aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.github/pull_request_template.md5
-rw-r--r--.travis.yml2
-rwxr-xr-x.travis/omit-dist.sh5
-rwxr-xr-x.travis/prevent-base-master.sh5
-rw-r--r--CONTRIBUTING.md2
-rw-r--r--README.md8
-rw-r--r--demo/dist/demo.css2
-rw-r--r--demo/dist/demo.js2492
-rw-r--r--demo/dist/demo.min.js6
-rw-r--r--demo/dist/demo.min.js.map2
-rw-r--r--dist/plyr.css2
-rw-r--r--dist/plyr.js2424
-rw-r--r--dist/plyr.min.js4
-rw-r--r--dist/plyr.min.js.map2
-rw-r--r--dist/plyr.min.mjs4
-rw-r--r--dist/plyr.min.mjs.map2
-rw-r--r--dist/plyr.mjs2424
-rw-r--r--dist/plyr.polyfilled.js2486
-rw-r--r--dist/plyr.polyfilled.min.js4
-rw-r--r--dist/plyr.polyfilled.min.js.map2
-rw-r--r--dist/plyr.polyfilled.min.mjs4
-rw-r--r--dist/plyr.polyfilled.min.mjs.map2
-rw-r--r--dist/plyr.polyfilled.mjs2486
-rw-r--r--src/js/config/defaults.js2
-rw-r--r--src/js/fullscreen.js2
-rw-r--r--src/js/plyr.js2
-rw-r--r--src/js/plyr.polyfilled.js2
-rw-r--r--src/js/utils/is.js10
28 files changed, 5655 insertions, 6738 deletions
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index f67d769f..7efb45b8 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -1,8 +1,3 @@
### Link to related issue (if applicable)
### Summary of proposed changes
-
-### Checklist
-- [ ] Use `develop` as the base branch
-- [ ] Exclude the gulp build (`/dist` changes) from the PR
-- [ ] Test on [supported browsers](https://github.com/sampotts/plyr#browser-support)
diff --git a/.travis.yml b/.travis.yml
index 3203fb95..29a6dfc9 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -2,7 +2,5 @@ language: node_js
node_js: lts/*
script:
-- bash .travis/prevent-base-master.sh
-- bash .travis/omit-dist.sh
- npm run lint
- npm run build
diff --git a/.travis/omit-dist.sh b/.travis/omit-dist.sh
deleted file mode 100755
index f107a6b9..00000000
--- a/.travis/omit-dist.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-if [ $TRAVIS_BRANCH == "develop" ] && $(git diff --name-only $TRAVIS_COMMIT_RANGE | grep -qE "^(demo/)?dist/"); then
- echo 'Build output ("dist" and "demo/dist") not permitted in develop' >&2
- exit 1
-fi
diff --git a/.travis/prevent-base-master.sh b/.travis/prevent-base-master.sh
deleted file mode 100755
index 54536a66..00000000
--- a/.travis/prevent-base-master.sh
+++ /dev/null
@@ -1,5 +0,0 @@
-#!/bin/bash
-if [ "$TRAVIS_PULL_REQUEST" != "false" ] && [ $TRAVIS_BRANCH == "master" ] && $(git diff --name-only $TRAVIS_COMMIT_RANGE | grep -q "^src/"); then
- echo 'The base branch for pull requests must be "develop"' >&2
- exit 1
-fi
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 2b3efe9c..e140371e 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -49,6 +49,6 @@ So that you can start straight away.
- If your modifications changes the documented behavior or add new features, document these changes in [README.md](README.md).
-- When finished, push the changes to your GitHub repository and send a pull request to **develop**. Describe what your PR does.
+- When finished, push the changes to your GitHub repository and send a pull request. Describe what your PR does.
- If the Travis build fails, or if you get a code review with change requests, you can fix these by pushing new or rebased commits to the branch.
diff --git a/README.md b/README.md
index 5b8a79e3..dac62dd6 100644
--- a/README.md
+++ b/README.md
@@ -134,13 +134,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.6.3/plyr.js"></script>
+<script src="https://cdn.plyr.io/3.6.4/plyr.js"></script>
```
...or...
```html
-<script src="https://cdn.plyr.io/3.6.3/plyr.polyfilled.js"></script>
+<script src="https://cdn.plyr.io/3.6.4/plyr.polyfilled.js"></script>
```
## CSS
@@ -154,13 +154,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.6.3/plyr.css" />
+<link rel="stylesheet" href="https://cdn.plyr.io/3.6.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.6.3/plyr.svg`.
+reference, the CDN hosted SVG sprite can be found at `https://cdn.plyr.io/3.6.4/plyr.svg`.
# Ads
diff --git a/demo/dist/demo.css b/demo/dist/demo.css
index 280a85a1..e49e115b 100644
--- a/demo/dist/demo.css
+++ b/demo/dist/demo.css
@@ -1 +1 @@
-:root{--plyr-color-main:#00b3ff;--plyr-font-size-base:13px;--plyr-font-size-small:12px;--plyr-font-size-time:11px;--plyr-font-size-badges:9px;--plyr-font-size-menu:var(--plyr-font-size-base);--plyr-font-weight-regular:500;--plyr-font-weight-bold:600;--plyr-font-size-captions-medium:18px;--plyr-font-size-captions-large:21px}@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}}@keyframes shrinkHide{0%{opacity:.5;width:38px}20%{width:45px}100%{opacity:0;width:0}}/*! 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,#e0f6ff,#f5fcff);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;display:flex;flex-shrink:0;justify-content:center;padding:16px;position:relative;text-align:center;text-shadow:none;width:100%}aside .icon{fill:#4baaf4;margin-right:8px}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:16px}@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:#4a5764;font-family:Gordita,Avenir,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-weight:500;line-height:1.75}button,input,select,textarea{font:inherit}p,small{margin:0 0 24px}small{font-size:13px;font-size:.8125rem;display:block}h1{font-size:64px;font-size:4rem;color:#00b3ff;font-weight:600;letter-spacing:-.025em;line-height:1.2;margin:0 0 24px}.button,.button__count{align-items:center;border:0;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);display:inline-flex;padding:12px;position:relative;text-shadow:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.button{background:#00b3ff;color:#fff;font-weight:600;padding-left:20px;padding-right:20px;transition:all .2s ease}.button:focus,.button:hover{background:#1abaff}.button:focus::after,.button:hover::after{display:none}.button:hover{box-shadow:0 2px 2px rgba(0,0,0,.1)}.button:focus{outline:0}.button.tab-focus{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}.button:active{top:1px}.button--with-count{display:inline-flex}.button--with-count .button .icon{flex-shrink:0}.button__count{animation:fadein .2s ease;background:#fff;color:#5d6e7e;margin-left:12px}.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:16px;text-align:center}header h1 span{animation:shrinkHide 1s cubic-bezier(.175,.885,.32,1.275) 2s forwards;display:inline-block;font-weight:300;opacity:.5}header .call-to-action{margin-top:24px}@media only screen and (min-width:768px){header{margin-right:48px;max-width:360px;padding-bottom:32px;text-align:left}header p:first-of-type{font-size:16px;font-size:1rem}}.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:8px}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:#00b3ff;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:16px}.plyr{border-radius:8px;box-shadow:0 2px 15px rgba(0,0,0,.1);margin:16px 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{color:#728597}.plyr__cite .icon{margin-right:3px}@keyframes plyr-progress{to{background-position:25px 0;background-position:var(--plyr-progress-loading-size,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;align-items:center;direction:ltr;display:flex;flex-direction:column;font-family:inherit;font-family:var(--plyr-font-family,inherit);font-variant-numeric:tabular-nums;font-weight:500;font-weight:var(--plyr-font-weight-regular,400);line-height:1.7;line-height:var(--plyr-line-height,1.7);max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease;z-index:0}.plyr audio,.plyr iframe,.plyr video{display:block;height:100%;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:#4a5464;background:var(--plyr-badge-background,#4a5464);border-radius:2px;border-radius:var(--plyr-badge-border-radius,2px);color:#fff;color:var(--plyr-badge-text-color,#fff);font-size:9px;font-size:var(--plyr-font-size-badge,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;display:none;font-size:12px;font-size:var(--plyr-font-size-small,13px);left:0;padding:10px;padding:var(--plyr-control-spacing,10px);position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:13px;font-size:var(--plyr-font-size-base,15px);padding:calc(10px * 2);padding:calc(var(--plyr-control-spacing,10px) * 2)}}@media (min-width:768px){.plyr__captions{font-size:18px;font-size:var(--plyr-font-size-large,18px)}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(calc(10px * -4));transform:translateY(calc(var(--plyr-control-spacing,10px) * -4))}.plyr__caption{background:rgba(0,0,0,.8);background:var(--plyr-captions-background,rgba(0,0,0,.8));border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;color:#fff;color:var(--plyr-captions-text-color,#fff);line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__caption div{display:inline}.plyr__control{background:0 0;border:0;border-radius:3px;border-radius:var(--plyr-control-radius,3px);color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7);position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;height:var(--plyr-control-icon-size,18px);pointer-events:none;width:18px;width:var(--plyr-control-icon-size,18px)}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{outline-color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}a.plyr__control,button.plyr__control.faux-link{text-decoration:none}a.plyr__control::after,a.plyr__control::before,button.plyr__control.faux-link::after,button.plyr__control.faux-link::before{display:none}.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--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:calc(10px / 4);margin-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:calc(10px / 4);padding-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item.plyr__time{padding:0 calc(10px / 2);padding:0 calc(var(--plyr-control-spacing,10px)/ 2)}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls:empty{display:none}.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__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);background:var(--plyr-menu-background,rgba(255,255,255,.9));border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-menu-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-menu-color,#4a5464);font-size:13px;font-size:var(--plyr-font-size-base,15px);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:var(--plyr-menu-arrow-size,4px) solid transparent;border-top-color:rgba(255,255,255,.9);border-top-color:var(--plyr-menu-background,rgba(255,255,255,.9));content:'';height:0;position:absolute;right:calc(((18px / 2) + calc(10px * .7)) - (4px / 2));right:calc(((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7)) - (var(--plyr-menu-arrow-size,4px)/ 2));top:100%;width:0}.plyr__menu__container [role=menu]{padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7)}.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:#4a5464;color:var(--plyr-menu-color,#4a5464);display:flex;font-size:13px;font-size:var(--plyr-font-size-menu,var(--plyr-font-size-small,13px));padding-bottom:calc(calc(10px * .7)/ 1.5);padding-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);padding-left:calc(calc(10px * .7) * 1.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-right:calc(calc(10px * .7) * 1.5);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-top:calc(calc(10px * .7)/ 1.5);padding-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);-webkit-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;border:var(--plyr-menu-item-arrow-size,4px) solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:calc(calc(10px * .7) * 4);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4)}.plyr__menu__container .plyr__control--forward::after{border-left-color:#728197;border-left-color:var(--plyr-menu-arrow-color,#728197);right:calc((calc(10px * .7) * 1.5) - 4px);right:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.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;font-weight:var(--plyr-font-weight-regular,400);margin:calc(10px * .7);margin:calc(var(--plyr-control-spacing,10px) * .7);margin-bottom:calc(calc(10px * .7)/ 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);padding-left:calc(calc(10px * .7) * 4);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4);position:relative;width:calc(100% - (calc(10px * .7) * 2));width:calc(100% - (calc(var(--plyr-control-spacing,10px) * .7) * 2))}.plyr__menu__container .plyr__control--back::after{border-right-color:#728197;border-right-color:var(--plyr-menu-arrow-color,#728197);left:calc((calc(10px * .7) * 1.5) - 4px);left:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.plyr__menu__container .plyr__control--back::before{background:#dcdfe5;background:var(--plyr-menu-back-border-color,#dcdfe5);box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 var(--plyr-menu-back-border-shadow-color,#fff);content:'';height:1px;left:0;margin-top:calc(calc(10px * .7)/ 2);margin-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);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:calc(10px * .7);padding-left:calc(var(--plyr-control-spacing,10px) * .7)}.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;margin-right:var(--plyr-control-spacing,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:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));background:var(--plyr-control-toggle-checked-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)))}.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(35,40,47,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:calc((calc(10px * .7) - 2) * -1);margin-right:calc((calc(var(--plyr-control-spacing,10px) * .7) - 2) * -1);overflow:hidden;padding-left:calc(calc(10px * .7) * 3.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 3.5);pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:calc(13px * 2);border-radius:calc(var(--plyr-range-thumb-height,13px) * 2);color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));color:var(--plyr-range-fill-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));display:block;height:calc((3px * 2) + 13px);height:calc((var(--plyr-range-thumb-active-shadow-width,3px) * 2) + var(--plyr-range-thumb-height,13px));margin:0;min-width: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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor 0,transparent 0);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;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-webkit-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);-webkit-appearance:none;margin-top:calc(((13px - 5px)/ 2) * -1);margin-top:calc(((var(--plyr-range-thumb-height,13px) - var(--plyr-range-track-height,5px))/ 2) * -1)}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-moz-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-moz-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px)}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-ms-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);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{outline-color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{outline-color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{outline-color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.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;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px;margin-right:var(--plyr-control-spacing,10px)}@media (max-width:calc(768px - 1px)){.plyr__time+.plyr__time{display:none}}.plyr__tooltip{background:rgba(255,255,255,.9);background:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;border-radius:var(--plyr-tooltip-radius,3px);bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-tooltip-color,#4a5464);font-size:12px;font-size:var(--plyr-font-size-small,13px);font-weight:500;font-weight:var(--plyr-font-weight-regular,400);left:50%;line-height:1.3;margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:calc(10px / 2) calc(calc(10px / 2) * 1.5);padding:calc(var(--plyr-control-spacing,10px)/ 2) calc(calc(var(--plyr-control-spacing,10px)/ 2) * 1.5);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-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);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:calc((18px / 2) + calc(10px * .7));left:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7))}.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:calc((18px / 2) + calc(10px * .7));right:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7));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__progress{left:calc(13px * .5);left:calc(var(--plyr-range-thumb-height,13px) * .5);margin-right:13px;margin-right:var(--plyr-range-thumb-height,13px);position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:calc(13px * -.5);margin-left:calc(var(--plyr-range-thumb-height,13px) * -.5);margin-right:calc(13px * -.5);margin-right:calc(var(--plyr-range-thumb-height,13px) * -.5);width:calc(100% + 13px);width:calc(100% + var(--plyr-range-thumb-height,13px))}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:11px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin-top:calc((5px / 2) * -1);margin-top:calc((var(--plyr-range-track-height,5px)/ 2) * -1);padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-webkit-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-moz-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;-ms-transition:width .2s ease;transition:width .2s ease}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,40,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,40,47,.6) 50%,rgba(35,40,47,.6) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 25%,transparent 25%,transparent 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;background-size:var(--plyr-progress-loading-size,25px) var(--plyr-progress-loading-size,25px);color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr__volume{align-items:center;display:flex;max-width:110px;min-width:80px;position:relative;width:20%}.plyr__volume input[type=range]{margin-left:calc(10px / 2);margin-left:calc(var(--plyr-control-spacing,10px)/ 2);margin-right:calc(10px / 2);margin-right:calc(var(--plyr-control-spacing,10px)/ 2);position:relative;z-index:2}.plyr--is-ios .plyr__volume{min-width:0;width:auto}.plyr--audio{display:block}.plyr--audio .plyr__controls{background:#fff;background:var(--plyr-audio-controls-background,#fff);border-radius:inherit;color:#4a5464;color:var(--plyr-audio-control-color,#4a5464);padding:10px;padding:var(--plyr-control-spacing,10px)}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));background:var(--plyr-audio-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-audio-control-color-hover,#fff)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--audio .plyr__progress__buffer{color:rgba(193,200,209,.6);color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;height:100%;margin:auto;overflow:hidden;position:relative;width:100%}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;left:0;position:absolute;top:0}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75));background:var(--plyr-video-controls-background,linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75)));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;color:var(--plyr-video-control-color,#fff);left:0;padding:calc(10px / 2);padding:calc(var(--plyr-control-spacing,10px)/ 2);padding-top:calc(10px * 2);padding-top:calc(var(--plyr-control-spacing,10px) * 2);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:10px;padding:var(--plyr-control-spacing,10px);padding-top:calc(10px * 3.5);padding-top:calc(var(--plyr-control-spacing,10px) * 3.5)}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-video-control-color-hover,#fff)}.plyr__control--overlaid{background:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));border:0;border-radius:100%;color:#fff;color:var(--plyr-video-control-color,#fff);display:none;left:50%;opacity:.9;padding:calc(10px * 1.5);padding:calc(var(--plyr-control-spacing,10px) * 1.5);position:absolute;top:50%;transform:translate(-50%,-50%);transition:.3s;z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{opacity:1}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--video .plyr__progress__buffer{color:rgba(255,255,255,.25);color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr:-webkit-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:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-webkit-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:-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:-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;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:-ms-fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;display:block;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%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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:#23282f;border-radius:2px;bottom:10px;bottom:var(--plyr-control-spacing,10px);color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;right:var(--plyr-control-spacing,10px);z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin:-var(--plyr-range-track-height,5px)/2 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);background-color:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:3px;padding:var(--plyr-tooltip-radius,3px);pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c8d1;border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);color:#fff;font-size:11px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.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
+:root{--plyr-color-main:#00b3ff;--plyr-font-size-base:13px;--plyr-font-size-small:12px;--plyr-font-size-time:11px;--plyr-font-size-badges:9px;--plyr-font-size-menu:var(--plyr-font-size-base);--plyr-font-weight-regular:500;--plyr-font-weight-bold:600;--plyr-font-size-captions-medium:18px;--plyr-font-size-captions-large:21px}@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}}@keyframes shrinkHide{0%{opacity:.5;width:38px}20%{width:45px}100%{opacity:0;width:0}}/*! 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,#e0f6ff,#f5fcff);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;display:flex;flex-shrink:0;justify-content:center;padding:16px;position:relative;text-align:center;text-shadow:none;width:100%}aside .icon{fill:#4baaf4;margin-right:8px}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:16px}@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:#4a5764;font-family:Gordita,Avenir,"Helvetica Neue",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol";font-weight:500;line-height:1.75}button,input,select,textarea{font:inherit}p,small{margin:0 0 24px}small{font-size:13px;font-size:.8125rem;display:block}h1{font-size:64px;font-size:4rem;color:#00b3ff;font-weight:600;letter-spacing:-.025em;line-height:1.2;margin:0 0 24px}.button,.button__count{align-items:center;border:0;border-radius:4px;box-shadow:0 1px 1px rgba(0,0,0,.1);display:inline-flex;padding:12px;position:relative;text-shadow:none;-webkit-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle}.button{background:#00b3ff;color:#fff;font-weight:600;padding-left:20px;padding-right:20px;transition:all .2s ease}.button:focus,.button:hover{background:#1abaff}.button:focus::after,.button:hover::after{display:none}.button:hover{box-shadow:0 2px 2px rgba(0,0,0,.1)}.button:focus{outline:0}.button.tab-focus{box-shadow:0 0 0 3px rgba(255,255,255,.35);outline:0}.button:active{top:1px}.button--with-count{display:inline-flex}.button--with-count .button .icon{flex-shrink:0}.button__count{animation:fadein .2s ease;background:#fff;color:#5d6e7e;margin-left:12px}.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:16px;text-align:center}header h1 span{animation:shrinkHide 1s cubic-bezier(.175,.885,.32,1.275) 2s forwards;display:inline-block;font-weight:300;opacity:.5}header .call-to-action{margin-top:24px}@media only screen and (min-width:768px){header{margin-right:48px;max-width:360px;padding-bottom:32px;text-align:left}header p:first-of-type{font-size:16px;font-size:1rem}}.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:8px}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:#00b3ff;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:16px}.plyr{border-radius:8px;box-shadow:0 2px 15px rgba(0,0,0,.1);margin:16px 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{color:#728597}.plyr__cite .icon{margin-right:3px}@keyframes plyr-progress{to{background-position:25px 0;background-position:var(--plyr-progress-loading-size,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;align-items:center;direction:ltr;display:flex;flex-direction:column;font-family:inherit;font-family:var(--plyr-font-family,inherit);font-variant-numeric:tabular-nums;font-weight:500;font-weight:var(--plyr-font-weight-regular,400);line-height:1.7;line-height:var(--plyr-line-height,1.7);max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease;z-index:0}.plyr audio,.plyr iframe,.plyr video{display:block;height:100%;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:#4a5464;background:var(--plyr-badge-background,#4a5464);border-radius:2px;border-radius:var(--plyr-badge-border-radius,2px);color:#fff;color:var(--plyr-badge-text-color,#fff);font-size:9px;font-size:var(--plyr-font-size-badge,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;display:none;font-size:12px;font-size:var(--plyr-font-size-small,13px);left:0;padding:10px;padding:var(--plyr-control-spacing,10px);position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:13px;font-size:var(--plyr-font-size-base,15px);padding:calc(10px * 2);padding:calc(var(--plyr-control-spacing,10px) * 2)}}@media (min-width:768px){.plyr__captions{font-size:18px;font-size:var(--plyr-font-size-large,18px)}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(calc(10px * -4));transform:translateY(calc(var(--plyr-control-spacing,10px) * -4))}.plyr__caption{background:rgba(0,0,0,.8);background:var(--plyr-captions-background,rgba(0,0,0,.8));border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;color:#fff;color:var(--plyr-captions-text-color,#fff);line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__caption div{display:inline}.plyr__control{background:0 0;border:0;border-radius:3px;border-radius:var(--plyr-control-radius,3px);color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7);position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;height:var(--plyr-control-icon-size,18px);pointer-events:none;width:18px;width:var(--plyr-control-icon-size,18px)}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{outline-color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}a.plyr__control,button.plyr__control.faux-link{text-decoration:none}a.plyr__control::after,a.plyr__control::before,button.plyr__control.faux-link::after,button.plyr__control.faux-link::before{display:none}.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--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:calc(10px / 4);margin-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:calc(10px / 4);padding-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item.plyr__time{padding:0 calc(10px / 2);padding:0 calc(var(--plyr-control-spacing,10px)/ 2)}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls:empty{display:none}.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__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);background:var(--plyr-menu-background,rgba(255,255,255,.9));border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-menu-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-menu-color,#4a5464);font-size:13px;font-size:var(--plyr-font-size-base,15px);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:var(--plyr-menu-arrow-size,4px) solid transparent;border-top-color:rgba(255,255,255,.9);border-top-color:var(--plyr-menu-background,rgba(255,255,255,.9));content:'';height:0;position:absolute;right:calc(((18px / 2) + calc(10px * .7)) - (4px / 2));right:calc(((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7)) - (var(--plyr-menu-arrow-size,4px)/ 2));top:100%;width:0}.plyr__menu__container [role=menu]{padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7)}.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:#4a5464;color:var(--plyr-menu-color,#4a5464);display:flex;font-size:13px;font-size:var(--plyr-font-size-menu,var(--plyr-font-size-small,13px));padding-bottom:calc(calc(10px * .7)/ 1.5);padding-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);padding-left:calc(calc(10px * .7) * 1.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-right:calc(calc(10px * .7) * 1.5);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-top:calc(calc(10px * .7)/ 1.5);padding-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);-webkit-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;border:var(--plyr-menu-item-arrow-size,4px) solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:calc(calc(10px * .7) * 4);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4)}.plyr__menu__container .plyr__control--forward::after{border-left-color:#728197;border-left-color:var(--plyr-menu-arrow-color,#728197);right:calc((calc(10px * .7) * 1.5) - 4px);right:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.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;font-weight:var(--plyr-font-weight-regular,400);margin:calc(10px * .7);margin:calc(var(--plyr-control-spacing,10px) * .7);margin-bottom:calc(calc(10px * .7)/ 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);padding-left:calc(calc(10px * .7) * 4);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4);position:relative;width:calc(100% - (calc(10px * .7) * 2));width:calc(100% - (calc(var(--plyr-control-spacing,10px) * .7) * 2))}.plyr__menu__container .plyr__control--back::after{border-right-color:#728197;border-right-color:var(--plyr-menu-arrow-color,#728197);left:calc((calc(10px * .7) * 1.5) - 4px);left:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.plyr__menu__container .plyr__control--back::before{background:#dcdfe5;background:var(--plyr-menu-back-border-color,#dcdfe5);box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 var(--plyr-menu-back-border-shadow-color,#fff);content:'';height:1px;left:0;margin-top:calc(calc(10px * .7)/ 2);margin-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);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:calc(10px * .7);padding-left:calc(var(--plyr-control-spacing,10px) * .7)}.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;margin-right:var(--plyr-control-spacing,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:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));background:var(--plyr-control-toggle-checked-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)))}.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(35,40,47,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:calc((calc(10px * .7) - 2) * -1);margin-right:calc((calc(var(--plyr-control-spacing,10px) * .7) - 2) * -1);overflow:hidden;padding-left:calc(calc(10px * .7) * 3.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 3.5);pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:calc(13px * 2);border-radius:calc(var(--plyr-range-thumb-height,13px) * 2);color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));color:var(--plyr-range-fill-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));display:block;height:calc((3px * 2) + 13px);height:calc((var(--plyr-range-thumb-active-shadow-width,3px) * 2) + var(--plyr-range-thumb-height,13px));margin:0;min-width: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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor 0,transparent 0);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;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-webkit-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);-webkit-appearance:none;margin-top:calc(((13px - 5px)/ 2) * -1);margin-top:calc(((var(--plyr-range-thumb-height,13px) - var(--plyr-range-track-height,5px))/ 2) * -1)}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-moz-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-moz-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px)}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-ms-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);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{outline-color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{outline-color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{outline-color:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr__poster{background-color:#000;background-color:var(--plyr-video-background,var(--plyr-video-background,#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;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px;margin-right:var(--plyr-control-spacing,10px)}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr__tooltip{background:rgba(255,255,255,.9);background:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;border-radius:var(--plyr-tooltip-radius,3px);bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-tooltip-color,#4a5464);font-size:12px;font-size:var(--plyr-font-size-small,13px);font-weight:500;font-weight:var(--plyr-font-weight-regular,400);left:50%;line-height:1.3;margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:calc(10px / 2) calc(calc(10px / 2) * 1.5);padding:calc(var(--plyr-control-spacing,10px)/ 2) calc(calc(var(--plyr-control-spacing,10px)/ 2) * 1.5);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-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);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:calc((18px / 2) + calc(10px * .7));left:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7))}.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:calc((18px / 2) + calc(10px * .7));right:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7));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__progress{left:calc(13px * .5);left:calc(var(--plyr-range-thumb-height,13px) * .5);margin-right:13px;margin-right:var(--plyr-range-thumb-height,13px);position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:calc(13px * -.5);margin-left:calc(var(--plyr-range-thumb-height,13px) * -.5);margin-right:calc(13px * -.5);margin-right:calc(var(--plyr-range-thumb-height,13px) * -.5);width:calc(100% + 13px);width:calc(100% + var(--plyr-range-thumb-height,13px))}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:11px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin-top:calc((5px / 2) * -1);margin-top:calc((var(--plyr-range-track-height,5px)/ 2) * -1);padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-webkit-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-moz-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;-ms-transition:width .2s ease;transition:width .2s ease}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,40,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,40,47,.6) 50%,rgba(35,40,47,.6) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 25%,transparent 25%,transparent 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;background-size:var(--plyr-progress-loading-size,25px) var(--plyr-progress-loading-size,25px);color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr__volume{align-items:center;display:flex;max-width:110px;min-width:80px;position:relative;width:20%}.plyr__volume input[type=range]{margin-left:calc(10px / 2);margin-left:calc(var(--plyr-control-spacing,10px)/ 2);margin-right:calc(10px / 2);margin-right:calc(var(--plyr-control-spacing,10px)/ 2);position:relative;z-index:2}.plyr--is-ios .plyr__volume{min-width:0;width:auto}.plyr--audio{display:block}.plyr--audio .plyr__controls{background:#fff;background:var(--plyr-audio-controls-background,#fff);border-radius:inherit;color:#4a5464;color:var(--plyr-audio-control-color,#4a5464);padding:10px;padding:var(--plyr-control-spacing,10px)}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));background:var(--plyr-audio-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-audio-control-color-hover,#fff)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--audio .plyr__progress__buffer{color:rgba(193,200,209,.6);color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr--video{background:#000;background:var(--plyr-video-background,var(--plyr-video-background,#000));overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;background:var(--plyr-video-background,var(--plyr-video-background,#000));height:100%;margin:auto;overflow:hidden;position:relative;width:100%}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;left:0;position:absolute;top:0}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75));background:var(--plyr-video-controls-background,linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75)));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;color:var(--plyr-video-control-color,#fff);left:0;padding:calc(10px / 2);padding:calc(var(--plyr-control-spacing,10px)/ 2);padding-top:calc(10px * 2);padding-top:calc(var(--plyr-control-spacing,10px) * 2);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:10px;padding:var(--plyr-control-spacing,10px);padding-top:calc(10px * 3.5);padding-top:calc(var(--plyr-control-spacing,10px) * 3.5)}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-video-control-color-hover,#fff)}.plyr__control--overlaid{background:var(--plyr-color-main,var(--plyr-color-main,#00b3ff));background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));border:0;border-radius:100%;color:#fff;color:var(--plyr-video-control-color,#fff);display:none;left:50%;opacity:.9;padding:calc(10px * 1.5);padding:calc(var(--plyr-control-spacing,10px) * 1.5);position:absolute;top:50%;transform:translate(-50%,-50%);transition:.3s;z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{opacity:1}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--video .plyr__progress__buffer{color:rgba(255,255,255,.25);color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr:-webkit-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:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-webkit-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:-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:-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;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:-ms-fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;display:block;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%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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:#23282f;border-radius:2px;bottom:10px;bottom:var(--plyr-control-spacing,10px);color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;right:var(--plyr-control-spacing,10px);z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin:-var(--plyr-range-track-height,5px)/2 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);background-color:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:3px;padding:var(--plyr-tooltip-radius,3px);pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c8d1;border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);color:#fff;font-size:11px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.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 6cea2552..ba30d1bc 100644
--- a/demo/dist/demo.js
+++ b/demo/dist/demo.js
@@ -16298,6 +16298,46 @@ typeof navigator === "object" && (function () {
redefine$1(Object.prototype, 'toString', objectToString$1, { unsafe: true });
}
+ var propertyIsEnumerable$1 = objectPropertyIsEnumerable$1.f;
+
+ // `Object.{ entries, values }` methods implementation
+ var createMethod$9 = function (TO_ENTRIES) {
+ return function (it) {
+ var O = toIndexedObject$1(it);
+ var keys = objectKeys$1(O);
+ var length = keys.length;
+ var i = 0;
+ var result = [];
+ var key;
+ while (length > i) {
+ key = keys[i++];
+ if (!descriptors$1 || propertyIsEnumerable$1.call(O, key)) {
+ result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
+ }
+ }
+ return result;
+ };
+ };
+
+ var objectToArray$1 = {
+ // `Object.entries` method
+ // https://tc39.github.io/ecma262/#sec-object.entries
+ entries: createMethod$9(true),
+ // `Object.values` method
+ // https://tc39.github.io/ecma262/#sec-object.values
+ values: createMethod$9(false)
+ };
+
+ var $values = objectToArray$1.values;
+
+ // `Object.values` method
+ // https://tc39.github.io/ecma262/#sec-object.values
+ _export$1({ target: 'Object', stat: true }, {
+ values: function values(O) {
+ return $values(O);
+ }
+ });
+
// `RegExp.prototype.flags` getter implementation
// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags
var regexpFlags$1 = function () {
@@ -16484,7 +16524,7 @@ typeof navigator === "object" && (function () {
});
// `String.prototype.{ codePointAt, at }` methods implementation
- var createMethod$9 = function (CONVERT_TO_STRING) {
+ var createMethod$a = function (CONVERT_TO_STRING) {
return function ($this, pos) {
var S = String(requireObjectCoercible$1($this));
var position = toInteger$1(pos);
@@ -16502,10 +16542,10 @@ typeof navigator === "object" && (function () {
var stringMultibyte$1 = {
// `String.prototype.codePointAt` method
// https://tc39.github.io/ecma262/#sec-string.prototype.codepointat
- codeAt: createMethod$9(false),
+ codeAt: createMethod$a(false),
// `String.prototype.at` method
// https://github.com/mathiasbynens/String.prototype.at
- charAt: createMethod$9(true)
+ charAt: createMethod$a(true)
};
var charAt$2 = stringMultibyte$1.charAt;
@@ -19179,36 +19219,6 @@ typeof navigator === "object" && (function () {
}
});
- var propertyIsEnumerable$1 = objectPropertyIsEnumerable$1.f;
-
- // `Object.{ entries, values }` methods implementation
- var createMethod$a = function (TO_ENTRIES) {
- return function (it) {
- var O = toIndexedObject$1(it);
- var keys = objectKeys$1(O);
- var length = keys.length;
- var i = 0;
- var result = [];
- var key;
- while (length > i) {
- key = keys[i++];
- if (!descriptors$1 || propertyIsEnumerable$1.call(O, key)) {
- result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
- }
- }
- return result;
- };
- };
-
- var objectToArray$1 = {
- // `Object.entries` method
- // https://tc39.github.io/ecma262/#sec-object.entries
- entries: createMethod$a(true),
- // `Object.values` method
- // https://tc39.github.io/ecma262/#sec-object.values
- values: createMethod$a(false)
- };
-
var $entries$1 = objectToArray$1.entries;
// `Object.entries` method
@@ -19219,16 +19229,6 @@ typeof navigator === "object" && (function () {
}
});
- var $values = objectToArray$1.values;
-
- // `Object.values` method
- // https://tc39.github.io/ecma262/#sec-object.values
- _export$1({ target: 'Object', stat: true }, {
- values: function values(O) {
- return $values(O);
- }
- });
-
var max$5 = Math.max;
var min$a = Math.min;
var floor$a = Math.floor;
@@ -20651,10 +20651,6 @@ typeof navigator === "object" && (function () {
return instanceOf$2(input, NodeList);
};
- var isElement$3 = function isElement(input) {
- return instanceOf$2(input, Element);
- };
-
var isTextNode = function isTextNode(input) {
return getConstructor$2(input) === Text;
};
@@ -20679,6 +20675,10 @@ typeof navigator === "object" && (function () {
return instanceOf$2(input, Promise) && isFunction$2(input.then);
};
+ var isElement$3 = function isElement(input) {
+ return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';
+ };
+
var isEmpty$2 = function isEmpty(input) {
return isNullOrUndefined$2(input) || (isString$3(input) || isArray$4(input) || isNodeList$2(input)) && !input.length || isObject$4(input) && !Object.keys(input).length;
};
@@ -21859,21 +21859,16 @@ typeof navigator === "object" && (function () {
var Storage$1 = /*#__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 _this = this;
+ _classCallCheck(this, Storage);
- _createClass(Storage, [{
- key: "get",
- value: function get(key) {
- if (!Storage.supported || !this.enabled) {
+ _defineProperty(this, "get", function (key) {
+ if (!Storage.supported || !_this.enabled) {
return null;
}
- var store = window.localStorage.getItem(this.key);
+ var store = window.localStorage.getItem(_this.key);
if (is$2.empty(store)) {
return null;
@@ -21881,12 +21876,11 @@ typeof navigator === "object" && (function () {
var json = JSON.parse(store);
return is$2.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: "set",
- value: function set(object) {
+ });
+
+ _defineProperty(this, "set", function (object) {
// Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
+ if (!Storage.supported || !_this.enabled) {
return;
} // Can only store objectst
@@ -21896,7 +21890,8 @@ typeof navigator === "object" && (function () {
} // Get current storage
- var storage = this.get(); // Default to empty object
+ var storage = _this.get(); // Default to empty object
+
if (is$2.empty(storage)) {
storage = {};
@@ -21905,9 +21900,15 @@ typeof navigator === "object" && (function () {
extend$1(storage, object); // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
+ window.localStorage.setItem(_this.key, JSON.stringify(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, null, [{
key: "supported",
get: function get() {
try {
@@ -24040,7 +24041,7 @@ typeof navigator === "object" && (function () {
// Sprite (for icons)
loadSprite: true,
iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',
+ iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',
// Blank video (used to prevent errors on source change)
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
// Quality default
@@ -24439,83 +24440,41 @@ typeof navigator === "object" && (function () {
_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
- }; // Force the use of 'full window/browser' rather than fullscreen
-
- this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
- // Checks container is an ancestor, defaults to null
-
- this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
- _this.onChange();
- }); // Fullscreen toggle on double click
-
- on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
- // Ignore double click in controls
- if (is$2.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
- return;
- }
-
- _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');
- }); // Tap focus when in fullscreen
-
- on.call(this, this.player.elements.container, 'keydown', function (event) {
- return _this.trapFocus(event);
- }); // Update the UI
-
- this.update();
- } // Determine if native supported
-
-
- _createClass(Fullscreen, [{
- key: "onChange",
- value: function onChange() {
- if (!this.enabled) {
+ _defineProperty(this, "onChange", function () {
+ if (!_this.enabled) {
return;
} // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
+ var button = _this.player.elements.buttons.fullscreen;
if (is$2.element(button)) {
- button.pressed = this.active;
+ button.pressed = _this.active;
} // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up
- var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event
+ var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event
- triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
- }
- }, {
- key: "toggleFallback",
- value: function toggleFallback() {
+ triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);
+ });
+
+ _defineProperty(this, "toggleFallback", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
// Store or restore scroll position
if (toggle) {
- this.scrollPosition = {
+ _this.scrollPosition = {
x: window.scrollX || 0,
y: window.scrollY || 0
};
} else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ 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); // Force full viewport on iPhone X+
+ toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
if (browser.isIos) {
var viewport = document.head.querySelector('meta[name="viewport"]');
@@ -24530,12 +24489,12 @@ typeof navigator === "object" && (function () {
var hasProperty = is$2.string(viewport.content) && viewport.content.includes(property);
if (toggle) {
- this.cleanupViewport = !hasProperty;
+ _this.cleanupViewport = !hasProperty;
if (!hasProperty) {
viewport.content += ",".concat(property);
}
- } else if (this.cleanupViewport) {
+ } else if (_this.cleanupViewport) {
viewport.content = viewport.content.split(',').filter(function (part) {
return part.trim() !== property;
}).join(',');
@@ -24543,20 +24502,18 @@ typeof navigator === "object" && (function () {
} // Toggle button and fire events
- this.onChange();
- } // Trap focus inside container
+ _this.onChange();
+ });
- }, {
- key: "trapFocus",
- value: function trapFocus(event) {
+ _defineProperty(this, "trapFocus", function (event) {
// Bail if iOS, not active, not the tab key
- if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {
+ if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {
return;
} // Get the current focused element
var focused = document.activeElement;
- var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
+ var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
var _focusable = _slicedToArray(focusable, 1),
first = _focusable[0];
@@ -24572,15 +24529,13 @@ typeof navigator === "object" && (function () {
last.focus();
event.preventDefault();
}
- } // Update UI
+ });
- }, {
- key: "update",
- value: function update() {
- if (this.enabled) {
+ _defineProperty(this, "update", function () {
+ if (_this.enabled) {
var mode;
- if (this.forceFallback) {
+ if (_this.forceFallback) {
mode = 'Fallback (forced)';
} else if (Fullscreen.native) {
mode = 'Native';
@@ -24588,67 +24543,106 @@ typeof navigator === "object" && (function () {
mode = 'Fallback';
}
- this.player.debug.log("".concat(mode, " fullscreen enabled"));
+ _this.player.debug.log("".concat(mode, " fullscreen enabled"));
} else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
+ _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
+ toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);
+ });
- }, {
- key: "enter",
- value: function enter() {
- if (!this.enabled) {
+ _defineProperty(this, "enter", function () {
+ 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 || this.forceFallback) {
- this.toggleFallback(true);
- } else if (!this.prefix) {
- this.target.requestFullscreen({
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ if (_this.player.isVimeo) {
+ _this.player.embed.requestFullscreen();
+ } else {
+ _this.target.webkitEnterFullscreen();
+ }
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(true);
+ } else if (!_this.prefix) {
+ _this.target.requestFullscreen({
navigationUI: 'hide'
});
- } else if (!is$2.empty(this.prefix)) {
- this.target["".concat(this.prefix, "Request").concat(this.property)]();
+ } else if (!is$2.empty(_this.prefix)) {
+ _this.target["".concat(_this.prefix, "Request").concat(_this.property)]();
}
- } // Bail from fullscreen
+ });
- }, {
- key: "exit",
- value: function exit() {
- if (!this.enabled) {
+ _defineProperty(this, "exit", function () {
+ if (!_this.enabled) {
return;
} // iOS native fullscreen
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- silencePromise(this.player.play());
- } else if (!Fullscreen.native || this.forceFallback) {
- this.toggleFallback(false);
- } else if (!this.prefix) {
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ _this.target.webkitExitFullscreen();
+
+ silencePromise(_this.player.play());
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(false);
+ } else if (!_this.prefix) {
(document.cancelFullScreen || document.exitFullscreen).call(document);
- } else if (!is$2.empty(this.prefix)) {
- var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
- document["".concat(this.prefix).concat(action).concat(this.property)]();
+ } else if (!is$2.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();
+ _defineProperty(this, "toggle", function () {
+ if (!_this.active) {
+ _this.enter();
} else {
- this.exit();
+ _this.exit();
}
- }
- }, {
+ });
+
+ // 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
+ }; // Force the use of 'full window/browser' rather than fullscreen
+
+ this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
+ // Checks container is an ancestor, defaults to null
+
+ this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
+ _this.onChange();
+ }); // Fullscreen toggle on double click
+
+ on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
+ // Ignore double click in controls
+ if (is$2.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
+ return;
+ }
+
+ _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');
+ }); // Tap focus when in fullscreen
+
+ on.call(this, this.player.elements.container, 'keydown', function (event) {
+ return _this.trapFocus(event);
+ }); // Update the UI
+
+ this.update(); // this.toggle = this.toggle.bind(this);
+ } // Determine if native supported
+
+
+ _createClass(Fullscreen, [{
key: "usingNative",
// If we're actually using native
get: function get() {
@@ -24992,182 +24986,23 @@ typeof navigator === "object" && (function () {
};
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$2.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$2.element(focused)) {
- var editable = player.config.selectors.editable;
- var seek = elements.inputs.seek;
-
- if (focused !== seek && matches$2(focused, editable)) {
- return;
- }
-
- if (event.which === 32 && matches$2(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) {
- silencePromise(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;
- } // Escape is handle natively when in full screen
- // So we only need to worry about non native
-
-
- if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
- player.fullscreen.toggle();
- } // Store last code for next cycle
-
-
- this.lastKey = code;
- } else {
- this.lastKey = null;
- }
- } // Toggle menu
+ function Listeners(_player) {
+ var _this = this;
- }, {
- key: "toggleMenu",
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- } // Device is touch enabled
+ _classCallCheck(this, Listeners);
- }, {
- key: "firstTouch",
- value: function firstTouch() {
- var player = this.player;
+ _defineProperty(this, "firstTouch", function () {
+ 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;
+ });
+
+ _defineProperty(this, "setTabFocus", function (event) {
+ var player = _this.player;
var elements = player.elements;
- clearTimeout(this.focusTimer); // Ignore any key other than tab
+ clearTimeout(_this.focusTimer); // Ignore any key other than tab
if (event.type === 'keydown' && event.which !== 9) {
return;
@@ -25175,7 +25010,7 @@ typeof navigator === "object" && (function () {
if (event.type === 'keydown') {
- this.lastKeyDown = event.timeStamp;
+ _this.lastKeyDown = event.timeStamp;
} // Remove current classes
@@ -25186,7 +25021,7 @@ typeof navigator === "object" && (function () {
}; // 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
+ var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
if (event.type === 'focus' && !wasKeyDown) {
return;
@@ -25197,7 +25032,7 @@ typeof navigator === "object" && (function () {
// This event fires before the focusin event
if (event.type !== 'focusout') {
- this.focusTimer = setTimeout(function () {
+ _this.focusTimer = setTimeout(function () {
var focused = document.activeElement; // Ignore if current focus element isn't inside the player
if (!elements.container.contains(focused)) {
@@ -25207,36 +25042,32 @@ typeof navigator === "object" && (function () {
toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
}, 10);
}
- } // Global window & document listeners
+ });
- }, {
- key: "global",
- value: function global() {
+ _defineProperty(this, "global", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- var player = this.player; // Keyboard shortcuts
+ var player = _this.player; // Keyboard shortcuts
if (player.config.keyboard.global) {
- toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
+ 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
+ toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events
- once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
+ once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection
- toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);
- } // Container listeners
+ toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);
+ });
- }, {
- key: "container",
- value: function container() {
- var player = this.player;
+ _defineProperty(this, "container", function () {
+ var player = _this.player;
var config = player.config,
elements = player.elements,
timers = player.timers; // Keyboard shortcuts
if (!config.keyboard.global && config.keyboard.focused) {
- on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
+ on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);
} // Toggle controls on mouse events and entering fullscreen
@@ -25341,14 +25172,10 @@ typeof navigator === "object" && (function () {
}
}
});
- } // Listen for media events
-
- }, {
- key: "media",
- value: function media() {
- var _this = this;
+ });
- var player = this.player;
+ _defineProperty(this, "media", function () {
+ var player = _this.player;
var elements = player.elements; // Time change on media
on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
@@ -25440,7 +25267,6 @@ typeof navigator === "object" && (function () {
// Update UI
controls.updateSetting.call(player, 'speed'); // Save to storage
-
player.storage.set({
speed: player.speed
});
@@ -25467,12 +25293,10 @@ typeof navigator === "object" && (function () {
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;
+ _defineProperty(this, "proxy", function (event, defaultHandler, customHandlerKey) {
+ var player = _this.player;
var customHandler = player.config.listeners[customHandlerKey];
var hasCustomHandler = is$2.function(customHandler);
var returned = true; // Execute custom handler
@@ -25485,89 +25309,90 @@ typeof navigator === "object" && (function () {
if (returned !== false && is$2.function(defaultHandler)) {
defaultHandler.call(player, event);
}
- } // Trigger custom and default handlers
-
- }, {
- key: "bind",
- value: function bind(element, type, defaultHandler, customHandlerKey) {
- var _this2 = this;
+ });
+ _defineProperty(this, "bind", function (element, type, defaultHandler, customHandlerKey) {
var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var player = this.player;
+ var player = _this.player;
var customHandler = player.config.listeners[customHandlerKey];
var hasCustomHandler = is$2.function(customHandler);
on.call(player, element, type, function (event) {
- return _this2.proxy(event, defaultHandler, customHandlerKey);
+ return _this.proxy(event, defaultHandler, customHandlerKey);
}, passive && !hasCustomHandler);
- } // Listen for control events
-
- }, {
- key: "controls",
- value: function controls$1() {
- var _this3 = this;
+ });
- var player = this.player;
+ _defineProperty(this, "controls", function () {
+ 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) {
- _this3.bind(button, 'click', function () {
+ _this.bind(button, 'click', function () {
silencePromise(player.togglePlay());
}, 'play');
});
} // Pause
- this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+ _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
- this.bind(elements.buttons.rewind, 'click', function () {
+
+ _this.bind(elements.buttons.rewind, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after rewind
player.lastSeekTime = Date.now();
player.rewind();
}, 'rewind'); // Rewind
- this.bind(elements.buttons.fastForward, 'click', function () {
+
+ _this.bind(elements.buttons.fastForward, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after fast forward
player.lastSeekTime = Date.now();
player.forward();
}, 'fastForward'); // Mute toggle
- this.bind(elements.buttons.mute, 'click', function () {
+
+ _this.bind(elements.buttons.mute, 'click', function () {
player.muted = !player.muted;
}, 'mute'); // Captions toggle
- this.bind(elements.buttons.captions, 'click', function () {
+
+ _this.bind(elements.buttons.captions, 'click', function () {
return player.toggleCaptions();
}); // Download
- this.bind(elements.buttons.download, 'click', function () {
+
+ _this.bind(elements.buttons.download, 'click', function () {
triggerEvent.call(player, player.media, 'download');
}, 'download'); // Fullscreen toggle
- this.bind(elements.buttons.fullscreen, 'click', function () {
+
+ _this.bind(elements.buttons.fullscreen, 'click', function () {
player.fullscreen.toggle();
}, 'fullscreen'); // Picture-in-Picture
- this.bind(elements.buttons.pip, 'click', function () {
+
+ _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) {
+ _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();
event.preventDefault();
-
controls.toggleMenu.call(player, event);
}, null, false); // Can't be passive as we're preventing default
// 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) {
+
+ _this.bind(elements.buttons.settings, 'keyup', function (event) {
var code = event.which; // We only care about space and return
if (![13, 32].includes(code)) {
@@ -25577,7 +25402,6 @@ typeof navigator === "object" && (function () {
if (code === 13) {
controls.focusFirstMenuItem.call(player, null, true);
-
return;
} // Prevent scroll
@@ -25590,19 +25414,22 @@ typeof navigator === "object" && (function () {
}, null, false // Can't be passive as we're preventing default
); // Escape closes menu
- this.bind(elements.settings.menu, 'keydown', function (event) {
+
+ _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) {
+
+ _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) {
+
+ _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';
@@ -25629,17 +25456,18 @@ typeof navigator === "object" && (function () {
// 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 _this3.bind(input, inputEvent, function (event) {
+ return _this.bind(input, inputEvent, function (event) {
return repaint(event.target);
});
});
} // Seek
- this.bind(elements.inputs.seek, inputEvent, function (event) {
+ _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');
@@ -25652,12 +25480,14 @@ typeof navigator === "object" && (function () {
player.currentTime = seekTo / seek.max * player.duration;
}, 'seek'); // Seek tooltip
- this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+
+ _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
return controls.updateSeekTooltip.call(player, event);
}); // Preview thumbnails plugin
// TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this
- this.bind(elements.progress, 'mousemove touchmove', function (event) {
+
+ _this.bind(elements.progress, 'mousemove touchmove', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -25665,7 +25495,8 @@ typeof navigator === "object" && (function () {
}
}); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
- this.bind(elements.progress, 'mouseleave touchend click', function () {
+
+ _this.bind(elements.progress, 'mouseleave touchend click', function () {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -25673,14 +25504,16 @@ typeof navigator === "object" && (function () {
}
}); // Show scrubbing preview
- this.bind(elements.progress, 'mousedown touchstart', function (event) {
+
+ _this.bind(elements.progress, 'mousedown touchstart', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
previewThumbnails.startScrubbing(event);
}
});
- this.bind(elements.progress, 'mouseup touchend', function (event) {
+
+ _this.bind(elements.progress, 'mouseup touchend', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -25688,9 +25521,10 @@ typeof navigator === "object" && (function () {
}
}); // Polyfill for lower fill in <input type="range"> for webkit
+
if (browser.isWebkit) {
Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
- _this3.bind(element, 'input', function (event) {
+ _this.bind(element, 'input', function (event) {
return controls.updateRangeFill.call(player, event.target);
});
});
@@ -25699,43 +25533,45 @@ typeof navigator === "object" && (function () {
if (player.config.toggleInvert && !is$2.element(elements.display.duration)) {
- this.bind(elements.display.currentTime, 'click', function () {
+ _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) {
+ _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) {
+
+ _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
elements.controls.hover = !player.touch && event.type === 'mouseenter';
}); // Also update controls.hover state for any non-player children of fullscreen element (as above)
+
if (elements.fullscreen) {
Array.from(elements.fullscreen.children).filter(function (c) {
return !c.contains(elements.container);
}).forEach(function (child) {
- _this3.bind(child, 'mouseenter mouseleave', function (event) {
+ _this.bind(child, '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) {
+ _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
}); // Show controls when they receive focus (e.g., when using keyboard tab key)
- this.bind(elements.controls, 'focusin', function () {
+
+ _this.bind(elements.controls, 'focusin', function () {
var config = player.config,
timers = player.timers; // Skip transition to prevent focus from scrolling the parent element
@@ -25747,7 +25583,7 @@ typeof navigator === "object" && (function () {
toggleClass(elements.controls, config.classNames.noTransition, false);
}, 0); // Delay a little more for mouse users
- var delay = _this3.touch ? 3000 : 4000; // Clear timer
+ var delay = _this.touch ? 3000 : 4000; // Clear timer
clearTimeout(timers.controls); // Hide again after delay
@@ -25756,7 +25592,8 @@ typeof navigator === "object" && (function () {
}, delay);
}); // Mouse wheel for volume
- this.bind(elements.inputs.volume, 'wheel', function (event) {
+
+ _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
@@ -25779,7 +25616,166 @@ typeof navigator === "object" && (function () {
event.preventDefault();
}
}, 'volume', false);
- }
+ });
+
+ 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$2.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$2.element(focused)) {
+ var editable = player.config.selectors.editable;
+ var seek = elements.inputs.seek;
+
+ if (focused !== seek && matches$2(focused, editable)) {
+ return;
+ }
+
+ if (event.which === 32 && matches$2(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) {
+ silencePromise(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;
+ } // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+
+
+ if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
+ 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
+
}]);
return Listeners;
@@ -26233,7 +26229,7 @@ typeof navigator === "object" && (function () {
var src = format(player.config.urls.vimeo.iframe, id, params);
iframe.setAttribute('src', src);
iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required
+ iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required
if (!is$2.empty(referrerPolicy)) {
iframe.setAttribute('referrerPolicy', referrerPolicy);
@@ -26989,135 +26985,84 @@ typeof navigator === "object" && (function () {
_classCallCheck(this, Ads);
- this.player = player;
- this.config = player.config.ads;
- 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) {
+ _defineProperty(this, "load", function () {
+ if (!_this.enabled) {
return;
} // Check if the Google IMA3 SDK is loaded or load it ourselves
if (!is$2.object(window.google) || !is$2.object(window.google.ima)) {
- loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
- _this2.ready();
+ loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {
+ _this.ready();
}).catch(function () {
// Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
+ _this.trigger('error', new Error('Google IMA SDK failed to load'));
});
} else {
- this.ready();
+ _this.ready();
}
- }
- /**
- * Get the ads instance ready
- */
-
- }, {
- key: "ready",
- value: function ready() {
- var _this3 = this;
+ });
+ _defineProperty(this, "ready", function () {
// Double check we're enabled
- if (!this.enabled) {
- destroy(this);
+ if (!_this.enabled) {
+ destroy(_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.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
+
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
+ _this.managerPromise.then(function () {
+ _this.clearSafetyTimer('onAdsManagerLoaded()');
}); // Set listeners on the Plyr instance
- this.listeners(); // Setup the IMA SDK
- this.setupIMA();
- } // Build the tag URL
+ _this.listeners(); // Setup the IMA SDK
- }, {
- 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() {
- var _this4 = this;
+ _this.setupIMA();
+ });
+ _defineProperty(this, "setupIMA", function () {
// Create the container for our advertisements
- this.elements.container = createElement$1('div', {
- class: this.player.config.classNames.ads
+ _this.elements.container = createElement$1('div', {
+ class: _this.player.config.classNames.ads
});
- this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
+
+ _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); // Set playback for iOS10+
+ google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+
- google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
+ google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // 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, this.player.media); // Create ads loader
+ _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
+ _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);
+ _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this.onAdsManagerLoaded(event);
}, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
+
+ _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}, false); // Request video ads to be pre-loaded
- this.requestAds();
- }
- /**
- * Request advertisements
- */
- }, {
- key: "requestAds",
- value: function requestAds() {
- var container = this.player.elements.container;
+ _this.requestAds();
+ });
+
+ _defineProperty(this, "requestAds", function () {
+ var container = _this.player.elements.container;
try {
// Request video ads
var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
+ 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;
@@ -27127,51 +27072,38 @@ typeof navigator === "object" && (function () {
request.forceNonLinearFullSlot = false; // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
- this.loader.requestAds(request);
+ request.setAdWillPlayMuted(!_this.player.muted);
+
+ _this.loader.requestAds(request);
} catch (e) {
- this.onAdError(e);
+ _this.onAdError(e);
}
- }
- /**
- * Update the ad countdown
- * @param {Boolean} start
- */
-
- }, {
- key: "pollCountdown",
- value: function pollCountdown() {
- var _this5 = this;
+ });
+ _defineProperty(this, "pollCountdown", function () {
var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
+ 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);
+ var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));
+ var label = "".concat(i18n.get('advertisement', _this.player.config), " - ").concat(time);
- _this5.elements.container.setAttribute('data-badge-text', label);
+ _this.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;
+ _this.countdownTimer = setInterval(update, 100);
+ });
+ _defineProperty(this, "onAdsManagerLoaded", function (event) {
// Load could occur after a source change (race condition)
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
} // Get the ads manager
@@ -27182,38 +27114,36 @@ typeof navigator === "object" && (function () {
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.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 listeners to the required events
+ _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events
// Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
+ _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}); // Advertisement regular events
+
Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
- return _this6.onAdEvent(e);
+ _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
+ return _this.onAdEvent(e);
});
}); // Resolve our adsManager
- this.trigger('loaded');
- }
- }, {
- key: "addCuePoints",
- value: function addCuePoints() {
- var _this7 = this;
+ _this.trigger('loaded');
+ });
+ _defineProperty(this, "addCuePoints", function () {
// Add advertisement cue's within the time line if available
- if (!is$2.empty(this.cuePoints)) {
- this.cuePoints.forEach(function (cuePoint) {
- if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {
- var seekElement = _this7.player.elements.progress;
+ if (!is$2.empty(_this.cuePoints)) {
+ _this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {
+ var seekElement = _this.player.elements.progress;
if (is$2.element(seekElement)) {
- var cuePercentage = 100 / _this7.player.duration * cuePoint;
+ var cuePercentage = 100 / _this.player.duration * cuePoint;
var cue = createElement$1('span', {
- class: _this7.player.config.classNames.cues
+ class: _this.player.config.classNames.cues
});
cue.style.left = "".concat(cuePercentage.toString(), "%");
seekElement.appendChild(cue);
@@ -27221,27 +27151,17 @@ typeof navigator === "object" && (function () {
}
});
}
- }
- /**
- * 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 _this8 = this;
+ });
- var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ _defineProperty(this, "onAdEvent", function (event) {
+ 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();
var adData = event.getAdData(); // Proxy event
var dispatchEvent = function dispatchEvent(type) {
- triggerEvent.call(_this8.player, _this8.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
+ triggerEvent.call(_this.player, _this.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
}; // Bubble the event
@@ -27251,9 +27171,10 @@ typeof navigator === "object" && (function () {
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'); // Start countdown
+ _this.trigger('loaded'); // Start countdown
- this.pollCountdown(true);
+
+ _this.pollCountdown(true);
if (!ad.isLinear()) {
// Position AdDisplayContainer correctly for overlay
@@ -27267,7 +27188,8 @@ typeof navigator === "object" && (function () {
case google.ima.AdEvent.Type.STARTED:
// Set volume to match player
- this.manager.setVolume(this.player.volume);
+ _this.manager.setVolume(_this.player.volume);
+
break;
case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
@@ -27294,11 +27216,11 @@ typeof navigator === "object" && (function () {
// };
// 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
- if (this.player.ended) {
- this.loadAds();
+ if (_this.player.ended) {
+ _this.loadAds();
} else {
// The SDK won't allow new ads to be called without receiving a contentComplete()
- this.loader.contentComplete();
+ _this.loader.contentComplete();
}
break;
@@ -27307,7 +27229,8 @@ typeof navigator === "object" && (function () {
// 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
- this.pauseContent();
+ _this.pauseContent();
+
break;
case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
@@ -27315,275 +27238,237 @@ typeof navigator === "object" && (function () {
// 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
- this.pollCountdown();
- this.resumeContent();
+ _this.pollCountdown();
+
+ _this.resumeContent();
+
break;
case google.ima.AdEvent.Type.LOG:
if (adData.adError) {
- this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
+ _this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
}
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
- */
+ _defineProperty(this, "onAdError", function (event) {
+ _this.cancel();
- }, {
- key: "listeners",
- value: function listeners() {
- var _this9 = this;
+ _this.player.debug.warn('Ads error', event);
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "listeners", function () {
+ var container = _this.player.elements.container;
var time;
- this.player.on('canplay', function () {
- _this9.addCuePoints();
+
+ _this.player.on('canplay', function () {
+ _this.addCuePoints();
});
- this.player.on('ended', function () {
- _this9.loader.contentComplete();
+
+ _this.player.on('ended', function () {
+ _this.loader.contentComplete();
});
- this.player.on('timeupdate', function () {
- time = _this9.player.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ time = _this.player.currentTime;
});
- this.player.on('seeked', function () {
- var seekedTime = _this9.player.currentTime;
- if (is$2.empty(_this9.cuePoints)) {
+ _this.player.on('seeked', function () {
+ var seekedTime = _this.player.currentTime;
+
+ if (is$2.empty(_this.cuePoints)) {
return;
}
- _this9.cuePoints.forEach(function (cuePoint, index) {
+ _this.cuePoints.forEach(function (cuePoint, index) {
if (time < cuePoint && cuePoint < seekedTime) {
- _this9.manager.discardAdBreak();
+ _this.manager.discardAdBreak();
- _this9.cuePoints.splice(index, 1);
+ _this.cuePoints.splice(index, 1);
}
});
}); // Listen to the resizing of the window. And resize ad accordingly
// TODO: eventually implement ResizeObserver
+
window.addEventListener('resize', function () {
- if (_this9.manager) {
- _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ if (_this.manager) {
+ _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
}
});
- }
- /**
- * Initialize the adsManager and start playing advertisements
- */
-
- }, {
- key: "play",
- value: function play() {
- var _this10 = this;
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "play", function () {
+ var container = _this.player.elements.container;
- if (!this.managerPromise) {
- this.resumeContent();
+ if (!_this.managerPromise) {
+ _this.resumeContent();
} // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Set volume to match player
- _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices
+ _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices
- _this10.elements.displayContainer.initialize();
+ _this.elements.displayContainer.initialize();
try {
- if (!_this10.initialized) {
+ if (!_this.initialized) {
// Initialize the ads manager. Ad rules playlist will start at this time
- _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
+ _this.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
- _this10.manager.start();
+ _this.manager.start();
}
- _this10.initialized = true;
+ _this.initialized = true;
} catch (adError) {
// An error may be thrown if there was a problem with the
// VAST response
- _this10.onAdError(adError);
+ _this.onAdError(adError);
}
}).catch(function () {});
- }
- /**
- * Resume our video
- */
+ });
- }, {
- key: "resumeContent",
- value: function resumeContent() {
+ _defineProperty(this, "resumeContent", function () {
// Hide the advertisement container
- this.elements.container.style.zIndex = ''; // Ad is stopped
+ _this.elements.container.style.zIndex = ''; // Ad is stopped
- this.playing = false; // Play video
+ _this.playing = false; // Play video
- silencePromise(this.player.media.play());
- }
- /**
- * Pause our video
- */
+ silencePromise(_this.player.media.play());
+ });
- }, {
- key: "pauseContent",
- value: function pauseContent() {
+ _defineProperty(this, "pauseContent", function () {
// Show the advertisement container
- this.elements.container.style.zIndex = 3; // Ad is playing
+ _this.elements.container.style.zIndex = 3; // Ad is playing
- this.playing = true; // Pause our video.
+ _this.playing = true; // Pause our video.
- this.player.media.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
- */
+ _this.player.media.pause();
+ });
- }, {
- key: "cancel",
- value: function cancel() {
+ _defineProperty(this, "cancel", function () {
// Pause our video
- if (this.initialized) {
- this.resumeContent();
+ if (_this.initialized) {
+ _this.resumeContent();
} // Tell our instance that we're done for now
- this.trigger('error'); // Re-create our adsManager
+ _this.trigger('error'); // Re-create our adsManager
- this.loadAds();
- }
- /**
- * Re-create our adsManager
- */
- }, {
- key: "loadAds",
- value: function loadAds() {
- var _this11 = this;
+ _this.loadAds();
+ });
+ _defineProperty(this, "loadAds", function () {
// Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Destroy our adsManager
- if (_this11.manager) {
- _this11.manager.destroy();
+ if (_this.manager) {
+ _this.manager.destroy();
} // Re-set our adsManager promises
- _this11.managerPromise = new Promise(function (resolve) {
- _this11.on('loaded', resolve);
+ _this.managerPromise = new Promise(function (resolve) {
+ _this.on('loaded', resolve);
- _this11.player.debug.log(_this11.manager);
+ _this.player.debug.log(_this.manager);
}); // Now that the manager has been destroyed set it to also be un-initialized
- _this11.initialized = false; // Now request some new advertisements
+ _this.initialized = false; // Now request some new advertisements
- _this11.requestAds();
+ _this.requestAds();
}).catch(function () {});
- }
- /**
- * Handles callbacks after an ad event was invoked
- * @param {String} event - Event type
- */
-
- }, {
- key: "trigger",
- value: function trigger(event) {
- var _this12 = this;
+ });
+ _defineProperty(this, "trigger", function (event) {
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];
+ var handlers = _this.events[event];
if (is$2.array(handlers)) {
handlers.forEach(function (handler) {
if (is$2.function(handler)) {
- handler.apply(_this12, args);
+ handler.apply(_this, args);
}
});
}
- }
- /**
- * Add event listeners
- * @param {String} event - Event type
- * @param {Function} callback - Callback for when event occurs
- * @return {Ads}
- */
+ });
- }, {
- key: "on",
- value: function on(event, callback) {
- if (!is$2.array(this.events[event])) {
- this.events[event] = [];
+ _defineProperty(this, "on", function (event, callback) {
+ if (!is$2.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
- */
+ _this.events[event].push(callback);
- }, {
- key: "startSafetyTimer",
- value: function startSafetyTimer(time, from) {
- var _this13 = this;
+ return _this;
+ });
- this.player.debug.log("Safety timer invoked from: ".concat(from));
- this.safetyTimer = setTimeout(function () {
- _this13.cancel();
+ _defineProperty(this, "startSafetyTimer", function (time, from) {
+ _this.player.debug.log("Safety timer invoked from: ".concat(from));
- _this13.clearSafetyTimer('startSafetyTimer()');
+ _this.safetyTimer = setTimeout(function () {
+ _this.cancel();
+
+ _this.clearSafetyTimer('startSafetyTimer()');
}, time);
- }
- /**
- * Clear our safety timer(s)
- * @param {String} from
- */
+ });
- }, {
- key: "clearSafetyTimer",
- value: function clearSafetyTimer(from) {
- if (!is$2.nullOrUndefined(this.safetyTimer)) {
- this.player.debug.log("Safety timer cleared from: ".concat(from));
- clearTimeout(this.safetyTimer);
- this.safetyTimer = null;
+ _defineProperty(this, "clearSafetyTimer", function (from) {
+ if (!is$2.nullOrUndefined(_this.safetyTimer)) {
+ _this.player.debug.log("Safety timer cleared from: ".concat(from));
+
+ clearTimeout(_this.safetyTimer);
+ _this.safetyTimer = null;
}
- }
- }, {
+ });
+
+ this.player = player;
+ this.config = player.config.ads;
+ 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: "enabled",
get: function get() {
var config = this.config;
return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$2.empty(config.publisherId) || is$2.url(config.tagUrl));
}
+ /**
+ * Load the IMA SDK
+ */
+
}, {
key: "tagUrl",
+ // Build the tag URL
get: function get() {
var config = this.config;
@@ -27603,6 +27488,15 @@ typeof navigator === "object" && (function () {
var base = 'https://go.aniview.com/api/adserver6/vast/';
return "".concat(base, "?").concat(buildUrlParams(params));
}
+ /**
+ * 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.
+ */
+
}]);
return Ads;
@@ -27736,36 +27630,21 @@ typeof navigator === "object" && (function () {
* @return {PreviewThumbnails}
*/
function PreviewThumbnails(player) {
- _classCallCheck(this, PreviewThumbnails);
-
- this.player = player;
- this.thumbnails = [];
- this.loaded = false;
- this.lastMouseMoveTime = Date.now();
- this.mouseDown = false;
- this.loadedImages = [];
- this.elements = {
- thumb: {},
- scrubbing: {}
- };
- this.load();
- }
+ var _this = this;
- _createClass(PreviewThumbnails, [{
- key: "load",
- value: function load() {
- var _this = this;
+ _classCallCheck(this, PreviewThumbnails);
+ _defineProperty(this, "load", function () {
// Toggle the regular seek tooltip
- if (this.player.elements.display.seekTooltip) {
- this.player.elements.display.seekTooltip.hidden = this.enabled;
+ if (_this.player.elements.display.seekTooltip) {
+ _this.player.elements.display.seekTooltip.hidden = _this.enabled;
}
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
}
- this.getThumbnails().then(function () {
+ _this.getThumbnails().then(function () {
if (!_this.enabled) {
return;
} // Render DOM elements
@@ -27778,15 +27657,11 @@ typeof navigator === "object" && (function () {
_this.loaded = true;
});
- } // Download VTT files and parse them
-
- }, {
- key: "getThumbnails",
- value: function getThumbnails() {
- var _this2 = this;
+ });
+ _defineProperty(this, "getThumbnails", function () {
return new Promise(function (resolve) {
- var src = _this2.player.config.previewThumbnails.src;
+ var src = _this.player.config.previewThumbnails.src;
if (is$2.empty(src)) {
throw new Error('Missing previewThumbnails.src config attribute');
@@ -27795,11 +27670,11 @@ typeof navigator === "object" && (function () {
var sortAndResolve = function sortAndResolve() {
// Sort smallest to biggest (e.g., [120p, 480p, 1080p])
- _this2.thumbnails.sort(function (x, y) {
+ _this.thumbnails.sort(function (x, y) {
return x.height - y.height;
});
- _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
+ _this.player.debug.log('Preview thumbnails', _this.thumbnails);
resolve();
}; // Via callback()
@@ -27807,7 +27682,7 @@ typeof navigator === "object" && (function () {
if (is$2.function(src)) {
src(function (thumbnails) {
- _this2.thumbnails = thumbnails;
+ _this.thumbnails = thumbnails;
sortAndResolve();
});
} // VTT urls
@@ -27816,19 +27691,15 @@ typeof navigator === "object" && (function () {
var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
var promises = urls.map(function (u) {
- return _this2.getThumbnail(u);
+ return _this.getThumbnail(u);
}); // Resolve
Promise.all(promises).then(sortAndResolve);
}
});
- } // Process individual VTT file
-
- }, {
- key: "getThumbnail",
- value: function getThumbnail(url) {
- var _this3 = this;
+ });
+ _defineProperty(this, "getThumbnail", function (url) {
return new Promise(function (resolve) {
fetch(url).then(function (response) {
var thumbnail = {
@@ -27850,7 +27721,7 @@ typeof navigator === "object" && (function () {
thumbnail.height = tempImage.naturalHeight;
thumbnail.width = tempImage.naturalWidth;
- _this3.thumbnails.push(thumbnail);
+ _this.thumbnails.push(thumbnail);
resolve();
};
@@ -27858,11 +27729,10 @@ typeof navigator === "object" && (function () {
tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;
});
});
- }
- }, {
- key: "startMove",
- value: function startMove(event) {
- if (!this.loaded) {
+ });
+
+ _defineProperty(this, "startMove", function (event) {
+ if (!_this.loaded) {
return;
}
@@ -27871,163 +27741,153 @@ typeof navigator === "object" && (function () {
} // Wait until media has a duration
- if (!this.player.media.duration) {
+ if (!_this.player.media.duration) {
return;
}
if (event.type === 'touchmove') {
// Calculate seek hover position as approx video seconds
- this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
+ _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);
} else {
// Calculate seek hover position as approx video seconds
- var clientRect = this.player.elements.progress.getBoundingClientRect();
+ var clientRect = _this.player.elements.progress.getBoundingClientRect();
+
var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);
- this.seekTime = this.player.media.duration * (percentage / 100);
+ _this.seekTime = _this.player.media.duration * (percentage / 100);
- if (this.seekTime < 0) {
+ if (_this.seekTime < 0) {
// The mousemove fires for 10+px out to the left
- this.seekTime = 0;
+ _this.seekTime = 0;
}
- if (this.seekTime > this.player.media.duration - 1) {
+ if (_this.seekTime > _this.player.media.duration - 1) {
// Took 1 second off the duration for safety, because different players can disagree on the real duration of a video
- this.seekTime = this.player.media.duration - 1;
+ _this.seekTime = _this.player.media.duration - 1;
}
- this.mousePosX = event.pageX; // Set time text inside image container
+ _this.mousePosX = event.pageX; // Set time text inside image container
- this.elements.thumb.time.innerText = formatTime(this.seekTime);
+ _this.elements.thumb.time.innerText = formatTime(_this.seekTime);
} // Download and show image
- this.showImageAtCurrentTime();
- }
- }, {
- key: "endMove",
- value: function endMove() {
- this.toggleThumbContainer(false, true);
- }
- }, {
- key: "startScrubbing",
- value: function startScrubbing(event) {
+ _this.showImageAtCurrentTime();
+ });
+
+ _defineProperty(this, "endMove", function () {
+ _this.toggleThumbContainer(false, true);
+ });
+
+ _defineProperty(this, "startScrubbing", function (event) {
// Only act on left mouse button (0), or touch device (event.button does not exist or is false)
if (is$2.nullOrUndefined(event.button) || event.button === false || event.button === 0) {
- this.mouseDown = true; // Wait until media has a duration
+ _this.mouseDown = true; // Wait until media has a duration
- if (this.player.media.duration) {
- this.toggleScrubbingContainer(true);
- this.toggleThumbContainer(false, true); // Download and show image
+ if (_this.player.media.duration) {
+ _this.toggleScrubbingContainer(true);
- this.showImageAtCurrentTime();
+ _this.toggleThumbContainer(false, true); // Download and show image
+
+
+ _this.showImageAtCurrentTime();
}
}
- }
- }, {
- key: "endScrubbing",
- value: function endScrubbing() {
- var _this4 = this;
+ });
- this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
+ _defineProperty(this, "endScrubbing", function () {
+ _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
- if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {
+ if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {
// The video was already seeked/loaded at the chosen time - hide immediately
- this.toggleScrubbingContainer(false);
+ _this.toggleScrubbingContainer(false);
} else {
// The video hasn't seeked yet. Wait for that
- once.call(this.player, this.player.media, 'timeupdate', function () {
+ once.call(_this.player, _this.player.media, 'timeupdate', function () {
// Re-check mousedown - we might have already started scrubbing again
- if (!_this4.mouseDown) {
- _this4.toggleScrubbingContainer(false);
+ if (!_this.mouseDown) {
+ _this.toggleScrubbingContainer(false);
}
});
}
- }
- /**
- * Setup hooks for Plyr and window events
- */
-
- }, {
- key: "listeners",
- value: function listeners() {
- var _this5 = this;
+ });
+ _defineProperty(this, "listeners", function () {
// Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
- this.player.on('play', function () {
- _this5.toggleThumbContainer(false, true);
+ _this.player.on('play', function () {
+ _this.toggleThumbContainer(false, true);
});
- this.player.on('seeked', function () {
- _this5.toggleThumbContainer(false);
+
+ _this.player.on('seeked', function () {
+ _this.toggleThumbContainer(false);
});
- this.player.on('timeupdate', function () {
- _this5.lastTime = _this5.player.media.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ _this.lastTime = _this.player.media.currentTime;
});
- }
- /**
- * Create HTML elements for image containers
- */
+ });
- }, {
- key: "render",
- value: function render() {
+ _defineProperty(this, "render", function () {
// Create HTML element: plyr__preview-thumbnail-container
- this.elements.thumb.container = createElement$1('div', {
- class: this.player.config.classNames.previewThumbnails.thumbContainer
+ _this.elements.thumb.container = createElement$1('div', {
+ class: _this.player.config.classNames.previewThumbnails.thumbContainer
}); // Wrapper for the image for styling
- this.elements.thumb.imageContainer = createElement$1('div', {
- class: this.player.config.classNames.previewThumbnails.imageContainer
+ _this.elements.thumb.imageContainer = createElement$1('div', {
+ class: _this.player.config.classNames.previewThumbnails.imageContainer
});
- this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
+ _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
var timeContainer = createElement$1('div', {
- class: this.player.config.classNames.previewThumbnails.timeContainer
+ class: _this.player.config.classNames.previewThumbnails.timeContainer
});
- this.elements.thumb.time = createElement$1('span', {}, '00:00');
- timeContainer.appendChild(this.elements.thumb.time);
- this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+ _this.elements.thumb.time = createElement$1('span', {}, '00:00');
+ timeContainer.appendChild(_this.elements.thumb.time);
+
+ _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+
- if (is$2.element(this.player.elements.progress)) {
- this.player.elements.progress.appendChild(this.elements.thumb.container);
+ if (is$2.element(_this.player.elements.progress)) {
+ _this.player.elements.progress.appendChild(_this.elements.thumb.container);
} // Create HTML element: plyr__preview-scrubbing-container
- this.elements.scrubbing.container = createElement$1('div', {
- class: this.player.config.classNames.previewThumbnails.scrubbingContainer
+ _this.elements.scrubbing.container = createElement$1('div', {
+ class: _this.player.config.classNames.previewThumbnails.scrubbingContainer
});
- this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
- }
- }, {
- key: "destroy",
- value: function destroy() {
- if (this.elements.thumb.container) {
- this.elements.thumb.container.remove();
+
+ _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);
+ });
+
+ _defineProperty(this, "destroy", function () {
+ if (_this.elements.thumb.container) {
+ _this.elements.thumb.container.remove();
}
- if (this.elements.scrubbing.container) {
- this.elements.scrubbing.container.remove();
+ if (_this.elements.scrubbing.container) {
+ _this.elements.scrubbing.container.remove();
}
- }
- }, {
- key: "showImageAtCurrentTime",
- value: function showImageAtCurrentTime() {
- var _this6 = this;
+ });
- if (this.mouseDown) {
- this.setScrubbingContainerSize();
+ _defineProperty(this, "showImageAtCurrentTime", function () {
+ if (_this.mouseDown) {
+ _this.setScrubbingContainerSize();
} else {
- this.setThumbContainerSizeAndPos();
+ _this.setThumbContainerSizeAndPos();
} // Find the desired thumbnail index
// TODO: Handle a video longer than the thumbs where thumbNum is null
- var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {
- return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;
+ var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {
+ return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;
});
+
var hasThumb = thumbNum >= 0;
var qualityIndex = 0; // Show the thumb container if we're not scrubbing
- if (!this.mouseDown) {
- this.toggleThumbContainer(hasThumb);
+ if (!_this.mouseDown) {
+ _this.toggleThumbContainer(hasThumb);
} // No matching thumb found
@@ -28036,36 +27896,34 @@ typeof navigator === "object" && (function () {
} // Check to see if we've already downloaded higher quality versions of this image
- this.thumbnails.forEach(function (thumbnail, index) {
- if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
+ _this.thumbnails.forEach(function (thumbnail, index) {
+ if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
qualityIndex = index;
}
}); // Only proceed if either thumbnum or thumbfilename has changed
- if (thumbNum !== this.showingThumb) {
- this.showingThumb = thumbNum;
- this.loadImage(qualityIndex);
- }
- } // Show the image that's currently specified in this.showingThumb
- }, {
- key: "loadImage",
- value: function loadImage() {
- var _this7 = this;
+ if (thumbNum !== _this.showingThumb) {
+ _this.showingThumb = thumbNum;
+ _this.loadImage(qualityIndex);
+ }
+ });
+
+ _defineProperty(this, "loadImage", function () {
var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var thumbNum = this.showingThumb;
- var thumbnail = this.thumbnails[qualityIndex];
+ var thumbNum = _this.showingThumb;
+ var thumbnail = _this.thumbnails[qualityIndex];
var urlPrefix = thumbnail.urlPrefix;
var frame = thumbnail.frames[thumbNum];
var thumbFilename = thumbnail.frames[thumbNum].text;
var thumbUrl = urlPrefix + thumbFilename;
- if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {
+ if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {
// If we're already loading a previous image, remove its onload handler - we don't want it to load after this one
// Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort
- if (this.loadingImage && this.usingSprites) {
- this.loadingImage.onload = null;
+ if (_this.loadingImage && _this.usingSprites) {
+ _this.loadingImage.onload = null;
} // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image
// is instead used. But this causes issues with larger images in Firefox and Safari - switching between background
// images causes a flicker. Putting a new image over the top does not
@@ -28075,56 +27933,59 @@ typeof navigator === "object" && (function () {
previewImage.src = thumbUrl;
previewImage.dataset.index = thumbNum;
previewImage.dataset.filename = thumbFilename;
- this.showingThumbFilename = thumbFilename;
- this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+ _this.showingThumbFilename = thumbFilename;
+
+ _this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+
previewImage.onload = function () {
- return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
+ return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
};
- this.loadingImage = previewImage;
- this.removeOldImages(previewImage);
+ _this.loadingImage = previewImage;
+
+ _this.removeOldImages(previewImage);
} else {
// Update the existing image
- this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
- this.currentImageElement.dataset.index = thumbNum;
- this.removeOldImages(this.currentImageElement);
+ _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
+
+ _this.currentImageElement.dataset.index = thumbNum;
+
+ _this.removeOldImages(_this.currentImageElement);
}
- }
- }, {
- key: "showImage",
- value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
+ });
+
+ _defineProperty(this, "showImage", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
- this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
- this.setImageSizeAndOffset(previewImage, frame);
+
+ _this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
+
+ _this.setImageSizeAndOffset(previewImage, frame);
if (newImage) {
- this.currentImageContainer.appendChild(previewImage);
- this.currentImageElement = previewImage;
+ _this.currentImageContainer.appendChild(previewImage);
- if (!this.loadedImages.includes(thumbFilename)) {
- this.loadedImages.push(thumbFilename);
+ _this.currentImageElement = previewImage;
+
+ if (!_this.loadedImages.includes(thumbFilename)) {
+ _this.loadedImages.push(thumbFilename);
}
} // Preload images before and after the current one
// Show higher quality of the same frame
// Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
- this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
- } // Remove all preview images that aren't the designated current image
-
- }, {
- key: "removeOldImages",
- value: function removeOldImages(currentImage) {
- var _this8 = this;
+ _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
+ });
+ _defineProperty(this, "removeOldImages", function (currentImage) {
// Get a list of all images, convert it from a DOM list to an array
- Array.from(this.currentImageContainer.children).forEach(function (image) {
+ Array.from(_this.currentImageContainer.children).forEach(function (image) {
if (image.tagName.toLowerCase() !== 'img') {
return;
}
- var removeDelay = _this8.usingSprites ? 500 : 1000;
+ var removeDelay = _this.usingSprites ? 500 : 1000;
if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {
// Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients
@@ -28132,35 +27993,30 @@ typeof navigator === "object" && (function () {
// eslint-disable-next-line no-param-reassign
image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub
- var currentImageContainer = _this8.currentImageContainer;
+ var currentImageContainer = _this.currentImageContainer;
setTimeout(function () {
currentImageContainer.removeChild(image);
- _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
+ _this.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
}, removeDelay);
}
});
- } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
- // This will only preload the lowest quality
-
- }, {
- key: "preloadNearby",
- value: function preloadNearby(thumbNum) {
- var _this9 = this;
+ });
+ _defineProperty(this, "preloadNearby", function (thumbNum) {
var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return new Promise(function (resolve) {
setTimeout(function () {
- var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;
+ var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;
- if (_this9.showingThumbFilename === oldThumbFilename) {
+ if (_this.showingThumbFilename === oldThumbFilename) {
// Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away
var thumbnailsClone;
if (forward) {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);
+ thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);
} else {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();
+ thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();
}
var foundOne = false;
@@ -28169,20 +28025,20 @@ typeof navigator === "object" && (function () {
if (newThumbFilename !== oldThumbFilename) {
// Found one with a different filename. Make sure it hasn't already been loaded on this page visit
- if (!_this9.loadedImages.includes(newThumbFilename)) {
+ if (!_this.loadedImages.includes(newThumbFilename)) {
foundOne = true;
- _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
- var urlPrefix = _this9.thumbnails[0].urlPrefix;
+ var urlPrefix = _this.thumbnails[0].urlPrefix;
var thumbURL = urlPrefix + newThumbFilename;
var previewImage = new Image();
previewImage.src = thumbURL;
previewImage.onload = function () {
- _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
- if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
+ if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
resolve();
};
@@ -28196,97 +28052,91 @@ typeof navigator === "object" && (function () {
}
}, 300);
});
- } // If user has been hovering current image for half a second, look for a higher quality one
-
- }, {
- key: "getHigherQuality",
- value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {
- var _this10 = this;
+ });
- if (currentQualityIndex < this.thumbnails.length - 1) {
+ _defineProperty(this, "getHigherQuality", function (currentQualityIndex, previewImage, frame, thumbFilename) {
+ if (currentQualityIndex < _this.thumbnails.length - 1) {
// Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
var previewImageHeight = previewImage.naturalHeight;
- if (this.usingSprites) {
+ if (_this.usingSprites) {
previewImageHeight = frame.h;
}
- if (previewImageHeight < this.thumbContainerHeight) {
+ if (previewImageHeight < _this.thumbContainerHeight) {
// Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while
setTimeout(function () {
// Make sure the mouse hasn't already moved on and started hovering at another image
- if (_this10.showingThumbFilename === thumbFilename) {
- _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
+ if (_this.showingThumbFilename === thumbFilename) {
+ _this.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
- _this10.loadImage(currentQualityIndex + 1);
+ _this.loadImage(currentQualityIndex + 1);
}
}, 300);
}
}
- }
- }, {
- key: "toggleThumbContainer",
- value: function toggleThumbContainer() {
+ });
+
+ _defineProperty(this, "toggleThumbContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;
- this.elements.thumb.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;
+
+ _this.elements.thumb.container.classList.toggle(className, toggle);
if (!toggle && clearShowing) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "toggleScrubbingContainer",
- value: function toggleScrubbingContainer() {
+ });
+
+ _defineProperty(this, "toggleScrubbingContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
- this.elements.scrubbing.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
+
+ _this.elements.scrubbing.container.classList.toggle(className, toggle);
if (!toggle) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "determineContainerAutoSizing",
- value: function determineContainerAutoSizing() {
- if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {
+ });
+
+ _defineProperty(this, "determineContainerAutoSizing", function () {
+ if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {
// This will prevent auto sizing in this.setThumbContainerSizeAndPos()
- this.sizeSpecifiedInCSS = true;
+ _this.sizeSpecifiedInCSS = true;
}
- } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
+ });
- }, {
- key: "setThumbContainerSizeAndPos",
- value: function setThumbContainerSizeAndPos() {
- if (!this.sizeSpecifiedInCSS) {
- var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px");
- this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {
- var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);
+ _defineProperty(this, "setThumbContainerSizeAndPos", function () {
+ if (!_this.sizeSpecifiedInCSS) {
+ var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(_this.thumbContainerHeight, "px");
+ _this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {
+ var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {
- var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
+ _this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {
+ var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
}
- this.setThumbContainerPos();
- }
- }, {
- key: "setThumbContainerPos",
- value: function setThumbContainerPos() {
- var seekbarRect = this.player.elements.progress.getBoundingClientRect();
- var plyrRect = this.player.elements.container.getBoundingClientRect();
- var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
+ _this.setThumbContainerPos();
+ });
+
+ _defineProperty(this, "setThumbContainerPos", function () {
+ var seekbarRect = _this.player.elements.progress.getBoundingClientRect();
+
+ var plyrRect = _this.player.elements.container.getBoundingClientRect();
+
+ var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
var minVal = plyrRect.left - seekbarRect.left + 10;
var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth
- var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;
+ var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;
if (previewPos < minVal) {
previewPos = minVal;
@@ -28297,31 +28147,27 @@ typeof navigator === "object" && (function () {
}
container.style.left = "".concat(previewPos, "px");
- } // Can't use 100% width, in case the video is a different aspect ratio to the video container
+ });
- }, {
- key: "setScrubbingContainerSize",
- value: function setScrubbingContainerSize() {
- var _fitRatio = fitRatio(this.thumbAspectRatio, {
- width: this.player.media.clientWidth,
- height: this.player.media.clientHeight
+ _defineProperty(this, "setScrubbingContainerSize", function () {
+ var _fitRatio = fitRatio(_this.thumbAspectRatio, {
+ width: _this.player.media.clientWidth,
+ height: _this.player.media.clientHeight
}),
width = _fitRatio.width,
height = _fitRatio.height;
- this.elements.scrubbing.container.style.width = "".concat(width, "px");
- this.elements.scrubbing.container.style.height = "".concat(height, "px");
- } // Sprites need to be offset to the correct location
+ _this.elements.scrubbing.container.style.width = "".concat(width, "px");
+ _this.elements.scrubbing.container.style.height = "".concat(height, "px");
+ });
- }, {
- key: "setImageSizeAndOffset",
- value: function setImageSizeAndOffset(previewImage, frame) {
- if (!this.usingSprites) {
+ _defineProperty(this, "setImageSizeAndOffset", function (previewImage, frame) {
+ if (!_this.usingSprites) {
return;
} // Find difference between height and preview container height
- var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
+ var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
previewImage.style.height = "".concat(previewImage.naturalHeight * multiplier, "px"); // eslint-disable-next-line no-param-reassign
@@ -28330,8 +28176,22 @@ typeof navigator === "object" && (function () {
previewImage.style.left = "-".concat(frame.x * multiplier, "px"); // eslint-disable-next-line no-param-reassign
previewImage.style.top = "-".concat(frame.y * multiplier, "px");
- }
- }, {
+ });
+
+ this.player = player;
+ this.thumbnails = [];
+ this.loaded = false;
+ this.lastMouseMoveTime = Date.now();
+ this.mouseDown = false;
+ this.loadedImages = [];
+ this.elements = {
+ thumb: {},
+ scrubbing: {}
+ };
+ this.load();
+ }
+
+ _createClass(PreviewThumbnails, [{
key: "enabled",
get: function get() {
return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;
@@ -28577,6 +28437,214 @@ typeof navigator === "object" && (function () {
_classCallCheck(this, Plyr);
+ _defineProperty(this, "play", function () {
+ if (!is$2.function(_this.media.play)) {
+ return null;
+ } // Intecept play with ads
+
+
+ if (_this.ads && _this.ads.enabled) {
+ _this.ads.managerPromise.then(function () {
+ return _this.ads.play();
+ }).catch(function () {
+ return silencePromise(_this.media.play());
+ });
+ } // Return the promise (for HTML5)
+
+
+ return _this.media.play();
+ });
+
+ _defineProperty(this, "pause", function () {
+ if (!_this.playing || !is$2.function(_this.media.pause)) {
+ return null;
+ }
+
+ return _this.media.pause();
+ });
+
+ _defineProperty(this, "togglePlay", function (input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is$2.boolean(input) ? input : !_this.playing;
+
+ if (toggle) {
+ return _this.play();
+ }
+
+ return _this.pause();
+ });
+
+ _defineProperty(this, "stop", function () {
+ if (_this.isHTML5) {
+ _this.pause();
+
+ _this.restart();
+ } else if (is$2.function(_this.media.stop)) {
+ _this.media.stop();
+ }
+ });
+
+ _defineProperty(this, "restart", function () {
+ _this.currentTime = 0;
+ });
+
+ _defineProperty(this, "rewind", function (seekTime) {
+ _this.currentTime -= is$2.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "forward", function (seekTime) {
+ _this.currentTime += is$2.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "increaseVolume", function (step) {
+ var volume = _this.media.muted ? 0 : _this.volume;
+ _this.volume = volume + (is$2.number(step) ? step : 0);
+ });
+
+ _defineProperty(this, "decreaseVolume", function (step) {
+ _this.increaseVolume(-step);
+ });
+
+ _defineProperty(this, "airplay", function () {
+ // Show dialog if supported
+ if (support.airplay) {
+ _this.media.webkitShowPlaybackTargetPicker();
+ }
+ });
+
+ _defineProperty(this, "toggleControls", function (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 && is$2.array(_this.config.controls) && _this.config.controls.includes('settings') && !is$2.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;
+ });
+
+ _defineProperty(this, "on", function (event, callback) {
+ on.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "once", function (event, callback) {
+ once.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "off", function (event, callback) {
+ off(_this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "destroy", function (callback) {
+ 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
+
+ _this.embed = null; // If it's a soft destroy, make minimal changes
+
+ if (soft) {
+ if (Object.keys(_this.elements).length) {
+ // Remove elements
+ removeElement(_this.elements.buttons.play);
+ removeElement(_this.elements.captions);
+ removeElement(_this.elements.controls);
+ removeElement(_this.elements.wrapper); // Clear for GC
+
+ _this.elements.buttons.play = null;
+ _this.elements.captions = null;
+ _this.elements.controls = null;
+ _this.elements.wrapper = null;
+ } // Callback
+
+
+ if (is$2.function(callback)) {
+ callback();
+ }
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this); // Cancel current network requests
+
+ html5.cancelRequests.call(_this); // Replace the container with the original element provided
+
+ replaceElement(_this.elements.original, _this.elements.container); // Event
+
+ triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback
+
+ if (is$2.function(callback)) {
+ callback.call(_this.elements.original);
+ } // Reset state
+
+
+ _this.ready = false; // Clear for garbage collection
+
+ setTimeout(function () {
+ _this.elements = null;
+ _this.media = null;
+ }, 200);
+ }
+ }; // Stop playback
+
+
+ _this.stop(); // Clear timeouts
+
+
+ clearTimeout(_this.timers.loading);
+ clearTimeout(_this.timers.controls);
+ clearTimeout(_this.timers.resized); // Provider specific stuff
+
+ if (_this.isHTML5) {
+ // 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$2.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);
+ }
+ });
+
+ _defineProperty(this, "supports", function (type) {
+ return support.mime.call(_this, type);
+ });
+
this.timers = {}; // State
this.ready = false;
@@ -28673,12 +28741,13 @@ typeof navigator === "object" && (function () {
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 _type = this.media.tagName.toLowerCase(); // Embed properties
+
var iframe = null;
var url = null; // Different setup based on type
- switch (type) {
+ switch (_type) {
case 'div':
// Find the frame
iframe = this.media.querySelector('iframe'); // <iframe> type
@@ -28721,7 +28790,7 @@ typeof navigator === "object" && (function () {
} // Unsupported or missing provider
- if (is$2.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ if (is$2.empty(this.provider) || !Object.values(providers).includes(this.provider)) {
this.debug.error('Setup failed: Invalid provider');
return;
} // Audio will come later for external providers
@@ -28732,7 +28801,7 @@ typeof navigator === "object" && (function () {
case 'video':
case 'audio':
- this.type = type;
+ this.type = _type;
this.provider = providers.html5; // Get config from attributes
if (this.media.hasAttribute('crossorigin')) {
@@ -28838,139 +28907,6 @@ typeof navigator === "object" && (function () {
_createClass(Plyr, [{
- key: "play",
-
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- var _this2 = this;
-
- if (!is$2.function(this.media.play)) {
- return null;
- } // Intecept play with ads
-
-
- if (this.ads && this.ads.enabled) {
- this.ads.managerPromise.then(function () {
- return _this2.ads.play();
- }).catch(function () {
- return silencePromise(_this2.media.play());
- });
- } // Return the promise (for HTML5)
-
-
- return this.media.play();
- }
- /**
- * Pause the media
- */
-
- }, {
- key: "pause",
- value: function pause() {
- if (!this.playing || !is$2.function(this.media.pause)) {
- return null;
- }
-
- 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$2.boolean(input) ? input : !this.playing;
-
- if (toggle) {
- return this.play();
- }
-
- return this.pause();
- }
- /**
- * Stop playback
- */
-
- }, {
- key: "stop",
- value: function stop() {
- if (this.isHTML5) {
- this.pause();
- this.restart();
- } else if (is$2.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 -= is$2.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 += is$2.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$2.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",
/**
@@ -28986,202 +28922,6 @@ typeof navigator === "object" && (function () {
*/
}, {
- 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 && is$2.array(this.config.controls) && this.config.controls.includes('settings') && !is$2.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 _this3 = 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
-
- _this3.embed = null; // If it's a soft destroy, make minimal changes
-
- if (soft) {
- if (Object.keys(_this3.elements).length) {
- // Remove elements
- removeElement(_this3.elements.buttons.play);
- removeElement(_this3.elements.captions);
- removeElement(_this3.elements.controls);
- removeElement(_this3.elements.wrapper); // Clear for GC
-
- _this3.elements.buttons.play = null;
- _this3.elements.captions = null;
- _this3.elements.controls = null;
- _this3.elements.wrapper = null;
- } // Callback
-
-
- if (is$2.function(callback)) {
- callback();
- }
- } else {
- // Unbind listeners
- unbindListeners.call(_this3); // Cancel current network requests
-
- html5.cancelRequests.call(_this3); // Replace the container with the original element provided
-
- replaceElement(_this3.elements.original, _this3.elements.container); // Event
-
- triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback
-
- if (is$2.function(callback)) {
- callback.call(_this3.elements.original);
- } // Reset state
-
-
- _this3.ready = false; // Clear for garbage collection
-
- setTimeout(function () {
- _this3.elements = null;
- _this3.media = null;
- }, 200);
- }
- }; // Stop playback
-
-
- this.stop(); // Clear timeouts
-
- clearTimeout(this.timers.loading);
- clearTimeout(this.timers.controls);
- clearTimeout(this.timers.resized); // Provider specific stuff
-
- if (this.isHTML5) {
- // 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$2.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 {Boolean} inline - Where player has `playsinline` sttribute
- */
-
- }, {
key: "isHTML5",
get: function get() {
return this.provider === providers.html5;
@@ -29211,8 +28951,16 @@ typeof navigator === "object" && (function () {
get: function get() {
return this.type === types.audio;
}
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+
}, {
key: "playing",
+
+ /**
+ * Get playing state
+ */
get: function get() {
return Boolean(this.ready && !this.paused && !this.ended);
}
@@ -29243,8 +28991,18 @@ typeof navigator === "object" && (function () {
get: function get() {
return Boolean(this.media.ended);
}
+ /**
+ * Toggle playback based on current status
+ * @param {Boolean} input
+ */
+
}, {
key: "currentTime",
+
+ /**
+ * Seek to a time
+ * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
set: function set(input) {
// Bail if media duration isn't available yet
if (!this.duration) {
@@ -29363,8 +29121,18 @@ typeof navigator === "object" && (function () {
get: function get() {
return Number(this.media.volume);
}
+ /**
+ * Increase volume
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
+ */
+
}, {
key: "muted",
+
+ /**
+ * Set muted state
+ * @param {Boolean} mute
+ */
set: function set(mute) {
var toggle = mute; // Load muted state from storage
@@ -29416,7 +29184,7 @@ typeof navigator === "object" && (function () {
}, {
key: "speed",
set: function set(input) {
- var _this4 = this;
+ var _this2 = this;
var speed = null;
@@ -29440,7 +29208,7 @@ typeof navigator === "object" && (function () {
this.config.speed.selected = speed; // Set media speed
setTimeout(function () {
- _this4.media.playbackRate = speed;
+ _this2.media.playbackRate = speed;
}, 0);
}
/**
@@ -29788,8 +29556,20 @@ typeof navigator === "object" && (function () {
return this.media === document.pictureInPictureElement;
}
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+
}], [{
key: "supported",
+
+ /**
+ * Check for support
+ * @param {String} type - Player type (audio/video)
+ * @param {String} provider - Provider (html5/youtube/vimeo)
+ * @param {Boolean} inline - Where player has `playsinline` sttribute
+ */
value: function supported(type, provider, inline) {
return support.check(type, provider, inline);
}
diff --git a/demo/dist/demo.min.js b/demo/dist/demo.min.js
index a16eb974..04979e45 100644
--- a/demo/dist/demo.min.js
+++ b/demo/dist/demo.min.js
@@ -1,4 +1,4 @@
-"object"==typeof navigator&&function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"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=function(e){return e&&e.Math==Math&&e},r=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")(),i=function(e){try{return!!e()}catch(e){return!0}},o=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,c={f:s&&!a.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:a},u=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},l={}.toString,f=function(e){return l.call(e).slice(8,-1)},h="".split,p=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?h.call(e,""):Object(e)}:Object,d=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},g=function(e){return p(d(e))},m=function(e){return"object"==typeof e?null!==e:"function"==typeof e},v=function(e,t){if(!m(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!m(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!m(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!m(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},w=r.document,_=m(w)&&m(w.createElement),E=function(e){return _?w.createElement(e):{}},k=!o&&!i((function(){return 7!=Object.defineProperty(E("div"),"a",{get:function(){return 7}}).a})),S=Object.getOwnPropertyDescriptor,T={f:o?S:function(e,t){if(e=g(e),t=v(t,!0),k)try{return S(e,t)}catch(e){}if(b(e,t))return u(!c.f.call(e,t),e[t])}},x=function(e){if(!m(e))throw TypeError(String(e)+" is not an object");return e},A=Object.defineProperty,O={f:o?A:function(e,t,n){if(x(e),t=v(t,!0),x(n),k)try{return A(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}},P=o?function(e,t,n){return O.f(e,t,u(1,n))}:function(e,t,n){return e[t]=n,e},C=function(e,t){try{P(r,e,t)}catch(n){r[e]=t}return t},I="__core-js_shared__",j=r[I]||C(I,{}),R=Function.toString;"function"!=typeof j.inspectSource&&(j.inspectSource=function(e){return R.call(e)});var L,N,M,U=j.inspectSource,D=r.WeakMap,F="function"==typeof D&&/native code/.test(U(D)),B=t((function(e){(e.exports=function(e,t){return j[e]||(j[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),q=0,H=Math.random(),V=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++q+H).toString(36)},W=B("keys"),z=function(e){return W[e]||(W[e]=V(e))},Y={},$=r.WeakMap;if(F){var G=new $,K=G.get,X=G.has,J=G.set;L=function(e,t){return J.call(G,e,t),t},N=function(e){return K.call(G,e)||{}},M=function(e){return X.call(G,e)}}else{var Q=z("state");Y[Q]=!0,L=function(e,t){return P(e,Q,t),t},N=function(e){return b(e,Q)?e[Q]:{}},M=function(e){return b(e,Q)}}var Z={set:L,get:N,has:M,enforce:function(e){return M(e)?N(e):L(e,{})},getterFor:function(e){return function(t){var n;if(!m(t)||(n=N(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},ee=t((function(e){var t=Z.get,n=Z.enforce,i=String(String).split("String");(e.exports=function(e,t,o,a){var s=!!a&&!!a.unsafe,c=!!a&&!!a.enumerable,u=!!a&&!!a.noTargetGet;"function"==typeof o&&("string"!=typeof t||b(o,"name")||P(o,"name",t),n(o).source=i.join("string"==typeof t?t:"")),e!==r?(s?!u&&e[t]&&(c=!0):delete e[t],c?e[t]=o:P(e,t,o)):c?e[t]=o:C(t,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||U(this)}))})),te=r,ne=function(e){return"function"==typeof e?e:void 0},re=function(e,t){return arguments.length<2?ne(te[e])||ne(r[e]):te[e]&&te[e][t]||r[e]&&r[e][t]},ie=Math.ceil,oe=Math.floor,ae=function(e){return isNaN(e=+e)?0:(e>0?oe:ie)(e)},se=Math.min,ce=function(e){return e>0?se(ae(e),9007199254740991):0},ue=Math.max,le=Math.min,fe=function(e,t){var n=ae(e);return n<0?ue(n+t,0):le(n,t)},he=function(e){return function(t,n,r){var i,o=g(t),a=ce(o.length),s=fe(r,a);if(e&&n!=n){for(;a>s;)if((i=o[s++])!=i)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},pe={includes:he(!0),indexOf:he(!1)},de=pe.indexOf,ge=function(e,t){var n,r=g(e),i=0,o=[];for(n in r)!b(Y,n)&&b(r,n)&&o.push(n);for(;t.length>i;)b(r,n=t[i++])&&(~de(o,n)||o.push(n));return o},me=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ve=me.concat("length","prototype"),ye={f:Object.getOwnPropertyNames||function(e){return ge(e,ve)}},be={f:Object.getOwnPropertySymbols},we=re("Reflect","ownKeys")||function(e){var t=ye.f(x(e)),n=be.f;return n?t.concat(n(e)):t},_e=function(e,t){for(var n=we(t),r=O.f,i=T.f,o=0;o<n.length;o++){var a=n[o];b(e,a)||r(e,a,i(t,a))}},Ee=/#|\.prototype\./,ke=function(e,t){var n=Te[Se(e)];return n==Ae||n!=xe&&("function"==typeof t?i(t):!!t)},Se=ke.normalize=function(e){return String(e).replace(Ee,".").toLowerCase()},Te=ke.data={},xe=ke.NATIVE="N",Ae=ke.POLYFILL="P",Oe=ke,Pe=T.f,Ce=function(e,t){var n,i,o,a,s,c=e.target,u=e.global,l=e.stat;if(n=u?r:l?r[c]||C(c,{}):(r[c]||{}).prototype)for(i in t){if(a=t[i],o=e.noTargetGet?(s=Pe(n,i))&&s.value:n[i],!Oe(u?i:c+(l?".":"#")+i,e.forced)&&void 0!==o){if(typeof a==typeof o)continue;_e(a,o)}(e.sham||o&&o.sham)&&P(a,"sham",!0),ee(n,i,a,e)}},Ie=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},je=function(e,t,n){if(Ie(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},Re=function(e){return Object(d(e))},Le=Array.isArray||function(e){return"Array"==f(e)},Ne=!!Object.getOwnPropertySymbols&&!i((function(){return!String(Symbol())})),Me=Ne&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Ue=B("wks"),De=r.Symbol,Fe=Me?De:De&&De.withoutSetter||V,Be=function(e){return b(Ue,e)||(Ne&&b(De,e)?Ue[e]=De[e]:Ue[e]=Fe("Symbol."+e)),Ue[e]},qe=Be("species"),He=function(e,t){var n;return Le(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!Le(n.prototype)?m(n)&&null===(n=n[qe])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},Ve=[].push,We=function(e){var t=1==e,n=2==e,r=3==e,i=4==e,o=6==e,a=5==e||o;return function(s,c,u,l){for(var f,h,d=Re(s),g=p(d),m=je(c,u,3),v=ce(g.length),y=0,b=l||He,w=t?b(s,v):n?b(s,0):void 0;v>y;y++)if((a||y in g)&&(h=m(f=g[y],y,d),e))if(t)w[y]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:Ve.call(w,f)}else if(i)return!1;return o?-1:r||i?i:w}},ze={forEach:We(0),map:We(1),filter:We(2),some:We(3),every:We(4),find:We(5),findIndex:We(6)},Ye=function(e,t){var n=[][e];return!!n&&i((function(){n.call(null,t||function(){throw 1},1)}))},$e=Object.defineProperty,Ge={},Ke=function(e){throw e},Xe=function(e,t){if(b(Ge,e))return Ge[e];t||(t={});var n=[][e],r=!!b(t,"ACCESSORS")&&t.ACCESSORS,a=b(t,0)?t[0]:Ke,s=b(t,1)?t[1]:void 0;return Ge[e]=!!n&&!i((function(){if(r&&!o)return!0;var e={length:-1};r?$e(e,1,{enumerable:!0,get:Ke}):e[1]=1,n.call(e,a,s)}))},Je=ze.forEach,Qe=Ye("forEach"),Ze=Xe("forEach"),et=Qe&&Ze?[].forEach:function(e){return Je(this,e,arguments.length>1?arguments[1]:void 0)};Ce({target:"Array",proto:!0,forced:[].forEach!=et},{forEach:et});var tt=function(e,t,n,r){try{return r?t(x(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&x(i.call(e)),t}},nt={},rt=Be("iterator"),it=Array.prototype,ot=function(e){return void 0!==e&&(nt.Array===e||it[rt]===e)},at=function(e,t,n){var r=v(t);r in e?O.f(e,r,u(0,n)):e[r]=n},st={};st[Be("toStringTag")]="z";var ct="[object z]"===String(st),ut=Be("toStringTag"),lt="Arguments"==f(function(){return arguments}()),ft=ct?f:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),ut))?n:lt?f(t):"Object"==(r=f(t))&&"function"==typeof t.callee?"Arguments":r},ht=Be("iterator"),pt=function(e){if(null!=e)return e[ht]||e["@@iterator"]||nt[ft(e)]},dt=function(e){var t,n,r,i,o,a,s=Re(e),c="function"==typeof this?this:Array,u=arguments.length,l=u>1?arguments[1]:void 0,f=void 0!==l,h=pt(s),p=0;if(f&&(l=je(l,u>2?arguments[2]:void 0,2)),null==h||c==Array&&ot(h))for(n=new c(t=ce(s.length));t>p;p++)a=f?l(s[p],p):s[p],at(n,p,a);else for(o=(i=h.call(s)).next,n=new c;!(r=o.call(i)).done;p++)a=f?tt(i,l,[r.value,p],!0):r.value,at(n,p,a);return n.length=p,n},gt=Be("iterator"),mt=!1;try{var vt=0,yt={next:function(){return{done:!!vt++}},return:function(){mt=!0}};yt[gt]=function(){return this},Array.from(yt,(function(){throw 2}))}catch(e){}var bt=function(e,t){if(!t&&!mt)return!1;var n=!1;try{var r={};r[gt]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},wt=!bt((function(e){Array.from(e)}));Ce({target:"Array",stat:!0,forced:wt},{from:dt});var _t,Et=Object.keys||function(e){return ge(e,me)},kt=o?Object.defineProperties:function(e,t){x(e);for(var n,r=Et(t),i=r.length,o=0;i>o;)O.f(e,n=r[o++],t[n]);return e},St=re("document","documentElement"),Tt=z("IE_PROTO"),xt=function(){},At=function(e){return"<script>"+e+"</"+"script>"},Ot=function(){try{_t=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t;Ot=_t?function(e){e.write(At("")),e.close();var t=e.parentWindow.Object;return e=null,t}(_t):((t=E("iframe")).style.display="none",St.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(At("document.F=Object")),e.close(),e.F);for(var n=me.length;n--;)delete Ot.prototype[me[n]];return Ot()};Y[Tt]=!0;var Pt=Object.create||function(e,t){var n;return null!==e?(xt.prototype=x(e),n=new xt,xt.prototype=null,n[Tt]=e):n=Ot(),void 0===t?n:kt(n,t)},Ct=Be("unscopables"),It=Array.prototype;null==It[Ct]&&O.f(It,Ct,{configurable:!0,value:Pt(null)});var jt=function(e){It[Ct][e]=!0},Rt=pe.includes,Lt=Xe("indexOf",{ACCESSORS:!0,1:0});Ce({target:"Array",proto:!0,forced:!Lt},{includes:function(e){return Rt(this,e,arguments.length>1?arguments[1]:void 0)}}),jt("includes");var Nt,Mt,Ut=re("navigator","userAgent")||"",Dt=r.process,Ft=Dt&&Dt.versions,Bt=Ft&&Ft.v8;Bt?Mt=(Nt=Bt.split("."))[0]+Nt[1]:Ut&&(!(Nt=Ut.match(/Edge\/(\d+)/))||Nt[1]>=74)&&(Nt=Ut.match(/Chrome\/(\d+)/))&&(Mt=Nt[1]);var qt=Mt&&+Mt,Ht=Be("species"),Vt=function(e){return qt>=51||!i((function(){var t=[];return(t.constructor={})[Ht]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Wt=ze.map,zt=Vt("map"),Yt=Xe("map");Ce({target:"Array",proto:!0,forced:!zt||!Yt},{map:function(e){return Wt(this,e,arguments.length>1?arguments[1]:void 0)}});var $t=i((function(){Et(1)}));Ce({target:"Object",stat:!0,forced:$t},{keys:function(e){return Et(Re(e))}});var Gt=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return x(n),function(e){if(!m(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype")}(r),t?e.call(n,r):n.__proto__=r,n}}():void 0),Kt=function(e,t,n){var r,i;return Gt&&"function"==typeof(r=t.constructor)&&r!==n&&m(i=r.prototype)&&i!==n.prototype&&Gt(e,i),e},Xt=Be("match"),Jt=function(e){var t;return m(e)&&(void 0!==(t=e[Xt])?!!t:"RegExp"==f(e))},Qt=function(){var e=x(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function Zt(e,t){return RegExp(e,t)}var en={UNSUPPORTED_Y:i((function(){var e=Zt("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:i((function(){var e=Zt("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},tn=Be("species"),nn=function(e){var t=re(e),n=O.f;o&&t&&!t[tn]&&n(t,tn,{configurable:!0,get:function(){return this}})},rn=O.f,on=ye.f,an=Z.set,sn=Be("match"),cn=r.RegExp,un=cn.prototype,ln=/a/g,fn=/a/g,hn=new cn(ln)!==ln,pn=en.UNSUPPORTED_Y;if(o&&Oe("RegExp",!hn||pn||i((function(){return fn[sn]=!1,cn(ln)!=ln||cn(fn)==fn||"/a/i"!=cn(ln,"i")})))){for(var dn=function(e,t){var n,r=this instanceof dn,i=Jt(e),o=void 0===t;if(!r&&i&&e.constructor===dn&&o)return e;hn?i&&!o&&(e=e.source):e instanceof dn&&(o&&(t=Qt.call(e)),e=e.source),pn&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var a=Kt(hn?new cn(e,t):cn(e,t),r?this:un,dn);return pn&&n&&an(a,{sticky:n}),a},gn=function(e){e in dn||rn(dn,e,{configurable:!0,get:function(){return cn[e]},set:function(t){cn[e]=t}})},mn=on(cn),vn=0;mn.length>vn;)gn(mn[vn++]);un.constructor=dn,dn.prototype=un,ee(r,"RegExp",dn)}nn("RegExp");var yn=RegExp.prototype.exec,bn=String.prototype.replace,wn=yn,_n=function(){var e=/a/,t=/b*/g;return yn.call(e,"a"),yn.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),En=en.UNSUPPORTED_Y||en.BROKEN_CARET,kn=void 0!==/()??/.exec("")[1];(_n||kn||En)&&(wn=function(e){var t,n,r,i,o=this,a=En&&o.sticky,s=Qt.call(o),c=o.source,u=0,l=e;return a&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),l=String(e).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==e[o.lastIndex-1])&&(c="(?: "+c+")",l=" "+l,u++),n=new RegExp("^(?:"+c+")",s)),kn&&(n=new RegExp("^"+c+"$(?!\\s)",s)),_n&&(t=o.lastIndex),r=yn.call(a?n:o,l),a?r?(r.input=r.input.slice(u),r[0]=r[0].slice(u),r.index=o.lastIndex,o.lastIndex+=r[0].length):o.lastIndex=0:_n&&r&&(o.lastIndex=o.global?r.index+r[0].length:t),kn&&r&&r.length>1&&bn.call(r[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r});var Sn=wn;Ce({target:"RegExp",proto:!0,forced:/./.exec!==Sn},{exec:Sn});var Tn="toString",xn=RegExp.prototype,An=xn.toString,On=i((function(){return"/a/b"!=An.call({source:"a",flags:"b"})})),Pn=An.name!=Tn;(On||Pn)&&ee(RegExp.prototype,Tn,(function(){var e=x(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in xn)?Qt.call(e):n)}),{unsafe:!0});var Cn=function(e){if(Jt(e))throw TypeError("The method doesn't accept regular expressions");return e},In=Be("match");Ce({target:"String",proto:!0,forced:!function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[In]=!1,"/./"[e](t)}catch(e){}}return!1}("includes")},{includes:function(e){return!!~String(d(this)).indexOf(Cn(e),arguments.length>1?arguments[1]:void 0)}});var jn,Rn,Ln,Nn=function(e){return function(t,n){var r,i,o=String(d(t)),a=ae(n),s=o.length;return a<0||a>=s?e?"":void 0:(r=o.charCodeAt(a))<55296||r>56319||a+1===s||(i=o.charCodeAt(a+1))<56320||i>57343?e?o.charAt(a):r:e?o.slice(a,a+2):i-56320+(r-55296<<10)+65536}},Mn={codeAt:Nn(!1),charAt:Nn(!0)},Un=!i((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),Dn=z("IE_PROTO"),Fn=Object.prototype,Bn=Un?Object.getPrototypeOf:function(e){return e=Re(e),b(e,Dn)?e[Dn]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Fn:null},qn=Be("iterator"),Hn=!1;[].keys&&("next"in(Ln=[].keys())?(Rn=Bn(Bn(Ln)))!==Object.prototype&&(jn=Rn):Hn=!0),null==jn&&(jn={}),b(jn,qn)||P(jn,qn,(function(){return this}));var Vn={IteratorPrototype:jn,BUGGY_SAFARI_ITERATORS:Hn},Wn=O.f,zn=Be("toStringTag"),Yn=function(e,t,n){e&&!b(e=n?e:e.prototype,zn)&&Wn(e,zn,{configurable:!0,value:t})},$n=Vn.IteratorPrototype,Gn=function(){return this},Kn=function(e,t,n){var r=t+" Iterator";return e.prototype=Pt($n,{next:u(1,n)}),Yn(e,r,!1),nt[r]=Gn,e},Xn=Vn.IteratorPrototype,Jn=Vn.BUGGY_SAFARI_ITERATORS,Qn=Be("iterator"),Zn="keys",er="values",tr="entries",nr=function(){return this},rr=function(e,t,n,r,i,o,a){Kn(n,t,r);var s,c,u,l=function(e){if(e===i&&g)return g;if(!Jn&&e in p)return p[e];switch(e){case Zn:case er:case tr:return function(){return new n(this,e)}}return function(){return new n(this)}},f=t+" Iterator",h=!1,p=e.prototype,d=p[Qn]||p["@@iterator"]||i&&p[i],g=!Jn&&d||l(i),m="Array"==t&&p.entries||d;if(m&&(s=Bn(m.call(new e)),Xn!==Object.prototype&&s.next&&(Bn(s)!==Xn&&(Gt?Gt(s,Xn):"function"!=typeof s[Qn]&&P(s,Qn,nr)),Yn(s,f,!0))),i==er&&d&&d.name!==er&&(h=!0,g=function(){return d.call(this)}),p[Qn]!==g&&P(p,Qn,g),nt[t]=g,i)if(c={values:l(er),keys:o?g:l(Zn),entries:l(tr)},a)for(u in c)(Jn||h||!(u in p))&&ee(p,u,c[u]);else Ce({target:t,proto:!0,forced:Jn||h},c);return c},ir=Mn.charAt,or="String Iterator",ar=Z.set,sr=Z.getterFor(or);rr(String,"String",(function(e){ar(this,{type:or,string:String(e),index:0})}),(function(){var e,t=sr(this),n=t.string,r=t.index;return r>=n.length?{value:void 0,done:!0}:(e=ir(n,r),t.index+=e.length,{value:e,done:!1})}));var cr={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0};for(var ur in cr){var lr=r[ur],fr=lr&&lr.prototype;if(fr&&fr.forEach!==et)try{P(fr,"forEach",et)}catch(e){fr.forEach=et}}var hr=document.getElementById("container"),pr="tab-focus";document.addEventListener("focusout",(function(e){e.target.classList&&!hr.contains(e.target)&&e.target.classList.remove(pr)})),document.addEventListener("keydown",(function(e){9===e.keyCode&&setTimeout((function(){var e=document.activeElement;e&&e.classList&&!hr.contains(e)&&e.classList.add(pr)}),10)})),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,r;return(t=t||{}).bubbles=!!t.bubbles,t.cancelable=!!t.cancelable,(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.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 dr=ye.f,gr={}.toString,mr="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],vr={f:function(e){return mr&&"[object Window]"==gr.call(e)?function(e){try{return dr(e)}catch(e){return mr.slice()}}(e):dr(g(e))}},yr={f:Be},br=O.f,wr=function(e){var t=te.Symbol||(te.Symbol={});b(t,e)||br(t,e,{value:yr.f(e)})},_r=ze.forEach,Er=z("hidden"),kr="Symbol",Sr=Be("toPrimitive"),Tr=Z.set,xr=Z.getterFor(kr),Ar=Object.prototype,Or=r.Symbol,Pr=re("JSON","stringify"),Cr=T.f,Ir=O.f,jr=vr.f,Rr=c.f,Lr=B("symbols"),Nr=B("op-symbols"),Mr=B("string-to-symbol-registry"),Ur=B("symbol-to-string-registry"),Dr=B("wks"),Fr=r.QObject,Br=!Fr||!Fr.prototype||!Fr.prototype.findChild,qr=o&&i((function(){return 7!=Pt(Ir({},"a",{get:function(){return Ir(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=Cr(Ar,t);r&&delete Ar[t],Ir(e,t,n),r&&e!==Ar&&Ir(Ar,t,r)}:Ir,Hr=function(e,t){var n=Lr[e]=Pt(Or.prototype);return Tr(n,{type:kr,tag:e,description:t}),o||(n.description=t),n},Vr=Me?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof Or},Wr=function(e,t,n){e===Ar&&Wr(Nr,t,n),x(e);var r=v(t,!0);return x(n),b(Lr,r)?(n.enumerable?(b(e,Er)&&e[Er][r]&&(e[Er][r]=!1),n=Pt(n,{enumerable:u(0,!1)})):(b(e,Er)||Ir(e,Er,u(1,{})),e[Er][r]=!0),qr(e,r,n)):Ir(e,r,n)},zr=function(e,t){x(e);var n=g(t),r=Et(n).concat(Kr(n));return _r(r,(function(t){o&&!Yr.call(n,t)||Wr(e,t,n[t])})),e},Yr=function(e){var t=v(e,!0),n=Rr.call(this,t);return!(this===Ar&&b(Lr,t)&&!b(Nr,t))&&(!(n||!b(this,t)||!b(Lr,t)||b(this,Er)&&this[Er][t])||n)},$r=function(e,t){var n=g(e),r=v(t,!0);if(n!==Ar||!b(Lr,r)||b(Nr,r)){var i=Cr(n,r);return!i||!b(Lr,r)||b(n,Er)&&n[Er][r]||(i.enumerable=!0),i}},Gr=function(e){var t=jr(g(e)),n=[];return _r(t,(function(e){b(Lr,e)||b(Y,e)||n.push(e)})),n},Kr=function(e){var t=e===Ar,n=jr(t?Nr:g(e)),r=[];return _r(n,(function(e){!b(Lr,e)||t&&!b(Ar,e)||r.push(Lr[e])})),r};if(Ne||(ee((Or=function(){if(this instanceof Or)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=V(e),n=function(e){this===Ar&&n.call(Nr,e),b(this,Er)&&b(this[Er],t)&&(this[Er][t]=!1),qr(this,t,u(1,e))};return o&&Br&&qr(Ar,t,{configurable:!0,set:n}),Hr(t,e)}).prototype,"toString",(function(){return xr(this).tag})),ee(Or,"withoutSetter",(function(e){return Hr(V(e),e)})),c.f=Yr,O.f=Wr,T.f=$r,ye.f=vr.f=Gr,be.f=Kr,yr.f=function(e){return Hr(Be(e),e)},o&&(Ir(Or.prototype,"description",{configurable:!0,get:function(){return xr(this).description}}),ee(Ar,"propertyIsEnumerable",Yr,{unsafe:!0}))),Ce({global:!0,wrap:!0,forced:!Ne,sham:!Ne},{Symbol:Or}),_r(Et(Dr),(function(e){wr(e)})),Ce({target:kr,stat:!0,forced:!Ne},{for:function(e){var t=String(e);if(b(Mr,t))return Mr[t];var n=Or(t);return Mr[t]=n,Ur[n]=t,n},keyFor:function(e){if(!Vr(e))throw TypeError(e+" is not a symbol");if(b(Ur,e))return Ur[e]},useSetter:function(){Br=!0},useSimple:function(){Br=!1}}),Ce({target:"Object",stat:!0,forced:!Ne,sham:!o},{create:function(e,t){return void 0===t?Pt(e):zr(Pt(e),t)},defineProperty:Wr,defineProperties:zr,getOwnPropertyDescriptor:$r}),Ce({target:"Object",stat:!0,forced:!Ne},{getOwnPropertyNames:Gr,getOwnPropertySymbols:Kr}),Ce({target:"Object",stat:!0,forced:i((function(){be.f(1)}))},{getOwnPropertySymbols:function(e){return be.f(Re(e))}}),Pr){var Xr=!Ne||i((function(){var e=Or();return"[null]"!=Pr([e])||"{}"!=Pr({a:e})||"{}"!=Pr(Object(e))}));Ce({target:"JSON",stat:!0,forced:Xr},{stringify:function(e,t,n){for(var r,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(r=t,(m(t)||void 0!==e)&&!Vr(e))return Le(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!Vr(t))return t}),i[1]=t,Pr.apply(null,i)}})}Or.prototype[Sr]||P(Or.prototype,Sr,Or.prototype.valueOf),Yn(Or,kr),Y[Er]=!0;var Jr=O.f,Qr=r.Symbol;if(o&&"function"==typeof Qr&&(!("description"in Qr.prototype)||void 0!==Qr().description)){var Zr={},ei=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof ei?new Qr(e):void 0===e?Qr():Qr(e);return""===e&&(Zr[t]=!0),t};_e(ei,Qr);var ti=ei.prototype=Qr.prototype;ti.constructor=ei;var ni=ti.toString,ri="Symbol(test)"==String(Qr("test")),ii=/^Symbol\((.*)\)[^)]+$/;Jr(ti,"description",{configurable:!0,get:function(){var e=m(this)?this.valueOf():this,t=ni.call(e);if(b(Zr,e))return"";var n=ri?t.slice(7,-1):t.replace(ii,"$1");return""===n?void 0:n}}),Ce({global:!0,forced:!0},{Symbol:ei})}wr("iterator");var oi=pe.indexOf,ai=[].indexOf,si=!!ai&&1/[1].indexOf(1,-0)<0,ci=Ye("indexOf"),ui=Xe("indexOf",{ACCESSORS:!0,1:0});Ce({target:"Array",proto:!0,forced:si||!ci||!ui},{indexOf:function(e){return si?ai.apply(this,arguments)||0:oi(this,e,arguments.length>1?arguments[1]:void 0)}});var li="Array Iterator",fi=Z.set,hi=Z.getterFor(li),pi=rr(Array,"Array",(function(e,t){fi(this,{type:li,target:g(e),index:0,kind:t})}),(function(){var e=hi(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");nt.Arguments=nt.Array,jt("keys"),jt("values"),jt("entries");var di=[].join,gi=p!=Object,mi=Ye("join",",");Ce({target:"Array",proto:!0,forced:gi||!mi},{join:function(e){return di.call(g(this),void 0===e?",":e)}});var vi=Vt("slice"),yi=Xe("slice",{ACCESSORS:!0,0:0,1:2}),bi=Be("species"),wi=[].slice,_i=Math.max;Ce({target:"Array",proto:!0,forced:!vi||!yi},{slice:function(e,t){var n,r,i,o=g(this),a=ce(o.length),s=fe(e,a),c=fe(void 0===t?a:t,a);if(Le(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!Le(n.prototype)?m(n)&&null===(n=n[bi])&&(n=void 0):n=void 0,n===Array||void 0===n))return wi.call(o,s,c);for(r=new(void 0===n?Array:n)(_i(c-s,0)),i=0;s<c;s++,i++)s in o&&at(r,i,o[s]);return r.length=i,r}});var Ei=ct?{}.toString:function(){return"[object "+ft(this)+"]"};ct||ee(Object.prototype,"toString",Ei,{unsafe:!0});var ki=Be("species"),Si=!i((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),Ti="$0"==="a".replace(/./,"$0"),xi=Be("replace"),Ai=!!/./[xi]&&""===/./[xi]("a","$0"),Oi=!i((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),Pi=function(e,t,n,r){var o=Be(e),a=!i((function(){var t={};return t[o]=function(){return 7},7!=""[e](t)})),s=a&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[ki]=function(){return n},n.flags="",n[o]=/./[o]),n.exec=function(){return t=!0,null},n[o](""),!t}));if(!a||!s||"replace"===e&&(!Si||!Ti||Ai)||"split"===e&&!Oi){var c=/./[o],u=n(o,""[e],(function(e,t,n,r,i){return t.exec===Sn?a&&!i?{done:!0,value:c.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:Ti,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:Ai}),l=u[0],f=u[1];ee(String.prototype,e,l),ee(RegExp.prototype,o,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}r&&P(RegExp.prototype[o],"sham",!0)},Ci=Mn.charAt,Ii=function(e,t,n){return t+(n?Ci(e,t).length:1)},ji=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==f(e))throw TypeError("RegExp#exec called on incompatible receiver");return Sn.call(e,t)},Ri=Math.max,Li=Math.min,Ni=Math.floor,Mi=/\$([$&'`]|\d\d?|<[^>]*>)/g,Ui=/\$([$&'`]|\d\d?)/g;Pi("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=r.REPLACE_KEEPS_$0,a=i?"$":"$0";return[function(n,r){var i=d(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&o||"string"==typeof r&&-1===r.indexOf(a)){var c=n(t,e,this,r);if(c.done)return c.value}var u=x(e),l=String(this),f="function"==typeof r;f||(r=String(r));var h=u.global;if(h){var p=u.unicode;u.lastIndex=0}for(var d=[];;){var g=ji(u,l);if(null===g)break;if(d.push(g),!h)break;""===String(g[0])&&(u.lastIndex=Ii(l,ce(u.lastIndex),p))}for(var m,v="",y=0,b=0;b<d.length;b++){g=d[b];for(var w=String(g[0]),_=Ri(Li(ae(g.index),l.length),0),E=[],k=1;k<g.length;k++)E.push(void 0===(m=g[k])?m:String(m));var S=g.groups;if(f){var T=[w].concat(E,_,l);void 0!==S&&T.push(S);var A=String(r.apply(void 0,T))}else A=s(w,l,_,E,S,r);_>=y&&(v+=l.slice(y,_)+A,y=_+w.length)}return v+l.slice(y)}];function s(e,n,r,i,o,a){var s=r+e.length,c=i.length,u=Ui;return void 0!==o&&(o=Re(o),u=Mi),t.call(a,u,(function(t,a){var u;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":u=o[a.slice(1,-1)];break;default:var l=+a;if(0===l)return t;if(l>c){var f=Ni(l/10);return 0===f?t:f<=c?void 0===i[f-1]?a.charAt(1):i[f-1]+a.charAt(1):t}u=i[l-1]}return void 0===u?"":u}))}}));var Di=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};Pi("search",1,(function(e,t,n){return[function(t){var n=d(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=x(e),o=String(this),a=i.lastIndex;Di(a,0)||(i.lastIndex=0);var s=ji(i,o);return Di(i.lastIndex,a)||(i.lastIndex=a),null===s?-1:s.index}]}));var Fi=Be("species"),Bi=function(e,t){var n,r=x(e).constructor;return void 0===r||null==(n=x(r)[Fi])?t:Ie(n)},qi=[].push,Hi=Math.min,Vi=4294967295,Wi=!i((function(){return!RegExp(Vi,"y")}));Pi("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(d(this)),i=void 0===n?Vi:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!Jt(e))return t.call(r,e,i);for(var o,a,s,c=[],u=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),l=0,f=new RegExp(e.source,u+"g");(o=Sn.call(f,r))&&!((a=f.lastIndex)>l&&(c.push(r.slice(l,o.index)),o.length>1&&o.index<r.length&&qi.apply(c,o.slice(1)),s=o[0].length,l=a,c.length>=i));)f.lastIndex===o.index&&f.lastIndex++;return l===r.length?!s&&f.test("")||c.push(""):c.push(r.slice(l)),c.length>i?c.slice(0,i):c}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=d(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var o=n(r,e,this,i,r!==t);if(o.done)return o.value;var a=x(e),s=String(this),c=Bi(a,RegExp),u=a.unicode,l=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(Wi?"y":"g"),f=new c(Wi?a:"^(?:"+a.source+")",l),h=void 0===i?Vi:i>>>0;if(0===h)return[];if(0===s.length)return null===ji(f,s)?[s]:[];for(var p=0,d=0,g=[];d<s.length;){f.lastIndex=Wi?d:0;var m,v=ji(f,Wi?s:s.slice(d));if(null===v||(m=Hi(ce(f.lastIndex+(Wi?0:d)),s.length))===p)d=Ii(s,d,u);else{if(g.push(s.slice(p,d)),g.length===h)return g;for(var y=1;y<=v.length-1;y++)if(g.push(v[y]),g.length===h)return g;d=p=m}}return g.push(s.slice(p)),g}]}),!Wi);var zi=Be("iterator"),Yi=Be("toStringTag"),$i=pi.values;for(var Gi in cr){var Ki=r[Gi],Xi=Ki&&Ki.prototype;if(Xi){if(Xi[zi]!==$i)try{P(Xi,zi,$i)}catch(e){Xi[zi]=$i}if(Xi[Yi]||P(Xi,Yi,Gi),cr[Gi])for(var Ji in pi)if(Xi[Ji]!==pi[Ji])try{P(Xi,Ji,pi[Ji])}catch(e){Xi[Ji]=pi[Ji]}}}var Qi=Be("iterator"),Zi=!i((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,r){t.delete("b"),n+=r+e})),!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[Qi]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})),eo=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},to=Object.assign,no=Object.defineProperty,ro=!to||i((function(){if(o&&1!==to({b:1},to(no({},"a",{enumerable:!0,get:function(){no(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=to({},e)[n]||Et(to({},t)).join("")!=r}))?function(e,t){for(var n=Re(e),r=arguments.length,i=1,a=be.f,s=c.f;r>i;)for(var u,l=p(arguments[i++]),f=a?Et(l).concat(a(l)):Et(l),h=f.length,d=0;h>d;)u=f[d++],o&&!s.call(l,u)||(n[u]=l[u]);return n}:to,io=2147483647,oo=/[^\0-\u007E]/,ao=/[.\u3002\uFF0E\uFF61]/g,so="Overflow: input needs wider integers to process",co=Math.floor,uo=String.fromCharCode,lo=function(e){return e+22+75*(e<26)},fo=function(e,t,n){var r=0;for(e=n?co(e/700):e>>1,e+=co(e/t);e>455;r+=36)e=co(e/35);return co(r+36*e/(e+38))},ho=function(e){var t,n,r=[],i=(e=function(e){for(var t=[],n=0,r=e.length;n<r;){var i=e.charCodeAt(n++);if(i>=55296&&i<=56319&&n<r){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&i)<<10)+(1023&o)+65536):(t.push(i),n--)}else t.push(i)}return t}(e)).length,o=128,a=0,s=72;for(t=0;t<e.length;t++)(n=e[t])<128&&r.push(uo(n));var c=r.length,u=c;for(c&&r.push("-");u<i;){var l=io;for(t=0;t<e.length;t++)(n=e[t])>=o&&n<l&&(l=n);var f=u+1;if(l-o>co((io-a)/f))throw RangeError(so);for(a+=(l-o)*f,o=l,t=0;t<e.length;t++){if((n=e[t])<o&&++a>io)throw RangeError(so);if(n==o){for(var h=a,p=36;;p+=36){var d=p<=s?1:p>=s+26?26:p-s;if(h<d)break;var g=h-d,m=36-d;r.push(uo(lo(d+g%m))),h=co(g/m)}r.push(uo(lo(h))),s=fo(a,f,u==c),a=0,++u}}++a,++o}return r.join("")},po=function(e,t,n){for(var r in t)ee(e,r,t[r],n);return e},go=function(e){var t=pt(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return x(t.call(e))},mo=re("fetch"),vo=re("Headers"),yo=Be("iterator"),bo="URLSearchParams",wo="URLSearchParamsIterator",_o=Z.set,Eo=Z.getterFor(bo),ko=Z.getterFor(wo),So=/\+/g,To=Array(4),xo=function(e){return To[e-1]||(To[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},Ao=function(e){try{return decodeURIComponent(e)}catch(t){return e}},Oo=function(e){var t=e.replace(So," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(xo(n--),Ao);return t}},Po=/[!'()~]|%20/g,Co={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},Io=function(e){return Co[e]},jo=function(e){return encodeURIComponent(e).replace(Po,Io)},Ro=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o<i.length;)(n=i[o++]).length&&(r=n.split("="),e.push({key:Oo(r.shift()),value:Oo(r.join("="))}))},Lo=function(e){this.entries.length=0,Ro(this.entries,e)},No=function(e,t){if(e<t)throw TypeError("Not enough arguments")},Mo=Kn((function(e,t){_o(this,{type:wo,iterator:go(Eo(e).entries),kind:t})}),"Iterator",(function(){var e=ko(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value="keys"===t?r.key:"values"===t?r.value:[r.key,r.value]),n})),Uo=function(){eo(this,Uo,bo);var e,t,n,r,i,o,a,s,c,u=arguments.length>0?arguments[0]:void 0,l=this,f=[];if(_o(l,{type:bo,entries:f,updateURL:function(){},updateSearchParams:Lo}),void 0!==u)if(m(u))if("function"==typeof(e=pt(u)))for(n=(t=e.call(u)).next;!(r=n.call(t)).done;){if((a=(o=(i=go(x(r.value))).next).call(i)).done||(s=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");f.push({key:a.value+"",value:s.value+""})}else for(c in u)b(u,c)&&f.push({key:c,value:u[c]+""});else Ro(f,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},Do=Uo.prototype;po(Do,{append:function(e,t){No(arguments.length,2);var n=Eo(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){No(arguments.length,1);for(var t=Eo(this),n=t.entries,r=e+"",i=0;i<n.length;)n[i].key===r?n.splice(i,1):i++;t.updateURL()},get:function(e){No(arguments.length,1);for(var t=Eo(this).entries,n=e+"",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){No(arguments.length,1);for(var t=Eo(this).entries,n=e+"",r=[],i=0;i<t.length;i++)t[i].key===n&&r.push(t[i].value);return r},has:function(e){No(arguments.length,1);for(var t=Eo(this).entries,n=e+"",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){No(arguments.length,1);for(var n,r=Eo(this),i=r.entries,o=!1,a=e+"",s=t+"",c=0;c<i.length;c++)(n=i[c]).key===a&&(o?i.splice(c--,1):(o=!0,n.value=s));o||i.push({key:a,value:s}),r.updateURL()},sort:function(){var e,t,n,r=Eo(this),i=r.entries,o=i.slice();for(i.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(i[t].key>e.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=Eo(this).entries,r=je(e,arguments.length>1?arguments[1]:void 0,3),i=0;i<n.length;)r((t=n[i++]).value,t.key,this)},keys:function(){return new Mo(this,"keys")},values:function(){return new Mo(this,"values")},entries:function(){return new Mo(this,"entries")}},{enumerable:!0}),ee(Do,yo,Do.entries),ee(Do,"toString",(function(){for(var e,t=Eo(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(jo(e.key)+"="+jo(e.value));return n.join("&")}),{enumerable:!0}),Yn(Uo,bo),Ce({global:!0,forced:!Zi},{URLSearchParams:Uo}),Zi||"function"!=typeof mo||"function"!=typeof vo||Ce({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,i=[e];return arguments.length>1&&(m(t=arguments[1])&&(n=t.body,ft(n)===bo&&((r=t.headers?new vo(t.headers):new vo).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=Pt(t,{body:u(0,String(n)),headers:u(0,r)}))),i.push(t)),mo.apply(this,i)}});var Fo,Bo={URLSearchParams:Uo,getState:Eo},qo=Mn.codeAt,Ho=r.URL,Vo=Bo.URLSearchParams,Wo=Bo.getState,zo=Z.set,Yo=Z.getterFor("URL"),$o=Math.floor,Go=Math.pow,Ko="Invalid scheme",Xo="Invalid host",Jo="Invalid port",Qo=/[A-Za-z]/,Zo=/[\d+-.A-Za-z]/,ea=/\d/,ta=/^(0x|0X)/,na=/^[0-7]+$/,ra=/^\d+$/,ia=/^[\dA-Fa-f]+$/,oa=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,aa=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,sa=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,ca=/[\u0009\u000A\u000D]/g,ua=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return Xo;if(!(n=fa(t.slice(1,-1))))return Xo;e.host=n}else if(ba(e)){if(t=function(e){var t,n,r=[],i=e.toLowerCase().replace(ao,".").split(".");for(t=0;t<i.length;t++)n=i[t],r.push(oo.test(n)?"xn--"+ho(n):n);return r.join(".")}(t),oa.test(t))return Xo;if(null===(n=la(t)))return Xo;e.host=n}else{if(aa.test(t))return Xo;for(n="",r=dt(t),i=0;i<r.length;i++)n+=va(r[i],pa);e.host=n}},la=function(e){var t,n,r,i,o,a,s,c=e.split(".");if(c.length&&""==c[c.length-1]&&c.pop(),(t=c.length)>4)return e;for(n=[],r=0;r<t;r++){if(""==(i=c[r]))return e;if(o=10,i.length>1&&"0"==i.charAt(0)&&(o=ta.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)a=0;else{if(!(10==o?ra:8==o?na:ia).test(i))return e;a=parseInt(i,o)}n.push(a)}for(r=0;r<t;r++)if(a=n[r],r==t-1){if(a>=Go(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*Go(256,3-r);return s},fa=function(e){var t,n,r,i,o,a,s,c=[0,0,0,0,0,0,0,0],u=0,l=null,f=0,h=function(){return e.charAt(f)};if(":"==h()){if(":"!=e.charAt(1))return;f+=2,l=++u}for(;h();){if(8==u)return;if(":"!=h()){for(t=n=0;n<4&&ia.test(h());)t=16*t+parseInt(h(),16),f++,n++;if("."==h()){if(0==n)return;if(f-=n,u>6)return;for(r=0;h();){if(i=null,r>0){if(!("."==h()&&r<4))return;f++}if(!ea.test(h()))return;for(;ea.test(h());){if(o=parseInt(h(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==h()){if(f++,!h())return}else if(h())return;c[u++]=t}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(a=u-l,u=7;0!=u&&a>0;)s=c[u],c[u--]=c[l+a-1],c[l+--a]=s;else if(8!=u)return;return c},ha=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=$o(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},pa={},da=ro({},pa,{" ":1,'"':1,"<":1,">":1,"`":1}),ga=ro({},da,{"#":1,"?":1,"{":1,"}":1}),ma=ro({},ga,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),va=function(e,t){var n=qo(e,0);return n>32&&n<127&&!b(t,e)?e:encodeURIComponent(e)},ya={ftp:21,file:null,http:80,https:443,ws:80,wss:443},ba=function(e){return b(ya,e.scheme)},wa=function(e){return""!=e.username||""!=e.password},_a=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},Ea=function(e,t){var n;return 2==e.length&&Qo.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},ka=function(e){var t;return e.length>1&&Ea(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},Sa=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&Ea(t[0],!0)||t.pop()},Ta=function(e){return"."===e||"%2e"===e.toLowerCase()},xa={},Aa={},Oa={},Pa={},Ca={},Ia={},ja={},Ra={},La={},Na={},Ma={},Ua={},Da={},Fa={},Ba={},qa={},Ha={},Va={},Wa={},za={},Ya={},$a=function(e,t,n,r){var i,o,a,s,c,u=n||xa,l=0,f="",h=!1,p=!1,d=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(sa,"")),t=t.replace(ca,""),i=dt(t);l<=i.length;){switch(o=i[l],u){case xa:if(!o||!Qo.test(o)){if(n)return Ko;u=Oa;continue}f+=o.toLowerCase(),u=Aa;break;case Aa:if(o&&(Zo.test(o)||"+"==o||"-"==o||"."==o))f+=o.toLowerCase();else{if(":"!=o){if(n)return Ko;f="",u=Oa,l=0;continue}if(n&&(ba(e)!=b(ya,f)||"file"==f&&(wa(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(ba(e)&&ya[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?u=Fa:ba(e)&&r&&r.scheme==e.scheme?u=Pa:ba(e)?u=Ra:"/"==i[l+1]?(u=Ca,l++):(e.cannotBeABaseURL=!0,e.path.push(""),u=Wa)}break;case Oa:if(!r||r.cannotBeABaseURL&&"#"!=o)return Ko;if(r.cannotBeABaseURL&&"#"==o){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,u=Ya;break}u="file"==r.scheme?Fa:Ia;continue;case Pa:if("/"!=o||"/"!=i[l+1]){u=Ia;continue}u=La,l++;break;case Ca:if("/"==o){u=Na;break}u=Va;continue;case Ia:if(e.scheme=r.scheme,o==Fo)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==o||"\\"==o&&ba(e))u=ja;else if("?"==o)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",u=za;else{if("#"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),u=Va;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=Ya}break;case ja:if(!ba(e)||"/"!=o&&"\\"!=o){if("/"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,u=Va;continue}u=Na}else u=La;break;case Ra:if(u=La,"/"!=o||"/"!=f.charAt(l+1))continue;l++;break;case La:if("/"!=o&&"\\"!=o){u=Na;continue}break;case Na:if("@"==o){h&&(f="%40"+f),h=!0,a=dt(f);for(var g=0;g<a.length;g++){var m=a[g];if(":"!=m||d){var v=va(m,ma);d?e.password+=v:e.username+=v}else d=!0}f=""}else if(o==Fo||"/"==o||"?"==o||"#"==o||"\\"==o&&ba(e)){if(h&&""==f)return"Invalid authority";l-=dt(f).length+1,f="",u=Ma}else f+=o;break;case Ma:case Ua:if(n&&"file"==e.scheme){u=qa;continue}if(":"!=o||p){if(o==Fo||"/"==o||"?"==o||"#"==o||"\\"==o&&ba(e)){if(ba(e)&&""==f)return Xo;if(n&&""==f&&(wa(e)||null!==e.port))return;if(s=ua(e,f))return s;if(f="",u=Ha,n)return;continue}"["==o?p=!0:"]"==o&&(p=!1),f+=o}else{if(""==f)return Xo;if(s=ua(e,f))return s;if(f="",u=Da,n==Ua)return}break;case Da:if(!ea.test(o)){if(o==Fo||"/"==o||"?"==o||"#"==o||"\\"==o&&ba(e)||n){if(""!=f){var y=parseInt(f,10);if(y>65535)return Jo;e.port=ba(e)&&y===ya[e.scheme]?null:y,f=""}if(n)return;u=Ha;continue}return Jo}f+=o;break;case Fa:if(e.scheme="file","/"==o||"\\"==o)u=Ba;else{if(!r||"file"!=r.scheme){u=Va;continue}if(o==Fo)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==o)e.host=r.host,e.path=r.path.slice(),e.query="",u=za;else{if("#"!=o){ka(i.slice(l).join(""))||(e.host=r.host,e.path=r.path.slice(),Sa(e)),u=Va;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=Ya}}break;case Ba:if("/"==o||"\\"==o){u=qa;break}r&&"file"==r.scheme&&!ka(i.slice(l).join(""))&&(Ea(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),u=Va;continue;case qa:if(o==Fo||"/"==o||"\\"==o||"?"==o||"#"==o){if(!n&&Ea(f))u=Va;else if(""==f){if(e.host="",n)return;u=Ha}else{if(s=ua(e,f))return s;if("localhost"==e.host&&(e.host=""),n)return;f="",u=Ha}continue}f+=o;break;case Ha:if(ba(e)){if(u=Va,"/"!=o&&"\\"!=o)continue}else if(n||"?"!=o)if(n||"#"!=o){if(o!=Fo&&(u=Va,"/"!=o))continue}else e.fragment="",u=Ya;else e.query="",u=za;break;case Va:if(o==Fo||"/"==o||"\\"==o&&ba(e)||!n&&("?"==o||"#"==o)){if(".."===(c=(c=f).toLowerCase())||"%2e."===c||".%2e"===c||"%2e%2e"===c?(Sa(e),"/"==o||"\\"==o&&ba(e)||e.path.push("")):Ta(f)?"/"==o||"\\"==o&&ba(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&Ea(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(o==Fo||"?"==o||"#"==o))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==o?(e.query="",u=za):"#"==o&&(e.fragment="",u=Ya)}else f+=va(o,ga);break;case Wa:"?"==o?(e.query="",u=za):"#"==o?(e.fragment="",u=Ya):o!=Fo&&(e.path[0]+=va(o,pa));break;case za:n||"#"!=o?o!=Fo&&("'"==o&&ba(e)?e.query+="%27":e.query+="#"==o?"%23":va(o,pa)):(e.fragment="",u=Ya);break;case Ya:o!=Fo&&(e.fragment+=va(o,da))}l++}},Ga=function(e){var t,n,r=eo(this,Ga,"URL"),i=arguments.length>1?arguments[1]:void 0,a=String(e),s=zo(r,{type:"URL"});if(void 0!==i)if(i instanceof Ga)t=Yo(i);else if(n=$a(t={},String(i)))throw TypeError(n);if(n=$a(s,a,null,t))throw TypeError(n);var c=s.searchParams=new Vo,u=Wo(c);u.updateSearchParams(s.query),u.updateURL=function(){s.query=String(c)||null},o||(r.href=Xa.call(r),r.origin=Ja.call(r),r.protocol=Qa.call(r),r.username=Za.call(r),r.password=es.call(r),r.host=ts.call(r),r.hostname=ns.call(r),r.port=rs.call(r),r.pathname=is.call(r),r.search=os.call(r),r.searchParams=as.call(r),r.hash=ss.call(r))},Ka=Ga.prototype,Xa=function(){var e=Yo(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,a=e.path,s=e.query,c=e.fragment,u=t+":";return null!==i?(u+="//",wa(e)&&(u+=n+(r?":"+r:"")+"@"),u+=ha(i),null!==o&&(u+=":"+o)):"file"==t&&(u+="//"),u+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(u+="?"+s),null!==c&&(u+="#"+c),u},Ja=function(){var e=Yo(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&ba(e)?t+"://"+ha(e.host)+(null!==n?":"+n:""):"null"},Qa=function(){return Yo(this).scheme+":"},Za=function(){return Yo(this).username},es=function(){return Yo(this).password},ts=function(){var e=Yo(this),t=e.host,n=e.port;return null===t?"":null===n?ha(t):ha(t)+":"+n},ns=function(){var e=Yo(this).host;return null===e?"":ha(e)},rs=function(){var e=Yo(this).port;return null===e?"":String(e)},is=function(){var e=Yo(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},os=function(){var e=Yo(this).query;return e?"?"+e:""},as=function(){return Yo(this).searchParams},ss=function(){var e=Yo(this).fragment;return e?"#"+e:""},cs=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&kt(Ka,{href:cs(Xa,(function(e){var t=Yo(this),n=String(e),r=$a(t,n);if(r)throw TypeError(r);Wo(t.searchParams).updateSearchParams(t.query)})),origin:cs(Ja),protocol:cs(Qa,(function(e){var t=Yo(this);$a(t,String(e)+":",xa)})),username:cs(Za,(function(e){var t=Yo(this),n=dt(String(e));if(!_a(t)){t.username="";for(var r=0;r<n.length;r++)t.username+=va(n[r],ma)}})),password:cs(es,(function(e){var t=Yo(this),n=dt(String(e));if(!_a(t)){t.password="";for(var r=0;r<n.length;r++)t.password+=va(n[r],ma)}})),host:cs(ts,(function(e){var t=Yo(this);t.cannotBeABaseURL||$a(t,String(e),Ma)})),hostname:cs(ns,(function(e){var t=Yo(this);t.cannotBeABaseURL||$a(t,String(e),Ua)})),port:cs(rs,(function(e){var t=Yo(this);_a(t)||(""==(e=String(e))?t.port=null:$a(t,e,Da))})),pathname:cs(is,(function(e){var t=Yo(this);t.cannotBeABaseURL||(t.path=[],$a(t,e+"",Ha))})),search:cs(os,(function(e){var t=Yo(this);""==(e=String(e))?t.query=null:("?"==e.charAt(0)&&(e=e.slice(1)),t.query="",$a(t,e,za)),Wo(t.searchParams).updateSearchParams(t.query)})),searchParams:cs(as),hash:cs(ss,(function(e){var t=Yo(this);""!=(e=String(e))?("#"==e.charAt(0)&&(e=e.slice(1)),t.fragment="",$a(t,e,Ya)):t.fragment=null}))}),ee(Ka,"toJSON",(function(){return Xa.call(this)}),{enumerable:!0}),ee(Ka,"toString",(function(){return Xa.call(this)}),{enumerable:!0}),Ho){var us=Ho.createObjectURL,ls=Ho.revokeObjectURL;us&&ee(Ga,"createObjectURL",(function(e){return us.apply(Ho,arguments)})),ls&&ee(Ga,"revokeObjectURL",(function(e){return ls.apply(Ho,arguments)}))}function fs(e){return(fs="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function hs(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ps(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ds(e,t,n){return t&&ps(e.prototype,t),n&&ps(e,n),e}function gs(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ms(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function vs(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ms(Object(n),!0).forEach((function(t){gs(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ms(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ys(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function bs(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw o}}return n}(e,t)||_s(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ws(e){return function(e){if(Array.isArray(e))return Es(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||_s(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _s(e,t){if(e){if("string"==typeof e)return Es(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Es(e,t):void 0}}function Es(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}Yn(Ga,"URL"),Ce({global:!0,forced:!Zi,sham:!o},{URL:Ga}),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},r=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},i=function(e){return decodeURIComponent(String(e).replace(/\+/g," "))};(function(){try{var t=e.URLSearchParams;return"a=1"===new t("?a=1").toString()&&"function"==typeof t.prototype.set}catch(e){return!1}})()||function(){var i=function e(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var n=fs(t);if("undefined"===n);else if("string"===n)""!==t&&this._fromString(t);else if(t instanceof e){var r=this;t.forEach((function(e,t){r.append(t,e)}))}else{if(null===t||"object"!==n)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var i=0;i<t.length;i++){var o=t[i];if("[object Array]"!==Object.prototype.toString.call(o)&&2===o.length)throw new TypeError("Expected [string, any] as entry at index "+i+" of URLSearchParams's input");this.append(o[0],o[1])}else for(var a in t)t.hasOwnProperty(a)&&this.append(a,t[a])}},o=i.prototype;o.append=function(e,t){e in this._entries?this._entries[e].push(String(t)):this._entries[e]=[String(t)]},o.delete=function(e){delete this._entries[e]},o.get=function(e){return e in this._entries?this._entries[e][0]:null},o.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},o.has=function(e){return e in this._entries},o.set=function(e,t){this._entries[e]=[String(t)]},o.forEach=function(e,t){var n;for(var r in this._entries)if(this._entries.hasOwnProperty(r)){n=this._entries[r];for(var i=0;i<n.length;i++)e.call(t,n[i],r,this)}},o.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),n(e)},o.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),n(e)},o.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),n(e)},t&&(o[Symbol.iterator]=o.entries),o.toString=function(){var e=[];return this.forEach((function(t,n){e.push(r(n)+"="+r(t))})),e.join("&")},e.URLSearchParams=i}();var o=e.URLSearchParams.prototype;"function"!=typeof o.sort&&(o.sort=function(){var e=this,t=[];this.forEach((function(n,r){t.push([r,n]),e._entries||e.delete(r)})),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])}),"function"!=typeof o._fromString&&Object.defineProperty(o,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){if(this._entries)this._entries={};else{var t=[];this.forEach((function(e,n){t.push(n)}));for(var n=0;n<t.length;n++)this.delete(t[n])}var r,o=(e=e.replace(/^\?/,"")).split("&");for(n=0;n<o.length;n++)r=o[n].split("="),this.append(i(r[0]),r.length>1?i(r[1]):"")}})}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var t=new e.URL("b","http://a");return t.pathname="c d","http://a/c%20d"===t.href&&t.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t));var r,i=document;if(n&&(void 0===e.location||n!==e.location.href)){(r=(i=document.implementation.createHTMLDocument("")).createElement("base")).href=n,i.head.appendChild(r);try{if(0!==r.href.indexOf(n))throw new Error(r.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=i.createElement("a");if(o.href=t,r&&(i.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 e.URLSearchParams(this.search),s=!0,c=!0,u=this;["append","delete","set"].forEach((function(e){var t=a[e];a[e]=function(){t.apply(a,arguments),s&&(c=!1,u.search=a.toString(),c=!0)}})),Object.defineProperty(this,"searchParams",{value:a,enumerable:!0});var l=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==l&&(l=this.search,c&&(s=!1,this.searchParams._fromString(this.search),s=!0))}})},r=n.prototype;["hash","host","hostname","port","protocol"].forEach((function(e){!function(e){Object.defineProperty(r,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)})),Object.defineProperty(r,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(r,{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),wr("asyncIterator");var ks=Be("isConcatSpreadable"),Ss=9007199254740991,Ts="Maximum allowed index exceeded",xs=qt>=51||!i((function(){var e=[];return e[ks]=!1,e.concat()[0]!==e})),As=Vt("concat"),Os=function(e){if(!m(e))return!1;var t=e[ks];return void 0!==t?!!t:Le(e)};Ce({target:"Array",proto:!0,forced:!xs||!As},{concat:function(e){var t,n,r,i,o,a=Re(this),s=He(a,0),c=0;for(t=-1,r=arguments.length;t<r;t++)if(Os(o=-1===t?a:arguments[t])){if(c+(i=ce(o.length))>Ss)throw TypeError(Ts);for(n=0;n<i;n++,c++)n in o&&at(s,c,o[n])}else{if(c>=Ss)throw TypeError(Ts);at(s,c++,o)}return s.length=c,s}}),Ce({target:"Object",stat:!0,forced:Object.assign!==ro},{assign:ro});var Ps=T.f,Cs=i((function(){Ps(1)}));Ce({target:"Object",stat:!0,forced:!o||Cs,sham:!o},{getOwnPropertyDescriptor:function(e,t){return Ps(g(e),t)}});var Is,js,Rs,Ls=r.Promise,Ns=t((function(e){var t=function(e,t){this.stopped=e,this.result=t};(e.exports=function(e,n,r,i,o){var a,s,c,u,l,f,h,p=je(n,r,i?2:1);if(o)a=e;else{if("function"!=typeof(s=pt(e)))throw TypeError("Target is not iterable");if(ot(s)){for(c=0,u=ce(e.length);u>c;c++)if((l=i?p(x(h=e[c])[0],h[1]):p(e[c]))&&l instanceof t)return l;return new t(!1)}a=s.call(e)}for(f=a.next;!(h=f.call(a)).done;)if("object"==typeof(l=tt(a,p,h.value,i))&&l&&l instanceof t)return l;return new t(!1)}).stop=function(e){return new t(!0,e)}})),Ms=/(iphone|ipod|ipad).*applewebkit/i.test(Ut),Us=r.location,Ds=r.setImmediate,Fs=r.clearImmediate,Bs=r.process,qs=r.MessageChannel,Hs=r.Dispatch,Vs=0,Ws={},zs="onreadystatechange",Ys=function(e){if(Ws.hasOwnProperty(e)){var t=Ws[e];delete Ws[e],t()}},$s=function(e){return function(){Ys(e)}},Gs=function(e){Ys(e.data)},Ks=function(e){r.postMessage(e+"",Us.protocol+"//"+Us.host)};Ds&&Fs||(Ds=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return Ws[++Vs]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},Is(Vs),Vs},Fs=function(e){delete Ws[e]},"process"==f(Bs)?Is=function(e){Bs.nextTick($s(e))}:Hs&&Hs.now?Is=function(e){Hs.now($s(e))}:qs&&!Ms?(Rs=(js=new qs).port2,js.port1.onmessage=Gs,Is=je(Rs.postMessage,Rs,1)):!r.addEventListener||"function"!=typeof postMessage||r.importScripts||i(Ks)||"file:"===Us.protocol?Is=zs in E("script")?function(e){St.appendChild(E("script")).onreadystatechange=function(){St.removeChild(this),Ys(e)}}:function(e){setTimeout($s(e),0)}:(Is=Ks,r.addEventListener("message",Gs,!1)));var Xs,Js,Qs,Zs,ec,tc,nc,rc,ic={set:Ds,clear:Fs},oc=T.f,ac=ic.set,sc=r.MutationObserver||r.WebKitMutationObserver,cc=r.process,uc=r.Promise,lc="process"==f(cc),fc=oc(r,"queueMicrotask"),hc=fc&&fc.value;hc||(Xs=function(){var e,t;for(lc&&(e=cc.domain)&&e.exit();Js;){t=Js.fn,Js=Js.next;try{t()}catch(e){throw Js?Zs():Qs=void 0,e}}Qs=void 0,e&&e.enter()},lc?Zs=function(){cc.nextTick(Xs)}:sc&&!Ms?(ec=!0,tc=document.createTextNode(""),new sc(Xs).observe(tc,{characterData:!0}),Zs=function(){tc.data=ec=!ec}):uc&&uc.resolve?(nc=uc.resolve(void 0),rc=nc.then,Zs=function(){rc.call(nc,Xs)}):Zs=function(){ac.call(r,Xs)});var pc,dc,gc,mc,vc=hc||function(e){var t={fn:e,next:void 0};Qs&&(Qs.next=t),Js||(Js=t,Zs()),Qs=t},yc=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=Ie(t),this.reject=Ie(n)},bc={f:function(e){return new yc(e)}},wc=function(e,t){if(x(e),m(t)&&t.constructor===e)return t;var n=bc.f(e);return(0,n.resolve)(t),n.promise},_c=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},Ec=ic.set,kc=Be("species"),Sc="Promise",Tc=Z.get,xc=Z.set,Ac=Z.getterFor(Sc),Oc=Ls,Pc=r.TypeError,Cc=r.document,Ic=r.process,jc=re("fetch"),Rc=bc.f,Lc=Rc,Nc="process"==f(Ic),Mc=!!(Cc&&Cc.createEvent&&r.dispatchEvent),Uc="unhandledrejection",Dc=Oe(Sc,(function(){if(!(U(Oc)!==String(Oc))){if(66===qt)return!0;if(!Nc&&"function"!=typeof PromiseRejectionEvent)return!0}if(qt>=51&&/native code/.test(Oc))return!1;var e=Oc.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[kc]=t,!(e.then((function(){}))instanceof t)})),Fc=Dc||!bt((function(e){Oc.all(e).catch((function(){}))})),Bc=function(e){var t;return!(!m(e)||"function"!=typeof(t=e.then))&&t},qc=function(e,t,n){if(!t.notified){t.notified=!0;var r=t.reactions;vc((function(){for(var i=t.value,o=1==t.state,a=0;r.length>a;){var s,c,u,l=r[a++],f=o?l.ok:l.fail,h=l.resolve,p=l.reject,d=l.domain;try{f?(o||(2===t.rejection&&zc(e,t),t.rejection=1),!0===f?s=i:(d&&d.enter(),s=f(i),d&&(d.exit(),u=!0)),s===l.promise?p(Pc("Promise-chain cycle")):(c=Bc(s))?c.call(s,h,p):h(s)):p(i)}catch(e){d&&!u&&d.exit(),p(e)}}t.reactions=[],t.notified=!1,n&&!t.rejection&&Vc(e,t)}))}},Hc=function(e,t,n){var i,o;Mc?((i=Cc.createEvent("Event")).promise=t,i.reason=n,i.initEvent(e,!1,!0),r.dispatchEvent(i)):i={promise:t,reason:n},(o=r["on"+e])?o(i):e===Uc&&function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}("Unhandled promise rejection",n)},Vc=function(e,t){Ec.call(r,(function(){var n,r=t.value;if(Wc(t)&&(n=_c((function(){Nc?Ic.emit("unhandledRejection",r,e):Hc(Uc,e,r)})),t.rejection=Nc||Wc(t)?2:1,n.error))throw n.value}))},Wc=function(e){return 1!==e.rejection&&!e.parent},zc=function(e,t){Ec.call(r,(function(){Nc?Ic.emit("rejectionHandled",e):Hc("rejectionhandled",e,t.value)}))},Yc=function(e,t,n,r){return function(i){e(t,n,i,r)}},$c=function(e,t,n,r){t.done||(t.done=!0,r&&(t=r),t.value=n,t.state=2,qc(e,t,!0))},Gc=function(e,t,n,r){if(!t.done){t.done=!0,r&&(t=r);try{if(e===n)throw Pc("Promise can't be resolved itself");var i=Bc(n);i?vc((function(){var r={done:!1};try{i.call(n,Yc(Gc,e,r,t),Yc($c,e,r,t))}catch(n){$c(e,r,n,t)}})):(t.value=n,t.state=1,qc(e,t,!1))}catch(n){$c(e,{done:!1},n,t)}}};Dc&&(Oc=function(e){eo(this,Oc,Sc),Ie(e),pc.call(this);var t=Tc(this);try{e(Yc(Gc,this,t),Yc($c,this,t))}catch(e){$c(this,t,e)}},(pc=function(e){xc(this,{type:Sc,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=po(Oc.prototype,{then:function(e,t){var n=Ac(this),r=Rc(Bi(this,Oc));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=Nc?Ic.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&qc(this,n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),dc=function(){var e=new pc,t=Tc(e);this.promise=e,this.resolve=Yc(Gc,e,t),this.reject=Yc($c,e,t)},bc.f=Rc=function(e){return e===Oc||e===gc?new dc(e):Lc(e)},"function"==typeof Ls&&(mc=Ls.prototype.then,ee(Ls.prototype,"then",(function(e,t){var n=this;return new Oc((function(e,t){mc.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof jc&&Ce({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return wc(Oc,jc.apply(r,arguments))}}))),Ce({global:!0,wrap:!0,forced:Dc},{Promise:Oc}),Yn(Oc,Sc,!1),nn(Sc),gc=re(Sc),Ce({target:Sc,stat:!0,forced:Dc},{reject:function(e){var t=Rc(this);return t.reject.call(void 0,e),t.promise}}),Ce({target:Sc,stat:!0,forced:Dc},{resolve:function(e){return wc(this,e)}}),Ce({target:Sc,stat:!0,forced:Fc},{all:function(e){var t=this,n=Rc(t),r=n.resolve,i=n.reject,o=_c((function(){var n=Ie(t.resolve),o=[],a=0,s=1;Ns(e,(function(e){var c=a++,u=!1;o.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,o[c]=e,--s||r(o))}),i)})),--s||r(o)}));return o.error&&i(o.value),n.promise},race:function(e){var t=this,n=Rc(t),r=n.reject,i=_c((function(){var i=Ie(t.resolve);Ns(e,(function(e){i.call(t,e).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}});
+"object"==typeof navigator&&function(){"use strict";var e="undefined"!=typeof globalThis?globalThis:"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=function(e){return e&&e.Math==Math&&e},r=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||Function("return this")(),i=function(e){try{return!!e()}catch(e){return!0}},o=!i((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,c={f:s&&!a.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:a},u=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},l={}.toString,f=function(e){return l.call(e).slice(8,-1)},h="".split,p=i((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?h.call(e,""):Object(e)}:Object,d=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},g=function(e){return p(d(e))},m=function(e){return"object"==typeof e?null!==e:"function"==typeof e},v=function(e,t){if(!m(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!m(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!m(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!m(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},w=r.document,_=m(w)&&m(w.createElement),E=function(e){return _?w.createElement(e):{}},S=!o&&!i((function(){return 7!=Object.defineProperty(E("div"),"a",{get:function(){return 7}}).a})),k=Object.getOwnPropertyDescriptor,T={f:o?k:function(e,t){if(e=g(e),t=v(t,!0),S)try{return k(e,t)}catch(e){}if(b(e,t))return u(!c.f.call(e,t),e[t])}},x=function(e){if(!m(e))throw TypeError(String(e)+" is not an object");return e},A=Object.defineProperty,O={f:o?A:function(e,t,n){if(x(e),t=v(t,!0),x(n),S)try{return A(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}},I=o?function(e,t,n){return O.f(e,t,u(1,n))}:function(e,t,n){return e[t]=n,e},C=function(e,t){try{I(r,e,t)}catch(n){r[e]=t}return t},P="__core-js_shared__",j=r[P]||C(P,{}),R=Function.toString;"function"!=typeof j.inspectSource&&(j.inspectSource=function(e){return R.call(e)});var L,N,M,U=j.inspectSource,D=r.WeakMap,F="function"==typeof D&&/native code/.test(U(D)),q=t((function(e){(e.exports=function(e,t){return j[e]||(j[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.6.5",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),B=0,H=Math.random(),V=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++B+H).toString(36)},W=q("keys"),z=function(e){return W[e]||(W[e]=V(e))},Y={},$=r.WeakMap;if(F){var G=new $,K=G.get,X=G.has,J=G.set;L=function(e,t){return J.call(G,e,t),t},N=function(e){return K.call(G,e)||{}},M=function(e){return X.call(G,e)}}else{var Q=z("state");Y[Q]=!0,L=function(e,t){return I(e,Q,t),t},N=function(e){return b(e,Q)?e[Q]:{}},M=function(e){return b(e,Q)}}var Z={set:L,get:N,has:M,enforce:function(e){return M(e)?N(e):L(e,{})},getterFor:function(e){return function(t){var n;if(!m(t)||(n=N(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},ee=t((function(e){var t=Z.get,n=Z.enforce,i=String(String).split("String");(e.exports=function(e,t,o,a){var s=!!a&&!!a.unsafe,c=!!a&&!!a.enumerable,u=!!a&&!!a.noTargetGet;"function"==typeof o&&("string"!=typeof t||b(o,"name")||I(o,"name",t),n(o).source=i.join("string"==typeof t?t:"")),e!==r?(s?!u&&e[t]&&(c=!0):delete e[t],c?e[t]=o:I(e,t,o)):c?e[t]=o:C(t,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||U(this)}))})),te=r,ne=function(e){return"function"==typeof e?e:void 0},re=function(e,t){return arguments.length<2?ne(te[e])||ne(r[e]):te[e]&&te[e][t]||r[e]&&r[e][t]},ie=Math.ceil,oe=Math.floor,ae=function(e){return isNaN(e=+e)?0:(e>0?oe:ie)(e)},se=Math.min,ce=function(e){return e>0?se(ae(e),9007199254740991):0},ue=Math.max,le=Math.min,fe=function(e,t){var n=ae(e);return n<0?ue(n+t,0):le(n,t)},he=function(e){return function(t,n,r){var i,o=g(t),a=ce(o.length),s=fe(r,a);if(e&&n!=n){for(;a>s;)if((i=o[s++])!=i)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},pe={includes:he(!0),indexOf:he(!1)},de=pe.indexOf,ge=function(e,t){var n,r=g(e),i=0,o=[];for(n in r)!b(Y,n)&&b(r,n)&&o.push(n);for(;t.length>i;)b(r,n=t[i++])&&(~de(o,n)||o.push(n));return o},me=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ve=me.concat("length","prototype"),ye={f:Object.getOwnPropertyNames||function(e){return ge(e,ve)}},be={f:Object.getOwnPropertySymbols},we=re("Reflect","ownKeys")||function(e){var t=ye.f(x(e)),n=be.f;return n?t.concat(n(e)):t},_e=function(e,t){for(var n=we(t),r=O.f,i=T.f,o=0;o<n.length;o++){var a=n[o];b(e,a)||r(e,a,i(t,a))}},Ee=/#|\.prototype\./,Se=function(e,t){var n=Te[ke(e)];return n==Ae||n!=xe&&("function"==typeof t?i(t):!!t)},ke=Se.normalize=function(e){return String(e).replace(Ee,".").toLowerCase()},Te=Se.data={},xe=Se.NATIVE="N",Ae=Se.POLYFILL="P",Oe=Se,Ie=T.f,Ce=function(e,t){var n,i,o,a,s,c=e.target,u=e.global,l=e.stat;if(n=u?r:l?r[c]||C(c,{}):(r[c]||{}).prototype)for(i in t){if(a=t[i],o=e.noTargetGet?(s=Ie(n,i))&&s.value:n[i],!Oe(u?i:c+(l?".":"#")+i,e.forced)&&void 0!==o){if(typeof a==typeof o)continue;_e(a,o)}(e.sham||o&&o.sham)&&I(a,"sham",!0),ee(n,i,a,e)}},Pe=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},je=function(e,t,n){if(Pe(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},Re=function(e){return Object(d(e))},Le=Array.isArray||function(e){return"Array"==f(e)},Ne=!!Object.getOwnPropertySymbols&&!i((function(){return!String(Symbol())})),Me=Ne&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Ue=q("wks"),De=r.Symbol,Fe=Me?De:De&&De.withoutSetter||V,qe=function(e){return b(Ue,e)||(Ne&&b(De,e)?Ue[e]=De[e]:Ue[e]=Fe("Symbol."+e)),Ue[e]},Be=qe("species"),He=function(e,t){var n;return Le(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!Le(n.prototype)?m(n)&&null===(n=n[Be])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},Ve=[].push,We=function(e){var t=1==e,n=2==e,r=3==e,i=4==e,o=6==e,a=5==e||o;return function(s,c,u,l){for(var f,h,d=Re(s),g=p(d),m=je(c,u,3),v=ce(g.length),y=0,b=l||He,w=t?b(s,v):n?b(s,0):void 0;v>y;y++)if((a||y in g)&&(h=m(f=g[y],y,d),e))if(t)w[y]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:Ve.call(w,f)}else if(i)return!1;return o?-1:r||i?i:w}},ze={forEach:We(0),map:We(1),filter:We(2),some:We(3),every:We(4),find:We(5),findIndex:We(6)},Ye=function(e,t){var n=[][e];return!!n&&i((function(){n.call(null,t||function(){throw 1},1)}))},$e=Object.defineProperty,Ge={},Ke=function(e){throw e},Xe=function(e,t){if(b(Ge,e))return Ge[e];t||(t={});var n=[][e],r=!!b(t,"ACCESSORS")&&t.ACCESSORS,a=b(t,0)?t[0]:Ke,s=b(t,1)?t[1]:void 0;return Ge[e]=!!n&&!i((function(){if(r&&!o)return!0;var e={length:-1};r?$e(e,1,{enumerable:!0,get:Ke}):e[1]=1,n.call(e,a,s)}))},Je=ze.forEach,Qe=Ye("forEach"),Ze=Xe("forEach"),et=Qe&&Ze?[].forEach:function(e){return Je(this,e,arguments.length>1?arguments[1]:void 0)};Ce({target:"Array",proto:!0,forced:[].forEach!=et},{forEach:et});var tt=function(e,t,n,r){try{return r?t(x(n)[0],n[1]):t(n)}catch(t){var i=e.return;throw void 0!==i&&x(i.call(e)),t}},nt={},rt=qe("iterator"),it=Array.prototype,ot=function(e){return void 0!==e&&(nt.Array===e||it[rt]===e)},at=function(e,t,n){var r=v(t);r in e?O.f(e,r,u(0,n)):e[r]=n},st={};st[qe("toStringTag")]="z";var ct="[object z]"===String(st),ut=qe("toStringTag"),lt="Arguments"==f(function(){return arguments}()),ft=ct?f:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),ut))?n:lt?f(t):"Object"==(r=f(t))&&"function"==typeof t.callee?"Arguments":r},ht=qe("iterator"),pt=function(e){if(null!=e)return e[ht]||e["@@iterator"]||nt[ft(e)]},dt=function(e){var t,n,r,i,o,a,s=Re(e),c="function"==typeof this?this:Array,u=arguments.length,l=u>1?arguments[1]:void 0,f=void 0!==l,h=pt(s),p=0;if(f&&(l=je(l,u>2?arguments[2]:void 0,2)),null==h||c==Array&&ot(h))for(n=new c(t=ce(s.length));t>p;p++)a=f?l(s[p],p):s[p],at(n,p,a);else for(o=(i=h.call(s)).next,n=new c;!(r=o.call(i)).done;p++)a=f?tt(i,l,[r.value,p],!0):r.value,at(n,p,a);return n.length=p,n},gt=qe("iterator"),mt=!1;try{var vt=0,yt={next:function(){return{done:!!vt++}},return:function(){mt=!0}};yt[gt]=function(){return this},Array.from(yt,(function(){throw 2}))}catch(e){}var bt=function(e,t){if(!t&&!mt)return!1;var n=!1;try{var r={};r[gt]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},wt=!bt((function(e){Array.from(e)}));Ce({target:"Array",stat:!0,forced:wt},{from:dt});var _t,Et=Object.keys||function(e){return ge(e,me)},St=o?Object.defineProperties:function(e,t){x(e);for(var n,r=Et(t),i=r.length,o=0;i>o;)O.f(e,n=r[o++],t[n]);return e},kt=re("document","documentElement"),Tt=z("IE_PROTO"),xt=function(){},At=function(e){return"<script>"+e+"</"+"script>"},Ot=function(){try{_t=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t;Ot=_t?function(e){e.write(At("")),e.close();var t=e.parentWindow.Object;return e=null,t}(_t):((t=E("iframe")).style.display="none",kt.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(At("document.F=Object")),e.close(),e.F);for(var n=me.length;n--;)delete Ot.prototype[me[n]];return Ot()};Y[Tt]=!0;var It=Object.create||function(e,t){var n;return null!==e?(xt.prototype=x(e),n=new xt,xt.prototype=null,n[Tt]=e):n=Ot(),void 0===t?n:St(n,t)},Ct=qe("unscopables"),Pt=Array.prototype;null==Pt[Ct]&&O.f(Pt,Ct,{configurable:!0,value:It(null)});var jt=function(e){Pt[Ct][e]=!0},Rt=pe.includes,Lt=Xe("indexOf",{ACCESSORS:!0,1:0});Ce({target:"Array",proto:!0,forced:!Lt},{includes:function(e){return Rt(this,e,arguments.length>1?arguments[1]:void 0)}}),jt("includes");var Nt,Mt,Ut=re("navigator","userAgent")||"",Dt=r.process,Ft=Dt&&Dt.versions,qt=Ft&&Ft.v8;qt?Mt=(Nt=qt.split("."))[0]+Nt[1]:Ut&&(!(Nt=Ut.match(/Edge\/(\d+)/))||Nt[1]>=74)&&(Nt=Ut.match(/Chrome\/(\d+)/))&&(Mt=Nt[1]);var Bt=Mt&&+Mt,Ht=qe("species"),Vt=function(e){return Bt>=51||!i((function(){var t=[];return(t.constructor={})[Ht]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Wt=ze.map,zt=Vt("map"),Yt=Xe("map");Ce({target:"Array",proto:!0,forced:!zt||!Yt},{map:function(e){return Wt(this,e,arguments.length>1?arguments[1]:void 0)}});var $t=i((function(){Et(1)}));Ce({target:"Object",stat:!0,forced:$t},{keys:function(e){return Et(Re(e))}});var Gt=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return x(n),function(e){if(!m(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype")}(r),t?e.call(n,r):n.__proto__=r,n}}():void 0),Kt=function(e,t,n){var r,i;return Gt&&"function"==typeof(r=t.constructor)&&r!==n&&m(i=r.prototype)&&i!==n.prototype&&Gt(e,i),e},Xt=qe("match"),Jt=function(e){var t;return m(e)&&(void 0!==(t=e[Xt])?!!t:"RegExp"==f(e))},Qt=function(){var e=x(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function Zt(e,t){return RegExp(e,t)}var en={UNSUPPORTED_Y:i((function(){var e=Zt("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:i((function(){var e=Zt("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},tn=qe("species"),nn=function(e){var t=re(e),n=O.f;o&&t&&!t[tn]&&n(t,tn,{configurable:!0,get:function(){return this}})},rn=O.f,on=ye.f,an=Z.set,sn=qe("match"),cn=r.RegExp,un=cn.prototype,ln=/a/g,fn=/a/g,hn=new cn(ln)!==ln,pn=en.UNSUPPORTED_Y;if(o&&Oe("RegExp",!hn||pn||i((function(){return fn[sn]=!1,cn(ln)!=ln||cn(fn)==fn||"/a/i"!=cn(ln,"i")})))){for(var dn=function(e,t){var n,r=this instanceof dn,i=Jt(e),o=void 0===t;if(!r&&i&&e.constructor===dn&&o)return e;hn?i&&!o&&(e=e.source):e instanceof dn&&(o&&(t=Qt.call(e)),e=e.source),pn&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var a=Kt(hn?new cn(e,t):cn(e,t),r?this:un,dn);return pn&&n&&an(a,{sticky:n}),a},gn=function(e){e in dn||rn(dn,e,{configurable:!0,get:function(){return cn[e]},set:function(t){cn[e]=t}})},mn=on(cn),vn=0;mn.length>vn;)gn(mn[vn++]);un.constructor=dn,dn.prototype=un,ee(r,"RegExp",dn)}nn("RegExp");var yn=RegExp.prototype.exec,bn=String.prototype.replace,wn=yn,_n=function(){var e=/a/,t=/b*/g;return yn.call(e,"a"),yn.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),En=en.UNSUPPORTED_Y||en.BROKEN_CARET,Sn=void 0!==/()??/.exec("")[1];(_n||Sn||En)&&(wn=function(e){var t,n,r,i,o=this,a=En&&o.sticky,s=Qt.call(o),c=o.source,u=0,l=e;return a&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),l=String(e).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==e[o.lastIndex-1])&&(c="(?: "+c+")",l=" "+l,u++),n=new RegExp("^(?:"+c+")",s)),Sn&&(n=new RegExp("^"+c+"$(?!\\s)",s)),_n&&(t=o.lastIndex),r=yn.call(a?n:o,l),a?r?(r.input=r.input.slice(u),r[0]=r[0].slice(u),r.index=o.lastIndex,o.lastIndex+=r[0].length):o.lastIndex=0:_n&&r&&(o.lastIndex=o.global?r.index+r[0].length:t),Sn&&r&&r.length>1&&bn.call(r[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r});var kn=wn;Ce({target:"RegExp",proto:!0,forced:/./.exec!==kn},{exec:kn});var Tn="toString",xn=RegExp.prototype,An=xn.toString,On=i((function(){return"/a/b"!=An.call({source:"a",flags:"b"})})),In=An.name!=Tn;(On||In)&&ee(RegExp.prototype,Tn,(function(){var e=x(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in xn)?Qt.call(e):n)}),{unsafe:!0});var Cn=function(e){if(Jt(e))throw TypeError("The method doesn't accept regular expressions");return e},Pn=qe("match");Ce({target:"String",proto:!0,forced:!function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Pn]=!1,"/./"[e](t)}catch(e){}}return!1}("includes")},{includes:function(e){return!!~String(d(this)).indexOf(Cn(e),arguments.length>1?arguments[1]:void 0)}});var jn,Rn,Ln,Nn=function(e){return function(t,n){var r,i,o=String(d(t)),a=ae(n),s=o.length;return a<0||a>=s?e?"":void 0:(r=o.charCodeAt(a))<55296||r>56319||a+1===s||(i=o.charCodeAt(a+1))<56320||i>57343?e?o.charAt(a):r:e?o.slice(a,a+2):i-56320+(r-55296<<10)+65536}},Mn={codeAt:Nn(!1),charAt:Nn(!0)},Un=!i((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),Dn=z("IE_PROTO"),Fn=Object.prototype,qn=Un?Object.getPrototypeOf:function(e){return e=Re(e),b(e,Dn)?e[Dn]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Fn:null},Bn=qe("iterator"),Hn=!1;[].keys&&("next"in(Ln=[].keys())?(Rn=qn(qn(Ln)))!==Object.prototype&&(jn=Rn):Hn=!0),null==jn&&(jn={}),b(jn,Bn)||I(jn,Bn,(function(){return this}));var Vn={IteratorPrototype:jn,BUGGY_SAFARI_ITERATORS:Hn},Wn=O.f,zn=qe("toStringTag"),Yn=function(e,t,n){e&&!b(e=n?e:e.prototype,zn)&&Wn(e,zn,{configurable:!0,value:t})},$n=Vn.IteratorPrototype,Gn=function(){return this},Kn=function(e,t,n){var r=t+" Iterator";return e.prototype=It($n,{next:u(1,n)}),Yn(e,r,!1),nt[r]=Gn,e},Xn=Vn.IteratorPrototype,Jn=Vn.BUGGY_SAFARI_ITERATORS,Qn=qe("iterator"),Zn="keys",er="values",tr="entries",nr=function(){return this},rr=function(e,t,n,r,i,o,a){Kn(n,t,r);var s,c,u,l=function(e){if(e===i&&g)return g;if(!Jn&&e in p)return p[e];switch(e){case Zn:case er:case tr:return function(){return new n(this,e)}}return function(){return new n(this)}},f=t+" Iterator",h=!1,p=e.prototype,d=p[Qn]||p["@@iterator"]||i&&p[i],g=!Jn&&d||l(i),m="Array"==t&&p.entries||d;if(m&&(s=qn(m.call(new e)),Xn!==Object.prototype&&s.next&&(qn(s)!==Xn&&(Gt?Gt(s,Xn):"function"!=typeof s[Qn]&&I(s,Qn,nr)),Yn(s,f,!0))),i==er&&d&&d.name!==er&&(h=!0,g=function(){return d.call(this)}),p[Qn]!==g&&I(p,Qn,g),nt[t]=g,i)if(c={values:l(er),keys:o?g:l(Zn),entries:l(tr)},a)for(u in c)(Jn||h||!(u in p))&&ee(p,u,c[u]);else Ce({target:t,proto:!0,forced:Jn||h},c);return c},ir=Mn.charAt,or="String Iterator",ar=Z.set,sr=Z.getterFor(or);rr(String,"String",(function(e){ar(this,{type:or,string:String(e),index:0})}),(function(){var e,t=sr(this),n=t.string,r=t.index;return r>=n.length?{value:void 0,done:!0}:(e=ir(n,r),t.index+=e.length,{value:e,done:!1})}));var cr={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0};for(var ur in cr){var lr=r[ur],fr=lr&&lr.prototype;if(fr&&fr.forEach!==et)try{I(fr,"forEach",et)}catch(e){fr.forEach=et}}var hr=document.getElementById("container"),pr="tab-focus";document.addEventListener("focusout",(function(e){e.target.classList&&!hr.contains(e.target)&&e.target.classList.remove(pr)})),document.addEventListener("keydown",(function(e){9===e.keyCode&&setTimeout((function(){var e=document.activeElement;e&&e.classList&&!hr.contains(e)&&e.classList.add(pr)}),10)})),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,r;return(t=t||{}).bubbles=!!t.bubbles,t.cancelable=!!t.cancelable,(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.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 dr=ye.f,gr={}.toString,mr="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],vr={f:function(e){return mr&&"[object Window]"==gr.call(e)?function(e){try{return dr(e)}catch(e){return mr.slice()}}(e):dr(g(e))}},yr={f:qe},br=O.f,wr=function(e){var t=te.Symbol||(te.Symbol={});b(t,e)||br(t,e,{value:yr.f(e)})},_r=ze.forEach,Er=z("hidden"),Sr="Symbol",kr=qe("toPrimitive"),Tr=Z.set,xr=Z.getterFor(Sr),Ar=Object.prototype,Or=r.Symbol,Ir=re("JSON","stringify"),Cr=T.f,Pr=O.f,jr=vr.f,Rr=c.f,Lr=q("symbols"),Nr=q("op-symbols"),Mr=q("string-to-symbol-registry"),Ur=q("symbol-to-string-registry"),Dr=q("wks"),Fr=r.QObject,qr=!Fr||!Fr.prototype||!Fr.prototype.findChild,Br=o&&i((function(){return 7!=It(Pr({},"a",{get:function(){return Pr(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=Cr(Ar,t);r&&delete Ar[t],Pr(e,t,n),r&&e!==Ar&&Pr(Ar,t,r)}:Pr,Hr=function(e,t){var n=Lr[e]=It(Or.prototype);return Tr(n,{type:Sr,tag:e,description:t}),o||(n.description=t),n},Vr=Me?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof Or},Wr=function(e,t,n){e===Ar&&Wr(Nr,t,n),x(e);var r=v(t,!0);return x(n),b(Lr,r)?(n.enumerable?(b(e,Er)&&e[Er][r]&&(e[Er][r]=!1),n=It(n,{enumerable:u(0,!1)})):(b(e,Er)||Pr(e,Er,u(1,{})),e[Er][r]=!0),Br(e,r,n)):Pr(e,r,n)},zr=function(e,t){x(e);var n=g(t),r=Et(n).concat(Kr(n));return _r(r,(function(t){o&&!Yr.call(n,t)||Wr(e,t,n[t])})),e},Yr=function(e){var t=v(e,!0),n=Rr.call(this,t);return!(this===Ar&&b(Lr,t)&&!b(Nr,t))&&(!(n||!b(this,t)||!b(Lr,t)||b(this,Er)&&this[Er][t])||n)},$r=function(e,t){var n=g(e),r=v(t,!0);if(n!==Ar||!b(Lr,r)||b(Nr,r)){var i=Cr(n,r);return!i||!b(Lr,r)||b(n,Er)&&n[Er][r]||(i.enumerable=!0),i}},Gr=function(e){var t=jr(g(e)),n=[];return _r(t,(function(e){b(Lr,e)||b(Y,e)||n.push(e)})),n},Kr=function(e){var t=e===Ar,n=jr(t?Nr:g(e)),r=[];return _r(n,(function(e){!b(Lr,e)||t&&!b(Ar,e)||r.push(Lr[e])})),r};if(Ne||(ee((Or=function(){if(this instanceof Or)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=V(e),n=function(e){this===Ar&&n.call(Nr,e),b(this,Er)&&b(this[Er],t)&&(this[Er][t]=!1),Br(this,t,u(1,e))};return o&&qr&&Br(Ar,t,{configurable:!0,set:n}),Hr(t,e)}).prototype,"toString",(function(){return xr(this).tag})),ee(Or,"withoutSetter",(function(e){return Hr(V(e),e)})),c.f=Yr,O.f=Wr,T.f=$r,ye.f=vr.f=Gr,be.f=Kr,yr.f=function(e){return Hr(qe(e),e)},o&&(Pr(Or.prototype,"description",{configurable:!0,get:function(){return xr(this).description}}),ee(Ar,"propertyIsEnumerable",Yr,{unsafe:!0}))),Ce({global:!0,wrap:!0,forced:!Ne,sham:!Ne},{Symbol:Or}),_r(Et(Dr),(function(e){wr(e)})),Ce({target:Sr,stat:!0,forced:!Ne},{for:function(e){var t=String(e);if(b(Mr,t))return Mr[t];var n=Or(t);return Mr[t]=n,Ur[n]=t,n},keyFor:function(e){if(!Vr(e))throw TypeError(e+" is not a symbol");if(b(Ur,e))return Ur[e]},useSetter:function(){qr=!0},useSimple:function(){qr=!1}}),Ce({target:"Object",stat:!0,forced:!Ne,sham:!o},{create:function(e,t){return void 0===t?It(e):zr(It(e),t)},defineProperty:Wr,defineProperties:zr,getOwnPropertyDescriptor:$r}),Ce({target:"Object",stat:!0,forced:!Ne},{getOwnPropertyNames:Gr,getOwnPropertySymbols:Kr}),Ce({target:"Object",stat:!0,forced:i((function(){be.f(1)}))},{getOwnPropertySymbols:function(e){return be.f(Re(e))}}),Ir){var Xr=!Ne||i((function(){var e=Or();return"[null]"!=Ir([e])||"{}"!=Ir({a:e})||"{}"!=Ir(Object(e))}));Ce({target:"JSON",stat:!0,forced:Xr},{stringify:function(e,t,n){for(var r,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(r=t,(m(t)||void 0!==e)&&!Vr(e))return Le(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!Vr(t))return t}),i[1]=t,Ir.apply(null,i)}})}Or.prototype[kr]||I(Or.prototype,kr,Or.prototype.valueOf),Yn(Or,Sr),Y[Er]=!0;var Jr=O.f,Qr=r.Symbol;if(o&&"function"==typeof Qr&&(!("description"in Qr.prototype)||void 0!==Qr().description)){var Zr={},ei=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof ei?new Qr(e):void 0===e?Qr():Qr(e);return""===e&&(Zr[t]=!0),t};_e(ei,Qr);var ti=ei.prototype=Qr.prototype;ti.constructor=ei;var ni=ti.toString,ri="Symbol(test)"==String(Qr("test")),ii=/^Symbol\((.*)\)[^)]+$/;Jr(ti,"description",{configurable:!0,get:function(){var e=m(this)?this.valueOf():this,t=ni.call(e);if(b(Zr,e))return"";var n=ri?t.slice(7,-1):t.replace(ii,"$1");return""===n?void 0:n}}),Ce({global:!0,forced:!0},{Symbol:ei})}wr("iterator");var oi=pe.indexOf,ai=[].indexOf,si=!!ai&&1/[1].indexOf(1,-0)<0,ci=Ye("indexOf"),ui=Xe("indexOf",{ACCESSORS:!0,1:0});Ce({target:"Array",proto:!0,forced:si||!ci||!ui},{indexOf:function(e){return si?ai.apply(this,arguments)||0:oi(this,e,arguments.length>1?arguments[1]:void 0)}});var li="Array Iterator",fi=Z.set,hi=Z.getterFor(li),pi=rr(Array,"Array",(function(e,t){fi(this,{type:li,target:g(e),index:0,kind:t})}),(function(){var e=hi(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");nt.Arguments=nt.Array,jt("keys"),jt("values"),jt("entries");var di=[].join,gi=p!=Object,mi=Ye("join",",");Ce({target:"Array",proto:!0,forced:gi||!mi},{join:function(e){return di.call(g(this),void 0===e?",":e)}});var vi=Vt("slice"),yi=Xe("slice",{ACCESSORS:!0,0:0,1:2}),bi=qe("species"),wi=[].slice,_i=Math.max;Ce({target:"Array",proto:!0,forced:!vi||!yi},{slice:function(e,t){var n,r,i,o=g(this),a=ce(o.length),s=fe(e,a),c=fe(void 0===t?a:t,a);if(Le(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!Le(n.prototype)?m(n)&&null===(n=n[bi])&&(n=void 0):n=void 0,n===Array||void 0===n))return wi.call(o,s,c);for(r=new(void 0===n?Array:n)(_i(c-s,0)),i=0;s<c;s++,i++)s in o&&at(r,i,o[s]);return r.length=i,r}});var Ei=ct?{}.toString:function(){return"[object "+ft(this)+"]"};ct||ee(Object.prototype,"toString",Ei,{unsafe:!0});var Si=qe("species"),ki=!i((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),Ti="$0"==="a".replace(/./,"$0"),xi=qe("replace"),Ai=!!/./[xi]&&""===/./[xi]("a","$0"),Oi=!i((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),Ii=function(e,t,n,r){var o=qe(e),a=!i((function(){var t={};return t[o]=function(){return 7},7!=""[e](t)})),s=a&&!i((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[Si]=function(){return n},n.flags="",n[o]=/./[o]),n.exec=function(){return t=!0,null},n[o](""),!t}));if(!a||!s||"replace"===e&&(!ki||!Ti||Ai)||"split"===e&&!Oi){var c=/./[o],u=n(o,""[e],(function(e,t,n,r,i){return t.exec===kn?a&&!i?{done:!0,value:c.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:Ti,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:Ai}),l=u[0],f=u[1];ee(String.prototype,e,l),ee(RegExp.prototype,o,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}r&&I(RegExp.prototype[o],"sham",!0)},Ci=Mn.charAt,Pi=function(e,t,n){return t+(n?Ci(e,t).length:1)},ji=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==f(e))throw TypeError("RegExp#exec called on incompatible receiver");return kn.call(e,t)},Ri=Math.max,Li=Math.min,Ni=Math.floor,Mi=/\$([$&'`]|\d\d?|<[^>]*>)/g,Ui=/\$([$&'`]|\d\d?)/g;Ii("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=r.REPLACE_KEEPS_$0,a=i?"$":"$0";return[function(n,r){var i=d(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&o||"string"==typeof r&&-1===r.indexOf(a)){var c=n(t,e,this,r);if(c.done)return c.value}var u=x(e),l=String(this),f="function"==typeof r;f||(r=String(r));var h=u.global;if(h){var p=u.unicode;u.lastIndex=0}for(var d=[];;){var g=ji(u,l);if(null===g)break;if(d.push(g),!h)break;""===String(g[0])&&(u.lastIndex=Pi(l,ce(u.lastIndex),p))}for(var m,v="",y=0,b=0;b<d.length;b++){g=d[b];for(var w=String(g[0]),_=Ri(Li(ae(g.index),l.length),0),E=[],S=1;S<g.length;S++)E.push(void 0===(m=g[S])?m:String(m));var k=g.groups;if(f){var T=[w].concat(E,_,l);void 0!==k&&T.push(k);var A=String(r.apply(void 0,T))}else A=s(w,l,_,E,k,r);_>=y&&(v+=l.slice(y,_)+A,y=_+w.length)}return v+l.slice(y)}];function s(e,n,r,i,o,a){var s=r+e.length,c=i.length,u=Ui;return void 0!==o&&(o=Re(o),u=Mi),t.call(a,u,(function(t,a){var u;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":u=o[a.slice(1,-1)];break;default:var l=+a;if(0===l)return t;if(l>c){var f=Ni(l/10);return 0===f?t:f<=c?void 0===i[f-1]?a.charAt(1):i[f-1]+a.charAt(1):t}u=i[l-1]}return void 0===u?"":u}))}}));var Di=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};Ii("search",1,(function(e,t,n){return[function(t){var n=d(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=x(e),o=String(this),a=i.lastIndex;Di(a,0)||(i.lastIndex=0);var s=ji(i,o);return Di(i.lastIndex,a)||(i.lastIndex=a),null===s?-1:s.index}]}));var Fi=qe("species"),qi=function(e,t){var n,r=x(e).constructor;return void 0===r||null==(n=x(r)[Fi])?t:Pe(n)},Bi=[].push,Hi=Math.min,Vi=4294967295,Wi=!i((function(){return!RegExp(Vi,"y")}));Ii("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(d(this)),i=void 0===n?Vi:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!Jt(e))return t.call(r,e,i);for(var o,a,s,c=[],u=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),l=0,f=new RegExp(e.source,u+"g");(o=kn.call(f,r))&&!((a=f.lastIndex)>l&&(c.push(r.slice(l,o.index)),o.length>1&&o.index<r.length&&Bi.apply(c,o.slice(1)),s=o[0].length,l=a,c.length>=i));)f.lastIndex===o.index&&f.lastIndex++;return l===r.length?!s&&f.test("")||c.push(""):c.push(r.slice(l)),c.length>i?c.slice(0,i):c}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=d(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var o=n(r,e,this,i,r!==t);if(o.done)return o.value;var a=x(e),s=String(this),c=qi(a,RegExp),u=a.unicode,l=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(Wi?"y":"g"),f=new c(Wi?a:"^(?:"+a.source+")",l),h=void 0===i?Vi:i>>>0;if(0===h)return[];if(0===s.length)return null===ji(f,s)?[s]:[];for(var p=0,d=0,g=[];d<s.length;){f.lastIndex=Wi?d:0;var m,v=ji(f,Wi?s:s.slice(d));if(null===v||(m=Hi(ce(f.lastIndex+(Wi?0:d)),s.length))===p)d=Pi(s,d,u);else{if(g.push(s.slice(p,d)),g.length===h)return g;for(var y=1;y<=v.length-1;y++)if(g.push(v[y]),g.length===h)return g;d=p=m}}return g.push(s.slice(p)),g}]}),!Wi);var zi=qe("iterator"),Yi=qe("toStringTag"),$i=pi.values;for(var Gi in cr){var Ki=r[Gi],Xi=Ki&&Ki.prototype;if(Xi){if(Xi[zi]!==$i)try{I(Xi,zi,$i)}catch(e){Xi[zi]=$i}if(Xi[Yi]||I(Xi,Yi,Gi),cr[Gi])for(var Ji in pi)if(Xi[Ji]!==pi[Ji])try{I(Xi,Ji,pi[Ji])}catch(e){Xi[Ji]=pi[Ji]}}}var Qi=qe("iterator"),Zi=!i((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,r){t.delete("b"),n+=r+e})),!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[Qi]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})),eo=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},to=Object.assign,no=Object.defineProperty,ro=!to||i((function(){if(o&&1!==to({b:1},to(no({},"a",{enumerable:!0,get:function(){no(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=to({},e)[n]||Et(to({},t)).join("")!=r}))?function(e,t){for(var n=Re(e),r=arguments.length,i=1,a=be.f,s=c.f;r>i;)for(var u,l=p(arguments[i++]),f=a?Et(l).concat(a(l)):Et(l),h=f.length,d=0;h>d;)u=f[d++],o&&!s.call(l,u)||(n[u]=l[u]);return n}:to,io=2147483647,oo=/[^\0-\u007E]/,ao=/[.\u3002\uFF0E\uFF61]/g,so="Overflow: input needs wider integers to process",co=Math.floor,uo=String.fromCharCode,lo=function(e){return e+22+75*(e<26)},fo=function(e,t,n){var r=0;for(e=n?co(e/700):e>>1,e+=co(e/t);e>455;r+=36)e=co(e/35);return co(r+36*e/(e+38))},ho=function(e){var t,n,r=[],i=(e=function(e){for(var t=[],n=0,r=e.length;n<r;){var i=e.charCodeAt(n++);if(i>=55296&&i<=56319&&n<r){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&i)<<10)+(1023&o)+65536):(t.push(i),n--)}else t.push(i)}return t}(e)).length,o=128,a=0,s=72;for(t=0;t<e.length;t++)(n=e[t])<128&&r.push(uo(n));var c=r.length,u=c;for(c&&r.push("-");u<i;){var l=io;for(t=0;t<e.length;t++)(n=e[t])>=o&&n<l&&(l=n);var f=u+1;if(l-o>co((io-a)/f))throw RangeError(so);for(a+=(l-o)*f,o=l,t=0;t<e.length;t++){if((n=e[t])<o&&++a>io)throw RangeError(so);if(n==o){for(var h=a,p=36;;p+=36){var d=p<=s?1:p>=s+26?26:p-s;if(h<d)break;var g=h-d,m=36-d;r.push(uo(lo(d+g%m))),h=co(g/m)}r.push(uo(lo(h))),s=fo(a,f,u==c),a=0,++u}}++a,++o}return r.join("")},po=function(e,t,n){for(var r in t)ee(e,r,t[r],n);return e},go=function(e){var t=pt(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return x(t.call(e))},mo=re("fetch"),vo=re("Headers"),yo=qe("iterator"),bo="URLSearchParams",wo="URLSearchParamsIterator",_o=Z.set,Eo=Z.getterFor(bo),So=Z.getterFor(wo),ko=/\+/g,To=Array(4),xo=function(e){return To[e-1]||(To[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},Ao=function(e){try{return decodeURIComponent(e)}catch(t){return e}},Oo=function(e){var t=e.replace(ko," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(xo(n--),Ao);return t}},Io=/[!'()~]|%20/g,Co={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},Po=function(e){return Co[e]},jo=function(e){return encodeURIComponent(e).replace(Io,Po)},Ro=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o<i.length;)(n=i[o++]).length&&(r=n.split("="),e.push({key:Oo(r.shift()),value:Oo(r.join("="))}))},Lo=function(e){this.entries.length=0,Ro(this.entries,e)},No=function(e,t){if(e<t)throw TypeError("Not enough arguments")},Mo=Kn((function(e,t){_o(this,{type:wo,iterator:go(Eo(e).entries),kind:t})}),"Iterator",(function(){var e=So(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value="keys"===t?r.key:"values"===t?r.value:[r.key,r.value]),n})),Uo=function(){eo(this,Uo,bo);var e,t,n,r,i,o,a,s,c,u=arguments.length>0?arguments[0]:void 0,l=this,f=[];if(_o(l,{type:bo,entries:f,updateURL:function(){},updateSearchParams:Lo}),void 0!==u)if(m(u))if("function"==typeof(e=pt(u)))for(n=(t=e.call(u)).next;!(r=n.call(t)).done;){if((a=(o=(i=go(x(r.value))).next).call(i)).done||(s=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");f.push({key:a.value+"",value:s.value+""})}else for(c in u)b(u,c)&&f.push({key:c,value:u[c]+""});else Ro(f,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},Do=Uo.prototype;po(Do,{append:function(e,t){No(arguments.length,2);var n=Eo(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){No(arguments.length,1);for(var t=Eo(this),n=t.entries,r=e+"",i=0;i<n.length;)n[i].key===r?n.splice(i,1):i++;t.updateURL()},get:function(e){No(arguments.length,1);for(var t=Eo(this).entries,n=e+"",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){No(arguments.length,1);for(var t=Eo(this).entries,n=e+"",r=[],i=0;i<t.length;i++)t[i].key===n&&r.push(t[i].value);return r},has:function(e){No(arguments.length,1);for(var t=Eo(this).entries,n=e+"",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){No(arguments.length,1);for(var n,r=Eo(this),i=r.entries,o=!1,a=e+"",s=t+"",c=0;c<i.length;c++)(n=i[c]).key===a&&(o?i.splice(c--,1):(o=!0,n.value=s));o||i.push({key:a,value:s}),r.updateURL()},sort:function(){var e,t,n,r=Eo(this),i=r.entries,o=i.slice();for(i.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(i[t].key>e.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=Eo(this).entries,r=je(e,arguments.length>1?arguments[1]:void 0,3),i=0;i<n.length;)r((t=n[i++]).value,t.key,this)},keys:function(){return new Mo(this,"keys")},values:function(){return new Mo(this,"values")},entries:function(){return new Mo(this,"entries")}},{enumerable:!0}),ee(Do,yo,Do.entries),ee(Do,"toString",(function(){for(var e,t=Eo(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(jo(e.key)+"="+jo(e.value));return n.join("&")}),{enumerable:!0}),Yn(Uo,bo),Ce({global:!0,forced:!Zi},{URLSearchParams:Uo}),Zi||"function"!=typeof mo||"function"!=typeof vo||Ce({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,i=[e];return arguments.length>1&&(m(t=arguments[1])&&(n=t.body,ft(n)===bo&&((r=t.headers?new vo(t.headers):new vo).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=It(t,{body:u(0,String(n)),headers:u(0,r)}))),i.push(t)),mo.apply(this,i)}});var Fo,qo={URLSearchParams:Uo,getState:Eo},Bo=Mn.codeAt,Ho=r.URL,Vo=qo.URLSearchParams,Wo=qo.getState,zo=Z.set,Yo=Z.getterFor("URL"),$o=Math.floor,Go=Math.pow,Ko="Invalid scheme",Xo="Invalid host",Jo="Invalid port",Qo=/[A-Za-z]/,Zo=/[\d+-.A-Za-z]/,ea=/\d/,ta=/^(0x|0X)/,na=/^[0-7]+$/,ra=/^\d+$/,ia=/^[\dA-Fa-f]+$/,oa=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,aa=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,sa=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,ca=/[\u0009\u000A\u000D]/g,ua=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return Xo;if(!(n=fa(t.slice(1,-1))))return Xo;e.host=n}else if(ba(e)){if(t=function(e){var t,n,r=[],i=e.toLowerCase().replace(ao,".").split(".");for(t=0;t<i.length;t++)n=i[t],r.push(oo.test(n)?"xn--"+ho(n):n);return r.join(".")}(t),oa.test(t))return Xo;if(null===(n=la(t)))return Xo;e.host=n}else{if(aa.test(t))return Xo;for(n="",r=dt(t),i=0;i<r.length;i++)n+=va(r[i],pa);e.host=n}},la=function(e){var t,n,r,i,o,a,s,c=e.split(".");if(c.length&&""==c[c.length-1]&&c.pop(),(t=c.length)>4)return e;for(n=[],r=0;r<t;r++){if(""==(i=c[r]))return e;if(o=10,i.length>1&&"0"==i.charAt(0)&&(o=ta.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)a=0;else{if(!(10==o?ra:8==o?na:ia).test(i))return e;a=parseInt(i,o)}n.push(a)}for(r=0;r<t;r++)if(a=n[r],r==t-1){if(a>=Go(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*Go(256,3-r);return s},fa=function(e){var t,n,r,i,o,a,s,c=[0,0,0,0,0,0,0,0],u=0,l=null,f=0,h=function(){return e.charAt(f)};if(":"==h()){if(":"!=e.charAt(1))return;f+=2,l=++u}for(;h();){if(8==u)return;if(":"!=h()){for(t=n=0;n<4&&ia.test(h());)t=16*t+parseInt(h(),16),f++,n++;if("."==h()){if(0==n)return;if(f-=n,u>6)return;for(r=0;h();){if(i=null,r>0){if(!("."==h()&&r<4))return;f++}if(!ea.test(h()))return;for(;ea.test(h());){if(o=parseInt(h(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==h()){if(f++,!h())return}else if(h())return;c[u++]=t}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(a=u-l,u=7;0!=u&&a>0;)s=c[u],c[u--]=c[l+a-1],c[l+--a]=s;else if(8!=u)return;return c},ha=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=$o(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},pa={},da=ro({},pa,{" ":1,'"':1,"<":1,">":1,"`":1}),ga=ro({},da,{"#":1,"?":1,"{":1,"}":1}),ma=ro({},ga,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),va=function(e,t){var n=Bo(e,0);return n>32&&n<127&&!b(t,e)?e:encodeURIComponent(e)},ya={ftp:21,file:null,http:80,https:443,ws:80,wss:443},ba=function(e){return b(ya,e.scheme)},wa=function(e){return""!=e.username||""!=e.password},_a=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},Ea=function(e,t){var n;return 2==e.length&&Qo.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},Sa=function(e){var t;return e.length>1&&Ea(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},ka=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&Ea(t[0],!0)||t.pop()},Ta=function(e){return"."===e||"%2e"===e.toLowerCase()},xa={},Aa={},Oa={},Ia={},Ca={},Pa={},ja={},Ra={},La={},Na={},Ma={},Ua={},Da={},Fa={},qa={},Ba={},Ha={},Va={},Wa={},za={},Ya={},$a=function(e,t,n,r){var i,o,a,s,c,u=n||xa,l=0,f="",h=!1,p=!1,d=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(sa,"")),t=t.replace(ca,""),i=dt(t);l<=i.length;){switch(o=i[l],u){case xa:if(!o||!Qo.test(o)){if(n)return Ko;u=Oa;continue}f+=o.toLowerCase(),u=Aa;break;case Aa:if(o&&(Zo.test(o)||"+"==o||"-"==o||"."==o))f+=o.toLowerCase();else{if(":"!=o){if(n)return Ko;f="",u=Oa,l=0;continue}if(n&&(ba(e)!=b(ya,f)||"file"==f&&(wa(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(ba(e)&&ya[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?u=Fa:ba(e)&&r&&r.scheme==e.scheme?u=Ia:ba(e)?u=Ra:"/"==i[l+1]?(u=Ca,l++):(e.cannotBeABaseURL=!0,e.path.push(""),u=Wa)}break;case Oa:if(!r||r.cannotBeABaseURL&&"#"!=o)return Ko;if(r.cannotBeABaseURL&&"#"==o){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,u=Ya;break}u="file"==r.scheme?Fa:Pa;continue;case Ia:if("/"!=o||"/"!=i[l+1]){u=Pa;continue}u=La,l++;break;case Ca:if("/"==o){u=Na;break}u=Va;continue;case Pa:if(e.scheme=r.scheme,o==Fo)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==o||"\\"==o&&ba(e))u=ja;else if("?"==o)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",u=za;else{if("#"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),u=Va;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=Ya}break;case ja:if(!ba(e)||"/"!=o&&"\\"!=o){if("/"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,u=Va;continue}u=Na}else u=La;break;case Ra:if(u=La,"/"!=o||"/"!=f.charAt(l+1))continue;l++;break;case La:if("/"!=o&&"\\"!=o){u=Na;continue}break;case Na:if("@"==o){h&&(f="%40"+f),h=!0,a=dt(f);for(var g=0;g<a.length;g++){var m=a[g];if(":"!=m||d){var v=va(m,ma);d?e.password+=v:e.username+=v}else d=!0}f=""}else if(o==Fo||"/"==o||"?"==o||"#"==o||"\\"==o&&ba(e)){if(h&&""==f)return"Invalid authority";l-=dt(f).length+1,f="",u=Ma}else f+=o;break;case Ma:case Ua:if(n&&"file"==e.scheme){u=Ba;continue}if(":"!=o||p){if(o==Fo||"/"==o||"?"==o||"#"==o||"\\"==o&&ba(e)){if(ba(e)&&""==f)return Xo;if(n&&""==f&&(wa(e)||null!==e.port))return;if(s=ua(e,f))return s;if(f="",u=Ha,n)return;continue}"["==o?p=!0:"]"==o&&(p=!1),f+=o}else{if(""==f)return Xo;if(s=ua(e,f))return s;if(f="",u=Da,n==Ua)return}break;case Da:if(!ea.test(o)){if(o==Fo||"/"==o||"?"==o||"#"==o||"\\"==o&&ba(e)||n){if(""!=f){var y=parseInt(f,10);if(y>65535)return Jo;e.port=ba(e)&&y===ya[e.scheme]?null:y,f=""}if(n)return;u=Ha;continue}return Jo}f+=o;break;case Fa:if(e.scheme="file","/"==o||"\\"==o)u=qa;else{if(!r||"file"!=r.scheme){u=Va;continue}if(o==Fo)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==o)e.host=r.host,e.path=r.path.slice(),e.query="",u=za;else{if("#"!=o){Sa(i.slice(l).join(""))||(e.host=r.host,e.path=r.path.slice(),ka(e)),u=Va;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=Ya}}break;case qa:if("/"==o||"\\"==o){u=Ba;break}r&&"file"==r.scheme&&!Sa(i.slice(l).join(""))&&(Ea(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),u=Va;continue;case Ba:if(o==Fo||"/"==o||"\\"==o||"?"==o||"#"==o){if(!n&&Ea(f))u=Va;else if(""==f){if(e.host="",n)return;u=Ha}else{if(s=ua(e,f))return s;if("localhost"==e.host&&(e.host=""),n)return;f="",u=Ha}continue}f+=o;break;case Ha:if(ba(e)){if(u=Va,"/"!=o&&"\\"!=o)continue}else if(n||"?"!=o)if(n||"#"!=o){if(o!=Fo&&(u=Va,"/"!=o))continue}else e.fragment="",u=Ya;else e.query="",u=za;break;case Va:if(o==Fo||"/"==o||"\\"==o&&ba(e)||!n&&("?"==o||"#"==o)){if(".."===(c=(c=f).toLowerCase())||"%2e."===c||".%2e"===c||"%2e%2e"===c?(ka(e),"/"==o||"\\"==o&&ba(e)||e.path.push("")):Ta(f)?"/"==o||"\\"==o&&ba(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&Ea(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(o==Fo||"?"==o||"#"==o))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==o?(e.query="",u=za):"#"==o&&(e.fragment="",u=Ya)}else f+=va(o,ga);break;case Wa:"?"==o?(e.query="",u=za):"#"==o?(e.fragment="",u=Ya):o!=Fo&&(e.path[0]+=va(o,pa));break;case za:n||"#"!=o?o!=Fo&&("'"==o&&ba(e)?e.query+="%27":e.query+="#"==o?"%23":va(o,pa)):(e.fragment="",u=Ya);break;case Ya:o!=Fo&&(e.fragment+=va(o,da))}l++}},Ga=function(e){var t,n,r=eo(this,Ga,"URL"),i=arguments.length>1?arguments[1]:void 0,a=String(e),s=zo(r,{type:"URL"});if(void 0!==i)if(i instanceof Ga)t=Yo(i);else if(n=$a(t={},String(i)))throw TypeError(n);if(n=$a(s,a,null,t))throw TypeError(n);var c=s.searchParams=new Vo,u=Wo(c);u.updateSearchParams(s.query),u.updateURL=function(){s.query=String(c)||null},o||(r.href=Xa.call(r),r.origin=Ja.call(r),r.protocol=Qa.call(r),r.username=Za.call(r),r.password=es.call(r),r.host=ts.call(r),r.hostname=ns.call(r),r.port=rs.call(r),r.pathname=is.call(r),r.search=os.call(r),r.searchParams=as.call(r),r.hash=ss.call(r))},Ka=Ga.prototype,Xa=function(){var e=Yo(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,a=e.path,s=e.query,c=e.fragment,u=t+":";return null!==i?(u+="//",wa(e)&&(u+=n+(r?":"+r:"")+"@"),u+=ha(i),null!==o&&(u+=":"+o)):"file"==t&&(u+="//"),u+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(u+="?"+s),null!==c&&(u+="#"+c),u},Ja=function(){var e=Yo(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&ba(e)?t+"://"+ha(e.host)+(null!==n?":"+n:""):"null"},Qa=function(){return Yo(this).scheme+":"},Za=function(){return Yo(this).username},es=function(){return Yo(this).password},ts=function(){var e=Yo(this),t=e.host,n=e.port;return null===t?"":null===n?ha(t):ha(t)+":"+n},ns=function(){var e=Yo(this).host;return null===e?"":ha(e)},rs=function(){var e=Yo(this).port;return null===e?"":String(e)},is=function(){var e=Yo(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},os=function(){var e=Yo(this).query;return e?"?"+e:""},as=function(){return Yo(this).searchParams},ss=function(){var e=Yo(this).fragment;return e?"#"+e:""},cs=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&St(Ka,{href:cs(Xa,(function(e){var t=Yo(this),n=String(e),r=$a(t,n);if(r)throw TypeError(r);Wo(t.searchParams).updateSearchParams(t.query)})),origin:cs(Ja),protocol:cs(Qa,(function(e){var t=Yo(this);$a(t,String(e)+":",xa)})),username:cs(Za,(function(e){var t=Yo(this),n=dt(String(e));if(!_a(t)){t.username="";for(var r=0;r<n.length;r++)t.username+=va(n[r],ma)}})),password:cs(es,(function(e){var t=Yo(this),n=dt(String(e));if(!_a(t)){t.password="";for(var r=0;r<n.length;r++)t.password+=va(n[r],ma)}})),host:cs(ts,(function(e){var t=Yo(this);t.cannotBeABaseURL||$a(t,String(e),Ma)})),hostname:cs(ns,(function(e){var t=Yo(this);t.cannotBeABaseURL||$a(t,String(e),Ua)})),port:cs(rs,(function(e){var t=Yo(this);_a(t)||(""==(e=String(e))?t.port=null:$a(t,e,Da))})),pathname:cs(is,(function(e){var t=Yo(this);t.cannotBeABaseURL||(t.path=[],$a(t,e+"",Ha))})),search:cs(os,(function(e){var t=Yo(this);""==(e=String(e))?t.query=null:("?"==e.charAt(0)&&(e=e.slice(1)),t.query="",$a(t,e,za)),Wo(t.searchParams).updateSearchParams(t.query)})),searchParams:cs(as),hash:cs(ss,(function(e){var t=Yo(this);""!=(e=String(e))?("#"==e.charAt(0)&&(e=e.slice(1)),t.fragment="",$a(t,e,Ya)):t.fragment=null}))}),ee(Ka,"toJSON",(function(){return Xa.call(this)}),{enumerable:!0}),ee(Ka,"toString",(function(){return Xa.call(this)}),{enumerable:!0}),Ho){var us=Ho.createObjectURL,ls=Ho.revokeObjectURL;us&&ee(Ga,"createObjectURL",(function(e){return us.apply(Ho,arguments)})),ls&&ee(Ga,"revokeObjectURL",(function(e){return ls.apply(Ho,arguments)}))}function fs(e){return(fs="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function hs(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function ps(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ds(e,t,n){return t&&ps(e.prototype,t),n&&ps(e,n),e}function gs(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ms(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function vs(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ms(Object(n),!0).forEach((function(t){gs(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ms(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function ys(e,t){if(null==e)return{};var n,r,i=function(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function bs(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw o}}return n}(e,t)||_s(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function ws(e){return function(e){if(Array.isArray(e))return Es(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||_s(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function _s(e,t){if(e){if("string"==typeof e)return Es(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?Es(e,t):void 0}}function Es(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}Yn(Ga,"URL"),Ce({global:!0,forced:!Zi,sham:!o},{URL:Ga}),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},r=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},i=function(e){return decodeURIComponent(String(e).replace(/\+/g," "))};(function(){try{var t=e.URLSearchParams;return"a=1"===new t("?a=1").toString()&&"function"==typeof t.prototype.set&&"function"==typeof t.prototype.entries}catch(e){return!1}})()||function(){var i=function e(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var n=fs(t);if("undefined"===n);else if("string"===n)""!==t&&this._fromString(t);else if(t instanceof e){var r=this;t.forEach((function(e,t){r.append(t,e)}))}else{if(null===t||"object"!==n)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var i=0;i<t.length;i++){var o=t[i];if("[object Array]"!==Object.prototype.toString.call(o)&&2===o.length)throw new TypeError("Expected [string, any] as entry at index "+i+" of URLSearchParams's input");this.append(o[0],o[1])}else for(var a in t)t.hasOwnProperty(a)&&this.append(a,t[a])}},o=i.prototype;o.append=function(e,t){e in this._entries?this._entries[e].push(String(t)):this._entries[e]=[String(t)]},o.delete=function(e){delete this._entries[e]},o.get=function(e){return e in this._entries?this._entries[e][0]:null},o.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},o.has=function(e){return e in this._entries},o.set=function(e,t){this._entries[e]=[String(t)]},o.forEach=function(e,t){var n;for(var r in this._entries)if(this._entries.hasOwnProperty(r)){n=this._entries[r];for(var i=0;i<n.length;i++)e.call(t,n[i],r,this)}},o.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),n(e)},o.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),n(e)},o.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),n(e)},t&&(o[Symbol.iterator]=o.entries),o.toString=function(){var e=[];return this.forEach((function(t,n){e.push(r(n)+"="+r(t))})),e.join("&")},e.URLSearchParams=i}();var o=e.URLSearchParams.prototype;"function"!=typeof o.sort&&(o.sort=function(){var e=this,t=[];this.forEach((function(n,r){t.push([r,n]),e._entries||e.delete(r)})),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])}),"function"!=typeof o._fromString&&Object.defineProperty(o,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){if(this._entries)this._entries={};else{var t=[];this.forEach((function(e,n){t.push(n)}));for(var n=0;n<t.length;n++)this.delete(t[n])}var r,o=(e=e.replace(/^\?/,"")).split("&");for(n=0;n<o.length;n++)r=o[n].split("="),this.append(i(r[0]),r.length>1?i(r[1]):"")}})}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var t=new e.URL("b","http://a");return t.pathname="c d","http://a/c%20d"===t.href&&t.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t));var r,i=document;if(n&&(void 0===e.location||n!==e.location.href)){(r=(i=document.implementation.createHTMLDocument("")).createElement("base")).href=n,i.head.appendChild(r);try{if(0!==r.href.indexOf(n))throw new Error(r.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=i.createElement("a");o.href=t,r&&(i.body.appendChild(o),o.href=o.href);var a=i.createElement("input");if(a.type="url",a.value=t,":"===o.protocol||!/:/.test(o.href)||!a.checkValidity()&&!n)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var s=new e.URLSearchParams(this.search),c=!0,u=!0,l=this;["append","delete","set"].forEach((function(e){var t=s[e];s[e]=function(){t.apply(s,arguments),c&&(u=!1,l.search=s.toString(),u=!0)}})),Object.defineProperty(this,"searchParams",{value:s,enumerable:!0});var f=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==f&&(f=this.search,u&&(c=!1,this.searchParams._fromString(this.search),c=!0))}})},r=n.prototype;["hash","host","hostname","port","protocol"].forEach((function(e){!function(e){Object.defineProperty(r,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)})),Object.defineProperty(r,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(r,{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),wr("asyncIterator");var Ss=qe("isConcatSpreadable"),ks=9007199254740991,Ts="Maximum allowed index exceeded",xs=Bt>=51||!i((function(){var e=[];return e[Ss]=!1,e.concat()[0]!==e})),As=Vt("concat"),Os=function(e){if(!m(e))return!1;var t=e[Ss];return void 0!==t?!!t:Le(e)};Ce({target:"Array",proto:!0,forced:!xs||!As},{concat:function(e){var t,n,r,i,o,a=Re(this),s=He(a,0),c=0;for(t=-1,r=arguments.length;t<r;t++)if(Os(o=-1===t?a:arguments[t])){if(c+(i=ce(o.length))>ks)throw TypeError(Ts);for(n=0;n<i;n++,c++)n in o&&at(s,c,o[n])}else{if(c>=ks)throw TypeError(Ts);at(s,c++,o)}return s.length=c,s}}),Ce({target:"Object",stat:!0,forced:Object.assign!==ro},{assign:ro});var Is=T.f,Cs=i((function(){Is(1)}));Ce({target:"Object",stat:!0,forced:!o||Cs,sham:!o},{getOwnPropertyDescriptor:function(e,t){return Is(g(e),t)}});var Ps,js,Rs,Ls=r.Promise,Ns=t((function(e){var t=function(e,t){this.stopped=e,this.result=t};(e.exports=function(e,n,r,i,o){var a,s,c,u,l,f,h,p=je(n,r,i?2:1);if(o)a=e;else{if("function"!=typeof(s=pt(e)))throw TypeError("Target is not iterable");if(ot(s)){for(c=0,u=ce(e.length);u>c;c++)if((l=i?p(x(h=e[c])[0],h[1]):p(e[c]))&&l instanceof t)return l;return new t(!1)}a=s.call(e)}for(f=a.next;!(h=f.call(a)).done;)if("object"==typeof(l=tt(a,p,h.value,i))&&l&&l instanceof t)return l;return new t(!1)}).stop=function(e){return new t(!0,e)}})),Ms=/(iphone|ipod|ipad).*applewebkit/i.test(Ut),Us=r.location,Ds=r.setImmediate,Fs=r.clearImmediate,qs=r.process,Bs=r.MessageChannel,Hs=r.Dispatch,Vs=0,Ws={},zs="onreadystatechange",Ys=function(e){if(Ws.hasOwnProperty(e)){var t=Ws[e];delete Ws[e],t()}},$s=function(e){return function(){Ys(e)}},Gs=function(e){Ys(e.data)},Ks=function(e){r.postMessage(e+"",Us.protocol+"//"+Us.host)};Ds&&Fs||(Ds=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return Ws[++Vs]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},Ps(Vs),Vs},Fs=function(e){delete Ws[e]},"process"==f(qs)?Ps=function(e){qs.nextTick($s(e))}:Hs&&Hs.now?Ps=function(e){Hs.now($s(e))}:Bs&&!Ms?(Rs=(js=new Bs).port2,js.port1.onmessage=Gs,Ps=je(Rs.postMessage,Rs,1)):!r.addEventListener||"function"!=typeof postMessage||r.importScripts||i(Ks)||"file:"===Us.protocol?Ps=zs in E("script")?function(e){kt.appendChild(E("script")).onreadystatechange=function(){kt.removeChild(this),Ys(e)}}:function(e){setTimeout($s(e),0)}:(Ps=Ks,r.addEventListener("message",Gs,!1)));var Xs,Js,Qs,Zs,ec,tc,nc,rc,ic={set:Ds,clear:Fs},oc=T.f,ac=ic.set,sc=r.MutationObserver||r.WebKitMutationObserver,cc=r.process,uc=r.Promise,lc="process"==f(cc),fc=oc(r,"queueMicrotask"),hc=fc&&fc.value;hc||(Xs=function(){var e,t;for(lc&&(e=cc.domain)&&e.exit();Js;){t=Js.fn,Js=Js.next;try{t()}catch(e){throw Js?Zs():Qs=void 0,e}}Qs=void 0,e&&e.enter()},lc?Zs=function(){cc.nextTick(Xs)}:sc&&!Ms?(ec=!0,tc=document.createTextNode(""),new sc(Xs).observe(tc,{characterData:!0}),Zs=function(){tc.data=ec=!ec}):uc&&uc.resolve?(nc=uc.resolve(void 0),rc=nc.then,Zs=function(){rc.call(nc,Xs)}):Zs=function(){ac.call(r,Xs)});var pc,dc,gc,mc,vc=hc||function(e){var t={fn:e,next:void 0};Qs&&(Qs.next=t),Js||(Js=t,Zs()),Qs=t},yc=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=Pe(t),this.reject=Pe(n)},bc={f:function(e){return new yc(e)}},wc=function(e,t){if(x(e),m(t)&&t.constructor===e)return t;var n=bc.f(e);return(0,n.resolve)(t),n.promise},_c=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},Ec=ic.set,Sc=qe("species"),kc="Promise",Tc=Z.get,xc=Z.set,Ac=Z.getterFor(kc),Oc=Ls,Ic=r.TypeError,Cc=r.document,Pc=r.process,jc=re("fetch"),Rc=bc.f,Lc=Rc,Nc="process"==f(Pc),Mc=!!(Cc&&Cc.createEvent&&r.dispatchEvent),Uc="unhandledrejection",Dc=Oe(kc,(function(){if(!(U(Oc)!==String(Oc))){if(66===Bt)return!0;if(!Nc&&"function"!=typeof PromiseRejectionEvent)return!0}if(Bt>=51&&/native code/.test(Oc))return!1;var e=Oc.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[Sc]=t,!(e.then((function(){}))instanceof t)})),Fc=Dc||!bt((function(e){Oc.all(e).catch((function(){}))})),qc=function(e){var t;return!(!m(e)||"function"!=typeof(t=e.then))&&t},Bc=function(e,t,n){if(!t.notified){t.notified=!0;var r=t.reactions;vc((function(){for(var i=t.value,o=1==t.state,a=0;r.length>a;){var s,c,u,l=r[a++],f=o?l.ok:l.fail,h=l.resolve,p=l.reject,d=l.domain;try{f?(o||(2===t.rejection&&zc(e,t),t.rejection=1),!0===f?s=i:(d&&d.enter(),s=f(i),d&&(d.exit(),u=!0)),s===l.promise?p(Ic("Promise-chain cycle")):(c=qc(s))?c.call(s,h,p):h(s)):p(i)}catch(e){d&&!u&&d.exit(),p(e)}}t.reactions=[],t.notified=!1,n&&!t.rejection&&Vc(e,t)}))}},Hc=function(e,t,n){var i,o;Mc?((i=Cc.createEvent("Event")).promise=t,i.reason=n,i.initEvent(e,!1,!0),r.dispatchEvent(i)):i={promise:t,reason:n},(o=r["on"+e])?o(i):e===Uc&&function(e,t){var n=r.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}("Unhandled promise rejection",n)},Vc=function(e,t){Ec.call(r,(function(){var n,r=t.value;if(Wc(t)&&(n=_c((function(){Nc?Pc.emit("unhandledRejection",r,e):Hc(Uc,e,r)})),t.rejection=Nc||Wc(t)?2:1,n.error))throw n.value}))},Wc=function(e){return 1!==e.rejection&&!e.parent},zc=function(e,t){Ec.call(r,(function(){Nc?Pc.emit("rejectionHandled",e):Hc("rejectionhandled",e,t.value)}))},Yc=function(e,t,n,r){return function(i){e(t,n,i,r)}},$c=function(e,t,n,r){t.done||(t.done=!0,r&&(t=r),t.value=n,t.state=2,Bc(e,t,!0))},Gc=function(e,t,n,r){if(!t.done){t.done=!0,r&&(t=r);try{if(e===n)throw Ic("Promise can't be resolved itself");var i=qc(n);i?vc((function(){var r={done:!1};try{i.call(n,Yc(Gc,e,r,t),Yc($c,e,r,t))}catch(n){$c(e,r,n,t)}})):(t.value=n,t.state=1,Bc(e,t,!1))}catch(n){$c(e,{done:!1},n,t)}}};Dc&&(Oc=function(e){eo(this,Oc,kc),Pe(e),pc.call(this);var t=Tc(this);try{e(Yc(Gc,this,t),Yc($c,this,t))}catch(e){$c(this,t,e)}},(pc=function(e){xc(this,{type:kc,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=po(Oc.prototype,{then:function(e,t){var n=Ac(this),r=Rc(qi(this,Oc));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=Nc?Pc.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&Bc(this,n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),dc=function(){var e=new pc,t=Tc(e);this.promise=e,this.resolve=Yc(Gc,e,t),this.reject=Yc($c,e,t)},bc.f=Rc=function(e){return e===Oc||e===gc?new dc(e):Lc(e)},"function"==typeof Ls&&(mc=Ls.prototype.then,ee(Ls.prototype,"then",(function(e,t){var n=this;return new Oc((function(e,t){mc.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof jc&&Ce({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return wc(Oc,jc.apply(r,arguments))}}))),Ce({global:!0,wrap:!0,forced:Dc},{Promise:Oc}),Yn(Oc,kc,!1),nn(kc),gc=re(kc),Ce({target:kc,stat:!0,forced:Dc},{reject:function(e){var t=Rc(this);return t.reject.call(void 0,e),t.promise}}),Ce({target:kc,stat:!0,forced:Dc},{resolve:function(e){return wc(this,e)}}),Ce({target:kc,stat:!0,forced:Fc},{all:function(e){var t=this,n=Rc(t),r=n.resolve,i=n.reject,o=_c((function(){var n=Pe(t.resolve),o=[],a=0,s=1;Ns(e,(function(e){var c=a++,u=!1;o.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,o[c]=e,--s||r(o))}),i)})),--s||r(o)}));return o.error&&i(o.value),n.promise},race:function(e){var t=this,n=Rc(t),r=n.reject,i=_c((function(){var i=Pe(t.resolve);Ns(e,(function(e){i.call(t,e).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}});
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
@@ -13,7 +13,7 @@
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */
-var Kc=function(e,t){return(Kc=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function Xc(e,t){function n(){this.constructor=e}Kc(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var Jc,Qc,Zc=function(){return(Zc=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function eu(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}function tu(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(eu(arguments[t]));return e}!function(e){e.Fatal="fatal",e.Error="error",e.Warning="warning",e.Log="log",e.Info="info",e.Debug="debug",e.Critical="critical"}(Jc||(Jc={})),function(e){e.fromString=function(t){switch(t){case"debug":return e.Debug;case"info":return e.Info;case"warn":case"warning":return e.Warning;case"error":return e.Error;case"fatal":return e.Fatal;case"critical":return e.Critical;case"log":default:return e.Log}}}(Jc||(Jc={})),function(e){e.Unknown="unknown",e.Skipped="skipped",e.Success="success",e.RateLimit="rate_limit",e.Invalid="invalid",e.Failed="failed"}(Qc||(Qc={})),function(e){e.fromHttpCode=function(t){return t>=200&&t<300?e.Success:429===t?e.RateLimit:t>=400&&t<500?e.Invalid:t>=500?e.Failed:e.Unknown}}(Qc||(Qc={}));var nu=O.f,ru=Function.prototype,iu=ru.toString,ou=/^\s*function ([^ (]*)/,au="name";o&&!(au in ru)&&nu(ru,au,{configurable:!0,get:function(){try{return iu.call(this).match(ou)[1]}catch(e){return""}}});var su=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){return e.__proto__=t,e}:function(e,t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n]);return e});var cu=function(e){function t(t){var n=this.constructor,r=e.call(this,t)||this;return r.message=t,r.name=n.prototype.constructor.name,su(r,n.prototype),r}return Xc(t,e),t}(Error);function uu(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return yu(e,Error)}}function lu(e){return"[object ErrorEvent]"===Object.prototype.toString.call(e)}function fu(e){return"[object DOMError]"===Object.prototype.toString.call(e)}function hu(e){return"[object String]"===Object.prototype.toString.call(e)}function pu(e){return null===e||"object"!==fs(e)&&"function"!=typeof e}function du(e){return"[object Object]"===Object.prototype.toString.call(e)}function gu(e){return"undefined"!=typeof Event&&yu(e,Event)}function mu(e){return"undefined"!=typeof Element&&yu(e,Element)}function vu(e){return Boolean(e&&e.then&&"function"==typeof e.then)}function yu(e,t){try{return e instanceof t}catch(e){return!1}}Pi("match",1,(function(e,t,n){return[function(t){var n=d(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=x(e),o=String(this);if(!i.global)return ji(i,o);var a=i.unicode;i.lastIndex=0;for(var s,c=[],u=0;null!==(s=ji(i,o));){var l=String(s[0]);c[u]=l,""===l&&(i.lastIndex=Ii(o,ce(i.lastIndex),a)),u++}return 0===u?null:c}]}));var bu,wu="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView,_u=O.f,Eu=r.Int8Array,ku=Eu&&Eu.prototype,Su=r.Uint8ClampedArray,Tu=Su&&Su.prototype,xu=Eu&&Bn(Eu),Au=ku&&Bn(ku),Ou=Object.prototype,Pu=Ou.isPrototypeOf,Cu=Be("toStringTag"),Iu=V("TYPED_ARRAY_TAG"),ju=wu&&!!Gt&&"Opera"!==ft(r.opera),Ru=!1,Lu={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},Nu=function(e){return m(e)&&b(Lu,ft(e))};for(bu in Lu)r[bu]||(ju=!1);if((!ju||"function"!=typeof xu||xu===Function.prototype)&&(xu=function(){throw TypeError("Incorrect invocation")},ju))for(bu in Lu)r[bu]&&Gt(r[bu],xu);if((!ju||!Au||Au===Ou)&&(Au=xu.prototype,ju))for(bu in Lu)r[bu]&&Gt(r[bu].prototype,Au);if(ju&&Bn(Tu)!==Au&&Gt(Tu,Au),o&&!b(Au,Cu))for(bu in Ru=!0,_u(Au,Cu,{get:function(){return m(this)?this[Iu]:void 0}}),Lu)r[bu]&&P(r[bu],Iu,bu);var Mu={NATIVE_ARRAY_BUFFER_VIEWS:ju,TYPED_ARRAY_TAG:Ru&&Iu,aTypedArray:function(e){if(Nu(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(Gt){if(Pu.call(xu,e))return e}else for(var t in Lu)if(b(Lu,bu)){var n=r[t];if(n&&(e===n||Pu.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var i in Lu){var a=r[i];a&&b(a.prototype,e)&&delete a.prototype[e]}Au[e]&&!n||ee(Au,e,n?t:ju&&ku[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var i,a;if(o){if(Gt){if(n)for(i in Lu)(a=r[i])&&b(a,e)&&delete a[e];if(xu[e]&&!n)return;try{return ee(xu,e,n?t:ju&&Eu[e]||t)}catch(e){}}for(i in Lu)!(a=r[i])||a[e]&&!n||ee(a,e,t)}},isView:function(e){var t=ft(e);return"DataView"===t||b(Lu,t)},isTypedArray:Nu,TypedArray:xu,TypedArrayPrototype:Au},Uu=Mu.NATIVE_ARRAY_BUFFER_VIEWS,Du=r.ArrayBuffer,Fu=r.Int8Array,Bu=!Uu||!i((function(){Fu(1)}))||!i((function(){new Fu(-1)}))||!bt((function(e){new Fu,new Fu(null),new Fu(1.5),new Fu(e)}),!0)||i((function(){return 1!==new Fu(new Du(2),1,void 0).length})),qu=function(e){if(void 0===e)return 0;var t=ae(e),n=ce(t);if(t!==n)throw RangeError("Wrong length or index");return n},Hu=1/0,Vu=Math.abs,Wu=Math.pow,zu=Math.floor,Yu=Math.log,$u=Math.LN2,Gu=function(e,t,n){var r,i,o,a=new Array(n),s=8*n-t-1,c=(1<<s)-1,u=c>>1,l=23===t?Wu(2,-24)-Wu(2,-77):0,f=e<0||0===e&&1/e<0?1:0,h=0;for((e=Vu(e))!=e||e===Hu?(i=e!=e?1:0,r=c):(r=zu(Yu(e)/$u),e*(o=Wu(2,-r))<1&&(r--,o*=2),(e+=r+u>=1?l/o:l*Wu(2,1-u))*o>=2&&(r++,o/=2),r+u>=c?(i=0,r=c):r+u>=1?(i=(e*o-1)*Wu(2,t),r+=u):(i=e*Wu(2,u-1)*Wu(2,t),r=0));t>=8;a[h++]=255&i,i/=256,t-=8);for(r=r<<t|i,s+=t;s>0;a[h++]=255&r,r/=256,s-=8);return a[--h]|=128*f,a},Ku=function(e,t){var n,r=e.length,i=8*r-t-1,o=(1<<i)-1,a=o>>1,s=i-7,c=r-1,u=e[c--],l=127&u;for(u>>=7;s>0;l=256*l+e[c],c--,s-=8);for(n=l&(1<<-s)-1,l>>=-s,s+=t;s>0;n=256*n+e[c],c--,s-=8);if(0===l)l=1-a;else{if(l===o)return n?NaN:u?-1/0:Hu;n+=Wu(2,t),l-=a}return(u?-1:1)*n*Wu(2,l-t)},Xu=function(e){for(var t=Re(this),n=ce(t.length),r=arguments.length,i=fe(r>1?arguments[1]:void 0,n),o=r>2?arguments[2]:void 0,a=void 0===o?n:fe(o,n);a>i;)t[i++]=e;return t},Ju=ye.f,Qu=O.f,Zu=Z.get,el=Z.set,tl="ArrayBuffer",nl="DataView",rl="Wrong index",il=r.ArrayBuffer,ol=il,al=r.DataView,sl=al&&al.prototype,cl=Object.prototype,ul=r.RangeError,ll=Gu,fl=Ku,hl=function(e){return[255&e]},pl=function(e){return[255&e,e>>8&255]},dl=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},gl=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},ml=function(e){return ll(e,23,4)},vl=function(e){return ll(e,52,8)},yl=function(e,t){Qu(e.prototype,t,{get:function(){return Zu(this)[t]}})},bl=function(e,t,n,r){var i=qu(n),o=Zu(e);if(i+t>o.byteLength)throw ul(rl);var a=Zu(o.buffer).bytes,s=i+o.byteOffset,c=a.slice(s,s+t);return r?c:c.reverse()},wl=function(e,t,n,r,i,o){var a=qu(n),s=Zu(e);if(a+t>s.byteLength)throw ul(rl);for(var c=Zu(s.buffer).bytes,u=a+s.byteOffset,l=r(+i),f=0;f<t;f++)c[u+f]=l[o?f:t-f-1]};if(wu){if(!i((function(){il(1)}))||!i((function(){new il(-1)}))||i((function(){return new il,new il(1.5),new il(NaN),il.name!=tl}))){for(var _l,El=(ol=function(e){return eo(this,ol),new il(qu(e))}).prototype=il.prototype,kl=Ju(il),Sl=0;kl.length>Sl;)(_l=kl[Sl++])in ol||P(ol,_l,il[_l]);El.constructor=ol}Gt&&Bn(sl)!==cl&&Gt(sl,cl);var Tl=new al(new ol(2)),xl=sl.setInt8;Tl.setInt8(0,2147483648),Tl.setInt8(1,2147483649),!Tl.getInt8(0)&&Tl.getInt8(1)||po(sl,{setInt8:function(e,t){xl.call(this,e,t<<24>>24)},setUint8:function(e,t){xl.call(this,e,t<<24>>24)}},{unsafe:!0})}else ol=function(e){eo(this,ol,tl);var t=qu(e);el(this,{bytes:Xu.call(new Array(t),0),byteLength:t}),o||(this.byteLength=t)},al=function(e,t,n){eo(this,al,nl),eo(e,ol,nl);var r=Zu(e).byteLength,i=ae(t);if(i<0||i>r)throw ul("Wrong offset");if(i+(n=void 0===n?r-i:ce(n))>r)throw ul("Wrong length");el(this,{buffer:e,byteLength:n,byteOffset:i}),o||(this.buffer=e,this.byteLength=n,this.byteOffset=i)},o&&(yl(ol,"byteLength"),yl(al,"buffer"),yl(al,"byteLength"),yl(al,"byteOffset")),po(al.prototype,{getInt8:function(e){return bl(this,1,e)[0]<<24>>24},getUint8:function(e){return bl(this,1,e)[0]},getInt16:function(e){var t=bl(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=bl(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return gl(bl(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return gl(bl(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return fl(bl(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return fl(bl(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){wl(this,1,e,hl,t)},setUint8:function(e,t){wl(this,1,e,hl,t)},setInt16:function(e,t){wl(this,2,e,pl,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){wl(this,2,e,pl,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){wl(this,4,e,dl,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){wl(this,4,e,dl,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){wl(this,4,e,ml,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){wl(this,8,e,vl,t,arguments.length>2?arguments[2]:void 0)}});Yn(ol,tl),Yn(al,nl);var Al={ArrayBuffer:ol,DataView:al},Ol=function(e,t){var n=function(e){var t=ae(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}(e);if(n%t)throw RangeError("Wrong offset");return n},Pl=Mu.aTypedArrayConstructor,Cl=function(e){var t,n,r,i,o,a,s=Re(e),c=arguments.length,u=c>1?arguments[1]:void 0,l=void 0!==u,f=pt(s);if(null!=f&&!ot(f))for(a=(o=f.call(s)).next,s=[];!(i=a.call(o)).done;)s.push(i.value);for(l&&c>2&&(u=je(u,arguments[2],2)),n=ce(s.length),r=new(Pl(this))(n),t=0;n>t;t++)r[t]=l?u(s[t],t):s[t];return r};t((function(e){var t=ye.f,n=ze.forEach,i=Z.get,a=Z.set,s=O.f,c=T.f,l=Math.round,f=r.RangeError,h=Al.ArrayBuffer,p=Al.DataView,d=Mu.NATIVE_ARRAY_BUFFER_VIEWS,g=Mu.TYPED_ARRAY_TAG,y=Mu.TypedArray,w=Mu.TypedArrayPrototype,_=Mu.aTypedArrayConstructor,E=Mu.isTypedArray,k="BYTES_PER_ELEMENT",S="Wrong length",x=function(e,t){for(var n=0,r=t.length,i=new(_(e))(r);r>n;)i[n]=t[n++];return i},A=function(e,t){s(e,t,{get:function(){return i(this)[t]}})},C=function(e){var t;return e instanceof h||"ArrayBuffer"==(t=ft(e))||"SharedArrayBuffer"==t},I=function(e,t){return E(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},j=function(e,t){return I(e,t=v(t,!0))?u(2,e[t]):c(e,t)},R=function(e,t,n){return!(I(e,t=v(t,!0))&&m(n)&&b(n,"value"))||b(n,"get")||b(n,"set")||n.configurable||b(n,"writable")&&!n.writable||b(n,"enumerable")&&!n.enumerable?s(e,t,n):(e[t]=n.value,e)};o?(d||(T.f=j,O.f=R,A(w,"buffer"),A(w,"byteOffset"),A(w,"byteLength"),A(w,"length")),Ce({target:"Object",stat:!0,forced:!d},{getOwnPropertyDescriptor:j,defineProperty:R}),e.exports=function(e,o,c){var u=e.match(/\d+$/)[0]/8,v=e+(c?"Clamped":"")+"Array",b="get"+e,_="set"+e,T=r[v],A=T,O=A&&A.prototype,I={},j=function(e,t){s(e,t,{get:function(){return function(e,t){var n=i(e);return n.view[b](t*u+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,n){var r=i(e);c&&(n=(n=l(n))<0?0:n>255?255:255&n),r.view[_](t*u+r.byteOffset,n,!0)}(this,t,e)},enumerable:!0})};d?Bu&&(A=o((function(e,t,n,r){return eo(e,A,v),Kt(m(t)?C(t)?void 0!==r?new T(t,Ol(n,u),r):void 0!==n?new T(t,Ol(n,u)):new T(t):E(t)?x(A,t):Cl.call(A,t):new T(qu(t)),e,A)})),Gt&&Gt(A,y),n(t(T),(function(e){e in A||P(A,e,T[e])})),A.prototype=O):(A=o((function(e,t,n,r){eo(e,A,v);var i,o,s,c=0,l=0;if(m(t)){if(!C(t))return E(t)?x(A,t):Cl.call(A,t);i=t,l=Ol(n,u);var d=t.byteLength;if(void 0===r){if(d%u)throw f(S);if((o=d-l)<0)throw f(S)}else if((o=ce(r)*u)+l>d)throw f(S);s=o/u}else s=qu(t),i=new h(o=s*u);for(a(e,{buffer:i,byteOffset:l,byteLength:o,length:s,view:new p(i)});c<s;)j(e,c++)})),Gt&&Gt(A,y),O=A.prototype=Pt(w)),O.constructor!==A&&P(O,"constructor",A),g&&P(O,g,v),I[v]=A,Ce({global:!0,forced:A!=T,sham:!d},I),k in A||P(A,k,u),k in O||P(O,k,u),nn(v)}):e.exports=function(){}}))("Uint16",(function(e){return function(t,n,r){return e(this,t,n,r)}}));var Il=Math.min,jl=[].copyWithin||function(e,t){var n=Re(this),r=ce(n.length),i=fe(e,r),o=fe(t,r),a=arguments.length>2?arguments[2]:void 0,s=Il((void 0===a?r:fe(a,r))-o,r-i),c=1;for(o<i&&i<o+s&&(c=-1,o+=s-1,i+=s-1);s-- >0;)o in n?n[i]=n[o]:delete n[i],i+=c,o+=c;return n},Rl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("copyWithin",(function(e,t){return jl.call(Rl(this),e,t,arguments.length>2?arguments[2]:void 0)}));var Ll=ze.every,Nl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("every",(function(e){return Ll(Nl(this),e,arguments.length>1?arguments[1]:void 0)}));var Ml=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("fill",(function(e){return Xu.apply(Ml(this),arguments)}));var Ul=ze.filter,Dl=Mu.aTypedArray,Fl=Mu.aTypedArrayConstructor;(0,Mu.exportTypedArrayMethod)("filter",(function(e){for(var t=Ul(Dl(this),e,arguments.length>1?arguments[1]:void 0),n=Bi(this,this.constructor),r=0,i=t.length,o=new(Fl(n))(i);i>r;)o[r]=t[r++];return o}));var Bl=ze.find,ql=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("find",(function(e){return Bl(ql(this),e,arguments.length>1?arguments[1]:void 0)}));var Hl=ze.findIndex,Vl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("findIndex",(function(e){return Hl(Vl(this),e,arguments.length>1?arguments[1]:void 0)}));var Wl=ze.forEach,zl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("forEach",(function(e){Wl(zl(this),e,arguments.length>1?arguments[1]:void 0)}));var Yl=pe.includes,$l=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("includes",(function(e){return Yl($l(this),e,arguments.length>1?arguments[1]:void 0)}));var Gl=pe.indexOf,Kl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("indexOf",(function(e){return Gl(Kl(this),e,arguments.length>1?arguments[1]:void 0)}));var Xl=Be("iterator"),Jl=r.Uint8Array,Ql=pi.values,Zl=pi.keys,ef=pi.entries,tf=Mu.aTypedArray,nf=Mu.exportTypedArrayMethod,rf=Jl&&Jl.prototype[Xl],of=!!rf&&("values"==rf.name||null==rf.name),af=function(){return Ql.call(tf(this))};nf("entries",(function(){return ef.call(tf(this))})),nf("keys",(function(){return Zl.call(tf(this))})),nf("values",af,!of),nf(Xl,af,!of);var sf=Mu.aTypedArray,cf=[].join;(0,Mu.exportTypedArrayMethod)("join",(function(e){return cf.apply(sf(this),arguments)}));var uf=Math.min,lf=[].lastIndexOf,ff=!!lf&&1/[1].lastIndexOf(1,-0)<0,hf=Ye("lastIndexOf"),pf=Xe("indexOf",{ACCESSORS:!0,1:0}),df=ff||!hf||!pf?function(e){if(ff)return lf.apply(this,arguments)||0;var t=g(this),n=ce(t.length),r=n-1;for(arguments.length>1&&(r=uf(r,ae(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:lf,gf=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("lastIndexOf",(function(e){return df.apply(gf(this),arguments)}));var mf=ze.map,vf=Mu.aTypedArray,yf=Mu.aTypedArrayConstructor;(0,Mu.exportTypedArrayMethod)("map",(function(e){return mf(vf(this),e,arguments.length>1?arguments[1]:void 0,(function(e,t){return new(yf(Bi(e,e.constructor)))(t)}))}));var bf=function(e){return function(t,n,r,i){Ie(n);var o=Re(t),a=p(o),s=ce(o.length),c=e?s-1:0,u=e?-1:1;if(r<2)for(;;){if(c in a){i=a[c],c+=u;break}if(c+=u,e?c<0:s<=c)throw TypeError("Reduce of empty array with no initial value")}for(;e?c>=0:s>c;c+=u)c in a&&(i=n(i,a[c],c,o));return i}},wf={left:bf(!1),right:bf(!0)},_f=wf.left,Ef=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("reduce",(function(e){return _f(Ef(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)}));var kf=wf.right,Sf=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("reduceRight",(function(e){return kf(Sf(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)}));var Tf=Mu.aTypedArray,xf=Mu.exportTypedArrayMethod,Af=Math.floor;xf("reverse",(function(){for(var e,t=this,n=Tf(t).length,r=Af(n/2),i=0;i<r;)e=t[i],t[i++]=t[--n],t[n]=e;return t}));var Of=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("set",(function(e){Of(this);var t=Ol(arguments.length>1?arguments[1]:void 0,1),n=this.length,r=Re(e),i=ce(r.length),o=0;if(i+t>n)throw RangeError("Wrong length");for(;o<i;)this[t+o]=r[o++]}),i((function(){new Int8Array(1).set({})})));var Pf=Mu.aTypedArray,Cf=Mu.aTypedArrayConstructor,If=[].slice;(0,Mu.exportTypedArrayMethod)("slice",(function(e,t){for(var n=If.call(Pf(this),e,t),r=Bi(this,this.constructor),i=0,o=n.length,a=new(Cf(r))(o);o>i;)a[i]=n[i++];return a}),i((function(){new Int8Array(1).slice()})));var jf=ze.some,Rf=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("some",(function(e){return jf(Rf(this),e,arguments.length>1?arguments[1]:void 0)}));var Lf=Mu.aTypedArray,Nf=[].sort;(0,Mu.exportTypedArrayMethod)("sort",(function(e){return Nf.call(Lf(this),e)}));var Mf=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("subarray",(function(e,t){var n=Mf(this),r=n.length,i=fe(e,r);return new(Bi(n,n.constructor))(n.buffer,n.byteOffset+i*n.BYTES_PER_ELEMENT,ce((void 0===t?r:fe(t,r))-i))}));var Uf=r.Int8Array,Df=Mu.aTypedArray,Ff=Mu.exportTypedArrayMethod,Bf=[].toLocaleString,qf=[].slice,Hf=!!Uf&&i((function(){Bf.call(new Uf(1))}));Ff("toLocaleString",(function(){return Bf.apply(Hf?qf.call(Df(this)):Df(this),arguments)}),i((function(){return[1,2].toLocaleString()!=new Uf([1,2]).toLocaleString()}))||!i((function(){Uf.prototype.toLocaleString.call([1,2])})));var Vf=Mu.exportTypedArrayMethod,Wf=r.Uint8Array,zf=Wf&&Wf.prototype||{},Yf=[].toString,$f=[].join;i((function(){Yf.call({})}))&&(Yf=function(){return $f.call(this)});var Gf=zf.toString!=Yf;function Kf(e,t){return void 0===t&&(t=0),"string"!=typeof e||0===t||e.length<=t?e:e.substr(0,t)+"..."}function Xf(e,t){if(!Array.isArray(e))return"";for(var n=[],r=0;r<e.length;r++){var i=e[r];try{n.push(String(i))}catch(e){n.push("[value cannot be serialized]")}}return n.join(t)}function Jf(e,t){return!!hu(e)&&(n=t,"[object RegExp]"===Object.prototype.toString.call(n)?t.test(e):"string"==typeof t&&-1!==e.indexOf(t));var n}function Qf(){return"[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0)}Vf("toString",Yf,Gf);var Zf={};function eh(){return Qf()?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:Zf}function th(){var e=eh(),t=e.crypto||e.msCrypto;if(void 0!==t&&t.getRandomValues){var n=new Uint16Array(8);t.getRandomValues(n),n[3]=4095&n[3]|16384,n[4]=16383&n[4]|32768;var r=function(e){for(var t=e.toString(16);t.length<4;)t="0"+t;return t};return r(n[0])+r(n[1])+r(n[2])+r(n[3])+r(n[4])+r(n[5])+r(n[6])+r(n[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}))}function nh(e){if(!e)return{};var t=e.match(/^(([^:\/?#]+):)?(\/\/([^\/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!t)return{};var n=t[6]||"",r=t[8]||"";return{host:t[4],path:t[5],protocol:t[2],relative:t[5]+n+r}}function rh(e){if(e.message)return e.message;if(e.exception&&e.exception.values&&e.exception.values[0]){var t=e.exception.values[0];return t.type&&t.value?t.type+": "+t.value:t.type||t.value||e.event_id||"<unknown>"}return e.event_id||"<unknown>"}function ih(e){var t=eh();if(!("console"in t))return e();var n=t.console,r={};["debug","info","warn","error","log","assert"].forEach((function(e){e in t.console&&n[e].__sentry_original__&&(r[e]=n[e],n[e]=n[e].__sentry_original__)}));var i=e();return Object.keys(r).forEach((function(e){n[e]=r[e]})),i}function oh(e,t,n){e.exception=e.exception||{},e.exception.values=e.exception.values||[],e.exception.values[0]=e.exception.values[0]||{},e.exception.values[0].value=e.exception.values[0].value||t||"",e.exception.values[0].type=e.exception.values[0].type||n||"Error"}function ah(e,t){void 0===t&&(t={});try{e.exception.values[0].mechanism=e.exception.values[0].mechanism||{},Object.keys(t).forEach((function(n){e.exception.values[0].mechanism[n]=t[n]}))}catch(e){}}function sh(e){try{for(var t=e,n=[],r=0,i=0,o=" > ".length,a=void 0;t&&r++<5&&!("html"===(a=ch(t))||r>1&&i+n.length*o+a.length>=80);)n.push(a),i+=a.length,t=t.parentNode;return n.reverse().join(" > ")}catch(e){return"<unknown>"}}function ch(e){var t,n,r,i,o,a=e,s=[];if(!a||!a.tagName)return"";if(s.push(a.tagName.toLowerCase()),a.id&&s.push("#"+a.id),(t=a.className)&&hu(t))for(n=t.split(/\s+/),o=0;o<n.length;o++)s.push("."+n[o]);var c=["type","name","title","alt"];for(o=0;o<c.length;o++)r=c[o],(i=a.getAttribute(r))&&s.push("["+r+'="'+i+'"]');return s.join("")}var uh=Date.now(),lh=0,fh={now:function(){var e=Date.now()-uh;return e<lh&&(e=lh),lh=e,e},timeOrigin:uh},hh=function(){if(Qf())try{return(e=module,t="perf_hooks",e.require(t)).performance}catch(e){return fh}var e,t;return eh().performance&&void 0===performance.timeOrigin&&(performance.timeOrigin=performance.timing&&performance.timing.navigationStart||uh),eh().performance||fh}();function ph(){return(hh.timeOrigin+hh.now())/1e3}function dh(e,t){if(!t)return 6e4;var n=parseInt(""+t,10);if(!isNaN(n))return 1e3*n;var r=Date.parse(""+t);return isNaN(r)?6e4:r-e}var gh="<anonymous>";function mh(e){try{return e&&"function"==typeof e&&e.name||gh}catch(e){return gh}}var vh=eh(),yh="Sentry Logger ",bh=function(){function e(){this._enabled=!1}return e.prototype.disable=function(){this._enabled=!1},e.prototype.enable=function(){this._enabled=!0},e.prototype.log=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&ih((function(){vh.console.log(yh+"[Log]: "+e.join(" "))}))},e.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&ih((function(){vh.console.warn(yh+"[Warn]: "+e.join(" "))}))},e.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&ih((function(){vh.console.error(yh+"[Error]: "+e.join(" "))}))},e}();vh.__SENTRY__=vh.__SENTRY__||{};var wh=vh.__SENTRY__.logger||(vh.__SENTRY__.logger=new bh),_h=Vt("splice"),Eh=Xe("splice",{ACCESSORS:!0,0:0,1:2}),kh=Math.max,Sh=Math.min,Th=9007199254740991,xh="Maximum allowed length exceeded";Ce({target:"Array",proto:!0,forced:!_h||!Eh},{splice:function(e,t){var n,r,i,o,a,s,c=Re(this),u=ce(c.length),l=fe(e,u),f=arguments.length;if(0===f?n=r=0:1===f?(n=0,r=u-l):(n=f-2,r=Sh(kh(ae(t),0),u-l)),u+n-r>Th)throw TypeError(xh);for(i=He(c,r),o=0;o<r;o++)(a=l+o)in c&&at(i,o,c[a]);if(i.length=r,n<r){for(o=l;o<u-r;o++)s=o+n,(a=o+r)in c?c[s]=c[a]:delete c[s];for(o=u;o>u-r+n;o--)delete c[o-1]}else if(n>r)for(o=u-r;o>l;o--)s=o+n-1,(a=o+r-1)in c?c[s]=c[a]:delete c[s];for(o=0;o<n;o++)c[o+l]=arguments[o+2];return c.length=u-r+n,i}});var Ah=!i((function(){return Object.isExtensible(Object.preventExtensions({}))})),Oh=t((function(e){var t=O.f,n=V("meta"),r=0,i=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:"O"+ ++r,weakData:{}}})},a=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!m(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!b(e,n)){if(!i(e))return"F";if(!t)return"E";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!b(e,n)){if(!i(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return Ah&&a.REQUIRED&&i(e)&&!b(e,n)&&o(e),e}};Y[n]=!0})),Ph=(Oh.REQUIRED,Oh.fastKey,Oh.getWeakData,Oh.onFreeze,Oh.getWeakData),Ch=Z.set,Ih=Z.getterFor,jh=ze.find,Rh=ze.findIndex,Lh=0,Nh=function(e){return e.frozen||(e.frozen=new Mh)},Mh=function(){this.entries=[]},Uh=function(e,t){return jh(e.entries,(function(e){return e[0]===t}))};Mh.prototype={get:function(e){var t=Uh(this,e);if(t)return t[1]},has:function(e){return!!Uh(this,e)},set:function(e,t){var n=Uh(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=Rh(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},function(e,t,n){var o=-1!==e.indexOf("Map"),a=-1!==e.indexOf("Weak"),s=o?"set":"add",c=r[e],u=c&&c.prototype,l=c,f={},h=function(e){var t=u[e];ee(u,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(a&&!m(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return a&&!m(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(a&&!m(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(Oe(e,"function"!=typeof c||!(a||u.forEach&&!i((function(){(new c).entries().next()})))))l=n.getConstructor(t,e,o,s),Oh.REQUIRED=!0;else if(Oe(e,!0)){var p=new l,d=p[s](a?{}:-0,1)!=p,g=i((function(){p.has(1)})),v=bt((function(e){new c(e)})),y=!a&&i((function(){for(var e=new c,t=5;t--;)e[s](t,t);return!e.has(-0)}));v||((l=t((function(t,n){eo(t,l,e);var r=Kt(new c,t,l);return null!=n&&Ns(n,r[s],r,o),r}))).prototype=u,u.constructor=l),(g||y)&&(h("delete"),h("has"),o&&h("get")),(y||d)&&h(s),a&&u.clear&&delete u.clear}f[e]=l,Ce({global:!0,forced:l!=c},f),Yn(l,e),a||n.setStrong(l,e,o)}("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),{getConstructor:function(e,t,n,r){var i=e((function(e,o){eo(e,i,t),Ch(e,{type:t,id:Lh++,frozen:void 0}),null!=o&&Ns(o,e[r],e,n)})),o=Ih(t),a=function(e,t,n){var r=o(e),i=Ph(x(t),!0);return!0===i?Nh(r).set(t,n):i[r.id]=n,e};return po(i.prototype,{delete:function(e){var t=o(this);if(!m(e))return!1;var n=Ph(e);return!0===n?Nh(t).delete(e):n&&b(n,t.id)&&delete n[t.id]},has:function(e){var t=o(this);if(!m(e))return!1;var n=Ph(e);return!0===n?Nh(t).has(e):n&&b(n,t.id)}}),po(i.prototype,n?{get:function(e){var t=o(this);if(m(e)){var n=Ph(e);return!0===n?Nh(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return a(this,e,t)}}:{add:function(e){return a(this,e,!0)}}),i}});var Dh=function(){function e(){this._hasWeakSet="function"==typeof WeakSet,this._inner=this._hasWeakSet?new WeakSet:[]}return e.prototype.memoize=function(e){if(this._hasWeakSet)return!!this._inner.has(e)||(this._inner.add(e),!1);for(var t=0;t<this._inner.length;t++){if(this._inner[t]===e)return!0}return this._inner.push(e),!1},e.prototype.unmemoize=function(e){if(this._hasWeakSet)this._inner.delete(e);else for(var t=0;t<this._inner.length;t++)if(this._inner[t]===e){this._inner.splice(t,1);break}},e}();function Fh(e,t,n){if(t in e){var r=e[t],i=n(r);if("function"==typeof i)try{i.prototype=i.prototype||{},Object.defineProperties(i,{__sentry_original__:{enumerable:!1,value:r}})}catch(e){}e[t]=i}}function Bh(e){if(uu(e)){var t=e,n={message:t.message,name:t.name,stack:t.stack};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}if(gu(e)){var i=e,o={};o.type=i.type;try{o.target=mu(i.target)?sh(i.target):Object.prototype.toString.call(i.target)}catch(e){o.target="<unknown>"}try{o.currentTarget=mu(i.currentTarget)?sh(i.currentTarget):Object.prototype.toString.call(i.currentTarget)}catch(e){o.currentTarget="<unknown>"}for(var r in"undefined"!=typeof CustomEvent&&yu(e,CustomEvent)&&(o.detail=i.detail),i)Object.prototype.hasOwnProperty.call(i,r)&&(o[r]=i);return o}return e}function qh(e){return function(e){return~-encodeURI(e).split(/%..|./).length}(JSON.stringify(e))}function Hh(e,t,n){void 0===t&&(t=3),void 0===n&&(n=102400);var r=zh(e,t);return qh(r)>n?Hh(e,t-1,n):r}function Vh(e,t){return"domain"===t&&e&&"object"===fs(e)&&e._events?"[Domain]":"domainEmitter"===t?"[DomainEmitter]":"undefined"!=typeof global&&e===global?"[Global]":"undefined"!=typeof window&&e===window?"[Window]":"undefined"!=typeof document&&e===document?"[Document]":du(n=e)&&"nativeEvent"in n&&"preventDefault"in n&&"stopPropagation"in n?"[SyntheticEvent]":"number"==typeof e&&e!=e?"[NaN]":void 0===e?"[undefined]":"function"==typeof e?"[Function: "+mh(e)+"]":e;var n}function Wh(e,t,n,r){if(void 0===n&&(n=1/0),void 0===r&&(r=new Dh),0===n)return function(e){var t=Object.prototype.toString.call(e);if("string"==typeof e)return e;if("[object Object]"===t)return"[Object]";if("[object Array]"===t)return"[Array]";var n=Vh(e);return pu(n)?n:t}(t);if(null!=t&&"function"==typeof t.toJSON)return t.toJSON();var i=Vh(t,e);if(pu(i))return i;var o=Bh(t),a=Array.isArray(t)?[]:{};if(r.memoize(t))return"[Circular ~]";for(var s in o)Object.prototype.hasOwnProperty.call(o,s)&&(a[s]=Wh(s,o[s],n-1,r));return r.unmemoize(t),a}function zh(e,t){try{return JSON.parse(JSON.stringify(e,(function(e,n){return Wh(e,n,t)})))}catch(e){return"**non-serializable**"}}function Yh(e,t){void 0===t&&(t=40);var n=Object.keys(Bh(e));if(n.sort(),!n.length)return"[object has no keys]";if(n[0].length>=t)return Kf(n[0],t);for(var r=n.length;r>0;r--){var i=n.slice(0,r).join(", ");if(!(i.length>t))return r===n.length?i:Kf(i,t)}return""}Ce({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}});var $h=ze.filter,Gh=Vt("filter"),Kh=Xe("filter");Ce({target:"Array",proto:!0,forced:!Gh||!Kh},{filter:function(e){return $h(this,e,arguments.length>1?arguments[1]:void 0)}});var Xh,Jh=!!Ls&&i((function(){Ls.prototype.finally.call({then:function(){}},(function(){}))}));Ce({target:"Promise",proto:!0,real:!0,forced:Jh},{finally:function(e){var t=Bi(this,re("Promise")),n="function"==typeof e;return this.then(n?function(n){return wc(t,e()).then((function(){return n}))}:e,n?function(n){return wc(t,e()).then((function(){throw n}))}:e)}}),"function"!=typeof Ls||Ls.prototype.finally||ee(Ls.prototype,"finally",re("Promise").prototype.finally),function(e){e.PENDING="PENDING",e.RESOLVED="RESOLVED",e.REJECTED="REJECTED"}(Xh||(Xh={}));var Qh=function(){function e(e){var t=this;this._state=Xh.PENDING,this._handlers=[],this._resolve=function(e){t._setResult(Xh.RESOLVED,e)},this._reject=function(e){t._setResult(Xh.REJECTED,e)},this._setResult=function(e,n){t._state===Xh.PENDING&&(vu(n)?n.then(t._resolve,t._reject):(t._state=e,t._value=n,t._executeHandlers()))},this._attachHandler=function(e){t._handlers=t._handlers.concat(e),t._executeHandlers()},this._executeHandlers=function(){if(t._state!==Xh.PENDING){var e=t._handlers.slice();t._handlers=[],e.forEach((function(e){e.done||(t._state===Xh.RESOLVED&&e.onfulfilled&&e.onfulfilled(t._value),t._state===Xh.REJECTED&&e.onrejected&&e.onrejected(t._value),e.done=!0)}))}};try{e(this._resolve,this._reject)}catch(e){this._reject(e)}}return e.prototype.toString=function(){return"[object SyncPromise]"},e.resolve=function(t){return new e((function(e){e(t)}))},e.reject=function(t){return new e((function(e,n){n(t)}))},e.all=function(t){return new e((function(n,r){if(Array.isArray(t))if(0!==t.length){var i=t.length,o=[];t.forEach((function(t,a){e.resolve(t).then((function(e){o[a]=e,0===(i-=1)&&n(o)})).then(null,r)}))}else n([]);else r(new TypeError("Promise.all requires an array as input."))}))},e.prototype.then=function(t,n){var r=this;return new e((function(e,i){r._attachHandler({done:!1,onfulfilled:function(n){if(t)try{return void e(t(n))}catch(e){return void i(e)}else e(n)},onrejected:function(t){if(n)try{return void e(n(t))}catch(e){return void i(e)}else i(t)}})}))},e.prototype.catch=function(e){return this.then((function(e){return e}),e)},e.prototype.finally=function(t){var n=this;return new e((function(e,r){var i,o;return n.then((function(e){o=!1,i=e,t&&t()}),(function(e){o=!0,i=e,t&&t()})).then((function(){o?r(i):e(i)}))}))},e}(),Zh=function(){function e(e){this._limit=e,this._buffer=[]}return e.prototype.isReady=function(){return void 0===this._limit||this.length()<this._limit},e.prototype.add=function(e){var t=this;return this.isReady()?(-1===this._buffer.indexOf(e)&&this._buffer.push(e),e.then((function(){return t.remove(e)})).then(null,(function(){return t.remove(e).then(null,(function(){}))})),e):Qh.reject(new cu("Not adding Promise due to buffer limit reached."))},e.prototype.remove=function(e){return this._buffer.splice(this._buffer.indexOf(e),1)[0]},e.prototype.length=function(){return this._buffer.length},e.prototype.drain=function(e){var t=this;return new Qh((function(n){var r=setTimeout((function(){e&&e>0&&n(!1)}),e);Qh.all(t._buffer).then((function(){clearTimeout(r),n(!0)})).then(null,(function(){n(!0)}))}))},e}();function ep(){if(!("fetch"in eh()))return!1;try{return new Headers,new Request(""),new Response,!0}catch(e){return!1}}function tp(e){return e&&/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(e.toString())}function np(){if(!ep())return!1;try{return new Request("_",{referrerPolicy:"origin"}),!0}catch(e){return!1}}var rp,ip=eh(),op={},ap={};function sp(e){if(!ap[e])switch(ap[e]=!0,e){case"console":!function(){if(!("console"in ip))return;["debug","info","warn","error","log","assert"].forEach((function(e){e in ip.console&&Fh(ip.console,e,(function(t){return function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];up("console",{args:n,level:e}),t&&Function.prototype.apply.call(t,ip.console,n)}}))}))}();break;case"dom":!function(){if(!("document"in ip))return;ip.document.addEventListener("click",gp("click",up.bind(null,"dom")),!1),ip.document.addEventListener("keypress",mp(up.bind(null,"dom")),!1),["EventTarget","Node"].forEach((function(e){var t=ip[e]&&ip[e].prototype;t&&t.hasOwnProperty&&t.hasOwnProperty("addEventListener")&&(Fh(t,"addEventListener",(function(e){return function(t,n,r){return n&&n.handleEvent?("click"===t&&Fh(n,"handleEvent",(function(e){return function(t){return gp("click",up.bind(null,"dom"))(t),e.call(this,t)}})),"keypress"===t&&Fh(n,"handleEvent",(function(e){return function(t){return mp(up.bind(null,"dom"))(t),e.call(this,t)}}))):("click"===t&&gp("click",up.bind(null,"dom"),!0)(this),"keypress"===t&&mp(up.bind(null,"dom"))(this)),e.call(this,t,n,r)}})),Fh(t,"removeEventListener",(function(e){return function(t,n,r){var i=n;try{i=i&&(i.__sentry_wrapped__||i)}catch(e){}return e.call(this,t,i,r)}})))}))}();break;case"xhr":!function(){if(!("XMLHttpRequest"in ip))return;var e=XMLHttpRequest.prototype;Fh(e,"open",(function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=t[1];return this.__sentry_xhr__={method:hu(t[0])?t[0].toUpperCase():t[0],url:t[1]},hu(r)&&"POST"===this.__sentry_xhr__.method&&r.match(/sentry_key/)&&(this.__sentry_own_request__=!0),e.apply(this,t)}})),Fh(e,"send",(function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=this,i={args:t,startTimestamp:Date.now(),xhr:r};return up("xhr",Zc({},i)),r.addEventListener("readystatechange",(function(){if(4===r.readyState){try{r.__sentry_xhr__&&(r.__sentry_xhr__.status_code=r.status)}catch(e){}up("xhr",Zc({},i,{endTimestamp:Date.now()}))}})),e.apply(this,t)}}))}();break;case"fetch":!function(){if(!function(){if(!ep())return!1;var e=eh();if(tp(e.fetch))return!0;var t=!1,n=e.document;if(n&&"function"==typeof n.createElement)try{var r=n.createElement("iframe");r.hidden=!0,n.head.appendChild(r),r.contentWindow&&r.contentWindow.fetch&&(t=tp(r.contentWindow.fetch)),n.head.removeChild(r)}catch(e){wh.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",e)}return t}())return;Fh(ip,"fetch",(function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r={args:t,fetchData:{method:lp(t),url:fp(t)},startTimestamp:Date.now()};return up("fetch",Zc({},r)),e.apply(ip,t).then((function(e){return up("fetch",Zc({},r,{endTimestamp:Date.now(),response:e})),e}),(function(e){throw up("fetch",Zc({},r,{endTimestamp:Date.now(),error:e})),e}))}}))}();break;case"history":!function(){if(!function(){var e=eh(),t=e.chrome,n=t&&t.app&&t.app.runtime,r="history"in e&&!!e.history.pushState&&!!e.history.replaceState;return!n&&r}())return;var e=ip.onpopstate;function t(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=t.length>2?t[2]:void 0;if(r){var i=rp,o=String(r);rp=o,up("history",{from:i,to:o})}return e.apply(this,t)}}ip.onpopstate=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=ip.location.href,i=rp;if(rp=r,up("history",{from:i,to:r}),e)return e.apply(this,t)},Fh(ip.history,"pushState",t),Fh(ip.history,"replaceState",t)}();break;case"error":vp=ip.onerror,ip.onerror=function(e,t,n,r,i){return up("error",{column:r,error:i,line:n,msg:e,url:t}),!!vp&&vp.apply(this,arguments)};break;case"unhandledrejection":yp=ip.onunhandledrejection,ip.onunhandledrejection=function(e){return up("unhandledrejection",e),!yp||yp.apply(this,arguments)};break;default:wh.warn("unknown instrumentation type:",e)}}function cp(e){e&&"string"==typeof e.type&&"function"==typeof e.callback&&(op[e.type]=op[e.type]||[],op[e.type].push(e.callback),sp(e.type))}function up(e,t){var n,r;if(e&&op[e])try{for(var i=function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}(op[e]||[]),o=i.next();!o.done;o=i.next()){var a=o.value;try{a(t)}catch(t){wh.error("Error while triggering instrumentation handler.\nType: "+e+"\nName: "+mh(a)+"\nError: "+t)}}}catch(e){n={error:e}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}}function lp(e){return void 0===e&&(e=[]),"Request"in ip&&yu(e[0],Request)&&e[0].method?String(e[0].method).toUpperCase():e[1]&&e[1].method?String(e[1].method).toUpperCase():"GET"}function fp(e){return void 0===e&&(e=[]),"string"==typeof e[0]?e[0]:"Request"in ip&&yu(e[0],Request)?e[0].url:String(e[0])}var hp,pp,dp=0;function gp(e,t,n){return void 0===n&&(n=!1),function(r){hp=void 0,r&&pp!==r&&(pp=r,dp&&clearTimeout(dp),n?dp=setTimeout((function(){t({event:r,name:e})})):t({event:r,name:e}))}}function mp(e){return function(t){var n;try{n=t.target}catch(e){return}var r=n&&n.tagName;r&&("INPUT"===r||"TEXTAREA"===r||n.isContentEditable)&&(hp||gp("input",e)(t),clearTimeout(hp),hp=setTimeout((function(){hp=void 0}),1e3))}}var vp=null;var yp=null;var bp=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w\.-]+)(?::(\d+))?\/(.+)/,wp="Invalid Dsn",_p=function(){function e(e){"string"==typeof e?this._fromString(e):this._fromComponents(e),this._validate()}return e.prototype.toString=function(e){void 0===e&&(e=!1);var t=this,n=t.host,r=t.path,i=t.pass,o=t.port,a=t.projectId;return t.protocol+"://"+t.user+(e&&i?":"+i:"")+"@"+n+(o?":"+o:"")+"/"+(r?r+"/":r)+a},e.prototype._fromString=function(e){var t=bp.exec(e);if(!t)throw new cu(wp);var n=eu(t.slice(1),6),r=n[0],i=n[1],o=n[2],a=void 0===o?"":o,s=n[3],c=n[4],u=void 0===c?"":c,l="",f=n[5],h=f.split("/");h.length>1&&(l=h.slice(0,-1).join("/"),f=h.pop()),this._fromComponents({host:s,pass:a,path:l,projectId:f,port:u,protocol:r,user:i})},e.prototype._fromComponents=function(e){this.protocol=e.protocol,this.user=e.user,this.pass=e.pass||"",this.host=e.host,this.port=e.port||"",this.path=e.path||"",this.projectId=e.projectId},e.prototype._validate=function(){var e=this;if(["protocol","user","host","projectId"].forEach((function(t){if(!e[t])throw new cu(wp)})),"http"!==this.protocol&&"https"!==this.protocol)throw new cu(wp);if(this.port&&isNaN(parseInt(this.port,10)))throw new cu(wp)},e}(),Ep=function(){function e(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._user={},this._tags={},this._extra={},this._context={}}return e.prototype.addScopeListener=function(e){this._scopeListeners.push(e)},e.prototype.addEventProcessor=function(e){return this._eventProcessors.push(e),this},e.prototype._notifyScopeListeners=function(){var e=this;this._notifyingListeners||(this._notifyingListeners=!0,setTimeout((function(){e._scopeListeners.forEach((function(t){t(e)})),e._notifyingListeners=!1})))},e.prototype._notifyEventProcessors=function(e,t,n,r){var i=this;return void 0===r&&(r=0),new Qh((function(o,a){var s=e[r];if(null===t||"function"!=typeof s)o(t);else{var c=s(Zc({},t),n);vu(c)?c.then((function(t){return i._notifyEventProcessors(e,t,n,r+1).then(o)})).then(null,a):i._notifyEventProcessors(e,c,n,r+1).then(o).then(null,a)}}))},e.prototype.setUser=function(e){return this._user=e||{},this._notifyScopeListeners(),this},e.prototype.setTags=function(e){return this._tags=Zc({},this._tags,e),this._notifyScopeListeners(),this},e.prototype.setTag=function(e,t){var n;return this._tags=Zc({},this._tags,((n={})[e]=t,n)),this._notifyScopeListeners(),this},e.prototype.setExtras=function(e){return this._extra=Zc({},this._extra,e),this._notifyScopeListeners(),this},e.prototype.setExtra=function(e,t){var n;return this._extra=Zc({},this._extra,((n={})[e]=t,n)),this._notifyScopeListeners(),this},e.prototype.setFingerprint=function(e){return this._fingerprint=e,this._notifyScopeListeners(),this},e.prototype.setLevel=function(e){return this._level=e,this._notifyScopeListeners(),this},e.prototype.setTransaction=function(e){return this._transaction=e,this._span&&(this._span.transaction=e),this._notifyScopeListeners(),this},e.prototype.setContext=function(e,t){var n;return this._context=Zc({},this._context,((n={})[e]=t,n)),this._notifyScopeListeners(),this},e.prototype.setSpan=function(e){return this._span=e,this._notifyScopeListeners(),this},e.prototype.getSpan=function(){return this._span},e.clone=function(t){var n=new e;return t&&(n._breadcrumbs=tu(t._breadcrumbs),n._tags=Zc({},t._tags),n._extra=Zc({},t._extra),n._context=Zc({},t._context),n._user=t._user,n._level=t._level,n._span=t._span,n._transaction=t._transaction,n._fingerprint=t._fingerprint,n._eventProcessors=tu(t._eventProcessors)),n},e.prototype.clear=function(){return this._breadcrumbs=[],this._tags={},this._extra={},this._user={},this._context={},this._level=void 0,this._transaction=void 0,this._fingerprint=void 0,this._span=void 0,this._notifyScopeListeners(),this},e.prototype.addBreadcrumb=function(e,t){var n=Zc({timestamp:ph()},e);return this._breadcrumbs=void 0!==t&&t>=0?tu(this._breadcrumbs,[n]).slice(-t):tu(this._breadcrumbs,[n]),this._notifyScopeListeners(),this},e.prototype.clearBreadcrumbs=function(){return this._breadcrumbs=[],this._notifyScopeListeners(),this},e.prototype._applyFingerprint=function(e){e.fingerprint=e.fingerprint?Array.isArray(e.fingerprint)?e.fingerprint:[e.fingerprint]:[],this._fingerprint&&(e.fingerprint=e.fingerprint.concat(this._fingerprint)),e.fingerprint&&!e.fingerprint.length&&delete e.fingerprint},e.prototype.applyToEvent=function(e,t){return this._extra&&Object.keys(this._extra).length&&(e.extra=Zc({},this._extra,e.extra)),this._tags&&Object.keys(this._tags).length&&(e.tags=Zc({},this._tags,e.tags)),this._user&&Object.keys(this._user).length&&(e.user=Zc({},this._user,e.user)),this._context&&Object.keys(this._context).length&&(e.contexts=Zc({},this._context,e.contexts)),this._level&&(e.level=this._level),this._transaction&&(e.transaction=this._transaction),this._span&&(e.contexts=Zc({trace:this._span.getTraceContext()},e.contexts)),this._applyFingerprint(e),e.breadcrumbs=tu(e.breadcrumbs||[],this._breadcrumbs),e.breadcrumbs=e.breadcrumbs.length>0?e.breadcrumbs:void 0,this._notifyEventProcessors(tu(kp(),this._eventProcessors),e,t)},e}();function kp(){var e=eh();return e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.globalEventProcessors=e.__SENTRY__.globalEventProcessors||[],e.__SENTRY__.globalEventProcessors}function Sp(e){kp().push(e)}var Tp=function(){function e(e,t,n){void 0===t&&(t=new Ep),void 0===n&&(n=3),this._version=n,this._stack=[],this._stack.push({client:e,scope:t})}return e.prototype._invokeClient=function(e){for(var t,n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];var i=this.getStackTop();i&&i.client&&i.client[e]&&(t=i.client)[e].apply(t,tu(n,[i.scope]))},e.prototype.isOlderThan=function(e){return this._version<e},e.prototype.bindClient=function(e){this.getStackTop().client=e,e&&e.setupIntegrations&&e.setupIntegrations()},e.prototype.pushScope=function(){var e=this.getStack(),t=e.length>0?e[e.length-1].scope:void 0,n=Ep.clone(t);return this.getStack().push({client:this.getClient(),scope:n}),n},e.prototype.popScope=function(){return void 0!==this.getStack().pop()},e.prototype.withScope=function(e){var t=this.pushScope();try{e(t)}finally{this.popScope()}},e.prototype.getClient=function(){return this.getStackTop().client},e.prototype.getScope=function(){return this.getStackTop().scope},e.prototype.getStack=function(){return this._stack},e.prototype.getStackTop=function(){return this._stack[this._stack.length-1]},e.prototype.captureException=function(e,t){var n=this._lastEventId=th(),r=t;if(!t){var i=void 0;try{throw new Error("Sentry syntheticException")}catch(e){i=e}r={originalException:e,syntheticException:i}}return this._invokeClient("captureException",e,Zc({},r,{event_id:n})),n},e.prototype.captureMessage=function(e,t,n){var r=this._lastEventId=th(),i=n;if(!n){var o=void 0;try{throw new Error(e)}catch(e){o=e}i={originalException:e,syntheticException:o}}return this._invokeClient("captureMessage",e,t,Zc({},i,{event_id:r})),r},e.prototype.captureEvent=function(e,t){var n=this._lastEventId=th();return this._invokeClient("captureEvent",e,Zc({},t,{event_id:n})),n},e.prototype.lastEventId=function(){return this._lastEventId},e.prototype.addBreadcrumb=function(e,t){var n=this.getStackTop();if(n.scope&&n.client){var r=n.client.getOptions&&n.client.getOptions()||{},i=r.beforeBreadcrumb,o=void 0===i?null:i,a=r.maxBreadcrumbs,s=void 0===a?100:a;if(!(s<=0)){var c=ph(),u=Zc({timestamp:c},e),l=o?ih((function(){return o(u,t)})):u;null!==l&&n.scope.addBreadcrumb(l,Math.min(s,100))}}},e.prototype.setUser=function(e){var t=this.getStackTop();t.scope&&t.scope.setUser(e)},e.prototype.setTags=function(e){var t=this.getStackTop();t.scope&&t.scope.setTags(e)},e.prototype.setExtras=function(e){var t=this.getStackTop();t.scope&&t.scope.setExtras(e)},e.prototype.setTag=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setTag(e,t)},e.prototype.setExtra=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setExtra(e,t)},e.prototype.setContext=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setContext(e,t)},e.prototype.configureScope=function(e){var t=this.getStackTop();t.scope&&t.client&&e(t.scope)},e.prototype.run=function(e){var t=Ap(this);try{e(this)}finally{Ap(t)}},e.prototype.getIntegration=function(e){var t=this.getClient();if(!t)return null;try{return t.getIntegration(e)}catch(t){return wh.warn("Cannot retrieve integration "+e.id+" from the current Hub"),null}},e.prototype.startSpan=function(e,t){return void 0===t&&(t=!1),this._callExtensionMethod("startSpan",e,t)},e.prototype.traceHeaders=function(){return this._callExtensionMethod("traceHeaders")},e.prototype._callExtensionMethod=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=xp(),i=r.__SENTRY__;if(i&&i.extensions&&"function"==typeof i.extensions[e])return i.extensions[e].apply(this,t);wh.warn("Extension method "+e+" couldn't be found, doing nothing.")},e}();function xp(){var e=eh();return e.__SENTRY__=e.__SENTRY__||{extensions:{},hub:void 0},e}function Ap(e){var t=xp(),n=Cp(t);return Ip(t,e),n}function Op(){var e=xp();return Pp(e)&&!Cp(e).isOlderThan(3)||Ip(e,new Tp),Qf()?function(e){try{var t="domain",n=xp().__SENTRY__;if(!n||!n.extensions||!n.extensions[t])return Cp(e);var r=n.extensions[t].active;if(!r)return Cp(e);if(!Pp(r)||Cp(r).isOlderThan(3)){var i=Cp(e).getStackTop();Ip(r,new Tp(i.client,Ep.clone(i.scope)))}return Cp(r)}catch(t){return Cp(e)}}(e):Cp(e)}function Pp(e){return!!(e&&e.__SENTRY__&&e.__SENTRY__.hub)}function Cp(e){return e&&e.__SENTRY__&&e.__SENTRY__.hub||(e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.hub=new Tp),e.__SENTRY__.hub}function Ip(e,t){return!!e&&(e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.hub=t,!0)}function jp(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=Op();if(r&&r[e])return r[e].apply(r,tu(t));throw new Error("No hub defined or "+e+" was not found on the hub, please open a bug report.")}function Rp(e){var t;try{throw new Error("Sentry syntheticException")}catch(e){t=e}return jp("captureException",e,{originalException:e,syntheticException:t})}function Lp(e){jp("withScope",e)}var Np=function(){function e(e){this.dsn=e,this._dsnObject=new _p(e)}return e.prototype.getDsn=function(){return this._dsnObject},e.prototype.getStoreEndpoint=function(){return""+this._getBaseUrl()+this.getStoreEndpointPath()},e.prototype.getStoreEndpointWithUrlEncodedAuth=function(){var e,t={sentry_key:this._dsnObject.user,sentry_version:"7"};return this.getStoreEndpoint()+"?"+(e=t,Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&"))},e.prototype._getBaseUrl=function(){var e=this._dsnObject,t=e.protocol?e.protocol+":":"",n=e.port?":"+e.port:"";return t+"//"+e.host+n},e.prototype.getStoreEndpointPath=function(){var e=this._dsnObject;return(e.path?"/"+e.path:"")+"/api/"+e.projectId+"/store/"},e.prototype.getRequestHeaders=function(e,t){var n=this._dsnObject,r=["Sentry sentry_version=7"];return r.push("sentry_client="+e+"/"+t),r.push("sentry_key="+n.user),n.pass&&r.push("sentry_secret="+n.pass),{"Content-Type":"application/json","X-Sentry-Auth":r.join(", ")}},e.prototype.getReportDialogEndpoint=function(e){void 0===e&&(e={});var t=this._dsnObject,n=this._getBaseUrl()+(t.path?"/"+t.path:"")+"/api/embed/error-page/",r=[];for(var i in r.push("dsn="+t.toString()),e)if("user"===i){if(!e.user)continue;e.user.name&&r.push("name="+encodeURIComponent(e.user.name)),e.user.email&&r.push("email="+encodeURIComponent(e.user.email))}else r.push(encodeURIComponent(i)+"="+encodeURIComponent(e[i]));return r.length?n+"?"+r.join("&"):n},e}(),Mp=[];function Up(e){var t={};return function(e){var t=e.defaultIntegrations&&tu(e.defaultIntegrations)||[],n=e.integrations,r=[];if(Array.isArray(n)){var i=n.map((function(e){return e.name})),o=[];t.forEach((function(e){-1===i.indexOf(e.name)&&-1===o.indexOf(e.name)&&(r.push(e),o.push(e.name))})),n.forEach((function(e){-1===o.indexOf(e.name)&&(r.push(e),o.push(e.name))}))}else"function"==typeof n?(r=n(t),r=Array.isArray(r)?r:[r]):r=tu(t);var a=r.map((function(e){return e.name})),s="Debug";return-1!==a.indexOf(s)&&r.push.apply(r,tu(r.splice(a.indexOf(s),1))),r}(e).forEach((function(e){t[e.name]=e,function(e){-1===Mp.indexOf(e.name)&&(e.setupOnce(Sp,Op),Mp.push(e.name),wh.log("Integration installed: "+e.name))}(e)})),t}var Dp,Fp=function(){function e(e,t){this._integrations={},this._processing=!1,this._backend=new e(t),this._options=t,t.dsn&&(this._dsn=new _p(t.dsn))}return e.prototype.captureException=function(e,t,n){var r=this,i=t&&t.event_id;return this._processing=!0,this._getBackend().eventFromException(e,t).then((function(e){return r._processEvent(e,t,n)})).then((function(e){i=e&&e.event_id,r._processing=!1})).then(null,(function(e){wh.error(e),r._processing=!1})),i},e.prototype.captureMessage=function(e,t,n,r){var i=this,o=n&&n.event_id;return this._processing=!0,(pu(e)?this._getBackend().eventFromMessage(""+e,t,n):this._getBackend().eventFromException(e,n)).then((function(e){return i._processEvent(e,n,r)})).then((function(e){o=e&&e.event_id,i._processing=!1})).then(null,(function(e){wh.error(e),i._processing=!1})),o},e.prototype.captureEvent=function(e,t,n){var r=this,i=t&&t.event_id;return this._processing=!0,this._processEvent(e,t,n).then((function(e){i=e&&e.event_id,r._processing=!1})).then(null,(function(e){wh.error(e),r._processing=!1})),i},e.prototype.getDsn=function(){return this._dsn},e.prototype.getOptions=function(){return this._options},e.prototype.flush=function(e){var t=this;return this._isClientProcessing(e).then((function(n){return clearInterval(n.interval),t._getBackend().getTransport().close(e).then((function(e){return n.ready&&e}))}))},e.prototype.close=function(e){var t=this;return this.flush(e).then((function(e){return t.getOptions().enabled=!1,e}))},e.prototype.setupIntegrations=function(){this._isEnabled()&&(this._integrations=Up(this._options))},e.prototype.getIntegration=function(e){try{return this._integrations[e.id]||null}catch(t){return wh.warn("Cannot retrieve integration "+e.id+" from the current Client"),null}},e.prototype._isClientProcessing=function(e){var t=this;return new Qh((function(n){var r=0,i=0;clearInterval(i),i=setInterval((function(){t._processing?(r+=1,e&&r>=e&&n({interval:i,ready:!1})):n({interval:i,ready:!0})}),1)}))},e.prototype._getBackend=function(){return this._backend},e.prototype._isEnabled=function(){return!1!==this.getOptions().enabled&&void 0!==this._dsn},e.prototype._prepareEvent=function(e,t,n){var r=this,i=this.getOptions(),o=i.environment,a=i.release,s=i.dist,c=i.maxValueLength,u=void 0===c?250:c,l=i.normalizeDepth,f=void 0===l?3:l,h=Zc({},e);void 0===h.environment&&void 0!==o&&(h.environment=o),void 0===h.release&&void 0!==a&&(h.release=a),void 0===h.dist&&void 0!==s&&(h.dist=s),h.message&&(h.message=Kf(h.message,u));var p=h.exception&&h.exception.values&&h.exception.values[0];p&&p.value&&(p.value=Kf(p.value,u));var d=h.request;d&&d.url&&(d.url=Kf(d.url,u)),void 0===h.event_id&&(h.event_id=n&&n.event_id?n.event_id:th()),this._addIntegrations(h.sdk);var g=Qh.resolve(h);return t&&(g=t.applyToEvent(h,n)),g.then((function(e){return"number"==typeof f&&f>0?r._normalizeEvent(e,f):e}))},e.prototype._normalizeEvent=function(e,t){return e?Zc({},e,e.breadcrumbs&&{breadcrumbs:e.breadcrumbs.map((function(e){return Zc({},e,e.data&&{data:zh(e.data,t)})}))},e.user&&{user:zh(e.user,t)},e.contexts&&{contexts:zh(e.contexts,t)},e.extra&&{extra:zh(e.extra,t)}):null},e.prototype._addIntegrations=function(e){var t=Object.keys(this._integrations);e&&t.length>0&&(e.integrations=t)},e.prototype._processEvent=function(e,t,n){var r=this,i=this.getOptions(),o=i.beforeSend,a=i.sampleRate;return this._isEnabled()?"number"==typeof a&&Math.random()>a?Qh.reject("This event has been sampled, will not send event."):new Qh((function(i,a){r._prepareEvent(e,n,t).then((function(e){if(null!==e){var n=e;if(t&&t.data&&!0===t.data.__sentry__||!o)return r._getBackend().sendEvent(n),void i(n);var s=o(e,t);if(void 0===s)wh.error("`beforeSend` method has to return `null` or a valid event.");else if(vu(s))r._handleAsyncBeforeSend(s,i,a);else{if(null===(n=s))return wh.log("`beforeSend` returned `null`, will not send event."),void i(null);r._getBackend().sendEvent(n),i(n)}}else a("An event processor returned null, will not send event.")})).then(null,(function(e){r.captureException(e,{data:{__sentry__:!0},originalException:e}),a("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: "+e)}))})):Qh.reject("SDK not enabled, will not send event.")},e.prototype._handleAsyncBeforeSend=function(e,t,n){var r=this;e.then((function(e){null!==e?(r._getBackend().sendEvent(e),t(e)):n("`beforeSend` returned `null`, will not send event.")})).then(null,(function(e){n("beforeSend rejected with "+e)}))},e}(),Bp=function(){function e(){}return e.prototype.sendEvent=function(e){return Qh.resolve({reason:"NoopTransport: Event has been skipped because no Dsn is configured.",status:Qc.Skipped})},e.prototype.close=function(e){return Qh.resolve(!0)},e}(),qp=function(){function e(e){this._options=e,this._options.dsn||wh.warn("No DSN provided, backend will not do anything."),this._transport=this._setupTransport()}return e.prototype._setupTransport=function(){return new Bp},e.prototype.eventFromException=function(e,t){throw new cu("Backend has to implement `eventFromException` method")},e.prototype.eventFromMessage=function(e,t,n){throw new cu("Backend has to implement `eventFromMessage` method")},e.prototype.sendEvent=function(e){this._transport.sendEvent(e).then(null,(function(e){wh.error("Error while sending event: "+e)}))},e.prototype.getTransport=function(){return this._transport},e}();var Hp=function(){function e(){this.name=e.id}return e.prototype.setupOnce=function(){Dp=Function.prototype.toString,Function.prototype.toString=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this.__sentry_original__||this;return Dp.apply(n,e)}},e.id="FunctionToString",e}(),Vp=ze.some,Wp=Ye("some"),zp=Xe("some");Ce({target:"Array",proto:!0,forced:!Wp||!zp},{some:function(e){return Vp(this,e,arguments.length>1?arguments[1]:void 0)}});var Yp=[/^Script error\.?$/,/^Javascript error: Script error\.? on line 0$/],$p=function(){function e(t){void 0===t&&(t={}),this._options=t,this.name=e.id}return e.prototype.setupOnce=function(){Sp((function(t){var n=Op();if(!n)return t;var r=n.getIntegration(e);if(r){var i=n.getClient(),o=i?i.getOptions():{},a=r._mergeOptions(o);if(r._shouldDropEvent(t,a))return null}return t}))},e.prototype._shouldDropEvent=function(e,t){return this._isSentryError(e,t)?(wh.warn("Event dropped due to being internal Sentry Error.\nEvent: "+rh(e)),!0):this._isIgnoredError(e,t)?(wh.warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: "+rh(e)),!0):this._isBlacklistedUrl(e,t)?(wh.warn("Event dropped due to being matched by `blacklistUrls` option.\nEvent: "+rh(e)+".\nUrl: "+this._getEventFilterUrl(e)),!0):!this._isWhitelistedUrl(e,t)&&(wh.warn("Event dropped due to not being matched by `whitelistUrls` option.\nEvent: "+rh(e)+".\nUrl: "+this._getEventFilterUrl(e)),!0)},e.prototype._isSentryError=function(e,t){if(void 0===t&&(t={}),!t.ignoreInternal)return!1;try{return e&&e.exception&&e.exception.values&&e.exception.values[0]&&"SentryError"===e.exception.values[0].type||!1}catch(e){return!1}},e.prototype._isIgnoredError=function(e,t){return void 0===t&&(t={}),!(!t.ignoreErrors||!t.ignoreErrors.length)&&this._getPossibleEventMessages(e).some((function(e){return t.ignoreErrors.some((function(t){return Jf(e,t)}))}))},e.prototype._isBlacklistedUrl=function(e,t){if(void 0===t&&(t={}),!t.blacklistUrls||!t.blacklistUrls.length)return!1;var n=this._getEventFilterUrl(e);return!!n&&t.blacklistUrls.some((function(e){return Jf(n,e)}))},e.prototype._isWhitelistedUrl=function(e,t){if(void 0===t&&(t={}),!t.whitelistUrls||!t.whitelistUrls.length)return!0;var n=this._getEventFilterUrl(e);return!n||t.whitelistUrls.some((function(e){return Jf(n,e)}))},e.prototype._mergeOptions=function(e){return void 0===e&&(e={}),{blacklistUrls:tu(this._options.blacklistUrls||[],e.blacklistUrls||[]),ignoreErrors:tu(this._options.ignoreErrors||[],e.ignoreErrors||[],Yp),ignoreInternal:void 0===this._options.ignoreInternal||this._options.ignoreInternal,whitelistUrls:tu(this._options.whitelistUrls||[],e.whitelistUrls||[])}},e.prototype._getPossibleEventMessages=function(e){if(e.message)return[e.message];if(e.exception)try{var t=e.exception.values&&e.exception.values[0]||{},n=t.type,r=void 0===n?"":n,i=t.value,o=void 0===i?"":i;return[""+o,r+": "+o]}catch(t){return wh.error("Cannot extract message for event "+rh(e)),[]}return[]},e.prototype._getEventFilterUrl=function(e){try{if(e.stacktrace){var t=e.stacktrace.frames;return t&&t[t.length-1].filename||null}if(e.exception){var n=e.exception.values&&e.exception.values[0].stacktrace&&e.exception.values[0].stacktrace.frames;return n&&n[n.length-1].filename||null}return null}catch(t){return wh.error("Cannot extract url for event "+rh(e)),null}},e.id="InboundFilters",e}(),Gp="?",Kp=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Xp=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i,Jp=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,Qp=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,Zp=/\((\S*)(?::(\d+))(?::(\d+))\)/;function ed(e){var t=null,n=e&&e.framesToPop;try{if(t=function(e){if(!e||!e.stacktrace)return null;for(var t,n=e.stacktrace,r=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,i=/ line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^\)]+))\((.*)\))? in (.*):\s*$/i,o=n.split("\n"),a=[],s=0;s<o.length;s+=2){var c=null;(t=r.exec(o[s]))?c={url:t[2],func:t[3],args:[],line:+t[1],column:null}:(t=i.exec(o[s]))&&(c={url:t[6],func:t[3]||t[4],args:t[5]?t[5].split(","):[],line:+t[1],column:+t[2]}),c&&(!c.func&&c.line&&(c.func=Gp),a.push(c))}if(!a.length)return null;return{message:nd(e),name:e.name,stack:a}}(e))return td(t,n)}catch(e){}try{if(t=function(e){if(!e||!e.stack)return null;for(var t,n,r,i=[],o=e.stack.split("\n"),a=0;a<o.length;++a){if(n=Kp.exec(o[a])){var s=n[2]&&0===n[2].indexOf("native");n[2]&&0===n[2].indexOf("eval")&&(t=Zp.exec(n[2]))&&(n[2]=t[1],n[3]=t[2],n[4]=t[3]),r={url:n[2]&&0===n[2].indexOf("address at ")?n[2].substr("address at ".length):n[2],func:n[1]||Gp,args:s?[n[2]]:[],line:n[3]?+n[3]:null,column:n[4]?+n[4]:null}}else if(n=Jp.exec(o[a]))r={url:n[2],func:n[1]||Gp,args:[],line:+n[3],column:n[4]?+n[4]:null};else{if(!(n=Xp.exec(o[a])))continue;n[3]&&n[3].indexOf(" > eval")>-1&&(t=Qp.exec(n[3]))?(n[1]=n[1]||"eval",n[3]=t[1],n[4]=t[2],n[5]=""):0!==a||n[5]||void 0===e.columnNumber||(i[0].column=e.columnNumber+1),r={url:n[3],func:n[1]||Gp,args:n[2]?n[2].split(","):[],line:n[4]?+n[4]:null,column:n[5]?+n[5]:null}}!r.func&&r.line&&(r.func=Gp),i.push(r)}if(!i.length)return null;return{message:nd(e),name:e.name,stack:i}}(e))return td(t,n)}catch(e){}return{message:nd(e),name:e&&e.name,stack:[],failed:!0}}function td(e,t){try{return Zc({},e,{stack:e.stack.slice(t)})}catch(t){return e}}function nd(e){var t=e&&e.message;return t?t.error&&"string"==typeof t.error.message?t.error.message:t:"No error message"}function rd(e){var t=od(e.stack),n={type:e.name,value:e.message};return t&&t.length&&(n.stacktrace={frames:t}),void 0===n.type&&""===n.value&&(n.value="Unrecoverable error caught"),n}function id(e){return{exception:{values:[rd(e)]}}}function od(e){if(!e||!e.length)return[];var t=e,n=t[0].func||"",r=t[t.length-1].func||"";return-1===n.indexOf("captureMessage")&&-1===n.indexOf("captureException")||(t=t.slice(1)),-1!==r.indexOf("sentryWrapped")&&(t=t.slice(0,-1)),t.map((function(e){return{colno:null===e.column?void 0:e.column,filename:e.url||t[0].url,function:e.func||"?",in_app:!0,lineno:null===e.line?void 0:e.line}})).slice(0,50).reverse()}function ad(e,t,n){var r,i;if(void 0===n&&(n={}),lu(e)&&e.error)return r=id(ed(e=e.error));if(fu(e)||(i=e,"[object DOMException]"===Object.prototype.toString.call(i))){var o=e,a=o.name||(fu(o)?"DOMError":"DOMException"),s=o.message?a+": "+o.message:a;return oh(r=sd(s,t,n),s),r}return uu(e)?r=id(ed(e)):du(e)||gu(e)?(ah(r=function(e,t,n){var r={exception:{values:[{type:gu(e)?e.constructor.name:n?"UnhandledRejection":"Error",value:"Non-Error "+(n?"promise rejection":"exception")+" captured with keys: "+Yh(e)}]},extra:{__serialized__:Hh(e)}};if(t){var i=od(ed(t).stack);r.stacktrace={frames:i}}return r}(e,t,n.rejection),{synthetic:!0}),r):(oh(r=sd(e,t,n),""+e,void 0),ah(r,{synthetic:!0}),r)}function sd(e,t,n){void 0===n&&(n={});var r={message:e};if(n.attachStacktrace&&t){var i=od(ed(t).stack);r.stacktrace={frames:i}}return r}var cd=function(){function e(e){this.options=e,this._buffer=new Zh(30),this.url=new Np(this.options.dsn).getStoreEndpointWithUrlEncodedAuth()}return e.prototype.sendEvent=function(e){throw new cu("Transport Class has to implement `sendEvent` method")},e.prototype.close=function(e){return this._buffer.drain(e)},e}(),ud=eh(),ld=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._disabledUntil=new Date(Date.now()),t}return Xc(t,e),t.prototype.sendEvent=function(e){var t=this;if(new Date(Date.now())<this._disabledUntil)return Promise.reject({event:e,reason:"Transport locked till "+this._disabledUntil+" due to too many requests.",status:429});var n={body:JSON.stringify(e),method:"POST",referrerPolicy:np()?"origin":""};return void 0!==this.options.headers&&(n.headers=this.options.headers),this._buffer.add(new Qh((function(e,r){ud.fetch(t.url,n).then((function(n){var i=Qc.fromHttpCode(n.status);if(i!==Qc.Success){if(i===Qc.RateLimit){var o=Date.now();t._disabledUntil=new Date(o+dh(o,n.headers.get("Retry-After"))),wh.warn("Too many requests, backing off till: "+t._disabledUntil)}r(n)}else e({status:i})})).catch(r)})))},t}(cd),fd=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._disabledUntil=new Date(Date.now()),t}return Xc(t,e),t.prototype.sendEvent=function(e){var t=this;return new Date(Date.now())<this._disabledUntil?Promise.reject({event:e,reason:"Transport locked till "+this._disabledUntil+" due to too many requests.",status:429}):this._buffer.add(new Qh((function(n,r){var i=new XMLHttpRequest;for(var o in i.onreadystatechange=function(){if(4===i.readyState){var e=Qc.fromHttpCode(i.status);if(e!==Qc.Success){if(e===Qc.RateLimit){var o=Date.now();t._disabledUntil=new Date(o+dh(o,i.getResponseHeader("Retry-After"))),wh.warn("Too many requests, backing off till: "+t._disabledUntil)}r(i)}else n({status:e})}},i.open("POST",t.url),t.options.headers)t.options.headers.hasOwnProperty(o)&&i.setRequestHeader(o,t.options.headers[o]);i.send(JSON.stringify(e))})))},t}(cd),hd=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Xc(t,e),t.prototype._setupTransport=function(){if(!this._options.dsn)return e.prototype._setupTransport.call(this);var t=Zc({},this._options.transportOptions,{dsn:this._options.dsn});return this._options.transport?new this._options.transport(t):ep()?new ld(t):new fd(t)},t.prototype.eventFromException=function(e,t){var n=ad(e,t&&t.syntheticException||void 0,{attachStacktrace:this._options.attachStacktrace});return ah(n,{handled:!0,type:"generic"}),n.level=Jc.Error,t&&t.event_id&&(n.event_id=t.event_id),Qh.resolve(n)},t.prototype.eventFromMessage=function(e,t,n){void 0===t&&(t=Jc.Info);var r=sd(e,n&&n.syntheticException||void 0,{attachStacktrace:this._options.attachStacktrace});return r.level=t,n&&n.event_id&&(r.event_id=n.event_id),Qh.resolve(r)},t}(qp),pd="5.15.5",dd=function(e){function t(t){return void 0===t&&(t={}),e.call(this,hd,t)||this}return Xc(t,e),t.prototype._prepareEvent=function(t,n,r){return t.platform=t.platform||"javascript",t.sdk=Zc({},t.sdk,{name:"sentry.javascript.browser",packages:tu(t.sdk&&t.sdk.packages||[],[{name:"npm:@sentry/browser",version:pd}]),version:pd}),e.prototype._prepareEvent.call(this,t,n,r)},t.prototype.showReportDialog=function(e){void 0===e&&(e={});var t=eh().document;if(t)if(this._isEnabled()){var n=e.dsn||this.getDsn();if(e.eventId)if(n){var r=t.createElement("script");r.async=!0,r.src=new Np(n).getReportDialogEndpoint(e),e.onLoad&&(r.onload=e.onLoad),(t.head||t.body).appendChild(r)}else wh.error("Missing `Dsn` option in showReportDialog call");else wh.error("Missing `eventId` option in showReportDialog call")}else wh.error("Trying to call showReportDialog with Sentry Client is disabled")},t}(Fp),gd=0;function md(){return gd>0}function vd(){gd+=1,setTimeout((function(){gd-=1}))}function yd(e,t,n){if(void 0===t&&(t={}),"function"!=typeof e)return e;try{if(e.__sentry__)return e;if(e.__sentry_wrapped__)return e.__sentry_wrapped__}catch(t){return e}var r=function(){var r=Array.prototype.slice.call(arguments);try{n&&"function"==typeof n&&n.apply(this,arguments);var i=r.map((function(e){return yd(e,t)}));return e.handleEvent?e.handleEvent.apply(this,i):e.apply(this,i)}catch(e){throw vd(),Lp((function(n){n.addEventProcessor((function(e){var n=Zc({},e);return t.mechanism&&(oh(n,void 0,void 0),ah(n,t.mechanism)),n.extra=Zc({},n.extra,{arguments:r}),n})),Rp(e)})),e}};try{for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(r[i]=e[i])}catch(e){}e.prototype=e.prototype||{},r.prototype=e.prototype,Object.defineProperty(e,"__sentry_wrapped__",{enumerable:!1,value:r}),Object.defineProperties(r,{__sentry__:{enumerable:!1,value:!0},__sentry_original__:{enumerable:!1,value:e}});try{Object.getOwnPropertyDescriptor(r,"name").configurable&&Object.defineProperty(r,"name",{get:function(){return e.name}})}catch(e){}return r}var bd=function(){function e(t){this.name=e.id,this._onErrorHandlerInstalled=!1,this._onUnhandledRejectionHandlerInstalled=!1,this._options=Zc({onerror:!0,onunhandledrejection:!0},t)}return e.prototype.setupOnce=function(){Error.stackTraceLimit=50,this._options.onerror&&(wh.log("Global Handler attached: onerror"),this._installGlobalOnErrorHandler()),this._options.onunhandledrejection&&(wh.log("Global Handler attached: onunhandledrejection"),this._installGlobalOnUnhandledRejectionHandler())},e.prototype._installGlobalOnErrorHandler=function(){var t=this;this._onErrorHandlerInstalled||(cp({callback:function(n){var r=n.error,i=Op(),o=i.getIntegration(e),a=r&&!0===r.__sentry_own_request__;if(o&&!md()&&!a){var s=i.getClient(),c=pu(r)?t._eventFromIncompleteOnError(n.msg,n.url,n.line,n.column):t._enhanceEventWithInitialFrame(ad(r,void 0,{attachStacktrace:s&&s.getOptions().attachStacktrace,rejection:!1}),n.url,n.line,n.column);ah(c,{handled:!1,type:"onerror"}),i.captureEvent(c,{originalException:r})}},type:"error"}),this._onErrorHandlerInstalled=!0)},e.prototype._installGlobalOnUnhandledRejectionHandler=function(){var t=this;this._onUnhandledRejectionHandlerInstalled||(cp({callback:function(n){var r=n;try{"reason"in n?r=n.reason:"detail"in n&&"reason"in n.detail&&(r=n.detail.reason)}catch(e){}var i=Op(),o=i.getIntegration(e),a=r&&!0===r.__sentry_own_request__;if(!o||md()||a)return!0;var s=i.getClient(),c=pu(r)?t._eventFromIncompleteRejection(r):ad(r,void 0,{attachStacktrace:s&&s.getOptions().attachStacktrace,rejection:!0});c.level=Jc.Error,ah(c,{handled:!1,type:"onunhandledrejection"}),i.captureEvent(c,{originalException:r})},type:"unhandledrejection"}),this._onUnhandledRejectionHandlerInstalled=!0)},e.prototype._eventFromIncompleteOnError=function(e,t,n,r){var i,o=lu(e)?e.message:e;if(hu(o)){var a=o.match(/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i);a&&(i=a[1],o=a[2])}var s={exception:{values:[{type:i||"Error",value:o}]}};return this._enhanceEventWithInitialFrame(s,t,n,r)},e.prototype._eventFromIncompleteRejection=function(e){return{exception:{values:[{type:"UnhandledRejection",value:"Non-Error promise rejection captured with value: "+e}]}}},e.prototype._enhanceEventWithInitialFrame=function(e,t,n,r){e.exception=e.exception||{},e.exception.values=e.exception.values||[],e.exception.values[0]=e.exception.values[0]||{},e.exception.values[0].stacktrace=e.exception.values[0].stacktrace||{},e.exception.values[0].stacktrace.frames=e.exception.values[0].stacktrace.frames||[];var i=isNaN(parseInt(r,10))?void 0:r,o=isNaN(parseInt(n,10))?void 0:n,a=hu(t)&&t.length>0?t:function(){try{return document.location.href}catch(e){return""}}();return 0===e.exception.values[0].stacktrace.frames.length&&e.exception.values[0].stacktrace.frames.push({colno:i,filename:a,function:"?",in_app:!0,lineno:o}),e},e.id="GlobalHandlers",e}(),wd=function(){function e(){this._ignoreOnError=0,this.name=e.id}return e.prototype._wrapTimeFunction=function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=t[0];return t[0]=yd(r,{mechanism:{data:{function:mh(e)},handled:!0,type:"instrument"}}),e.apply(this,t)}},e.prototype._wrapRAF=function(e){return function(t){return e(yd(t,{mechanism:{data:{function:"requestAnimationFrame",handler:mh(e)},handled:!0,type:"instrument"}}))}},e.prototype._wrapEventTarget=function(e){var t=eh(),n=t[e]&&t[e].prototype;n&&n.hasOwnProperty&&n.hasOwnProperty("addEventListener")&&(Fh(n,"addEventListener",(function(t){return function(n,r,i){try{"function"==typeof r.handleEvent&&(r.handleEvent=yd(r.handleEvent.bind(r),{mechanism:{data:{function:"handleEvent",handler:mh(r),target:e},handled:!0,type:"instrument"}}))}catch(e){}return t.call(this,n,yd(r,{mechanism:{data:{function:"addEventListener",handler:mh(r),target:e},handled:!0,type:"instrument"}}),i)}})),Fh(n,"removeEventListener",(function(e){return function(t,n,r){var i=n;try{i=i&&(i.__sentry_wrapped__||i)}catch(e){}return e.call(this,t,i,r)}})))},e.prototype._wrapXHR=function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=this,i=["onload","onerror","onprogress","onreadystatechange"];return i.forEach((function(e){e in r&&"function"==typeof r[e]&&Fh(r,e,(function(t){var n={mechanism:{data:{function:e,handler:mh(t)},handled:!0,type:"instrument"}};return t.__sentry_original__&&(n.mechanism.data.handler=mh(t.__sentry_original__)),yd(t,n)}))})),e.apply(this,t)}},e.prototype.setupOnce=function(){this._ignoreOnError=this._ignoreOnError;var e=eh();Fh(e,"setTimeout",this._wrapTimeFunction.bind(this)),Fh(e,"setInterval",this._wrapTimeFunction.bind(this)),Fh(e,"requestAnimationFrame",this._wrapRAF.bind(this)),"XMLHttpRequest"in e&&Fh(XMLHttpRequest.prototype,"send",this._wrapXHR.bind(this)),["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"].forEach(this._wrapEventTarget.bind(this))},e.id="TryCatch",e}(),_d=function(){function e(t){this.name=e.id,this._options=Zc({console:!0,dom:!0,fetch:!0,history:!0,sentry:!0,xhr:!0},t)}return e.prototype._consoleBreadcrumb=function(e){var t={category:"console",data:{arguments:e.args,logger:"console"},level:Jc.fromString(e.level),message:Xf(e.args," ")};if("assert"===e.level){if(!1!==e.args[0])return;t.message="Assertion failed: "+(Xf(e.args.slice(1)," ")||"console.assert"),t.data.arguments=e.args.slice(1)}Op().addBreadcrumb(t,{input:e.args,level:e.level})},e.prototype._domBreadcrumb=function(e){var t;try{t=e.event.target?sh(e.event.target):sh(e.event)}catch(e){t="<unknown>"}0!==t.length&&Op().addBreadcrumb({category:"ui."+e.name,message:t},{event:e.event,name:e.name})},e.prototype._xhrBreadcrumb=function(e){if(e.endTimestamp){if(e.xhr.__sentry_own_request__)return;Op().addBreadcrumb({category:"xhr",data:e.xhr.__sentry_xhr__,type:"http"},{xhr:e.xhr})}else this._options.sentry&&e.xhr.__sentry_own_request__&&Ed(e.args[0])},e.prototype._fetchBreadcrumb=function(e){if(e.endTimestamp){var t=Op().getClient(),n=t&&t.getDsn();if(this._options.sentry&&n){var r=new Np(n).getStoreEndpoint();if(r&&-1!==e.fetchData.url.indexOf(r)&&"POST"===e.fetchData.method&&e.args[1]&&e.args[1].body)return void Ed(e.args[1].body)}e.error?Op().addBreadcrumb({category:"fetch",data:Zc({},e.fetchData,{status_code:e.response.status}),level:Jc.Error,type:"http"},{data:e.error,input:e.args}):Op().addBreadcrumb({category:"fetch",data:Zc({},e.fetchData,{status_code:e.response.status}),type:"http"},{input:e.args,response:e.response})}},e.prototype._historyBreadcrumb=function(e){var t=eh(),n=e.from,r=e.to,i=nh(t.location.href),o=nh(n),a=nh(r);o.path||(o=i),i.protocol===a.protocol&&i.host===a.host&&(r=a.relative),i.protocol===o.protocol&&i.host===o.host&&(n=o.relative),Op().addBreadcrumb({category:"navigation",data:{from:n,to:r}})},e.prototype.setupOnce=function(){var e=this;this._options.console&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._consoleBreadcrumb.apply(e,tu(t))},type:"console"}),this._options.dom&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._domBreadcrumb.apply(e,tu(t))},type:"dom"}),this._options.xhr&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._xhrBreadcrumb.apply(e,tu(t))},type:"xhr"}),this._options.fetch&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._fetchBreadcrumb.apply(e,tu(t))},type:"fetch"}),this._options.history&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._historyBreadcrumb.apply(e,tu(t))},type:"history"})},e.id="Breadcrumbs",e}();function Ed(e){try{var t=JSON.parse(e);Op().addBreadcrumb({category:"sentry."+("transaction"===t.type?"transaction":"event"),event_id:t.event_id,level:t.level||Jc.fromString("error"),message:rh(t)},{event:t})}catch(e){wh.error("Error while adding sentry type breadcrumb")}}var kd=function(){function e(t){void 0===t&&(t={}),this.name=e.id,this._key=t.key||"cause",this._limit=t.limit||5}return e.prototype.setupOnce=function(){Sp((function(t,n){var r=Op().getIntegration(e);return r?r._handler(t,n):t}))},e.prototype._handler=function(e,t){if(!(e.exception&&e.exception.values&&t&&yu(t.originalException,Error)))return e;var n=this._walkErrorTree(t.originalException,this._key);return e.exception.values=tu(n,e.exception.values),e},e.prototype._walkErrorTree=function(e,t,n){if(void 0===n&&(n=[]),!yu(e[t],Error)||n.length+1>=this._limit)return n;var r=rd(ed(e[t]));return this._walkErrorTree(e[t],t,tu([r],n))},e.id="LinkedErrors",e}(),Sd=eh(),Td=function(){function e(){this.name=e.id}return e.prototype.setupOnce=function(){Sp((function(t){if(Op().getIntegration(e)){if(!Sd.navigator||!Sd.location)return t;var n=t.request||{};return n.url=n.url||Sd.location.href,n.headers=n.headers||{},n.headers["User-Agent"]=Sd.navigator.userAgent,Zc({},t,{request:n})}return t}))},e.id="UserAgent",e}(),xd=[new $p,new Hp,new wd,new _d,new bd,new kd,new Td];function Ad(e){if(void 0===e&&(e={}),void 0===e.defaultIntegrations&&(e.defaultIntegrations=xd),void 0===e.release){var t=eh();t.SENTRY_RELEASE&&t.SENTRY_RELEASE.id&&(e.release=t.SENTRY_RELEASE.id)}!function(e,t){!0===t.debug&&wh.enable();var n=Op(),r=new e(t);n.bindClient(r)}(dd,e)}var Od=ze.find,Pd="find",Cd=!0,Id=Xe(Pd);Pd in[]&&Array(1).find((function(){Cd=!1})),Ce({target:"Array",proto:!0,forced:Cd||!Id},{find:function(e){return Od(this,e,arguments.length>1?arguments[1]:void 0)}}),jt(Pd);var jd="[\t\n\v\f\r                 \u2028\u2029\ufeff]",Rd=RegExp("^"+jd+jd+"*"),Ld=RegExp(jd+jd+"*$"),Nd=function(e){return function(t){var n=String(d(t));return 1&e&&(n=n.replace(Rd,"")),2&e&&(n=n.replace(Ld,"")),n}},Md={start:Nd(1),end:Nd(2),trim:Nd(3)},Ud=ye.f,Dd=T.f,Fd=O.f,Bd=Md.trim,qd="Number",Hd=r.Number,Vd=Hd.prototype,Wd=f(Pt(Vd))==qd,zd=function(e){var t,n,r,i,o,a,s,c,u=v(e,!1);if("string"==typeof u&&u.length>2)if(43===(t=(u=Bd(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+u}for(a=(o=u.slice(2)).length,s=0;s<a;s++)if((c=o.charCodeAt(s))<48||c>i)return NaN;return parseInt(o,r)}return+u};if(Oe(qd,!Hd(" 0o1")||!Hd("0b1")||Hd("+0x1"))){for(var Yd,$d=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof $d&&(Wd?i((function(){Vd.valueOf.call(n)})):f(n)!=qd)?Kt(new Hd(zd(t)),n,$d):zd(t)},Gd=o?Ud(Hd):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Kd=0;Gd.length>Kd;Kd++)b(Hd,Yd=Gd[Kd])&&!b($d,Yd)&&Fd($d,Yd,Dd(Hd,Yd));$d.prototype=Vd,Vd.constructor=$d,ee(r,qd,$d)}Ce({target:"Number",stat:!0},{isNaN:function(e){return e!=e}});var Xd=c.f,Jd=function(e){return function(t){for(var n,r=g(t),i=Et(r),a=i.length,s=0,c=[];a>s;)n=i[s++],o&&!Xd.call(r,n)||c.push(e?[n,r[n]]:r[n]);return c}},Qd={entries:Jd(!0),values:Jd(!1)}.entries;function Zd(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function eg(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function tg(e,t,n){return t&&eg(e.prototype,t),n&&eg(e,n),e}function ng(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function rg(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw o}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}Ce({target:"Object",stat:!0},{entries:function(e){return Qd(e)}});var ig=function(e){return null!=e?e.constructor:null},og=function(e,t){return!!(e&&t&&e instanceof t)},ag=function(e){return null==e},sg=function(e){return ig(e)===Object},cg=function(e){return ig(e)===String},ug=function(e){return Array.isArray(e)},lg=function(e){return og(e,NodeList)},fg=ag,hg=sg,pg=function(e){return ig(e)===Number&&!Number.isNaN(e)},dg=cg,gg=function(e){return ig(e)===Boolean},mg=ug,vg=lg,yg=function(e){return og(e,Element)},bg=function(e){return og(e,Event)},wg=function(e){return ag(e)||(cg(e)||ug(e)||lg(e))&&!e.length||sg(e)&&!Object.keys(e).length},_g={facebook:{domain:"facebook.com",url:function(e){return"https://graph.facebook.com/?id=".concat(e,"&fields=og_object{engagement}")},shareCount:function(e){return e.og_object.engagement.count},popup:{width:640,height:360}},twitter:{domain:"twitter.com",url:function(){return null},shareCount:function(){return null},popup:{width:640,height:240}},pinterest:{domain:"pinterest.com",url:function(e){return"https://widgets.pinterest.com/v1/urls/count.json?url=".concat(e)},shareCount:function(e){return e.count},popup:{width:830,height:700}},github:{domain:"github.com",url:function(e,t){return"https://api.github.com/repos/".concat(e).concat(dg(t)?"?access_token=".concat(t):"")},shareCount:function(e){return e.data.stargazers_count}},youtube:{domain:"youtube.com",url:function(e,t){return"https://www.googleapis.com/youtube/v3/channels?part=statistics&id=".concat(e,"&key=").concat(t)},shareCount:function(e){if(!wg(e.error))return null;var t=rg(e.items,1)[0];return wg(t)?null:t.statistics.subscriberCount}}},Eg={debug:!1,wrapper:{className:"shr"},count:{className:"shr__count",displayZero:!1,format:!0,position:"after",increment:!0},tokens:{github:"",youtube:""},storage:{enabled:!0,key:"shr",ttl:3e5}};function kg(e){return new Promise((function(t,n){var r="jsonp_callback_".concat(Math.round(1e5*Math.random())),i=document.createElement("script");i.addEventListener("error",(function(e){return n(e)})),window[r]=function(e){delete window[r],document.body.removeChild(i),t(e)};var o=new URL(e);o.searchParams.set("callback",r),i.setAttribute("src",o.toString()),document.body.appendChild(i)}))}var Sg=function(){},Tg=function(){function e(){var t=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0];Zd(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return tg(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Sg}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Sg}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Sg}}]),e}();function xg(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function Ag(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach((function(e,n){var r=0<n?t.cloneNode(!0):t,i=e.parentNode,o=e.nextSibling;r.appendChild(e),o?i.insertBefore(r,o):i.appendChild(r)}))}function Og(e,t,n){var r=document.createElement(e);return hg(t)&&function(e,t){!yg(e)||wg(t)||Object.entries(t).filter((function(e){var t=rg(e,2)[1];return!fg(t)})).forEach((function(t){var n=rg(t,2),r=n[0],i=n[1];return e.setAttribute(r,i)}))}(r,t),dg(n)&&(r.innerText=n),r}function Pg(e){var t=/\./.test(1.1.toLocaleString())?".":",",n=new RegExp("\\".concat(t,"\\d+$"));return Math.round(e).toLocaleString().replace(n,"")}function Cg(){for(var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(1<t?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(!n.length)return e;var i=n.shift();return hg(i)?(Object.keys(i).forEach((function(t){hg(i[t])?(!Object.keys(e).includes(t)&&Object.assign(e,ng({},t,{})),Cg(e[t],i[t])):Object.assign(e,ng({},t,i[t]))})),Cg.apply(void 0,[e].concat(n))):e}var Ig=function(){function e(t,n){var r=!(2<arguments.length&&void 0!==arguments[2])||arguments[2];Zd(this,e),this.enabled=r&&e.supported,this.key=t,this.ttl=n}return tg(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(wg(n))return null;var r=window.localStorage.getItem("".concat(this.key,"_ttl"));if(wg(r)||r<Date.now())return null;var i=JSON.parse(n);return dg(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&hg(t)){var n=this.get();wg(n)&&(n={}),Cg(n,t),window.localStorage.setItem(this.key,JSON.stringify(n)),window.localStorage.setItem("".concat(this.key,"_ttl"),Date.now()+this.ttl)}}}],[{key:"supported",get:function(){try{return"localStorage"in window&&(window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0)}catch(e){return!1}}}]),e}();var jg=function(){function e(t,n){var r=this;Zd(this,e),this.elements={count:null,trigger:null,popup:null},yg(t)?this.elements.trigger=t:dg(t)&&(this.elements.trigger=document.querySelector(t)),yg(this.elements.trigger)&&wg(this.elements.trigger.shr)&&(this.config=Cg({},Eg,n,{networks:_g}),this.console=new Tg(this.config.debug),this.storage=new Ig(this.config.storage.key,this.config.storage.ttl,this.config.storage.enabled),this.getCount().then((function(e){return r.updateDisplay(e)})).catch((function(){})),this.listeners(!0),this.elements.trigger.shr=this)}return tg(e,[{key:"destroy",value:function(){this.listeners(!1)}},{key:"listeners",value:function(){var e=this,t=0<arguments.length&&void 0!==arguments[0]&&arguments[0]?"addEventListener":"removeEventListener";this.elements.trigger[t]("click",(function(t){return e.share(t)}),!1)}},{key:"share",value:function(e){var t=this;this.openPopup(e);var n=this.config.count.increment;this.getCount().then((function(e){return t.updateDisplay(e,n)})).catch((function(){}))}},{key:"openPopup",value:function(e){if(!wg(this.network)&&this.networkConfig.popup){bg(e)&&e.preventDefault();var t=this.networkConfig.popup,n=t.width,r=t.height,i="shr-popup--".concat(this.network);if(this.popup&&!this.popup.closed)this.popup.focus(),this.console.log("Popup re-focused.");else{var o=void 0===window.screenLeft?window.screen.left:window.screenLeft,a=void 0===window.screenTop?window.screen.top:window.screenTop,s=window.screen.width/2-n/2+o,c=window.screen.height/2-r/2+a;this.popup=window.open(this.href,i,"top=".concat(c,",left=").concat(s,",width=").concat(n,",height=").concat(r)),this.popup&&!this.popup.closed&&gg(this.popup.closed)?(this.popup.focus(),this.console.log("Popup opened.")):this.console.error("Popup blocked.")}}}},{key:"getCount",value:function(){var e=this,t=!(0<arguments.length&&void 0!==arguments[0])||arguments[0];return new Promise((function(n,r){var i=e.apiUrl;if(wg(i))r(new Error("No URL available for ".concat(e.network,".")));else{if(t){var o=e.storage.get(e.target);if(!wg(o)&&Object.keys(o).includes(e.network)){var a=o[e.network];return n(pg(a)?a:0),void e.console.log("getCount for '".concat(e.target,"' for '").concat(e.network,"' resolved from cache."))}}kg(i).then((function(t){var r=0,i=e.elements.trigger.getAttribute("data-shr-display");r=wg(i)?e.networkConfig.shareCount(t):t[i],wg(r)?r=0:(r=parseInt(r,10),!pg(r)&&(r=0)),e.storage.set(ng({},e.target,ng({},e.network,r))),n(r)})).catch(r)}}))}},{key:"updateDisplay",value:function(e){var t=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],n=this.config,r=n.count,i=n.wrapper,o=t?e+1:e,a=r.position.toLowerCase();if(0<o||r.displayZero){var s=function(e){return Math.round(o/e*10)/10},c=Pg(o);r.format&&(1e6<o?c="".concat(s(1e6),"M"):1e3<o&&(c="".concat(s(1e3),"K"))),yg(this.elements.count)?this.elements.count.textContent=c:(Ag(this.elements.trigger,Og("span",{class:i.className})),this.elements.count=Og("span",{class:"".concat(r.className," ").concat(r.className,"--").concat(a)},c),this.elements.trigger.insertAdjacentElement("after"===a?"afterend":"beforebegin",this.elements.count))}}},{key:"href",get:function(){return yg(this.elements.trigger)?this.elements.trigger.href:null}},{key:"network",get:function(){var e=this;if(!yg(this.elements.trigger))return null;var t=this.config.networks;return Object.keys(t).find((function(n){return function(e){var t=new URL(e).hostname,n=t.split("."),r=n.length;return 2<r&&(t="".concat(n[r-2],".").concat(n[r-1]),2===n[r-2].length&&2===n[r-1].length&&(t="".concat(n[r-3],".").concat(t))),t}(e.href)===t[n].domain}))}},{key:"networkConfig",get:function(){return wg(this.network)?null:this.config.networks[this.network]}},{key:"target",get:function(){if(wg(this.network))return null;var e=new URL(this.href);switch(this.network){case"facebook":return e.searchParams.get("u");case"github":return e.pathname.substring(1);case"youtube":return e.pathname.split("/").pop();default:return e.searchParams.get("url")}}},{key:"apiUrl",get:function(){if(wg(this.network))return null;var e=this.config.tokens;switch(this.network){case"github":return this.networkConfig.url(this.target,e.github);case"youtube":return this.networkConfig.url(this.target,e.youtube);default:return this.networkConfig.url(encodeURIComponent(this.target))}}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(dg(t)?r=Array.from(document.querySelectorAll(t)):yg(t)?r=[t]:vg(t)?r=Array.from(t):mg(t)&&(r=t.filter(yg)),wg(r))return null;var i=Object.assign({},Eg,n);return dg(t)&&i.watch&&new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){yg(n)&&xg(n,t)&&new e(n,i)}))}))})).observe(document.body,{childList:!0,subtree:!0}),r.map((function(t){return new e(t,n)}))}}]),e}(),Rg=function(e){return e&&e.Math==Math&&e},Lg=Rg("object"==typeof globalThis&&globalThis)||Rg("object"==typeof window&&window)||Rg("object"==typeof self&&self)||Rg("object"==typeof e&&e)||function(){return this}()||Function("return this")(),Ng=function(e){try{return!!e()}catch(e){return!0}},Mg=!Ng((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),Ug={}.propertyIsEnumerable,Dg=Object.getOwnPropertyDescriptor,Fg={f:Dg&&!Ug.call({1:2},1)?function(e){var t=Dg(this,e);return!!t&&t.enumerable}:Ug},Bg=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},qg={}.toString,Hg=function(e){return qg.call(e).slice(8,-1)},Vg="".split,Wg=Ng((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==Hg(e)?Vg.call(e,""):Object(e)}:Object,zg=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},Yg=function(e){return Wg(zg(e))},$g=function(e){return"object"==typeof e?null!==e:"function"==typeof e},Gg=function(e,t){if(!$g(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!$g(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!$g(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!$g(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},Kg={}.hasOwnProperty,Xg=function(e,t){return Kg.call(e,t)},Jg=Lg.document,Qg=$g(Jg)&&$g(Jg.createElement),Zg=function(e){return Qg?Jg.createElement(e):{}},em=!Mg&&!Ng((function(){return 7!=Object.defineProperty(Zg("div"),"a",{get:function(){return 7}}).a})),tm=Object.getOwnPropertyDescriptor,nm={f:Mg?tm:function(e,t){if(e=Yg(e),t=Gg(t,!0),em)try{return tm(e,t)}catch(e){}if(Xg(e,t))return Bg(!Fg.f.call(e,t),e[t])}},rm=function(e){if(!$g(e))throw TypeError(String(e)+" is not an object");return e},im=Object.defineProperty,om={f:Mg?im:function(e,t,n){if(rm(e),t=Gg(t,!0),rm(n),em)try{return im(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}},am=Mg?function(e,t,n){return om.f(e,t,Bg(1,n))}:function(e,t,n){return e[t]=n,e},sm=function(e,t){try{am(Lg,e,t)}catch(n){Lg[e]=t}return t},cm="__core-js_shared__",um=Lg[cm]||sm(cm,{}),lm=Function.toString;"function"!=typeof um.inspectSource&&(um.inspectSource=function(e){return lm.call(e)});var fm,hm,pm,dm=um.inspectSource,gm=Lg.WeakMap,mm="function"==typeof gm&&/native code/.test(dm(gm)),vm=t((function(e){(e.exports=function(e,t){return um[e]||(um[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.7.0",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),ym=0,bm=Math.random(),wm=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++ym+bm).toString(36)},_m=vm("keys"),Em=function(e){return _m[e]||(_m[e]=wm(e))},km={},Sm=Lg.WeakMap;if(mm){var Tm=um.state||(um.state=new Sm),xm=Tm.get,Am=Tm.has,Om=Tm.set;fm=function(e,t){return t.facade=e,Om.call(Tm,e,t),t},hm=function(e){return xm.call(Tm,e)||{}},pm=function(e){return Am.call(Tm,e)}}else{var Pm=Em("state");km[Pm]=!0,fm=function(e,t){return t.facade=e,am(e,Pm,t),t},hm=function(e){return Xg(e,Pm)?e[Pm]:{}},pm=function(e){return Xg(e,Pm)}}var Cm,Im,jm={set:fm,get:hm,has:pm,enforce:function(e){return pm(e)?hm(e):fm(e,{})},getterFor:function(e){return function(t){var n;if(!$g(t)||(n=hm(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Rm=t((function(e){var t=jm.get,n=jm.enforce,r=String(String).split("String");(e.exports=function(e,t,i,o){var a,s=!!o&&!!o.unsafe,c=!!o&&!!o.enumerable,u=!!o&&!!o.noTargetGet;"function"==typeof i&&("string"!=typeof t||Xg(i,"name")||am(i,"name",t),(a=n(i)).source||(a.source=r.join("string"==typeof t?t:""))),e!==Lg?(s?!u&&e[t]&&(c=!0):delete e[t],c?e[t]=i:am(e,t,i)):c?e[t]=i:sm(t,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||dm(this)}))})),Lm=Lg,Nm=function(e){return"function"==typeof e?e:void 0},Mm=function(e,t){return arguments.length<2?Nm(Lm[e])||Nm(Lg[e]):Lm[e]&&Lm[e][t]||Lg[e]&&Lg[e][t]},Um=Math.ceil,Dm=Math.floor,Fm=function(e){return isNaN(e=+e)?0:(e>0?Dm:Um)(e)},Bm=Math.min,qm=function(e){return e>0?Bm(Fm(e),9007199254740991):0},Hm=Math.max,Vm=Math.min,Wm=function(e,t){var n=Fm(e);return n<0?Hm(n+t,0):Vm(n,t)},zm=function(e){return function(t,n,r){var i,o=Yg(t),a=qm(o.length),s=Wm(r,a);if(e&&n!=n){for(;a>s;)if((i=o[s++])!=i)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},Ym={includes:zm(!0),indexOf:zm(!1)},$m=Ym.indexOf,Gm=function(e,t){var n,r=Yg(e),i=0,o=[];for(n in r)!Xg(km,n)&&Xg(r,n)&&o.push(n);for(;t.length>i;)Xg(r,n=t[i++])&&(~$m(o,n)||o.push(n));return o},Km=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Xm=Km.concat("length","prototype"),Jm={f:Object.getOwnPropertyNames||function(e){return Gm(e,Xm)}},Qm={f:Object.getOwnPropertySymbols},Zm=Mm("Reflect","ownKeys")||function(e){var t=Jm.f(rm(e)),n=Qm.f;return n?t.concat(n(e)):t},ev=function(e,t){for(var n=Zm(t),r=om.f,i=nm.f,o=0;o<n.length;o++){var a=n[o];Xg(e,a)||r(e,a,i(t,a))}},tv=/#|\.prototype\./,nv=function(e,t){var n=iv[rv(e)];return n==av||n!=ov&&("function"==typeof t?Ng(t):!!t)},rv=nv.normalize=function(e){return String(e).replace(tv,".").toLowerCase()},iv=nv.data={},ov=nv.NATIVE="N",av=nv.POLYFILL="P",sv=nv,cv=nm.f,uv=function(e,t){var n,r,i,o,a,s=e.target,c=e.global,u=e.stat;if(n=c?Lg:u?Lg[s]||sm(s,{}):(Lg[s]||{}).prototype)for(r in t){if(o=t[r],i=e.noTargetGet?(a=cv(n,r))&&a.value:n[r],!sv(c?r:s+(u?".":"#")+r,e.forced)&&void 0!==i){if(typeof o==typeof i)continue;ev(o,i)}(e.sham||i&&i.sham)&&am(o,"sham",!0),Rm(n,r,o,e)}},lv=Array.isArray||function(e){return"Array"==Hg(e)},fv=function(e){return Object(zg(e))},hv=function(e,t,n){var r=Gg(t);r in e?om.f(e,r,Bg(0,n)):e[r]=n},pv=!!Object.getOwnPropertySymbols&&!Ng((function(){return!String(Symbol())})),dv=pv&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,gv=vm("wks"),mv=Lg.Symbol,vv=dv?mv:mv&&mv.withoutSetter||wm,yv=function(e){return Xg(gv,e)||(pv&&Xg(mv,e)?gv[e]=mv[e]:gv[e]=vv("Symbol."+e)),gv[e]},bv=yv("species"),wv=function(e,t){var n;return lv(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!lv(n.prototype)?$g(n)&&null===(n=n[bv])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},_v=Mm("navigator","userAgent")||"",Ev=Lg.process,kv=Ev&&Ev.versions,Sv=kv&&kv.v8;Sv?Im=(Cm=Sv.split("."))[0]+Cm[1]:_v&&(!(Cm=_v.match(/Edge\/(\d+)/))||Cm[1]>=74)&&(Cm=_v.match(/Chrome\/(\d+)/))&&(Im=Cm[1]);var Tv=Im&&+Im,xv=yv("species"),Av=function(e){return Tv>=51||!Ng((function(){var t=[];return(t.constructor={})[xv]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Ov=yv("isConcatSpreadable"),Pv=9007199254740991,Cv="Maximum allowed index exceeded",Iv=Tv>=51||!Ng((function(){var e=[];return e[Ov]=!1,e.concat()[0]!==e})),jv=Av("concat"),Rv=function(e){if(!$g(e))return!1;var t=e[Ov];return void 0!==t?!!t:lv(e)};uv({target:"Array",proto:!0,forced:!Iv||!jv},{concat:function(e){var t,n,r,i,o,a=fv(this),s=wv(a,0),c=0;for(t=-1,r=arguments.length;t<r;t++)if(Rv(o=-1===t?a:arguments[t])){if(c+(i=qm(o.length))>Pv)throw TypeError(Cv);for(n=0;n<i;n++,c++)n in o&&hv(s,c,o[n])}else{if(c>=Pv)throw TypeError(Cv);hv(s,c++,o)}return s.length=c,s}});var Lv=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},Nv=function(e,t,n){if(Lv(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},Mv=[].push,Uv=function(e){var t=1==e,n=2==e,r=3==e,i=4==e,o=6==e,a=5==e||o;return function(s,c,u,l){for(var f,h,p=fv(s),d=Wg(p),g=Nv(c,u,3),m=qm(d.length),v=0,y=l||wv,b=t?y(s,m):n?y(s,0):void 0;m>v;v++)if((a||v in d)&&(h=g(f=d[v],v,p),e))if(t)b[v]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return v;case 2:Mv.call(b,f)}else if(i)return!1;return o?-1:r||i?i:b}},Dv={forEach:Uv(0),map:Uv(1),filter:Uv(2),some:Uv(3),every:Uv(4),find:Uv(5),findIndex:Uv(6)},Fv=Object.defineProperty,Bv={},qv=function(e){throw e},Hv=function(e,t){if(Xg(Bv,e))return Bv[e];t||(t={});var n=[][e],r=!!Xg(t,"ACCESSORS")&&t.ACCESSORS,i=Xg(t,0)?t[0]:qv,o=Xg(t,1)?t[1]:void 0;return Bv[e]=!!n&&!Ng((function(){if(r&&!Mg)return!0;var e={length:-1};r?Fv(e,1,{enumerable:!0,get:qv}):e[1]=1,n.call(e,i,o)}))},Vv=Dv.filter,Wv=Av("filter"),zv=Hv("filter");uv({target:"Array",proto:!0,forced:!Wv||!zv},{filter:function(e){return Vv(this,e,arguments.length>1?arguments[1]:void 0)}});var Yv,$v=Object.keys||function(e){return Gm(e,Km)},Gv=Mg?Object.defineProperties:function(e,t){rm(e);for(var n,r=$v(t),i=r.length,o=0;i>o;)om.f(e,n=r[o++],t[n]);return e},Kv=Mm("document","documentElement"),Xv=Em("IE_PROTO"),Jv=function(){},Qv=function(e){return"<script>"+e+"</"+"script>"},Zv=function(){try{Yv=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t;Zv=Yv?function(e){e.write(Qv("")),e.close();var t=e.parentWindow.Object;return e=null,t}(Yv):((t=Zg("iframe")).style.display="none",Kv.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(Qv("document.F=Object")),e.close(),e.F);for(var n=Km.length;n--;)delete Zv.prototype[Km[n]];return Zv()};km[Xv]=!0;var ey=Object.create||function(e,t){var n;return null!==e?(Jv.prototype=rm(e),n=new Jv,Jv.prototype=null,n[Xv]=e):n=Zv(),void 0===t?n:Gv(n,t)},ty=yv("unscopables"),ny=Array.prototype;null==ny[ty]&&om.f(ny,ty,{configurable:!0,value:ey(null)});var ry=function(e){ny[ty][e]=!0},iy=Dv.find,oy="find",ay=!0,sy=Hv(oy);oy in[]&&Array(1).find((function(){ay=!1})),uv({target:"Array",proto:!0,forced:ay||!sy},{find:function(e){return iy(this,e,arguments.length>1?arguments[1]:void 0)}}),ry(oy);var cy=function(e){var t=e.return;if(void 0!==t)return rm(t.call(e)).value},uy=function(e,t,n,r){try{return r?t(rm(n)[0],n[1]):t(n)}catch(t){throw cy(e),t}},ly={},fy=yv("iterator"),hy=Array.prototype,py=function(e){return void 0!==e&&(ly.Array===e||hy[fy]===e)},dy={};dy[yv("toStringTag")]="z";var gy="[object z]"===String(dy),my=yv("toStringTag"),vy="Arguments"==Hg(function(){return arguments}()),yy=gy?Hg:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),my))?n:vy?Hg(t):"Object"==(r=Hg(t))&&"function"==typeof t.callee?"Arguments":r},by=yv("iterator"),wy=function(e){if(null!=e)return e[by]||e["@@iterator"]||ly[yy(e)]},_y=function(e){var t,n,r,i,o,a,s=fv(e),c="function"==typeof this?this:Array,u=arguments.length,l=u>1?arguments[1]:void 0,f=void 0!==l,h=wy(s),p=0;if(f&&(l=Nv(l,u>2?arguments[2]:void 0,2)),null==h||c==Array&&py(h))for(n=new c(t=qm(s.length));t>p;p++)a=f?l(s[p],p):s[p],hv(n,p,a);else for(o=(i=h.call(s)).next,n=new c;!(r=o.call(i)).done;p++)a=f?uy(i,l,[r.value,p],!0):r.value,hv(n,p,a);return n.length=p,n},Ey=yv("iterator"),ky=!1;try{var Sy=0,Ty={next:function(){return{done:!!Sy++}},return:function(){ky=!0}};Ty[Ey]=function(){return this},Array.from(Ty,(function(){throw 2}))}catch(e){}var xy=function(e,t){if(!t&&!ky)return!1;var n=!1;try{var r={};r[Ey]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},Ay=!xy((function(e){Array.from(e)}));uv({target:"Array",stat:!0,forced:Ay},{from:_y});var Oy=Ym.includes,Py=Hv("indexOf",{ACCESSORS:!0,1:0});uv({target:"Array",proto:!0,forced:!Py},{includes:function(e){return Oy(this,e,arguments.length>1?arguments[1]:void 0)}}),ry("includes");var Cy,Iy,jy,Ry=!Ng((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),Ly=Em("IE_PROTO"),Ny=Object.prototype,My=Ry?Object.getPrototypeOf:function(e){return e=fv(e),Xg(e,Ly)?e[Ly]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Ny:null},Uy=yv("iterator"),Dy=!1;[].keys&&("next"in(jy=[].keys())?(Iy=My(My(jy)))!==Object.prototype&&(Cy=Iy):Dy=!0),null==Cy&&(Cy={}),Xg(Cy,Uy)||am(Cy,Uy,(function(){return this}));var Fy={IteratorPrototype:Cy,BUGGY_SAFARI_ITERATORS:Dy},By=om.f,qy=yv("toStringTag"),Hy=function(e,t,n){e&&!Xg(e=n?e:e.prototype,qy)&&By(e,qy,{configurable:!0,value:t})},Vy=Fy.IteratorPrototype,Wy=function(){return this},zy=function(e,t,n){var r=t+" Iterator";return e.prototype=ey(Vy,{next:Bg(1,n)}),Hy(e,r,!1),ly[r]=Wy,e},Yy=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return rm(n),function(e){if(!$g(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype")}(r),t?e.call(n,r):n.__proto__=r,n}}():void 0),$y=Fy.IteratorPrototype,Gy=Fy.BUGGY_SAFARI_ITERATORS,Ky=yv("iterator"),Xy="keys",Jy="values",Qy="entries",Zy=function(){return this},eb=function(e,t,n,r,i,o,a){zy(n,t,r);var s,c,u,l=function(e){if(e===i&&g)return g;if(!Gy&&e in p)return p[e];switch(e){case Xy:case Jy:case Qy:return function(){return new n(this,e)}}return function(){return new n(this)}},f=t+" Iterator",h=!1,p=e.prototype,d=p[Ky]||p["@@iterator"]||i&&p[i],g=!Gy&&d||l(i),m="Array"==t&&p.entries||d;if(m&&(s=My(m.call(new e)),$y!==Object.prototype&&s.next&&(My(s)!==$y&&(Yy?Yy(s,$y):"function"!=typeof s[Ky]&&am(s,Ky,Zy)),Hy(s,f,!0))),i==Jy&&d&&d.name!==Jy&&(h=!0,g=function(){return d.call(this)}),p[Ky]!==g&&am(p,Ky,g),ly[t]=g,i)if(c={values:l(Jy),keys:o?g:l(Xy),entries:l(Qy)},a)for(u in c)(Gy||h||!(u in p))&&Rm(p,u,c[u]);else uv({target:t,proto:!0,forced:Gy||h},c);return c},tb="Array Iterator",nb=jm.set,rb=jm.getterFor(tb),ib=eb(Array,"Array",(function(e,t){nb(this,{type:tb,target:Yg(e),index:0,kind:t})}),(function(){var e=rb(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");ly.Arguments=ly.Array,ry("keys"),ry("values"),ry("entries");var ob=function(e,t){var n=[][e];return!!n&&Ng((function(){n.call(null,t||function(){throw 1},1)}))},ab=[].join,sb=Wg!=Object,cb=ob("join",",");uv({target:"Array",proto:!0,forced:sb||!cb},{join:function(e){return ab.call(Yg(this),void 0===e?",":e)}});var ub=Dv.map,lb=Av("map"),fb=Hv("map");uv({target:"Array",proto:!0,forced:!lb||!fb},{map:function(e){return ub(this,e,arguments.length>1?arguments[1]:void 0)}});var hb=function(e,t,n){var r,i;return Yy&&"function"==typeof(r=t.constructor)&&r!==n&&$g(i=r.prototype)&&i!==n.prototype&&Yy(e,i),e},pb="\t\n\v\f\r                 \u2028\u2029\ufeff",db="["+pb+"]",gb=RegExp("^"+db+db+"*"),mb=RegExp(db+db+"*$"),vb=function(e){return function(t){var n=String(zg(t));return 1&e&&(n=n.replace(gb,"")),2&e&&(n=n.replace(mb,"")),n}},yb={start:vb(1),end:vb(2),trim:vb(3)},bb=Jm.f,wb=nm.f,_b=om.f,Eb=yb.trim,kb="Number",Sb=Lg.Number,Tb=Sb.prototype,xb=Hg(ey(Tb))==kb,Ab=function(e){var t,n,r,i,o,a,s,c,u=Gg(e,!1);if("string"==typeof u&&u.length>2)if(43===(t=(u=Eb(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+u}for(a=(o=u.slice(2)).length,s=0;s<a;s++)if((c=o.charCodeAt(s))<48||c>i)return NaN;return parseInt(o,r)}return+u};if(sv(kb,!Sb(" 0o1")||!Sb("0b1")||Sb("+0x1"))){for(var Ob,Pb=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof Pb&&(xb?Ng((function(){Tb.valueOf.call(n)})):Hg(n)!=kb)?hb(new Sb(Ab(t)),n,Pb):Ab(t)},Cb=Mg?bb(Sb):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Ib=0;Cb.length>Ib;Ib++)Xg(Sb,Ob=Cb[Ib])&&!Xg(Pb,Ob)&&_b(Pb,Ob,wb(Sb,Ob));Pb.prototype=Tb,Tb.constructor=Pb,Rm(Lg,kb,Pb)}var jb=Ng((function(){$v(1)}));uv({target:"Object",stat:!0,forced:jb},{keys:function(e){return $v(fv(e))}});var Rb=gy?{}.toString:function(){return"[object "+yy(this)+"]"};gy||Rm(Object.prototype,"toString",Rb,{unsafe:!0});var Lb=function(){var e=rm(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function Nb(e,t){return RegExp(e,t)}var Mb={UNSUPPORTED_Y:Ng((function(){var e=Nb("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:Ng((function(){var e=Nb("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},Ub=RegExp.prototype.exec,Db=String.prototype.replace,Fb=Ub,Bb=function(){var e=/a/,t=/b*/g;return Ub.call(e,"a"),Ub.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),qb=Mb.UNSUPPORTED_Y||Mb.BROKEN_CARET,Hb=void 0!==/()??/.exec("")[1];(Bb||Hb||qb)&&(Fb=function(e){var t,n,r,i,o=this,a=qb&&o.sticky,s=Lb.call(o),c=o.source,u=0,l=e;return a&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),l=String(e).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==e[o.lastIndex-1])&&(c="(?: "+c+")",l=" "+l,u++),n=new RegExp("^(?:"+c+")",s)),Hb&&(n=new RegExp("^"+c+"$(?!\\s)",s)),Bb&&(t=o.lastIndex),r=Ub.call(a?n:o,l),a?r?(r.input=r.input.slice(u),r[0]=r[0].slice(u),r.index=o.lastIndex,o.lastIndex+=r[0].length):o.lastIndex=0:Bb&&r&&(o.lastIndex=o.global?r.index+r[0].length:t),Hb&&r&&r.length>1&&Db.call(r[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r});var Vb=Fb;uv({target:"RegExp",proto:!0,forced:/./.exec!==Vb},{exec:Vb});var Wb="toString",zb=RegExp.prototype,Yb=zb.toString,$b=Ng((function(){return"/a/b"!=Yb.call({source:"a",flags:"b"})})),Gb=Yb.name!=Wb;($b||Gb)&&Rm(RegExp.prototype,Wb,(function(){var e=rm(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in zb)?Lb.call(e):n)}),{unsafe:!0});var Kb=yv("match"),Xb=function(e){var t;return $g(e)&&(void 0!==(t=e[Kb])?!!t:"RegExp"==Hg(e))},Jb=function(e){if(Xb(e))throw TypeError("The method doesn't accept regular expressions");return e},Qb=yv("match"),Zb=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Qb]=!1,"/./"[e](t)}catch(e){}}return!1};uv({target:"String",proto:!0,forced:!Zb("includes")},{includes:function(e){return!!~String(zg(this)).indexOf(Jb(e),arguments.length>1?arguments[1]:void 0)}});var ew=function(e){return function(t,n){var r,i,o=String(zg(t)),a=Fm(n),s=o.length;return a<0||a>=s?e?"":void 0:(r=o.charCodeAt(a))<55296||r>56319||a+1===s||(i=o.charCodeAt(a+1))<56320||i>57343?e?o.charAt(a):r:e?o.slice(a,a+2):i-56320+(r-55296<<10)+65536}},tw={codeAt:ew(!1),charAt:ew(!0)},nw=tw.charAt,rw="String Iterator",iw=jm.set,ow=jm.getterFor(rw);eb(String,"String",(function(e){iw(this,{type:rw,string:String(e),index:0})}),(function(){var e,t=ow(this),n=t.string,r=t.index;return r>=n.length?{value:void 0,done:!0}:(e=nw(n,r),t.index+=e.length,{value:e,done:!1})}));var aw=yv("species"),sw=!Ng((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),cw="$0"==="a".replace(/./,"$0"),uw=yv("replace"),lw=!!/./[uw]&&""===/./[uw]("a","$0"),fw=!Ng((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),hw=function(e,t,n,r){var i=yv(e),o=!Ng((function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})),a=o&&!Ng((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[aw]=function(){return n},n.flags="",n[i]=/./[i]),n.exec=function(){return t=!0,null},n[i](""),!t}));if(!o||!a||"replace"===e&&(!sw||!cw||lw)||"split"===e&&!fw){var s=/./[i],c=n(i,""[e],(function(e,t,n,r,i){return t.exec===Vb?o&&!i?{done:!0,value:s.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:cw,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:lw}),u=c[0],l=c[1];Rm(String.prototype,e,u),Rm(RegExp.prototype,i,2==t?function(e,t){return l.call(e,this,t)}:function(e){return l.call(e,this)})}r&&am(RegExp.prototype[i],"sham",!0)},pw=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t},dw=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==Hg(e))throw TypeError("RegExp#exec called on incompatible receiver");return Vb.call(e,t)};hw("search",1,(function(e,t,n){return[function(t){var n=zg(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=rm(e),o=String(this),a=i.lastIndex;pw(a,0)||(i.lastIndex=0);var s=dw(i,o);return pw(i.lastIndex,a)||(i.lastIndex=a),null===s?-1:s.index}]}));var gw=function(e,t,n){for(var r in t)Rm(e,r,t[r],n);return e},mw=!Ng((function(){return Object.isExtensible(Object.preventExtensions({}))})),vw=t((function(e){var t=om.f,n=wm("meta"),r=0,i=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:"O"+ ++r,weakData:{}}})},a=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!$g(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!Xg(e,n)){if(!i(e))return"F";if(!t)return"E";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!Xg(e,n)){if(!i(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return mw&&a.REQUIRED&&i(e)&&!Xg(e,n)&&o(e),e}};km[n]=!0})),yw=(vw.REQUIRED,vw.fastKey,vw.getWeakData,vw.onFreeze,function(e,t){this.stopped=e,this.result=t}),bw=function(e,t,n){var r,i,o,a,s,c,u,l=n&&n.that,f=!(!n||!n.AS_ENTRIES),h=!(!n||!n.IS_ITERATOR),p=!(!n||!n.INTERRUPTED),d=Nv(t,l,1+f+p),g=function(e){return r&&cy(r),new yw(!0,e)},m=function(e){return f?(rm(e),p?d(e[0],e[1],g):d(e[0],e[1])):p?d(e,g):d(e)};if(h)r=e;else{if("function"!=typeof(i=wy(e)))throw TypeError("Target is not iterable");if(py(i)){for(o=0,a=qm(e.length);a>o;o++)if((s=m(e[o]))&&s instanceof yw)return s;return new yw(!1)}r=i.call(e)}for(c=r.next;!(u=c.call(r)).done;){try{s=m(u.value)}catch(e){throw cy(r),e}if("object"==typeof s&&s&&s instanceof yw)return s}return new yw(!1)},ww=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},_w=vw.getWeakData,Ew=jm.set,kw=jm.getterFor,Sw=Dv.find,Tw=Dv.findIndex,xw=0,Aw=function(e){return e.frozen||(e.frozen=new Ow)},Ow=function(){this.entries=[]},Pw=function(e,t){return Sw(e.entries,(function(e){return e[0]===t}))};Ow.prototype={get:function(e){var t=Pw(this,e);if(t)return t[1]},has:function(e){return!!Pw(this,e)},set:function(e,t){var n=Pw(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=Tw(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}};var Cw={getConstructor:function(e,t,n,r){var i=e((function(e,o){ww(e,i,t),Ew(e,{type:t,id:xw++,frozen:void 0}),null!=o&&bw(o,e[r],{that:e,AS_ENTRIES:n})})),o=kw(t),a=function(e,t,n){var r=o(e),i=_w(rm(t),!0);return!0===i?Aw(r).set(t,n):i[r.id]=n,e};return gw(i.prototype,{delete:function(e){var t=o(this);if(!$g(e))return!1;var n=_w(e);return!0===n?Aw(t).delete(e):n&&Xg(n,t.id)&&delete n[t.id]},has:function(e){var t=o(this);if(!$g(e))return!1;var n=_w(e);return!0===n?Aw(t).has(e):n&&Xg(n,t.id)}}),gw(i.prototype,n?{get:function(e){var t=o(this);if($g(e)){var n=_w(e);return!0===n?Aw(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return a(this,e,t)}}:{add:function(e){return a(this,e,!0)}}),i}},Iw=(t((function(e){var t,n=jm.enforce,r=!Lg.ActiveXObject&&"ActiveXObject"in Lg,i=Object.isExtensible,o=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},a=e.exports=function(e,t,n){var r=-1!==e.indexOf("Map"),i=-1!==e.indexOf("Weak"),o=r?"set":"add",a=Lg[e],s=a&&a.prototype,c=a,u={},l=function(e){var t=s[e];Rm(s,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(i&&!$g(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return i&&!$g(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(i&&!$g(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(sv(e,"function"!=typeof a||!(i||s.forEach&&!Ng((function(){(new a).entries().next()})))))c=n.getConstructor(t,e,r,o),vw.REQUIRED=!0;else if(sv(e,!0)){var f=new c,h=f[o](i?{}:-0,1)!=f,p=Ng((function(){f.has(1)})),d=xy((function(e){new a(e)})),g=!i&&Ng((function(){for(var e=new a,t=5;t--;)e[o](t,t);return!e.has(-0)}));d||((c=t((function(t,n){ww(t,c,e);var i=hb(new a,t,c);return null!=n&&bw(n,i[o],{that:i,AS_ENTRIES:r}),i}))).prototype=s,s.constructor=c),(p||g)&&(l("delete"),l("has"),r&&l("get")),(g||h)&&l(o),i&&s.clear&&delete s.clear}return u[e]=c,uv({global:!0,forced:c!=a},u),Hy(c,e),i||n.setStrong(c,e,r),c}("WeakMap",o,Cw);if(mm&&r){t=Cw.getConstructor(o,"WeakMap",!0),vw.REQUIRED=!0;var s=a.prototype,c=s.delete,u=s.has,l=s.get,f=s.set;gw(s,{delete:function(e){if($g(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),c.call(this,e)||r.frozen.delete(e)}return c.call(this,e)},has:function(e){if($g(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),u.call(this,e)||r.frozen.has(e)}return u.call(this,e)},get:function(e){if($g(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),u.call(this,e)?l.call(this,e):r.frozen.get(e)}return l.call(this,e)},set:function(e,r){if($g(e)&&!i(e)){var o=n(this);o.frozen||(o.frozen=new t),u.call(this,e)?f.call(this,e,r):o.frozen.set(e,r)}else f.call(this,e,r);return this}})}})),{CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}),jw=yv("iterator"),Rw=yv("toStringTag"),Lw=ib.values;for(var Nw in Iw){var Mw=Lg[Nw],Uw=Mw&&Mw.prototype;if(Uw){if(Uw[jw]!==Lw)try{am(Uw,jw,Lw)}catch(e){Uw[jw]=Lw}if(Uw[Rw]||am(Uw,Rw,Nw),Iw[Nw])for(var Dw in ib)if(Uw[Dw]!==ib[Dw])try{am(Uw,Dw,ib[Dw])}catch(e){Uw[Dw]=ib[Dw]}}}var Fw=Dv.every,Bw=ob("every"),qw=Hv("every");uv({target:"Array",proto:!0,forced:!Bw||!qw},{every:function(e){return Fw(this,e,arguments.length>1?arguments[1]:void 0)}});var Hw=Dv.forEach,Vw=ob("forEach"),Ww=Hv("forEach"),zw=Vw&&Ww?[].forEach:function(e){return Hw(this,e,arguments.length>1?arguments[1]:void 0)};uv({target:"Array",proto:!0,forced:[].forEach!=zw},{forEach:zw});var Yw=Ym.indexOf,$w=[].indexOf,Gw=!!$w&&1/[1].indexOf(1,-0)<0,Kw=ob("indexOf"),Xw=Hv("indexOf",{ACCESSORS:!0,1:0});uv({target:"Array",proto:!0,forced:Gw||!Kw||!Xw},{indexOf:function(e){return Gw?$w.apply(this,arguments)||0:Yw(this,e,arguments.length>1?arguments[1]:void 0)}});var Jw=Object.assign,Qw=Object.defineProperty,Zw=!Jw||Ng((function(){if(Mg&&1!==Jw({b:1},Jw(Qw({},"a",{enumerable:!0,get:function(){Qw(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=Jw({},e)[n]||$v(Jw({},t)).join("")!=r}))?function(e,t){for(var n=fv(e),r=arguments.length,i=1,o=Qm.f,a=Fg.f;r>i;)for(var s,c=Wg(arguments[i++]),u=o?$v(c).concat(o(c)):$v(c),l=u.length,f=0;l>f;)s=u[f++],Mg&&!a.call(c,s)||(n[s]=c[s]);return n}:Jw;uv({target:"Object",stat:!0,forced:Object.assign!==Zw},{assign:Zw});var e_=yv("species"),t_=function(e,t){var n,r=rm(e).constructor;return void 0===r||null==(n=rm(r)[e_])?t:Lv(n)},n_=tw.charAt,r_=function(e,t,n){return t+(n?n_(e,t).length:1)},i_=[].push,o_=Math.min,a_=4294967295,s_=!Ng((function(){return!RegExp(a_,"y")}));hw("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(zg(this)),i=void 0===n?a_:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!Xb(e))return t.call(r,e,i);for(var o,a,s,c=[],u=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),l=0,f=new RegExp(e.source,u+"g");(o=Vb.call(f,r))&&!((a=f.lastIndex)>l&&(c.push(r.slice(l,o.index)),o.length>1&&o.index<r.length&&i_.apply(c,o.slice(1)),s=o[0].length,l=a,c.length>=i));)f.lastIndex===o.index&&f.lastIndex++;return l===r.length?!s&&f.test("")||c.push(""):c.push(r.slice(l)),c.length>i?c.slice(0,i):c}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=zg(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var o=n(r,e,this,i,r!==t);if(o.done)return o.value;var a=rm(e),s=String(this),c=t_(a,RegExp),u=a.unicode,l=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(s_?"y":"g"),f=new c(s_?a:"^(?:"+a.source+")",l),h=void 0===i?a_:i>>>0;if(0===h)return[];if(0===s.length)return null===dw(f,s)?[s]:[];for(var p=0,d=0,g=[];d<s.length;){f.lastIndex=s_?d:0;var m,v=dw(f,s_?s:s.slice(d));if(null===v||(m=o_(qm(f.lastIndex+(s_?0:d)),s.length))===p)d=r_(s,d,u);else{if(g.push(s.slice(p,d)),g.length===h)return g;for(var y=1;y<=v.length-1;y++)if(g.push(v[y]),g.length===h)return g;d=p=m}}return g.push(s.slice(p)),g}]}),!s_);var c_=yb.trim;for(var u_ in uv({target:"String",proto:!0,forced:function(e){return Ng((function(){return!!pb[e]()||"​…᠎"!="​…᠎"[e]()||pb[e].name!==e}))}("trim")},{trim:function(){return c_(this)}}),Iw){var l_=Lg[u_],f_=l_&&l_.prototype;if(f_&&f_.forEach!==zw)try{am(f_,"forEach",zw)}catch(e){f_.forEach=zw}}var h_=yv("iterator"),p_=!Ng((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,r){t.delete("b"),n+=r+e})),!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[h_]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})),d_=2147483647,g_=/[^\0-\u007E]/,m_=/[.\u3002\uFF0E\uFF61]/g,v_="Overflow: input needs wider integers to process",y_=Math.floor,b_=String.fromCharCode,w_=function(e){return e+22+75*(e<26)},__=function(e,t,n){var r=0;for(e=n?y_(e/700):e>>1,e+=y_(e/t);e>455;r+=36)e=y_(e/35);return y_(r+36*e/(e+38))},E_=function(e){var t,n,r=[],i=(e=function(e){for(var t=[],n=0,r=e.length;n<r;){var i=e.charCodeAt(n++);if(i>=55296&&i<=56319&&n<r){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&i)<<10)+(1023&o)+65536):(t.push(i),n--)}else t.push(i)}return t}(e)).length,o=128,a=0,s=72;for(t=0;t<e.length;t++)(n=e[t])<128&&r.push(b_(n));var c=r.length,u=c;for(c&&r.push("-");u<i;){var l=d_;for(t=0;t<e.length;t++)(n=e[t])>=o&&n<l&&(l=n);var f=u+1;if(l-o>y_((d_-a)/f))throw RangeError(v_);for(a+=(l-o)*f,o=l,t=0;t<e.length;t++){if((n=e[t])<o&&++a>d_)throw RangeError(v_);if(n==o){for(var h=a,p=36;;p+=36){var d=p<=s?1:p>=s+26?26:p-s;if(h<d)break;var g=h-d,m=36-d;r.push(b_(w_(d+g%m))),h=y_(g/m)}r.push(b_(w_(h))),s=__(a,f,u==c),a=0,++u}}++a,++o}return r.join("")},k_=function(e){var t=wy(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return rm(t.call(e))},S_=Mm("fetch"),T_=Mm("Headers"),x_=yv("iterator"),A_="URLSearchParams",O_="URLSearchParamsIterator",P_=jm.set,C_=jm.getterFor(A_),I_=jm.getterFor(O_),j_=/\+/g,R_=Array(4),L_=function(e){return R_[e-1]||(R_[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},N_=function(e){try{return decodeURIComponent(e)}catch(t){return e}},M_=function(e){var t=e.replace(j_," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(L_(n--),N_);return t}},U_=/[!'()~]|%20/g,D_={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},F_=function(e){return D_[e]},B_=function(e){return encodeURIComponent(e).replace(U_,F_)},q_=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o<i.length;)(n=i[o++]).length&&(r=n.split("="),e.push({key:M_(r.shift()),value:M_(r.join("="))}))},H_=function(e){this.entries.length=0,q_(this.entries,e)},V_=function(e,t){if(e<t)throw TypeError("Not enough arguments")},W_=zy((function(e,t){P_(this,{type:O_,iterator:k_(C_(e).entries),kind:t})}),"Iterator",(function(){var e=I_(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value="keys"===t?r.key:"values"===t?r.value:[r.key,r.value]),n})),z_=function(){ww(this,z_,A_);var e,t,n,r,i,o,a,s,c,u=arguments.length>0?arguments[0]:void 0,l=this,f=[];if(P_(l,{type:A_,entries:f,updateURL:function(){},updateSearchParams:H_}),void 0!==u)if($g(u))if("function"==typeof(e=wy(u)))for(n=(t=e.call(u)).next;!(r=n.call(t)).done;){if((a=(o=(i=k_(rm(r.value))).next).call(i)).done||(s=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");f.push({key:a.value+"",value:s.value+""})}else for(c in u)Xg(u,c)&&f.push({key:c,value:u[c]+""});else q_(f,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},Y_=z_.prototype;gw(Y_,{append:function(e,t){V_(arguments.length,2);var n=C_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){V_(arguments.length,1);for(var t=C_(this),n=t.entries,r=e+"",i=0;i<n.length;)n[i].key===r?n.splice(i,1):i++;t.updateURL()},get:function(e){V_(arguments.length,1);for(var t=C_(this).entries,n=e+"",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){V_(arguments.length,1);for(var t=C_(this).entries,n=e+"",r=[],i=0;i<t.length;i++)t[i].key===n&&r.push(t[i].value);return r},has:function(e){V_(arguments.length,1);for(var t=C_(this).entries,n=e+"",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){V_(arguments.length,1);for(var n,r=C_(this),i=r.entries,o=!1,a=e+"",s=t+"",c=0;c<i.length;c++)(n=i[c]).key===a&&(o?i.splice(c--,1):(o=!0,n.value=s));o||i.push({key:a,value:s}),r.updateURL()},sort:function(){var e,t,n,r=C_(this),i=r.entries,o=i.slice();for(i.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(i[t].key>e.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=C_(this).entries,r=Nv(e,arguments.length>1?arguments[1]:void 0,3),i=0;i<n.length;)r((t=n[i++]).value,t.key,this)},keys:function(){return new W_(this,"keys")},values:function(){return new W_(this,"values")},entries:function(){return new W_(this,"entries")}},{enumerable:!0}),Rm(Y_,x_,Y_.entries),Rm(Y_,"toString",(function(){for(var e,t=C_(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(B_(e.key)+"="+B_(e.value));return n.join("&")}),{enumerable:!0}),Hy(z_,A_),uv({global:!0,forced:!p_},{URLSearchParams:z_}),p_||"function"!=typeof S_||"function"!=typeof T_||uv({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,i=[e];return arguments.length>1&&($g(t=arguments[1])&&(n=t.body,yy(n)===A_&&((r=t.headers?new T_(t.headers):new T_).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=ey(t,{body:Bg(0,String(n)),headers:Bg(0,r)}))),i.push(t)),S_.apply(this,i)}});var $_,G_={URLSearchParams:z_,getState:C_},K_=tw.codeAt,X_=Lg.URL,J_=G_.URLSearchParams,Q_=G_.getState,Z_=jm.set,eE=jm.getterFor("URL"),tE=Math.floor,nE=Math.pow,rE="Invalid scheme",iE="Invalid host",oE="Invalid port",aE=/[A-Za-z]/,sE=/[\d+-.A-Za-z]/,cE=/\d/,uE=/^(0x|0X)/,lE=/^[0-7]+$/,fE=/^\d+$/,hE=/^[\dA-Fa-f]+$/,pE=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,dE=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,gE=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,mE=/[\u0009\u000A\u000D]/g,vE=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return iE;if(!(n=bE(t.slice(1,-1))))return iE;e.host=n}else if(AE(e)){if(t=function(e){var t,n,r=[],i=e.toLowerCase().replace(m_,".").split(".");for(t=0;t<i.length;t++)n=i[t],r.push(g_.test(n)?"xn--"+E_(n):n);return r.join(".")}(t),pE.test(t))return iE;if(null===(n=yE(t)))return iE;e.host=n}else{if(dE.test(t))return iE;for(n="",r=_y(t),i=0;i<r.length;i++)n+=TE(r[i],_E);e.host=n}},yE=function(e){var t,n,r,i,o,a,s,c=e.split(".");if(c.length&&""==c[c.length-1]&&c.pop(),(t=c.length)>4)return e;for(n=[],r=0;r<t;r++){if(""==(i=c[r]))return e;if(o=10,i.length>1&&"0"==i.charAt(0)&&(o=uE.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)a=0;else{if(!(10==o?fE:8==o?lE:hE).test(i))return e;a=parseInt(i,o)}n.push(a)}for(r=0;r<t;r++)if(a=n[r],r==t-1){if(a>=nE(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*nE(256,3-r);return s},bE=function(e){var t,n,r,i,o,a,s,c=[0,0,0,0,0,0,0,0],u=0,l=null,f=0,h=function(){return e.charAt(f)};if(":"==h()){if(":"!=e.charAt(1))return;f+=2,l=++u}for(;h();){if(8==u)return;if(":"!=h()){for(t=n=0;n<4&&hE.test(h());)t=16*t+parseInt(h(),16),f++,n++;if("."==h()){if(0==n)return;if(f-=n,u>6)return;for(r=0;h();){if(i=null,r>0){if(!("."==h()&&r<4))return;f++}if(!cE.test(h()))return;for(;cE.test(h());){if(o=parseInt(h(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==h()){if(f++,!h())return}else if(h())return;c[u++]=t}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(a=u-l,u=7;0!=u&&a>0;)s=c[u],c[u--]=c[l+a-1],c[l+--a]=s;else if(8!=u)return;return c},wE=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=tE(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},_E={},EE=Zw({},_E,{" ":1,'"':1,"<":1,">":1,"`":1}),kE=Zw({},EE,{"#":1,"?":1,"{":1,"}":1}),SE=Zw({},kE,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),TE=function(e,t){var n=K_(e,0);return n>32&&n<127&&!Xg(t,e)?e:encodeURIComponent(e)},xE={ftp:21,file:null,http:80,https:443,ws:80,wss:443},AE=function(e){return Xg(xE,e.scheme)},OE=function(e){return""!=e.username||""!=e.password},PE=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},CE=function(e,t){var n;return 2==e.length&&aE.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},IE=function(e){var t;return e.length>1&&CE(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},jE=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&CE(t[0],!0)||t.pop()},RE=function(e){return"."===e||"%2e"===e.toLowerCase()},LE={},NE={},ME={},UE={},DE={},FE={},BE={},qE={},HE={},VE={},WE={},zE={},YE={},$E={},GE={},KE={},XE={},JE={},QE={},ZE={},ek={},tk=function(e,t,n,r){var i,o,a,s,c,u=n||LE,l=0,f="",h=!1,p=!1,d=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(gE,"")),t=t.replace(mE,""),i=_y(t);l<=i.length;){switch(o=i[l],u){case LE:if(!o||!aE.test(o)){if(n)return rE;u=ME;continue}f+=o.toLowerCase(),u=NE;break;case NE:if(o&&(sE.test(o)||"+"==o||"-"==o||"."==o))f+=o.toLowerCase();else{if(":"!=o){if(n)return rE;f="",u=ME,l=0;continue}if(n&&(AE(e)!=Xg(xE,f)||"file"==f&&(OE(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(AE(e)&&xE[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?u=$E:AE(e)&&r&&r.scheme==e.scheme?u=UE:AE(e)?u=qE:"/"==i[l+1]?(u=DE,l++):(e.cannotBeABaseURL=!0,e.path.push(""),u=QE)}break;case ME:if(!r||r.cannotBeABaseURL&&"#"!=o)return rE;if(r.cannotBeABaseURL&&"#"==o){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,u=ek;break}u="file"==r.scheme?$E:FE;continue;case UE:if("/"!=o||"/"!=i[l+1]){u=FE;continue}u=HE,l++;break;case DE:if("/"==o){u=VE;break}u=JE;continue;case FE:if(e.scheme=r.scheme,o==$_)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==o||"\\"==o&&AE(e))u=BE;else if("?"==o)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",u=ZE;else{if("#"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),u=JE;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=ek}break;case BE:if(!AE(e)||"/"!=o&&"\\"!=o){if("/"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,u=JE;continue}u=VE}else u=HE;break;case qE:if(u=HE,"/"!=o||"/"!=f.charAt(l+1))continue;l++;break;case HE:if("/"!=o&&"\\"!=o){u=VE;continue}break;case VE:if("@"==o){h&&(f="%40"+f),h=!0,a=_y(f);for(var g=0;g<a.length;g++){var m=a[g];if(":"!=m||d){var v=TE(m,SE);d?e.password+=v:e.username+=v}else d=!0}f=""}else if(o==$_||"/"==o||"?"==o||"#"==o||"\\"==o&&AE(e)){if(h&&""==f)return"Invalid authority";l-=_y(f).length+1,f="",u=WE}else f+=o;break;case WE:case zE:if(n&&"file"==e.scheme){u=KE;continue}if(":"!=o||p){if(o==$_||"/"==o||"?"==o||"#"==o||"\\"==o&&AE(e)){if(AE(e)&&""==f)return iE;if(n&&""==f&&(OE(e)||null!==e.port))return;if(s=vE(e,f))return s;if(f="",u=XE,n)return;continue}"["==o?p=!0:"]"==o&&(p=!1),f+=o}else{if(""==f)return iE;if(s=vE(e,f))return s;if(f="",u=YE,n==zE)return}break;case YE:if(!cE.test(o)){if(o==$_||"/"==o||"?"==o||"#"==o||"\\"==o&&AE(e)||n){if(""!=f){var y=parseInt(f,10);if(y>65535)return oE;e.port=AE(e)&&y===xE[e.scheme]?null:y,f=""}if(n)return;u=XE;continue}return oE}f+=o;break;case $E:if(e.scheme="file","/"==o||"\\"==o)u=GE;else{if(!r||"file"!=r.scheme){u=JE;continue}if(o==$_)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==o)e.host=r.host,e.path=r.path.slice(),e.query="",u=ZE;else{if("#"!=o){IE(i.slice(l).join(""))||(e.host=r.host,e.path=r.path.slice(),jE(e)),u=JE;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=ek}}break;case GE:if("/"==o||"\\"==o){u=KE;break}r&&"file"==r.scheme&&!IE(i.slice(l).join(""))&&(CE(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),u=JE;continue;case KE:if(o==$_||"/"==o||"\\"==o||"?"==o||"#"==o){if(!n&&CE(f))u=JE;else if(""==f){if(e.host="",n)return;u=XE}else{if(s=vE(e,f))return s;if("localhost"==e.host&&(e.host=""),n)return;f="",u=XE}continue}f+=o;break;case XE:if(AE(e)){if(u=JE,"/"!=o&&"\\"!=o)continue}else if(n||"?"!=o)if(n||"#"!=o){if(o!=$_&&(u=JE,"/"!=o))continue}else e.fragment="",u=ek;else e.query="",u=ZE;break;case JE:if(o==$_||"/"==o||"\\"==o&&AE(e)||!n&&("?"==o||"#"==o)){if(".."===(c=(c=f).toLowerCase())||"%2e."===c||".%2e"===c||"%2e%2e"===c?(jE(e),"/"==o||"\\"==o&&AE(e)||e.path.push("")):RE(f)?"/"==o||"\\"==o&&AE(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&CE(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(o==$_||"?"==o||"#"==o))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==o?(e.query="",u=ZE):"#"==o&&(e.fragment="",u=ek)}else f+=TE(o,kE);break;case QE:"?"==o?(e.query="",u=ZE):"#"==o?(e.fragment="",u=ek):o!=$_&&(e.path[0]+=TE(o,_E));break;case ZE:n||"#"!=o?o!=$_&&("'"==o&&AE(e)?e.query+="%27":e.query+="#"==o?"%23":TE(o,_E)):(e.fragment="",u=ek);break;case ek:o!=$_&&(e.fragment+=TE(o,EE))}l++}},nk=function(e){var t,n,r=ww(this,nk,"URL"),i=arguments.length>1?arguments[1]:void 0,o=String(e),a=Z_(r,{type:"URL"});if(void 0!==i)if(i instanceof nk)t=eE(i);else if(n=tk(t={},String(i)))throw TypeError(n);if(n=tk(a,o,null,t))throw TypeError(n);var s=a.searchParams=new J_,c=Q_(s);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(s)||null},Mg||(r.href=ik.call(r),r.origin=ok.call(r),r.protocol=ak.call(r),r.username=sk.call(r),r.password=ck.call(r),r.host=uk.call(r),r.hostname=lk.call(r),r.port=fk.call(r),r.pathname=hk.call(r),r.search=pk.call(r),r.searchParams=dk.call(r),r.hash=gk.call(r))},rk=nk.prototype,ik=function(){var e=eE(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,a=e.path,s=e.query,c=e.fragment,u=t+":";return null!==i?(u+="//",OE(e)&&(u+=n+(r?":"+r:"")+"@"),u+=wE(i),null!==o&&(u+=":"+o)):"file"==t&&(u+="//"),u+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(u+="?"+s),null!==c&&(u+="#"+c),u},ok=function(){var e=eE(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&AE(e)?t+"://"+wE(e.host)+(null!==n?":"+n:""):"null"},ak=function(){return eE(this).scheme+":"},sk=function(){return eE(this).username},ck=function(){return eE(this).password},uk=function(){var e=eE(this),t=e.host,n=e.port;return null===t?"":null===n?wE(t):wE(t)+":"+n},lk=function(){var e=eE(this).host;return null===e?"":wE(e)},fk=function(){var e=eE(this).port;return null===e?"":String(e)},hk=function(){var e=eE(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},pk=function(){var e=eE(this).query;return e?"?"+e:""},dk=function(){return eE(this).searchParams},gk=function(){var e=eE(this).fragment;return e?"#"+e:""},mk=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(Mg&&Gv(rk,{href:mk(ik,(function(e){var t=eE(this),n=String(e),r=tk(t,n);if(r)throw TypeError(r);Q_(t.searchParams).updateSearchParams(t.query)})),origin:mk(ok),protocol:mk(ak,(function(e){var t=eE(this);tk(t,String(e)+":",LE)})),username:mk(sk,(function(e){var t=eE(this),n=_y(String(e));if(!PE(t)){t.username="";for(var r=0;r<n.length;r++)t.username+=TE(n[r],SE)}})),password:mk(ck,(function(e){var t=eE(this),n=_y(String(e));if(!PE(t)){t.password="";for(var r=0;r<n.length;r++)t.password+=TE(n[r],SE)}})),host:mk(uk,(function(e){var t=eE(this);t.cannotBeABaseURL||tk(t,String(e),WE)})),hostname:mk(lk,(function(e){var t=eE(this);t.cannotBeABaseURL||tk(t,String(e),zE)})),port:mk(fk,(function(e){var t=eE(this);PE(t)||(""==(e=String(e))?t.port=null:tk(t,e,YE))})),pathname:mk(hk,(function(e){var t=eE(this);t.cannotBeABaseURL||(t.path=[],tk(t,e+"",XE))})),search:mk(pk,(function(e){var t=eE(this);""==(e=String(e))?t.query=null:("?"==e.charAt(0)&&(e=e.slice(1)),t.query="",tk(t,e,ZE)),Q_(t.searchParams).updateSearchParams(t.query)})),searchParams:mk(dk),hash:mk(gk,(function(e){var t=eE(this);""!=(e=String(e))?("#"==e.charAt(0)&&(e=e.slice(1)),t.fragment="",tk(t,e,ek)):t.fragment=null}))}),Rm(rk,"toJSON",(function(){return ik.call(this)}),{enumerable:!0}),Rm(rk,"toString",(function(){return ik.call(this)}),{enumerable:!0}),X_){var vk=X_.createObjectURL,yk=X_.revokeObjectURL;vk&&Rm(nk,"createObjectURL",(function(e){return vk.apply(X_,arguments)})),yk&&Rm(nk,"revokeObjectURL",(function(e){return yk.apply(X_,arguments)}))}Hy(nk,"URL"),uv({global:!0,forced:!p_,sham:!Mg},{URL:nk});var bk=Dv.some,wk=ob("some"),_k=Hv("some");uv({target:"Array",proto:!0,forced:!wk||!_k},{some:function(e){return bk(this,e,arguments.length>1?arguments[1]:void 0)}});var Ek="".repeat||function(e){var t=String(zg(this)),n="",r=Fm(e);if(r<0||r==1/0)throw RangeError("Wrong number of repetitions");for(;r>0;(r>>>=1)&&(t+=t))1&r&&(n+=t);return n},kk=1..toFixed,Sk=Math.floor,Tk=function(e,t,n){return 0===t?n:t%2==1?Tk(e,t-1,n*e):Tk(e*e,t/2,n)},xk=kk&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!Ng((function(){kk.call({})}));uv({target:"Number",proto:!0,forced:xk},{toFixed:function(e){var t,n,r,i,o=function(e){if("number"!=typeof e&&"Number"!=Hg(e))throw TypeError("Incorrect invocation");return+e}(this),a=Fm(e),s=[0,0,0,0,0,0],c="",u="0",l=function(e,t){for(var n=-1,r=t;++n<6;)r+=e*s[n],s[n]=r%1e7,r=Sk(r/1e7)},f=function(e){for(var t=6,n=0;--t>=0;)n+=s[t],s[t]=Sk(n/e),n=n%e*1e7},h=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==s[e]){var n=String(s[e]);t=""===t?n:t+Ek.call("0",7-n.length)+n}return t};if(a<0||a>20)throw RangeError("Incorrect fraction digits");if(o!=o)return"NaN";if(o<=-1e21||o>=1e21)return String(o);if(o<0&&(c="-",o=-o),o>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(o*Tk(2,69,1))-69)<0?o*Tk(2,-t,1):o/Tk(2,t,1),n*=4503599627370496,(t=52-t)>0){for(l(0,n),r=a;r>=7;)l(1e7,0),r-=7;for(l(Tk(10,r,1),0),r=t-1;r>=23;)f(1<<23),r-=23;f(1<<r),l(1,1),f(2),u=h()}else l(0,n),l(1<<-t,0),u=h()+Ek.call("0",a);return u=a>0?c+((i=u.length)<=a?"0."+Ek.call("0",a-i)+u:u.slice(0,i-a)+"."+u.slice(i-a)):c+u}});var Ak=Fg.f,Ok=function(e){return function(t){for(var n,r=Yg(t),i=$v(r),o=i.length,a=0,s=[];o>a;)n=i[a++],Mg&&!Ak.call(r,n)||s.push(e?[n,r[n]]:r[n]);return s}},Pk={entries:Ok(!0),values:Ok(!1)},Ck=Pk.entries;uv({target:"Object",stat:!0},{entries:function(e){return Ck(e)}});var Ik=Pk.values;uv({target:"Object",stat:!0},{values:function(e){return Ik(e)}});var jk=Math.max,Rk=Math.min,Lk=Math.floor,Nk=/\$([$&'`]|\d\d?|<[^>]*>)/g,Mk=/\$([$&'`]|\d\d?)/g;hw("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=r.REPLACE_KEEPS_$0,a=i?"$":"$0";return[function(n,r){var i=zg(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&o||"string"==typeof r&&-1===r.indexOf(a)){var c=n(t,e,this,r);if(c.done)return c.value}var u=rm(e),l=String(this),f="function"==typeof r;f||(r=String(r));var h=u.global;if(h){var p=u.unicode;u.lastIndex=0}for(var d=[];;){var g=dw(u,l);if(null===g)break;if(d.push(g),!h)break;""===String(g[0])&&(u.lastIndex=r_(l,qm(u.lastIndex),p))}for(var m,v="",y=0,b=0;b<d.length;b++){g=d[b];for(var w=String(g[0]),_=jk(Rk(Fm(g.index),l.length),0),E=[],k=1;k<g.length;k++)E.push(void 0===(m=g[k])?m:String(m));var S=g.groups;if(f){var T=[w].concat(E,_,l);void 0!==S&&T.push(S);var x=String(r.apply(void 0,T))}else x=s(w,l,_,E,S,r);_>=y&&(v+=l.slice(y,_)+x,y=_+w.length)}return v+l.slice(y)}];function s(e,n,r,i,o,a){var s=r+e.length,c=i.length,u=Mk;return void 0!==o&&(o=fv(o),u=Nk),t.call(a,u,(function(t,a){var u;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":u=o[a.slice(1,-1)];break;default:var l=+a;if(0===l)return t;if(l>c){var f=Lk(l/10);return 0===f?t:f<=c?void 0===i[f-1]?a.charAt(1):i[f-1]+a.charAt(1):t}u=i[l-1]}return void 0===u?"":u}))}}));var Uk=Jm.f,Dk={}.toString,Fk="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],Bk={f:function(e){return Fk&&"[object Window]"==Dk.call(e)?function(e){try{return Uk(e)}catch(e){return Fk.slice()}}(e):Uk(Yg(e))}},qk={f:yv},Hk=om.f,Vk=Dv.forEach,Wk=Em("hidden"),zk="Symbol",Yk=yv("toPrimitive"),$k=jm.set,Gk=jm.getterFor(zk),Kk=Object.prototype,Xk=Lg.Symbol,Jk=Mm("JSON","stringify"),Qk=nm.f,Zk=om.f,eS=Bk.f,tS=Fg.f,nS=vm("symbols"),rS=vm("op-symbols"),iS=vm("string-to-symbol-registry"),oS=vm("symbol-to-string-registry"),aS=vm("wks"),sS=Lg.QObject,cS=!sS||!sS.prototype||!sS.prototype.findChild,uS=Mg&&Ng((function(){return 7!=ey(Zk({},"a",{get:function(){return Zk(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=Qk(Kk,t);r&&delete Kk[t],Zk(e,t,n),r&&e!==Kk&&Zk(Kk,t,r)}:Zk,lS=function(e,t){var n=nS[e]=ey(Xk.prototype);return $k(n,{type:zk,tag:e,description:t}),Mg||(n.description=t),n},fS=dv?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof Xk},hS=function(e,t,n){e===Kk&&hS(rS,t,n),rm(e);var r=Gg(t,!0);return rm(n),Xg(nS,r)?(n.enumerable?(Xg(e,Wk)&&e[Wk][r]&&(e[Wk][r]=!1),n=ey(n,{enumerable:Bg(0,!1)})):(Xg(e,Wk)||Zk(e,Wk,Bg(1,{})),e[Wk][r]=!0),uS(e,r,n)):Zk(e,r,n)},pS=function(e,t){rm(e);var n=Yg(t),r=$v(n).concat(vS(n));return Vk(r,(function(t){Mg&&!dS.call(n,t)||hS(e,t,n[t])})),e},dS=function(e){var t=Gg(e,!0),n=tS.call(this,t);return!(this===Kk&&Xg(nS,t)&&!Xg(rS,t))&&(!(n||!Xg(this,t)||!Xg(nS,t)||Xg(this,Wk)&&this[Wk][t])||n)},gS=function(e,t){var n=Yg(e),r=Gg(t,!0);if(n!==Kk||!Xg(nS,r)||Xg(rS,r)){var i=Qk(n,r);return!i||!Xg(nS,r)||Xg(n,Wk)&&n[Wk][r]||(i.enumerable=!0),i}},mS=function(e){var t=eS(Yg(e)),n=[];return Vk(t,(function(e){Xg(nS,e)||Xg(km,e)||n.push(e)})),n},vS=function(e){var t=e===Kk,n=eS(t?rS:Yg(e)),r=[];return Vk(n,(function(e){!Xg(nS,e)||t&&!Xg(Kk,e)||r.push(nS[e])})),r};if(pv||(Rm((Xk=function(){if(this instanceof Xk)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=wm(e),n=function(e){this===Kk&&n.call(rS,e),Xg(this,Wk)&&Xg(this[Wk],t)&&(this[Wk][t]=!1),uS(this,t,Bg(1,e))};return Mg&&cS&&uS(Kk,t,{configurable:!0,set:n}),lS(t,e)}).prototype,"toString",(function(){return Gk(this).tag})),Rm(Xk,"withoutSetter",(function(e){return lS(wm(e),e)})),Fg.f=dS,om.f=hS,nm.f=gS,Jm.f=Bk.f=mS,Qm.f=vS,qk.f=function(e){return lS(yv(e),e)},Mg&&(Zk(Xk.prototype,"description",{configurable:!0,get:function(){return Gk(this).description}}),Rm(Kk,"propertyIsEnumerable",dS,{unsafe:!0}))),uv({global:!0,wrap:!0,forced:!pv,sham:!pv},{Symbol:Xk}),Vk($v(aS),(function(e){!function(e){var t=Lm.Symbol||(Lm.Symbol={});Xg(t,e)||Hk(t,e,{value:qk.f(e)})}(e)})),uv({target:zk,stat:!0,forced:!pv},{for:function(e){var t=String(e);if(Xg(iS,t))return iS[t];var n=Xk(t);return iS[t]=n,oS[n]=t,n},keyFor:function(e){if(!fS(e))throw TypeError(e+" is not a symbol");if(Xg(oS,e))return oS[e]},useSetter:function(){cS=!0},useSimple:function(){cS=!1}}),uv({target:"Object",stat:!0,forced:!pv,sham:!Mg},{create:function(e,t){return void 0===t?ey(e):pS(ey(e),t)},defineProperty:hS,defineProperties:pS,getOwnPropertyDescriptor:gS}),uv({target:"Object",stat:!0,forced:!pv},{getOwnPropertyNames:mS,getOwnPropertySymbols:vS}),uv({target:"Object",stat:!0,forced:Ng((function(){Qm.f(1)}))},{getOwnPropertySymbols:function(e){return Qm.f(fv(e))}}),Jk){var yS=!pv||Ng((function(){var e=Xk();return"[null]"!=Jk([e])||"{}"!=Jk({a:e})||"{}"!=Jk(Object(e))}));uv({target:"JSON",stat:!0,forced:yS},{stringify:function(e,t,n){for(var r,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(r=t,($g(t)||void 0!==e)&&!fS(e))return lv(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!fS(t))return t}),i[1]=t,Jk.apply(null,i)}})}Xk.prototype[Yk]||am(Xk.prototype,Yk,Xk.prototype.valueOf),Hy(Xk,zk),km[Wk]=!0,uv({target:"Number",stat:!0},{isNaN:function(e){return e!=e}});var bS=nm.f,wS=Ng((function(){bS(1)}));function _S(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ES(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function kS(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function SS(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?kS(Object(n),!0).forEach((function(t){ES(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):kS(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}uv({target:"Object",stat:!0,forced:!Mg||wS,sham:!Mg},{getOwnPropertyDescriptor:function(e,t){return bS(Yg(e),t)}}),uv({target:"Object",stat:!0,sham:!Mg},{getOwnPropertyDescriptors:function(e){for(var t,n,r=Yg(e),i=nm.f,o=Zm(r),a={},s=0;o.length>s;)void 0!==(n=i(r,t=o[s++]))&&hv(a,t,n);return a}}),hw("match",1,(function(e,t,n){return[function(t){var n=zg(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=rm(e),o=String(this);if(!i.global)return dw(i,o);var a=i.unicode;i.lastIndex=0;for(var s,c=[],u=0;null!==(s=dw(i,o));){var l=String(s[0]);c[u]=l,""===l&&(i.lastIndex=r_(o,qm(i.lastIndex),a)),u++}return 0===u?null:c}]}));var TS={addCSS:!0,thumbWidth:15,watch:!0};function xS(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}var AS=function(e){return null!=e?e.constructor:null},OS=function(e,t){return!!(e&&t&&e instanceof t)},PS=function(e){return null==e},CS=function(e){return AS(e)===Object},IS=function(e){return AS(e)===String},jS=function(e){return Array.isArray(e)},RS=function(e){return OS(e,NodeList)},LS=IS,NS=jS,MS=RS,US=function(e){return OS(e,Element)},DS=function(e){return OS(e,Event)},FS=function(e){return PS(e)||(IS(e)||jS(e)||RS(e))&&!e.length||CS(e)&&!Object.keys(e).length};function BS(e,t){if(1>t){var n=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var qS,HS,VS,WS=function(){function e(t,n){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),US(t)?this.element=t:LS(t)&&(this.element=document.querySelector(t)),US(this.element)&&FS(this.element.rangeTouch)&&(this.config=SS({},TS,{},n),this.init())}return function(e,t,n){t&&_S(e.prototype,t),n&&_S(e,n)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!DS(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute("min"))||0,a=parseFloat(r.getAttribute("max"))||100,s=parseFloat(r.getAttribute("step"))||1,c=r.getBoundingClientRect(),u=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*u:50<n&&(n+=2*(n-50)*u),o+BS(n/100*(a-o),s)}},{key:"set",value:function(t){e.enabled&&DS(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(FS(t)||LS(t)?r=Array.from(document.querySelectorAll(LS(t)?t:'input[type="range"]')):US(t)?r=[t]:MS(t)?r=Array.from(t):NS(t)&&(r=t.filter(US)),FS(r))return null;var i=SS({},TS,{},n);if(LS(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){US(n)&&xS(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),zS=Lg.Promise,YS=yv("species"),$S=function(e){var t=Mm(e),n=om.f;Mg&&t&&!t[YS]&&n(t,YS,{configurable:!0,get:function(){return this}})},GS=/(iphone|ipod|ipad).*applewebkit/i.test(_v),KS="process"==Hg(Lg.process),XS=Lg.location,JS=Lg.setImmediate,QS=Lg.clearImmediate,ZS=Lg.process,eT=Lg.MessageChannel,tT=Lg.Dispatch,nT=0,rT={},iT="onreadystatechange",oT=function(e){if(rT.hasOwnProperty(e)){var t=rT[e];delete rT[e],t()}},aT=function(e){return function(){oT(e)}},sT=function(e){oT(e.data)},cT=function(e){Lg.postMessage(e+"",XS.protocol+"//"+XS.host)};JS&&QS||(JS=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return rT[++nT]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},qS(nT),nT},QS=function(e){delete rT[e]},KS?qS=function(e){ZS.nextTick(aT(e))}:tT&&tT.now?qS=function(e){tT.now(aT(e))}:eT&&!GS?(VS=(HS=new eT).port2,HS.port1.onmessage=sT,qS=Nv(VS.postMessage,VS,1)):Lg.addEventListener&&"function"==typeof postMessage&&!Lg.importScripts&&XS&&"file:"!==XS.protocol&&!Ng(cT)?(qS=cT,Lg.addEventListener("message",sT,!1)):qS=iT in Zg("script")?function(e){Kv.appendChild(Zg("script")).onreadystatechange=function(){Kv.removeChild(this),oT(e)}}:function(e){setTimeout(aT(e),0)});var uT,lT,fT,hT,pT,dT,gT,mT,vT={set:JS,clear:QS},yT=nm.f,bT=vT.set,wT=Lg.MutationObserver||Lg.WebKitMutationObserver,_T=Lg.document,ET=Lg.process,kT=Lg.Promise,ST=yT(Lg,"queueMicrotask"),TT=ST&&ST.value;TT||(uT=function(){var e,t;for(KS&&(e=ET.domain)&&e.exit();lT;){t=lT.fn,lT=lT.next;try{t()}catch(e){throw lT?hT():fT=void 0,e}}fT=void 0,e&&e.enter()},!GS&&!KS&&wT&&_T?(pT=!0,dT=_T.createTextNode(""),new wT(uT).observe(dT,{characterData:!0}),hT=function(){dT.data=pT=!pT}):kT&&kT.resolve?(gT=kT.resolve(void 0),mT=gT.then,hT=function(){mT.call(gT,uT)}):hT=KS?function(){ET.nextTick(uT)}:function(){bT.call(Lg,uT)});var xT,AT,OT,PT,CT=TT||function(e){var t={fn:e,next:void 0};fT&&(fT.next=t),lT||(lT=t,hT()),fT=t},IT=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=Lv(t),this.reject=Lv(n)},jT={f:function(e){return new IT(e)}},RT=function(e,t){if(rm(e),$g(t)&&t.constructor===e)return t;var n=jT.f(e);return(0,n.resolve)(t),n.promise},LT=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},NT=vT.set,MT=yv("species"),UT="Promise",DT=jm.get,FT=jm.set,BT=jm.getterFor(UT),qT=zS,HT=Lg.TypeError,VT=Lg.document,WT=Lg.process,zT=Mm("fetch"),YT=jT.f,$T=YT,GT=!!(VT&&VT.createEvent&&Lg.dispatchEvent),KT="function"==typeof PromiseRejectionEvent,XT="unhandledrejection",JT=sv(UT,(function(){if(!(dm(qT)!==String(qT))){if(66===Tv)return!0;if(!KS&&!KT)return!0}if(Tv>=51&&/native code/.test(qT))return!1;var e=qT.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[MT]=t,!(e.then((function(){}))instanceof t)})),QT=JT||!xy((function(e){qT.all(e).catch((function(){}))})),ZT=function(e){var t;return!(!$g(e)||"function"!=typeof(t=e.then))&&t},ex=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;CT((function(){for(var r=e.value,i=1==e.state,o=0;n.length>o;){var a,s,c,u=n[o++],l=i?u.ok:u.fail,f=u.resolve,h=u.reject,p=u.domain;try{l?(i||(2===e.rejection&&ix(e),e.rejection=1),!0===l?a=r:(p&&p.enter(),a=l(r),p&&(p.exit(),c=!0)),a===u.promise?h(HT("Promise-chain cycle")):(s=ZT(a))?s.call(a,f,h):f(a)):h(r)}catch(e){p&&!c&&p.exit(),h(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&nx(e)}))}},tx=function(e,t,n){var r,i;GT?((r=VT.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),Lg.dispatchEvent(r)):r={promise:t,reason:n},!KT&&(i=Lg["on"+e])?i(r):e===XT&&function(e,t){var n=Lg.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}("Unhandled promise rejection",n)},nx=function(e){NT.call(Lg,(function(){var t,n=e.facade,r=e.value;if(rx(e)&&(t=LT((function(){KS?WT.emit("unhandledRejection",r,n):tx(XT,n,r)})),e.rejection=KS||rx(e)?2:1,t.error))throw t.value}))},rx=function(e){return 1!==e.rejection&&!e.parent},ix=function(e){NT.call(Lg,(function(){var t=e.facade;KS?WT.emit("rejectionHandled",t):tx("rejectionhandled",t,e.value)}))},ox=function(e,t,n){return function(r){e(t,r,n)}},ax=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,ex(e,!0))},sx=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw HT("Promise can't be resolved itself");var r=ZT(t);r?CT((function(){var n={done:!1};try{r.call(t,ox(sx,n,e),ox(ax,n,e))}catch(t){ax(n,t,e)}})):(e.value=t,e.state=1,ex(e,!1))}catch(t){ax({done:!1},t,e)}}};JT&&(qT=function(e){ww(this,qT,UT),Lv(e),xT.call(this);var t=DT(this);try{e(ox(sx,t),ox(ax,t))}catch(e){ax(t,e)}},(xT=function(e){FT(this,{type:UT,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=gw(qT.prototype,{then:function(e,t){var n=BT(this),r=YT(t_(this,qT));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=KS?WT.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&ex(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),AT=function(){var e=new xT,t=DT(e);this.promise=e,this.resolve=ox(sx,t),this.reject=ox(ax,t)},jT.f=YT=function(e){return e===qT||e===OT?new AT(e):$T(e)},"function"==typeof zS&&(PT=zS.prototype.then,Rm(zS.prototype,"then",(function(e,t){var n=this;return new qT((function(e,t){PT.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof zT&&uv({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return RT(qT,zT.apply(Lg,arguments))}}))),uv({global:!0,wrap:!0,forced:JT},{Promise:qT}),Hy(qT,UT,!1),$S(UT),OT=Mm(UT),uv({target:UT,stat:!0,forced:JT},{reject:function(e){var t=YT(this);return t.reject.call(void 0,e),t.promise}}),uv({target:UT,stat:!0,forced:JT},{resolve:function(e){return RT(this,e)}}),uv({target:UT,stat:!0,forced:QT},{all:function(e){var t=this,n=YT(t),r=n.resolve,i=n.reject,o=LT((function(){var n=Lv(t.resolve),o=[],a=0,s=1;bw(e,(function(e){var c=a++,u=!1;o.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,o[c]=e,--s||r(o))}),i)})),--s||r(o)}));return o.error&&i(o.value),n.promise},race:function(e){var t=this,n=YT(t),r=n.reject,i=LT((function(){var i=Lv(t.resolve);bw(e,(function(e){i.call(t,e).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}});var cx,ux=nm.f,lx="".startsWith,fx=Math.min,hx=Zb("startsWith"),px=!(hx||(cx=ux(String.prototype,"startsWith"),!cx||cx.writable));uv({target:"String",proto:!0,forced:!px&&!hx},{startsWith:function(e){var t=String(zg(this));Jb(e);var n=qm(fx(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return lx?lx.call(t,r,n):t.slice(n,n+r.length)===r}});var dx,gx,mx,vx=function(e){return null!=e?e.constructor:null},yx=function(e,t){return Boolean(e&&t&&e instanceof t)},bx=function(e){return null==e},wx=function(e){return vx(e)===Object},_x=function(e){return vx(e)===String},Ex=function(e){return vx(e)===Function},kx=function(e){return Array.isArray(e)},Sx=function(e){return yx(e,NodeList)},Tx=function(e){return bx(e)||(_x(e)||kx(e)||Sx(e))&&!e.length||wx(e)&&!Object.keys(e).length},xx=bx,Ax=wx,Ox=function(e){return vx(e)===Number&&!Number.isNaN(e)},Px=_x,Cx=function(e){return vx(e)===Boolean},Ix=Ex,jx=kx,Rx=Sx,Lx=function(e){return yx(e,Element)},Nx=function(e){return yx(e,Event)},Mx=function(e){return yx(e,KeyboardEvent)},Ux=function(e){return yx(e,TextTrack)||!bx(e)&&_x(e.kind)},Dx=function(e){return yx(e,Promise)&&Ex(e.then)},Fx=function(e){if(yx(e,window.URL))return!0;if(!_x(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!Tx(new URL(t).hostname)}catch(e){return!1}},Bx=Tx,qx=(dx=document.createElement("span"),gx={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},mx=Object.keys(gx).find((function(e){return void 0!==dx.style[e]})),!!Px(mx)&&gx[mx]);function Hx(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var Vx={isIE:
+var Kc=function(e,t){return(Kc=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n])})(e,t)};function Xc(e,t){function n(){this.constructor=e}Kc(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}var Jc,Qc,Zc=function(){return(Zc=Object.assign||function(e){for(var t,n=1,r=arguments.length;n<r;n++)for(var i in t=arguments[n])Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e}).apply(this,arguments)};function eu(e,t){var n="function"==typeof Symbol&&e[Symbol.iterator];if(!n)return e;var r,i,o=n.call(e),a=[];try{for(;(void 0===t||t-- >0)&&!(r=o.next()).done;)a.push(r.value)}catch(e){i={error:e}}finally{try{r&&!r.done&&(n=o.return)&&n.call(o)}finally{if(i)throw i.error}}return a}function tu(){for(var e=[],t=0;t<arguments.length;t++)e=e.concat(eu(arguments[t]));return e}!function(e){e.Fatal="fatal",e.Error="error",e.Warning="warning",e.Log="log",e.Info="info",e.Debug="debug",e.Critical="critical"}(Jc||(Jc={})),function(e){e.fromString=function(t){switch(t){case"debug":return e.Debug;case"info":return e.Info;case"warn":case"warning":return e.Warning;case"error":return e.Error;case"fatal":return e.Fatal;case"critical":return e.Critical;case"log":default:return e.Log}}}(Jc||(Jc={})),function(e){e.Unknown="unknown",e.Skipped="skipped",e.Success="success",e.RateLimit="rate_limit",e.Invalid="invalid",e.Failed="failed"}(Qc||(Qc={})),function(e){e.fromHttpCode=function(t){return t>=200&&t<300?e.Success:429===t?e.RateLimit:t>=400&&t<500?e.Invalid:t>=500?e.Failed:e.Unknown}}(Qc||(Qc={}));var nu=O.f,ru=Function.prototype,iu=ru.toString,ou=/^\s*function ([^ (]*)/,au="name";o&&!(au in ru)&&nu(ru,au,{configurable:!0,get:function(){try{return iu.call(this).match(ou)[1]}catch(e){return""}}});var su=Object.setPrototypeOf||({__proto__:[]}instanceof Array?function(e,t){return e.__proto__=t,e}:function(e,t){for(var n in t)e.hasOwnProperty(n)||(e[n]=t[n]);return e});var cu=function(e){function t(t){var n=this.constructor,r=e.call(this,t)||this;return r.message=t,r.name=n.prototype.constructor.name,su(r,n.prototype),r}return Xc(t,e),t}(Error);function uu(e){switch(Object.prototype.toString.call(e)){case"[object Error]":case"[object Exception]":case"[object DOMException]":return!0;default:return yu(e,Error)}}function lu(e){return"[object ErrorEvent]"===Object.prototype.toString.call(e)}function fu(e){return"[object DOMError]"===Object.prototype.toString.call(e)}function hu(e){return"[object String]"===Object.prototype.toString.call(e)}function pu(e){return null===e||"object"!==fs(e)&&"function"!=typeof e}function du(e){return"[object Object]"===Object.prototype.toString.call(e)}function gu(e){return"undefined"!=typeof Event&&yu(e,Event)}function mu(e){return"undefined"!=typeof Element&&yu(e,Element)}function vu(e){return Boolean(e&&e.then&&"function"==typeof e.then)}function yu(e,t){try{return e instanceof t}catch(e){return!1}}Ii("match",1,(function(e,t,n){return[function(t){var n=d(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=x(e),o=String(this);if(!i.global)return ji(i,o);var a=i.unicode;i.lastIndex=0;for(var s,c=[],u=0;null!==(s=ji(i,o));){var l=String(s[0]);c[u]=l,""===l&&(i.lastIndex=Pi(o,ce(i.lastIndex),a)),u++}return 0===u?null:c}]}));var bu,wu="undefined"!=typeof ArrayBuffer&&"undefined"!=typeof DataView,_u=O.f,Eu=r.Int8Array,Su=Eu&&Eu.prototype,ku=r.Uint8ClampedArray,Tu=ku&&ku.prototype,xu=Eu&&qn(Eu),Au=Su&&qn(Su),Ou=Object.prototype,Iu=Ou.isPrototypeOf,Cu=qe("toStringTag"),Pu=V("TYPED_ARRAY_TAG"),ju=wu&&!!Gt&&"Opera"!==ft(r.opera),Ru=!1,Lu={Int8Array:1,Uint8Array:1,Uint8ClampedArray:1,Int16Array:2,Uint16Array:2,Int32Array:4,Uint32Array:4,Float32Array:4,Float64Array:8},Nu=function(e){return m(e)&&b(Lu,ft(e))};for(bu in Lu)r[bu]||(ju=!1);if((!ju||"function"!=typeof xu||xu===Function.prototype)&&(xu=function(){throw TypeError("Incorrect invocation")},ju))for(bu in Lu)r[bu]&&Gt(r[bu],xu);if((!ju||!Au||Au===Ou)&&(Au=xu.prototype,ju))for(bu in Lu)r[bu]&&Gt(r[bu].prototype,Au);if(ju&&qn(Tu)!==Au&&Gt(Tu,Au),o&&!b(Au,Cu))for(bu in Ru=!0,_u(Au,Cu,{get:function(){return m(this)?this[Pu]:void 0}}),Lu)r[bu]&&I(r[bu],Pu,bu);var Mu={NATIVE_ARRAY_BUFFER_VIEWS:ju,TYPED_ARRAY_TAG:Ru&&Pu,aTypedArray:function(e){if(Nu(e))return e;throw TypeError("Target is not a typed array")},aTypedArrayConstructor:function(e){if(Gt){if(Iu.call(xu,e))return e}else for(var t in Lu)if(b(Lu,bu)){var n=r[t];if(n&&(e===n||Iu.call(n,e)))return e}throw TypeError("Target is not a typed array constructor")},exportTypedArrayMethod:function(e,t,n){if(o){if(n)for(var i in Lu){var a=r[i];a&&b(a.prototype,e)&&delete a.prototype[e]}Au[e]&&!n||ee(Au,e,n?t:ju&&Su[e]||t)}},exportTypedArrayStaticMethod:function(e,t,n){var i,a;if(o){if(Gt){if(n)for(i in Lu)(a=r[i])&&b(a,e)&&delete a[e];if(xu[e]&&!n)return;try{return ee(xu,e,n?t:ju&&Eu[e]||t)}catch(e){}}for(i in Lu)!(a=r[i])||a[e]&&!n||ee(a,e,t)}},isView:function(e){var t=ft(e);return"DataView"===t||b(Lu,t)},isTypedArray:Nu,TypedArray:xu,TypedArrayPrototype:Au},Uu=Mu.NATIVE_ARRAY_BUFFER_VIEWS,Du=r.ArrayBuffer,Fu=r.Int8Array,qu=!Uu||!i((function(){Fu(1)}))||!i((function(){new Fu(-1)}))||!bt((function(e){new Fu,new Fu(null),new Fu(1.5),new Fu(e)}),!0)||i((function(){return 1!==new Fu(new Du(2),1,void 0).length})),Bu=function(e){if(void 0===e)return 0;var t=ae(e),n=ce(t);if(t!==n)throw RangeError("Wrong length or index");return n},Hu=1/0,Vu=Math.abs,Wu=Math.pow,zu=Math.floor,Yu=Math.log,$u=Math.LN2,Gu=function(e,t,n){var r,i,o,a=new Array(n),s=8*n-t-1,c=(1<<s)-1,u=c>>1,l=23===t?Wu(2,-24)-Wu(2,-77):0,f=e<0||0===e&&1/e<0?1:0,h=0;for((e=Vu(e))!=e||e===Hu?(i=e!=e?1:0,r=c):(r=zu(Yu(e)/$u),e*(o=Wu(2,-r))<1&&(r--,o*=2),(e+=r+u>=1?l/o:l*Wu(2,1-u))*o>=2&&(r++,o/=2),r+u>=c?(i=0,r=c):r+u>=1?(i=(e*o-1)*Wu(2,t),r+=u):(i=e*Wu(2,u-1)*Wu(2,t),r=0));t>=8;a[h++]=255&i,i/=256,t-=8);for(r=r<<t|i,s+=t;s>0;a[h++]=255&r,r/=256,s-=8);return a[--h]|=128*f,a},Ku=function(e,t){var n,r=e.length,i=8*r-t-1,o=(1<<i)-1,a=o>>1,s=i-7,c=r-1,u=e[c--],l=127&u;for(u>>=7;s>0;l=256*l+e[c],c--,s-=8);for(n=l&(1<<-s)-1,l>>=-s,s+=t;s>0;n=256*n+e[c],c--,s-=8);if(0===l)l=1-a;else{if(l===o)return n?NaN:u?-1/0:Hu;n+=Wu(2,t),l-=a}return(u?-1:1)*n*Wu(2,l-t)},Xu=function(e){for(var t=Re(this),n=ce(t.length),r=arguments.length,i=fe(r>1?arguments[1]:void 0,n),o=r>2?arguments[2]:void 0,a=void 0===o?n:fe(o,n);a>i;)t[i++]=e;return t},Ju=ye.f,Qu=O.f,Zu=Z.get,el=Z.set,tl="ArrayBuffer",nl="DataView",rl="Wrong index",il=r.ArrayBuffer,ol=il,al=r.DataView,sl=al&&al.prototype,cl=Object.prototype,ul=r.RangeError,ll=Gu,fl=Ku,hl=function(e){return[255&e]},pl=function(e){return[255&e,e>>8&255]},dl=function(e){return[255&e,e>>8&255,e>>16&255,e>>24&255]},gl=function(e){return e[3]<<24|e[2]<<16|e[1]<<8|e[0]},ml=function(e){return ll(e,23,4)},vl=function(e){return ll(e,52,8)},yl=function(e,t){Qu(e.prototype,t,{get:function(){return Zu(this)[t]}})},bl=function(e,t,n,r){var i=Bu(n),o=Zu(e);if(i+t>o.byteLength)throw ul(rl);var a=Zu(o.buffer).bytes,s=i+o.byteOffset,c=a.slice(s,s+t);return r?c:c.reverse()},wl=function(e,t,n,r,i,o){var a=Bu(n),s=Zu(e);if(a+t>s.byteLength)throw ul(rl);for(var c=Zu(s.buffer).bytes,u=a+s.byteOffset,l=r(+i),f=0;f<t;f++)c[u+f]=l[o?f:t-f-1]};if(wu){if(!i((function(){il(1)}))||!i((function(){new il(-1)}))||i((function(){return new il,new il(1.5),new il(NaN),il.name!=tl}))){for(var _l,El=(ol=function(e){return eo(this,ol),new il(Bu(e))}).prototype=il.prototype,Sl=Ju(il),kl=0;Sl.length>kl;)(_l=Sl[kl++])in ol||I(ol,_l,il[_l]);El.constructor=ol}Gt&&qn(sl)!==cl&&Gt(sl,cl);var Tl=new al(new ol(2)),xl=sl.setInt8;Tl.setInt8(0,2147483648),Tl.setInt8(1,2147483649),!Tl.getInt8(0)&&Tl.getInt8(1)||po(sl,{setInt8:function(e,t){xl.call(this,e,t<<24>>24)},setUint8:function(e,t){xl.call(this,e,t<<24>>24)}},{unsafe:!0})}else ol=function(e){eo(this,ol,tl);var t=Bu(e);el(this,{bytes:Xu.call(new Array(t),0),byteLength:t}),o||(this.byteLength=t)},al=function(e,t,n){eo(this,al,nl),eo(e,ol,nl);var r=Zu(e).byteLength,i=ae(t);if(i<0||i>r)throw ul("Wrong offset");if(i+(n=void 0===n?r-i:ce(n))>r)throw ul("Wrong length");el(this,{buffer:e,byteLength:n,byteOffset:i}),o||(this.buffer=e,this.byteLength=n,this.byteOffset=i)},o&&(yl(ol,"byteLength"),yl(al,"buffer"),yl(al,"byteLength"),yl(al,"byteOffset")),po(al.prototype,{getInt8:function(e){return bl(this,1,e)[0]<<24>>24},getUint8:function(e){return bl(this,1,e)[0]},getInt16:function(e){var t=bl(this,2,e,arguments.length>1?arguments[1]:void 0);return(t[1]<<8|t[0])<<16>>16},getUint16:function(e){var t=bl(this,2,e,arguments.length>1?arguments[1]:void 0);return t[1]<<8|t[0]},getInt32:function(e){return gl(bl(this,4,e,arguments.length>1?arguments[1]:void 0))},getUint32:function(e){return gl(bl(this,4,e,arguments.length>1?arguments[1]:void 0))>>>0},getFloat32:function(e){return fl(bl(this,4,e,arguments.length>1?arguments[1]:void 0),23)},getFloat64:function(e){return fl(bl(this,8,e,arguments.length>1?arguments[1]:void 0),52)},setInt8:function(e,t){wl(this,1,e,hl,t)},setUint8:function(e,t){wl(this,1,e,hl,t)},setInt16:function(e,t){wl(this,2,e,pl,t,arguments.length>2?arguments[2]:void 0)},setUint16:function(e,t){wl(this,2,e,pl,t,arguments.length>2?arguments[2]:void 0)},setInt32:function(e,t){wl(this,4,e,dl,t,arguments.length>2?arguments[2]:void 0)},setUint32:function(e,t){wl(this,4,e,dl,t,arguments.length>2?arguments[2]:void 0)},setFloat32:function(e,t){wl(this,4,e,ml,t,arguments.length>2?arguments[2]:void 0)},setFloat64:function(e,t){wl(this,8,e,vl,t,arguments.length>2?arguments[2]:void 0)}});Yn(ol,tl),Yn(al,nl);var Al={ArrayBuffer:ol,DataView:al},Ol=function(e,t){var n=function(e){var t=ae(e);if(t<0)throw RangeError("The argument can't be less than 0");return t}(e);if(n%t)throw RangeError("Wrong offset");return n},Il=Mu.aTypedArrayConstructor,Cl=function(e){var t,n,r,i,o,a,s=Re(e),c=arguments.length,u=c>1?arguments[1]:void 0,l=void 0!==u,f=pt(s);if(null!=f&&!ot(f))for(a=(o=f.call(s)).next,s=[];!(i=a.call(o)).done;)s.push(i.value);for(l&&c>2&&(u=je(u,arguments[2],2)),n=ce(s.length),r=new(Il(this))(n),t=0;n>t;t++)r[t]=l?u(s[t],t):s[t];return r};t((function(e){var t=ye.f,n=ze.forEach,i=Z.get,a=Z.set,s=O.f,c=T.f,l=Math.round,f=r.RangeError,h=Al.ArrayBuffer,p=Al.DataView,d=Mu.NATIVE_ARRAY_BUFFER_VIEWS,g=Mu.TYPED_ARRAY_TAG,y=Mu.TypedArray,w=Mu.TypedArrayPrototype,_=Mu.aTypedArrayConstructor,E=Mu.isTypedArray,S="BYTES_PER_ELEMENT",k="Wrong length",x=function(e,t){for(var n=0,r=t.length,i=new(_(e))(r);r>n;)i[n]=t[n++];return i},A=function(e,t){s(e,t,{get:function(){return i(this)[t]}})},C=function(e){var t;return e instanceof h||"ArrayBuffer"==(t=ft(e))||"SharedArrayBuffer"==t},P=function(e,t){return E(e)&&"symbol"!=typeof t&&t in e&&String(+t)==String(t)},j=function(e,t){return P(e,t=v(t,!0))?u(2,e[t]):c(e,t)},R=function(e,t,n){return!(P(e,t=v(t,!0))&&m(n)&&b(n,"value"))||b(n,"get")||b(n,"set")||n.configurable||b(n,"writable")&&!n.writable||b(n,"enumerable")&&!n.enumerable?s(e,t,n):(e[t]=n.value,e)};o?(d||(T.f=j,O.f=R,A(w,"buffer"),A(w,"byteOffset"),A(w,"byteLength"),A(w,"length")),Ce({target:"Object",stat:!0,forced:!d},{getOwnPropertyDescriptor:j,defineProperty:R}),e.exports=function(e,o,c){var u=e.match(/\d+$/)[0]/8,v=e+(c?"Clamped":"")+"Array",b="get"+e,_="set"+e,T=r[v],A=T,O=A&&A.prototype,P={},j=function(e,t){s(e,t,{get:function(){return function(e,t){var n=i(e);return n.view[b](t*u+n.byteOffset,!0)}(this,t)},set:function(e){return function(e,t,n){var r=i(e);c&&(n=(n=l(n))<0?0:n>255?255:255&n),r.view[_](t*u+r.byteOffset,n,!0)}(this,t,e)},enumerable:!0})};d?qu&&(A=o((function(e,t,n,r){return eo(e,A,v),Kt(m(t)?C(t)?void 0!==r?new T(t,Ol(n,u),r):void 0!==n?new T(t,Ol(n,u)):new T(t):E(t)?x(A,t):Cl.call(A,t):new T(Bu(t)),e,A)})),Gt&&Gt(A,y),n(t(T),(function(e){e in A||I(A,e,T[e])})),A.prototype=O):(A=o((function(e,t,n,r){eo(e,A,v);var i,o,s,c=0,l=0;if(m(t)){if(!C(t))return E(t)?x(A,t):Cl.call(A,t);i=t,l=Ol(n,u);var d=t.byteLength;if(void 0===r){if(d%u)throw f(k);if((o=d-l)<0)throw f(k)}else if((o=ce(r)*u)+l>d)throw f(k);s=o/u}else s=Bu(t),i=new h(o=s*u);for(a(e,{buffer:i,byteOffset:l,byteLength:o,length:s,view:new p(i)});c<s;)j(e,c++)})),Gt&&Gt(A,y),O=A.prototype=It(w)),O.constructor!==A&&I(O,"constructor",A),g&&I(O,g,v),P[v]=A,Ce({global:!0,forced:A!=T,sham:!d},P),S in A||I(A,S,u),S in O||I(O,S,u),nn(v)}):e.exports=function(){}}))("Uint16",(function(e){return function(t,n,r){return e(this,t,n,r)}}));var Pl=Math.min,jl=[].copyWithin||function(e,t){var n=Re(this),r=ce(n.length),i=fe(e,r),o=fe(t,r),a=arguments.length>2?arguments[2]:void 0,s=Pl((void 0===a?r:fe(a,r))-o,r-i),c=1;for(o<i&&i<o+s&&(c=-1,o+=s-1,i+=s-1);s-- >0;)o in n?n[i]=n[o]:delete n[i],i+=c,o+=c;return n},Rl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("copyWithin",(function(e,t){return jl.call(Rl(this),e,t,arguments.length>2?arguments[2]:void 0)}));var Ll=ze.every,Nl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("every",(function(e){return Ll(Nl(this),e,arguments.length>1?arguments[1]:void 0)}));var Ml=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("fill",(function(e){return Xu.apply(Ml(this),arguments)}));var Ul=ze.filter,Dl=Mu.aTypedArray,Fl=Mu.aTypedArrayConstructor;(0,Mu.exportTypedArrayMethod)("filter",(function(e){for(var t=Ul(Dl(this),e,arguments.length>1?arguments[1]:void 0),n=qi(this,this.constructor),r=0,i=t.length,o=new(Fl(n))(i);i>r;)o[r]=t[r++];return o}));var ql=ze.find,Bl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("find",(function(e){return ql(Bl(this),e,arguments.length>1?arguments[1]:void 0)}));var Hl=ze.findIndex,Vl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("findIndex",(function(e){return Hl(Vl(this),e,arguments.length>1?arguments[1]:void 0)}));var Wl=ze.forEach,zl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("forEach",(function(e){Wl(zl(this),e,arguments.length>1?arguments[1]:void 0)}));var Yl=pe.includes,$l=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("includes",(function(e){return Yl($l(this),e,arguments.length>1?arguments[1]:void 0)}));var Gl=pe.indexOf,Kl=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("indexOf",(function(e){return Gl(Kl(this),e,arguments.length>1?arguments[1]:void 0)}));var Xl=qe("iterator"),Jl=r.Uint8Array,Ql=pi.values,Zl=pi.keys,ef=pi.entries,tf=Mu.aTypedArray,nf=Mu.exportTypedArrayMethod,rf=Jl&&Jl.prototype[Xl],of=!!rf&&("values"==rf.name||null==rf.name),af=function(){return Ql.call(tf(this))};nf("entries",(function(){return ef.call(tf(this))})),nf("keys",(function(){return Zl.call(tf(this))})),nf("values",af,!of),nf(Xl,af,!of);var sf=Mu.aTypedArray,cf=[].join;(0,Mu.exportTypedArrayMethod)("join",(function(e){return cf.apply(sf(this),arguments)}));var uf=Math.min,lf=[].lastIndexOf,ff=!!lf&&1/[1].lastIndexOf(1,-0)<0,hf=Ye("lastIndexOf"),pf=Xe("indexOf",{ACCESSORS:!0,1:0}),df=ff||!hf||!pf?function(e){if(ff)return lf.apply(this,arguments)||0;var t=g(this),n=ce(t.length),r=n-1;for(arguments.length>1&&(r=uf(r,ae(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:lf,gf=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("lastIndexOf",(function(e){return df.apply(gf(this),arguments)}));var mf=ze.map,vf=Mu.aTypedArray,yf=Mu.aTypedArrayConstructor;(0,Mu.exportTypedArrayMethod)("map",(function(e){return mf(vf(this),e,arguments.length>1?arguments[1]:void 0,(function(e,t){return new(yf(qi(e,e.constructor)))(t)}))}));var bf=function(e){return function(t,n,r,i){Pe(n);var o=Re(t),a=p(o),s=ce(o.length),c=e?s-1:0,u=e?-1:1;if(r<2)for(;;){if(c in a){i=a[c],c+=u;break}if(c+=u,e?c<0:s<=c)throw TypeError("Reduce of empty array with no initial value")}for(;e?c>=0:s>c;c+=u)c in a&&(i=n(i,a[c],c,o));return i}},wf={left:bf(!1),right:bf(!0)},_f=wf.left,Ef=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("reduce",(function(e){return _f(Ef(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)}));var Sf=wf.right,kf=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("reduceRight",(function(e){return Sf(kf(this),e,arguments.length,arguments.length>1?arguments[1]:void 0)}));var Tf=Mu.aTypedArray,xf=Mu.exportTypedArrayMethod,Af=Math.floor;xf("reverse",(function(){for(var e,t=this,n=Tf(t).length,r=Af(n/2),i=0;i<r;)e=t[i],t[i++]=t[--n],t[n]=e;return t}));var Of=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("set",(function(e){Of(this);var t=Ol(arguments.length>1?arguments[1]:void 0,1),n=this.length,r=Re(e),i=ce(r.length),o=0;if(i+t>n)throw RangeError("Wrong length");for(;o<i;)this[t+o]=r[o++]}),i((function(){new Int8Array(1).set({})})));var If=Mu.aTypedArray,Cf=Mu.aTypedArrayConstructor,Pf=[].slice;(0,Mu.exportTypedArrayMethod)("slice",(function(e,t){for(var n=Pf.call(If(this),e,t),r=qi(this,this.constructor),i=0,o=n.length,a=new(Cf(r))(o);o>i;)a[i]=n[i++];return a}),i((function(){new Int8Array(1).slice()})));var jf=ze.some,Rf=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("some",(function(e){return jf(Rf(this),e,arguments.length>1?arguments[1]:void 0)}));var Lf=Mu.aTypedArray,Nf=[].sort;(0,Mu.exportTypedArrayMethod)("sort",(function(e){return Nf.call(Lf(this),e)}));var Mf=Mu.aTypedArray;(0,Mu.exportTypedArrayMethod)("subarray",(function(e,t){var n=Mf(this),r=n.length,i=fe(e,r);return new(qi(n,n.constructor))(n.buffer,n.byteOffset+i*n.BYTES_PER_ELEMENT,ce((void 0===t?r:fe(t,r))-i))}));var Uf=r.Int8Array,Df=Mu.aTypedArray,Ff=Mu.exportTypedArrayMethod,qf=[].toLocaleString,Bf=[].slice,Hf=!!Uf&&i((function(){qf.call(new Uf(1))}));Ff("toLocaleString",(function(){return qf.apply(Hf?Bf.call(Df(this)):Df(this),arguments)}),i((function(){return[1,2].toLocaleString()!=new Uf([1,2]).toLocaleString()}))||!i((function(){Uf.prototype.toLocaleString.call([1,2])})));var Vf=Mu.exportTypedArrayMethod,Wf=r.Uint8Array,zf=Wf&&Wf.prototype||{},Yf=[].toString,$f=[].join;i((function(){Yf.call({})}))&&(Yf=function(){return $f.call(this)});var Gf=zf.toString!=Yf;function Kf(e,t){return void 0===t&&(t=0),"string"!=typeof e||0===t||e.length<=t?e:e.substr(0,t)+"..."}function Xf(e,t){if(!Array.isArray(e))return"";for(var n=[],r=0;r<e.length;r++){var i=e[r];try{n.push(String(i))}catch(e){n.push("[value cannot be serialized]")}}return n.join(t)}function Jf(e,t){return!!hu(e)&&(n=t,"[object RegExp]"===Object.prototype.toString.call(n)?t.test(e):"string"==typeof t&&-1!==e.indexOf(t));var n}function Qf(){return"[object process]"===Object.prototype.toString.call("undefined"!=typeof process?process:0)}Vf("toString",Yf,Gf);var Zf={};function eh(){return Qf()?global:"undefined"!=typeof window?window:"undefined"!=typeof self?self:Zf}function th(){var e=eh(),t=e.crypto||e.msCrypto;if(void 0!==t&&t.getRandomValues){var n=new Uint16Array(8);t.getRandomValues(n),n[3]=4095&n[3]|16384,n[4]=16383&n[4]|32768;var r=function(e){for(var t=e.toString(16);t.length<4;)t="0"+t;return t};return r(n[0])+r(n[1])+r(n[2])+r(n[3])+r(n[4])+r(n[5])+r(n[6])+r(n[7])}return"xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx".replace(/[xy]/g,(function(e){var t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}))}function nh(e){if(!e)return{};var t=e.match(/^(([^:/?#]+):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?$/);if(!t)return{};var n=t[6]||"",r=t[8]||"";return{host:t[4],path:t[5],protocol:t[2],relative:t[5]+n+r}}function rh(e){if(e.message)return e.message;if(e.exception&&e.exception.values&&e.exception.values[0]){var t=e.exception.values[0];return t.type&&t.value?t.type+": "+t.value:t.type||t.value||e.event_id||"<unknown>"}return e.event_id||"<unknown>"}function ih(e){var t=eh();if(!("console"in t))return e();var n=t.console,r={};["debug","info","warn","error","log","assert"].forEach((function(e){e in t.console&&n[e].__sentry_original__&&(r[e]=n[e],n[e]=n[e].__sentry_original__)}));var i=e();return Object.keys(r).forEach((function(e){n[e]=r[e]})),i}function oh(e,t,n){e.exception=e.exception||{},e.exception.values=e.exception.values||[],e.exception.values[0]=e.exception.values[0]||{},e.exception.values[0].value=e.exception.values[0].value||t||"",e.exception.values[0].type=e.exception.values[0].type||n||"Error"}function ah(e,t){void 0===t&&(t={});try{e.exception.values[0].mechanism=e.exception.values[0].mechanism||{},Object.keys(t).forEach((function(n){e.exception.values[0].mechanism[n]=t[n]}))}catch(e){}}function sh(e){try{for(var t=e,n=[],r=0,i=0,o=" > ".length,a=void 0;t&&r++<5&&!("html"===(a=ch(t))||r>1&&i+n.length*o+a.length>=80);)n.push(a),i+=a.length,t=t.parentNode;return n.reverse().join(" > ")}catch(e){return"<unknown>"}}function ch(e){var t,n,r,i,o,a=e,s=[];if(!a||!a.tagName)return"";if(s.push(a.tagName.toLowerCase()),a.id&&s.push("#"+a.id),(t=a.className)&&hu(t))for(n=t.split(/\s+/),o=0;o<n.length;o++)s.push("."+n[o]);var c=["type","name","title","alt"];for(o=0;o<c.length;o++)r=c[o],(i=a.getAttribute(r))&&s.push("["+r+'="'+i+'"]');return s.join("")}var uh=Date.now(),lh=0,fh={now:function(){var e=Date.now()-uh;return e<lh&&(e=lh),lh=e,e},timeOrigin:uh},hh=function(){if(Qf())try{return(e=module,t="perf_hooks",e.require(t)).performance}catch(e){return fh}var e,t,n=eh().performance;return n&&n.now?(void 0===n.timeOrigin&&(n.timeOrigin=n.timing&&n.timing.navigationStart||uh),n):fh}();function ph(){return(hh.timeOrigin+hh.now())/1e3}function dh(e,t){if(!t)return 6e4;var n=parseInt(""+t,10);if(!isNaN(n))return 1e3*n;var r=Date.parse(""+t);return isNaN(r)?6e4:r-e}var gh="<anonymous>";function mh(e){try{return e&&"function"==typeof e&&e.name||gh}catch(e){return gh}}var vh=eh(),yh="Sentry Logger ",bh=function(){function e(){this._enabled=!1}return e.prototype.disable=function(){this._enabled=!1},e.prototype.enable=function(){this._enabled=!0},e.prototype.log=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&ih((function(){vh.console.log(yh+"[Log]: "+e.join(" "))}))},e.prototype.warn=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&ih((function(){vh.console.warn(yh+"[Warn]: "+e.join(" "))}))},e.prototype.error=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._enabled&&ih((function(){vh.console.error(yh+"[Error]: "+e.join(" "))}))},e}();vh.__SENTRY__=vh.__SENTRY__||{};var wh=vh.__SENTRY__.logger||(vh.__SENTRY__.logger=new bh),_h=Vt("splice"),Eh=Xe("splice",{ACCESSORS:!0,0:0,1:2}),Sh=Math.max,kh=Math.min,Th=9007199254740991,xh="Maximum allowed length exceeded";Ce({target:"Array",proto:!0,forced:!_h||!Eh},{splice:function(e,t){var n,r,i,o,a,s,c=Re(this),u=ce(c.length),l=fe(e,u),f=arguments.length;if(0===f?n=r=0:1===f?(n=0,r=u-l):(n=f-2,r=kh(Sh(ae(t),0),u-l)),u+n-r>Th)throw TypeError(xh);for(i=He(c,r),o=0;o<r;o++)(a=l+o)in c&&at(i,o,c[a]);if(i.length=r,n<r){for(o=l;o<u-r;o++)s=o+n,(a=o+r)in c?c[s]=c[a]:delete c[s];for(o=u;o>u-r+n;o--)delete c[o-1]}else if(n>r)for(o=u-r;o>l;o--)s=o+n-1,(a=o+r-1)in c?c[s]=c[a]:delete c[s];for(o=0;o<n;o++)c[o+l]=arguments[o+2];return c.length=u-r+n,i}});var Ah=!i((function(){return Object.isExtensible(Object.preventExtensions({}))})),Oh=t((function(e){var t=O.f,n=V("meta"),r=0,i=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:"O"+ ++r,weakData:{}}})},a=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!m(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!b(e,n)){if(!i(e))return"F";if(!t)return"E";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!b(e,n)){if(!i(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return Ah&&a.REQUIRED&&i(e)&&!b(e,n)&&o(e),e}};Y[n]=!0})),Ih=(Oh.REQUIRED,Oh.fastKey,Oh.getWeakData,Oh.onFreeze,Oh.getWeakData),Ch=Z.set,Ph=Z.getterFor,jh=ze.find,Rh=ze.findIndex,Lh=0,Nh=function(e){return e.frozen||(e.frozen=new Mh)},Mh=function(){this.entries=[]},Uh=function(e,t){return jh(e.entries,(function(e){return e[0]===t}))};Mh.prototype={get:function(e){var t=Uh(this,e);if(t)return t[1]},has:function(e){return!!Uh(this,e)},set:function(e,t){var n=Uh(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=Rh(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}},function(e,t,n){var o=-1!==e.indexOf("Map"),a=-1!==e.indexOf("Weak"),s=o?"set":"add",c=r[e],u=c&&c.prototype,l=c,f={},h=function(e){var t=u[e];ee(u,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(a&&!m(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return a&&!m(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(a&&!m(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(Oe(e,"function"!=typeof c||!(a||u.forEach&&!i((function(){(new c).entries().next()})))))l=n.getConstructor(t,e,o,s),Oh.REQUIRED=!0;else if(Oe(e,!0)){var p=new l,d=p[s](a?{}:-0,1)!=p,g=i((function(){p.has(1)})),v=bt((function(e){new c(e)})),y=!a&&i((function(){for(var e=new c,t=5;t--;)e[s](t,t);return!e.has(-0)}));v||((l=t((function(t,n){eo(t,l,e);var r=Kt(new c,t,l);return null!=n&&Ns(n,r[s],r,o),r}))).prototype=u,u.constructor=l),(g||y)&&(h("delete"),h("has"),o&&h("get")),(y||d)&&h(s),a&&u.clear&&delete u.clear}f[e]=l,Ce({global:!0,forced:l!=c},f),Yn(l,e),a||n.setStrong(l,e,o)}("WeakSet",(function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}}),{getConstructor:function(e,t,n,r){var i=e((function(e,o){eo(e,i,t),Ch(e,{type:t,id:Lh++,frozen:void 0}),null!=o&&Ns(o,e[r],e,n)})),o=Ph(t),a=function(e,t,n){var r=o(e),i=Ih(x(t),!0);return!0===i?Nh(r).set(t,n):i[r.id]=n,e};return po(i.prototype,{delete:function(e){var t=o(this);if(!m(e))return!1;var n=Ih(e);return!0===n?Nh(t).delete(e):n&&b(n,t.id)&&delete n[t.id]},has:function(e){var t=o(this);if(!m(e))return!1;var n=Ih(e);return!0===n?Nh(t).has(e):n&&b(n,t.id)}}),po(i.prototype,n?{get:function(e){var t=o(this);if(m(e)){var n=Ih(e);return!0===n?Nh(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return a(this,e,t)}}:{add:function(e){return a(this,e,!0)}}),i}});var Dh=function(){function e(){this._hasWeakSet="function"==typeof WeakSet,this._inner=this._hasWeakSet?new WeakSet:[]}return e.prototype.memoize=function(e){if(this._hasWeakSet)return!!this._inner.has(e)||(this._inner.add(e),!1);for(var t=0;t<this._inner.length;t++){if(this._inner[t]===e)return!0}return this._inner.push(e),!1},e.prototype.unmemoize=function(e){if(this._hasWeakSet)this._inner.delete(e);else for(var t=0;t<this._inner.length;t++)if(this._inner[t]===e){this._inner.splice(t,1);break}},e}();function Fh(e,t,n){if(t in e){var r=e[t],i=n(r);if("function"==typeof i)try{i.prototype=i.prototype||{},Object.defineProperties(i,{__sentry_original__:{enumerable:!1,value:r}})}catch(e){}e[t]=i}}function qh(e){if(uu(e)){var t=e,n={message:t.message,name:t.name,stack:t.stack};for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(n[r]=t[r]);return n}if(gu(e)){var i=e,o={};o.type=i.type;try{o.target=mu(i.target)?sh(i.target):Object.prototype.toString.call(i.target)}catch(e){o.target="<unknown>"}try{o.currentTarget=mu(i.currentTarget)?sh(i.currentTarget):Object.prototype.toString.call(i.currentTarget)}catch(e){o.currentTarget="<unknown>"}for(var r in"undefined"!=typeof CustomEvent&&yu(e,CustomEvent)&&(o.detail=i.detail),i)Object.prototype.hasOwnProperty.call(i,r)&&(o[r]=i);return o}return e}function Bh(e){return function(e){return~-encodeURI(e).split(/%..|./).length}(JSON.stringify(e))}function Hh(e,t,n){void 0===t&&(t=3),void 0===n&&(n=102400);var r=zh(e,t);return Bh(r)>n?Hh(e,t-1,n):r}function Vh(e,t){return"domain"===t&&e&&"object"===fs(e)&&e._events?"[Domain]":"domainEmitter"===t?"[DomainEmitter]":"undefined"!=typeof global&&e===global?"[Global]":"undefined"!=typeof window&&e===window?"[Window]":"undefined"!=typeof document&&e===document?"[Document]":du(n=e)&&"nativeEvent"in n&&"preventDefault"in n&&"stopPropagation"in n?"[SyntheticEvent]":"number"==typeof e&&e!=e?"[NaN]":void 0===e?"[undefined]":"function"==typeof e?"[Function: "+mh(e)+"]":e;var n}function Wh(e,t,n,r){if(void 0===n&&(n=1/0),void 0===r&&(r=new Dh),0===n)return function(e){var t=Object.prototype.toString.call(e);if("string"==typeof e)return e;if("[object Object]"===t)return"[Object]";if("[object Array]"===t)return"[Array]";var n=Vh(e);return pu(n)?n:t}(t);if(null!=t&&"function"==typeof t.toJSON)return t.toJSON();var i=Vh(t,e);if(pu(i))return i;var o=qh(t),a=Array.isArray(t)?[]:{};if(r.memoize(t))return"[Circular ~]";for(var s in o)Object.prototype.hasOwnProperty.call(o,s)&&(a[s]=Wh(s,o[s],n-1,r));return r.unmemoize(t),a}function zh(e,t){try{return JSON.parse(JSON.stringify(e,(function(e,n){return Wh(e,n,t)})))}catch(e){return"**non-serializable**"}}function Yh(e,t){void 0===t&&(t=40);var n=Object.keys(qh(e));if(n.sort(),!n.length)return"[object has no keys]";if(n[0].length>=t)return Kf(n[0],t);for(var r=n.length;r>0;r--){var i=n.slice(0,r).join(", ");if(!(i.length>t))return r===n.length?i:Kf(i,t)}return""}Ce({target:"URL",proto:!0,enumerable:!0},{toJSON:function(){return URL.prototype.toString.call(this)}});var $h=ze.filter,Gh=Vt("filter"),Kh=Xe("filter");Ce({target:"Array",proto:!0,forced:!Gh||!Kh},{filter:function(e){return $h(this,e,arguments.length>1?arguments[1]:void 0)}});var Xh,Jh=!!Ls&&i((function(){Ls.prototype.finally.call({then:function(){}},(function(){}))}));Ce({target:"Promise",proto:!0,real:!0,forced:Jh},{finally:function(e){var t=qi(this,re("Promise")),n="function"==typeof e;return this.then(n?function(n){return wc(t,e()).then((function(){return n}))}:e,n?function(n){return wc(t,e()).then((function(){throw n}))}:e)}}),"function"!=typeof Ls||Ls.prototype.finally||ee(Ls.prototype,"finally",re("Promise").prototype.finally),function(e){e.PENDING="PENDING",e.RESOLVED="RESOLVED",e.REJECTED="REJECTED"}(Xh||(Xh={}));var Qh=function(){function e(e){var t=this;this._state=Xh.PENDING,this._handlers=[],this._resolve=function(e){t._setResult(Xh.RESOLVED,e)},this._reject=function(e){t._setResult(Xh.REJECTED,e)},this._setResult=function(e,n){t._state===Xh.PENDING&&(vu(n)?n.then(t._resolve,t._reject):(t._state=e,t._value=n,t._executeHandlers()))},this._attachHandler=function(e){t._handlers=t._handlers.concat(e),t._executeHandlers()},this._executeHandlers=function(){if(t._state!==Xh.PENDING){var e=t._handlers.slice();t._handlers=[],e.forEach((function(e){e.done||(t._state===Xh.RESOLVED&&e.onfulfilled&&e.onfulfilled(t._value),t._state===Xh.REJECTED&&e.onrejected&&e.onrejected(t._value),e.done=!0)}))}};try{e(this._resolve,this._reject)}catch(e){this._reject(e)}}return e.resolve=function(t){return new e((function(e){e(t)}))},e.reject=function(t){return new e((function(e,n){n(t)}))},e.all=function(t){return new e((function(n,r){if(Array.isArray(t))if(0!==t.length){var i=t.length,o=[];t.forEach((function(t,a){e.resolve(t).then((function(e){o[a]=e,0===(i-=1)&&n(o)})).then(null,r)}))}else n([]);else r(new TypeError("Promise.all requires an array as input."))}))},e.prototype.then=function(t,n){var r=this;return new e((function(e,i){r._attachHandler({done:!1,onfulfilled:function(n){if(t)try{return void e(t(n))}catch(e){return void i(e)}else e(n)},onrejected:function(t){if(n)try{return void e(n(t))}catch(e){return void i(e)}else i(t)}})}))},e.prototype.catch=function(e){return this.then((function(e){return e}),e)},e.prototype.finally=function(t){var n=this;return new e((function(e,r){var i,o;return n.then((function(e){o=!1,i=e,t&&t()}),(function(e){o=!0,i=e,t&&t()})).then((function(){o?r(i):e(i)}))}))},e.prototype.toString=function(){return"[object SyncPromise]"},e}(),Zh=function(){function e(e){this._limit=e,this._buffer=[]}return e.prototype.isReady=function(){return void 0===this._limit||this.length()<this._limit},e.prototype.add=function(e){var t=this;return this.isReady()?(-1===this._buffer.indexOf(e)&&this._buffer.push(e),e.then((function(){return t.remove(e)})).then(null,(function(){return t.remove(e).then(null,(function(){}))})),e):Qh.reject(new cu("Not adding Promise due to buffer limit reached."))},e.prototype.remove=function(e){return this._buffer.splice(this._buffer.indexOf(e),1)[0]},e.prototype.length=function(){return this._buffer.length},e.prototype.drain=function(e){var t=this;return new Qh((function(n){var r=setTimeout((function(){e&&e>0&&n(!1)}),e);Qh.all(t._buffer).then((function(){clearTimeout(r),n(!0)})).then(null,(function(){n(!0)}))}))},e}();function ep(){if(!("fetch"in eh()))return!1;try{return new Headers,new Request(""),new Response,!0}catch(e){return!1}}function tp(e){return e&&/^function fetch\(\)\s+\{\s+\[native code\]\s+\}$/.test(e.toString())}function np(){if(!ep())return!1;try{return new Request("_",{referrerPolicy:"origin"}),!0}catch(e){return!1}}var rp,ip=eh(),op={},ap={};function sp(e){if(!ap[e])switch(ap[e]=!0,e){case"console":!function(){if(!("console"in ip))return;["debug","info","warn","error","log","assert"].forEach((function(e){e in ip.console&&Fh(ip.console,e,(function(t){return function(){for(var n=[],r=0;r<arguments.length;r++)n[r]=arguments[r];up("console",{args:n,level:e}),t&&Function.prototype.apply.call(t,ip.console,n)}}))}))}();break;case"dom":!function(){if(!("document"in ip))return;ip.document.addEventListener("click",gp("click",up.bind(null,"dom")),!1),ip.document.addEventListener("keypress",mp(up.bind(null,"dom")),!1),["EventTarget","Node"].forEach((function(e){var t=ip[e]&&ip[e].prototype;t&&t.hasOwnProperty&&t.hasOwnProperty("addEventListener")&&(Fh(t,"addEventListener",(function(e){return function(t,n,r){return n&&n.handleEvent?("click"===t&&Fh(n,"handleEvent",(function(e){return function(t){return gp("click",up.bind(null,"dom"))(t),e.call(this,t)}})),"keypress"===t&&Fh(n,"handleEvent",(function(e){return function(t){return mp(up.bind(null,"dom"))(t),e.call(this,t)}}))):("click"===t&&gp("click",up.bind(null,"dom"),!0)(this),"keypress"===t&&mp(up.bind(null,"dom"))(this)),e.call(this,t,n,r)}})),Fh(t,"removeEventListener",(function(e){return function(t,n,r){try{e.call(this,t,n.__sentry_wrapped__,r)}catch(e){}return e.call(this,t,n,r)}})))}))}();break;case"xhr":!function(){if(!("XMLHttpRequest"in ip))return;var e=XMLHttpRequest.prototype;Fh(e,"open",(function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=this,i=t[1];r.__sentry_xhr__={method:hu(t[0])?t[0].toUpperCase():t[0],url:t[1]},hu(i)&&"POST"===r.__sentry_xhr__.method&&i.match(/sentry_key/)&&(r.__sentry_own_request__=!0);var o=function(){if(4===r.readyState){try{r.__sentry_xhr__&&(r.__sentry_xhr__.status_code=r.status)}catch(e){}up("xhr",{args:t,endTimestamp:Date.now(),startTimestamp:Date.now(),xhr:r})}};return"onreadystatechange"in r&&"function"==typeof r.onreadystatechange?Fh(r,"onreadystatechange",(function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return o(),e.apply(r,t)}})):r.addEventListener("readystatechange",o),e.apply(r,t)}})),Fh(e,"send",(function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];return up("xhr",{args:t,startTimestamp:Date.now(),xhr:this}),e.apply(this,t)}}))}();break;case"fetch":!function(){if(!function(){if(!ep())return!1;var e=eh();if(tp(e.fetch))return!0;var t=!1,n=e.document;if(n&&"function"==typeof n.createElement)try{var r=n.createElement("iframe");r.hidden=!0,n.head.appendChild(r),r.contentWindow&&r.contentWindow.fetch&&(t=tp(r.contentWindow.fetch)),n.head.removeChild(r)}catch(e){wh.warn("Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ",e)}return t}())return;Fh(ip,"fetch",(function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r={args:t,fetchData:{method:lp(t),url:fp(t)},startTimestamp:Date.now()};return up("fetch",Zc({},r)),e.apply(ip,t).then((function(e){return up("fetch",Zc(Zc({},r),{endTimestamp:Date.now(),response:e})),e}),(function(e){throw up("fetch",Zc(Zc({},r),{endTimestamp:Date.now(),error:e})),e}))}}))}();break;case"history":!function(){if(!function(){var e=eh(),t=e.chrome,n=t&&t.app&&t.app.runtime,r="history"in e&&!!e.history.pushState&&!!e.history.replaceState;return!n&&r}())return;var e=ip.onpopstate;function t(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=t.length>2?t[2]:void 0;if(r){var i=rp,o=String(r);rp=o,up("history",{from:i,to:o})}return e.apply(this,t)}}ip.onpopstate=function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=ip.location.href,i=rp;if(rp=r,up("history",{from:i,to:r}),e)return e.apply(this,t)},Fh(ip.history,"pushState",t),Fh(ip.history,"replaceState",t)}();break;case"error":vp=ip.onerror,ip.onerror=function(e,t,n,r,i){return up("error",{column:r,error:i,line:n,msg:e,url:t}),!!vp&&vp.apply(this,arguments)};break;case"unhandledrejection":yp=ip.onunhandledrejection,ip.onunhandledrejection=function(e){return up("unhandledrejection",e),!yp||yp.apply(this,arguments)};break;default:wh.warn("unknown instrumentation type:",e)}}function cp(e){e&&"string"==typeof e.type&&"function"==typeof e.callback&&(op[e.type]=op[e.type]||[],op[e.type].push(e.callback),sp(e.type))}function up(e,t){var n,r;if(e&&op[e])try{for(var i=function(e){var t="function"==typeof Symbol&&Symbol.iterator,n=t&&e[t],r=0;if(n)return n.call(e);if(e&&"number"==typeof e.length)return{next:function(){return e&&r>=e.length&&(e=void 0),{value:e&&e[r++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}(op[e]||[]),o=i.next();!o.done;o=i.next()){var a=o.value;try{a(t)}catch(t){wh.error("Error while triggering instrumentation handler.\nType: "+e+"\nName: "+mh(a)+"\nError: "+t)}}}catch(e){n={error:e}}finally{try{o&&!o.done&&(r=i.return)&&r.call(i)}finally{if(n)throw n.error}}}function lp(e){return void 0===e&&(e=[]),"Request"in ip&&yu(e[0],Request)&&e[0].method?String(e[0].method).toUpperCase():e[1]&&e[1].method?String(e[1].method).toUpperCase():"GET"}function fp(e){return void 0===e&&(e=[]),"string"==typeof e[0]?e[0]:"Request"in ip&&yu(e[0],Request)?e[0].url:String(e[0])}var hp,pp,dp=0;function gp(e,t,n){return void 0===n&&(n=!1),function(r){hp=void 0,r&&pp!==r&&(pp=r,dp&&clearTimeout(dp),n?dp=setTimeout((function(){t({event:r,name:e})})):t({event:r,name:e}))}}function mp(e){return function(t){var n;try{n=t.target}catch(e){return}var r=n&&n.tagName;r&&("INPUT"===r||"TEXTAREA"===r||n.isContentEditable)&&(hp||gp("input",e)(t),clearTimeout(hp),hp=setTimeout((function(){hp=void 0}),1e3))}}var vp=null;var yp=null;var bp=/^(?:(\w+):)\/\/(?:(\w+)(?::(\w+))?@)([\w.-]+)(?::(\d+))?\/(.+)/,wp="Invalid Dsn",_p=function(){function e(e){"string"==typeof e?this._fromString(e):this._fromComponents(e),this._validate()}return e.prototype.toString=function(e){void 0===e&&(e=!1);var t=this,n=t.host,r=t.path,i=t.pass,o=t.port,a=t.projectId;return t.protocol+"://"+t.user+(e&&i?":"+i:"")+"@"+n+(o?":"+o:"")+"/"+(r?r+"/":r)+a},e.prototype._fromString=function(e){var t=bp.exec(e);if(!t)throw new cu(wp);var n=eu(t.slice(1),6),r=n[0],i=n[1],o=n[2],a=void 0===o?"":o,s=n[3],c=n[4],u=void 0===c?"":c,l="",f=n[5],h=f.split("/");if(h.length>1&&(l=h.slice(0,-1).join("/"),f=h.pop()),f){var p=f.match(/^\d+/);p&&(f=p[0])}this._fromComponents({host:s,pass:a,path:l,projectId:f,port:u,protocol:r,user:i})},e.prototype._fromComponents=function(e){this.protocol=e.protocol,this.user=e.user,this.pass=e.pass||"",this.host=e.host,this.port=e.port||"",this.path=e.path||"",this.projectId=e.projectId},e.prototype._validate=function(){var e=this;if(["protocol","user","host","projectId"].forEach((function(t){if(!e[t])throw new cu("Invalid Dsn: "+t+" missing")})),!this.projectId.match(/^\d+$/))throw new cu("Invalid Dsn: Invalid projectId "+this.projectId);if("http"!==this.protocol&&"https"!==this.protocol)throw new cu("Invalid Dsn: Invalid protocol "+this.protocol);if(this.port&&isNaN(parseInt(this.port,10)))throw new cu("Invalid Dsn: Invalid port "+this.port)},e}(),Ep=function(){function e(){this._notifyingListeners=!1,this._scopeListeners=[],this._eventProcessors=[],this._breadcrumbs=[],this._user={},this._tags={},this._extra={},this._contexts={}}return e.clone=function(t){var n=new e;return t&&(n._breadcrumbs=tu(t._breadcrumbs),n._tags=Zc({},t._tags),n._extra=Zc({},t._extra),n._contexts=Zc({},t._contexts),n._user=t._user,n._level=t._level,n._span=t._span,n._transactionName=t._transactionName,n._fingerprint=t._fingerprint,n._eventProcessors=tu(t._eventProcessors)),n},e.prototype.addScopeListener=function(e){this._scopeListeners.push(e)},e.prototype.addEventProcessor=function(e){return this._eventProcessors.push(e),this},e.prototype.setUser=function(e){return this._user=e||{},this._notifyScopeListeners(),this},e.prototype.setTags=function(e){return this._tags=Zc(Zc({},this._tags),e),this._notifyScopeListeners(),this},e.prototype.setTag=function(e,t){var n;return this._tags=Zc(Zc({},this._tags),((n={})[e]=t,n)),this._notifyScopeListeners(),this},e.prototype.setExtras=function(e){return this._extra=Zc(Zc({},this._extra),e),this._notifyScopeListeners(),this},e.prototype.setExtra=function(e,t){var n;return this._extra=Zc(Zc({},this._extra),((n={})[e]=t,n)),this._notifyScopeListeners(),this},e.prototype.setFingerprint=function(e){return this._fingerprint=e,this._notifyScopeListeners(),this},e.prototype.setLevel=function(e){return this._level=e,this._notifyScopeListeners(),this},e.prototype.setTransactionName=function(e){return this._transactionName=e,this._notifyScopeListeners(),this},e.prototype.setTransaction=function(e){return this.setTransactionName(e)},e.prototype.setContext=function(e,t){var n;return this._contexts=Zc(Zc({},this._contexts),((n={})[e]=t,n)),this._notifyScopeListeners(),this},e.prototype.setSpan=function(e){return this._span=e,this._notifyScopeListeners(),this},e.prototype.getSpan=function(){return this._span},e.prototype.getTransaction=function(){var e=this.getSpan();if(e&&e.spanRecorder&&e.spanRecorder.spans[0])return e.spanRecorder.spans[0]},e.prototype.update=function(t){if(!t)return this;if("function"==typeof t){var n=t(this);return n instanceof e?n:this}return t instanceof e?(this._tags=Zc(Zc({},this._tags),t._tags),this._extra=Zc(Zc({},this._extra),t._extra),this._contexts=Zc(Zc({},this._contexts),t._contexts),t._user&&(this._user=t._user),t._level&&(this._level=t._level),t._fingerprint&&(this._fingerprint=t._fingerprint)):du(t)&&(t=t,this._tags=Zc(Zc({},this._tags),t.tags),this._extra=Zc(Zc({},this._extra),t.extra),this._contexts=Zc(Zc({},this._contexts),t.contexts),t.user&&(this._user=t.user),t.level&&(this._level=t.level),t.fingerprint&&(this._fingerprint=t.fingerprint)),this},e.prototype.clear=function(){return this._breadcrumbs=[],this._tags={},this._extra={},this._user={},this._contexts={},this._level=void 0,this._transactionName=void 0,this._fingerprint=void 0,this._span=void 0,this._notifyScopeListeners(),this},e.prototype.addBreadcrumb=function(e,t){var n=Zc({timestamp:ph()},e);return this._breadcrumbs=void 0!==t&&t>=0?tu(this._breadcrumbs,[n]).slice(-t):tu(this._breadcrumbs,[n]),this._notifyScopeListeners(),this},e.prototype.clearBreadcrumbs=function(){return this._breadcrumbs=[],this._notifyScopeListeners(),this},e.prototype.applyToEvent=function(e,t){return this._extra&&Object.keys(this._extra).length&&(e.extra=Zc(Zc({},this._extra),e.extra)),this._tags&&Object.keys(this._tags).length&&(e.tags=Zc(Zc({},this._tags),e.tags)),this._user&&Object.keys(this._user).length&&(e.user=Zc(Zc({},this._user),e.user)),this._contexts&&Object.keys(this._contexts).length&&(e.contexts=Zc(Zc({},this._contexts),e.contexts)),this._level&&(e.level=this._level),this._transactionName&&(e.transaction=this._transactionName),this._span&&(e.contexts=Zc({trace:this._span.getTraceContext()},e.contexts)),this._applyFingerprint(e),e.breadcrumbs=tu(e.breadcrumbs||[],this._breadcrumbs),e.breadcrumbs=e.breadcrumbs.length>0?e.breadcrumbs:void 0,this._notifyEventProcessors(tu(Sp(),this._eventProcessors),e,t)},e.prototype._notifyEventProcessors=function(e,t,n,r){var i=this;return void 0===r&&(r=0),new Qh((function(o,a){var s=e[r];if(null===t||"function"!=typeof s)o(t);else{var c=s(Zc({},t),n);vu(c)?c.then((function(t){return i._notifyEventProcessors(e,t,n,r+1).then(o)})).then(null,a):i._notifyEventProcessors(e,c,n,r+1).then(o).then(null,a)}}))},e.prototype._notifyScopeListeners=function(){var e=this;this._notifyingListeners||(this._notifyingListeners=!0,setTimeout((function(){e._scopeListeners.forEach((function(t){t(e)})),e._notifyingListeners=!1})))},e.prototype._applyFingerprint=function(e){e.fingerprint=e.fingerprint?Array.isArray(e.fingerprint)?e.fingerprint:[e.fingerprint]:[],this._fingerprint&&(e.fingerprint=e.fingerprint.concat(this._fingerprint)),e.fingerprint&&!e.fingerprint.length&&delete e.fingerprint},e}();function Sp(){var e=eh();return e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.globalEventProcessors=e.__SENTRY__.globalEventProcessors||[],e.__SENTRY__.globalEventProcessors}function kp(e){Sp().push(e)}var Tp=function(){function e(e,t,n){void 0===t&&(t=new Ep),void 0===n&&(n=3),this._version=n,this._stack=[],this._stack.push({client:e,scope:t}),this.bindClient(e)}return e.prototype.isOlderThan=function(e){return this._version<e},e.prototype.bindClient=function(e){this.getStackTop().client=e,e&&e.setupIntegrations&&e.setupIntegrations()},e.prototype.pushScope=function(){var e=this.getStack(),t=e.length>0?e[e.length-1].scope:void 0,n=Ep.clone(t);return this.getStack().push({client:this.getClient(),scope:n}),n},e.prototype.popScope=function(){return void 0!==this.getStack().pop()},e.prototype.withScope=function(e){var t=this.pushScope();try{e(t)}finally{this.popScope()}},e.prototype.getClient=function(){return this.getStackTop().client},e.prototype.getScope=function(){return this.getStackTop().scope},e.prototype.getStack=function(){return this._stack},e.prototype.getStackTop=function(){return this._stack[this._stack.length-1]},e.prototype.captureException=function(e,t){var n=this._lastEventId=th(),r=t;if(!t){var i=void 0;try{throw new Error("Sentry syntheticException")}catch(e){i=e}r={originalException:e,syntheticException:i}}return this._invokeClient("captureException",e,Zc(Zc({},r),{event_id:n})),n},e.prototype.captureMessage=function(e,t,n){var r=this._lastEventId=th(),i=n;if(!n){var o=void 0;try{throw new Error(e)}catch(e){o=e}i={originalException:e,syntheticException:o}}return this._invokeClient("captureMessage",e,t,Zc(Zc({},i),{event_id:r})),r},e.prototype.captureEvent=function(e,t){var n=this._lastEventId=th();return this._invokeClient("captureEvent",e,Zc(Zc({},t),{event_id:n})),n},e.prototype.lastEventId=function(){return this._lastEventId},e.prototype.addBreadcrumb=function(e,t){var n=this.getStackTop();if(n.scope&&n.client){var r=n.client.getOptions&&n.client.getOptions()||{},i=r.beforeBreadcrumb,o=void 0===i?null:i,a=r.maxBreadcrumbs,s=void 0===a?100:a;if(!(s<=0)){var c=ph(),u=Zc({timestamp:c},e),l=o?ih((function(){return o(u,t)})):u;null!==l&&n.scope.addBreadcrumb(l,Math.min(s,100))}}},e.prototype.setUser=function(e){var t=this.getStackTop();t.scope&&t.scope.setUser(e)},e.prototype.setTags=function(e){var t=this.getStackTop();t.scope&&t.scope.setTags(e)},e.prototype.setExtras=function(e){var t=this.getStackTop();t.scope&&t.scope.setExtras(e)},e.prototype.setTag=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setTag(e,t)},e.prototype.setExtra=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setExtra(e,t)},e.prototype.setContext=function(e,t){var n=this.getStackTop();n.scope&&n.scope.setContext(e,t)},e.prototype.configureScope=function(e){var t=this.getStackTop();t.scope&&t.client&&e(t.scope)},e.prototype.run=function(e){var t=Ap(this);try{e(this)}finally{Ap(t)}},e.prototype.getIntegration=function(e){var t=this.getClient();if(!t)return null;try{return t.getIntegration(e)}catch(t){return wh.warn("Cannot retrieve integration "+e.id+" from the current Hub"),null}},e.prototype.startSpan=function(e){return this._callExtensionMethod("startSpan",e)},e.prototype.startTransaction=function(e){return this._callExtensionMethod("startTransaction",e)},e.prototype.traceHeaders=function(){return this._callExtensionMethod("traceHeaders")},e.prototype._invokeClient=function(e){for(var t,n=[],r=1;r<arguments.length;r++)n[r-1]=arguments[r];var i=this.getStackTop();i&&i.client&&i.client[e]&&(t=i.client)[e].apply(t,tu(n,[i.scope]))},e.prototype._callExtensionMethod=function(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=xp(),i=r.__SENTRY__;if(i&&i.extensions&&"function"==typeof i.extensions[e])return i.extensions[e].apply(this,t);wh.warn("Extension method "+e+" couldn't be found, doing nothing.")},e}();function xp(){var e=eh();return e.__SENTRY__=e.__SENTRY__||{extensions:{},hub:void 0},e}function Ap(e){var t=xp(),n=Cp(t);return Pp(t,e),n}function Op(){var e=xp();return Ip(e)&&!Cp(e).isOlderThan(3)||Pp(e,new Tp),Qf()?function(e){try{var t="domain",n=xp().__SENTRY__;if(!n||!n.extensions||!n.extensions[t])return Cp(e);var r=n.extensions[t].active;if(!r)return Cp(e);if(!Ip(r)||Cp(r).isOlderThan(3)){var i=Cp(e).getStackTop();Pp(r,new Tp(i.client,Ep.clone(i.scope)))}return Cp(r)}catch(t){return Cp(e)}}(e):Cp(e)}function Ip(e){return!!(e&&e.__SENTRY__&&e.__SENTRY__.hub)}function Cp(e){return e&&e.__SENTRY__&&e.__SENTRY__.hub||(e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.hub=new Tp),e.__SENTRY__.hub}function Pp(e,t){return!!e&&(e.__SENTRY__=e.__SENTRY__||{},e.__SENTRY__.hub=t,!0)}function jp(e){for(var t=[],n=1;n<arguments.length;n++)t[n-1]=arguments[n];var r=Op();if(r&&r[e])return r[e].apply(r,tu(t));throw new Error("No hub defined or "+e+" was not found on the hub, please open a bug report.")}function Rp(e,t){var n;try{throw new Error("Sentry syntheticException")}catch(e){n=e}return jp("captureException",e,{captureContext:t,originalException:e,syntheticException:n})}function Lp(e){jp("withScope",e)}var Np=function(){function e(e){this.dsn=e,this._dsnObject=new _p(e)}return e.prototype.getDsn=function(){return this._dsnObject},e.prototype.getBaseApiEndpoint=function(){var e=this._dsnObject,t=e.protocol?e.protocol+":":"",n=e.port?":"+e.port:"";return t+"//"+e.host+n+(e.path?"/"+e.path:"")+"/api/"},e.prototype.getStoreEndpoint=function(){return this._getIngestEndpoint("store")},e.prototype.getStoreEndpointWithUrlEncodedAuth=function(){return this.getStoreEndpoint()+"?"+this._encodedAuth()},e.prototype.getEnvelopeEndpointWithUrlEncodedAuth=function(){return this._getEnvelopeEndpoint()+"?"+this._encodedAuth()},e.prototype.getStoreEndpointPath=function(){var e=this._dsnObject;return(e.path?"/"+e.path:"")+"/api/"+e.projectId+"/store/"},e.prototype.getRequestHeaders=function(e,t){var n=this._dsnObject,r=["Sentry sentry_version=7"];return r.push("sentry_client="+e+"/"+t),r.push("sentry_key="+n.user),n.pass&&r.push("sentry_secret="+n.pass),{"Content-Type":"application/json","X-Sentry-Auth":r.join(", ")}},e.prototype.getReportDialogEndpoint=function(e){void 0===e&&(e={});var t=this._dsnObject,n=this.getBaseApiEndpoint()+"embed/error-page/",r=[];for(var i in r.push("dsn="+t.toString()),e)if("user"===i){if(!e.user)continue;e.user.name&&r.push("name="+encodeURIComponent(e.user.name)),e.user.email&&r.push("email="+encodeURIComponent(e.user.email))}else r.push(encodeURIComponent(i)+"="+encodeURIComponent(e[i]));return r.length?n+"?"+r.join("&"):n},e.prototype._getEnvelopeEndpoint=function(){return this._getIngestEndpoint("envelope")},e.prototype._getIngestEndpoint=function(e){return""+this.getBaseApiEndpoint()+this._dsnObject.projectId+"/"+e+"/"},e.prototype._encodedAuth=function(){var e,t={sentry_key:this._dsnObject.user,sentry_version:"7"};return e=t,Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")},e}(),Mp=[];function Up(e){var t={};return function(e){var t=e.defaultIntegrations&&tu(e.defaultIntegrations)||[],n=e.integrations,r=[];if(Array.isArray(n)){var i=n.map((function(e){return e.name})),o=[];t.forEach((function(e){-1===i.indexOf(e.name)&&-1===o.indexOf(e.name)&&(r.push(e),o.push(e.name))})),n.forEach((function(e){-1===o.indexOf(e.name)&&(r.push(e),o.push(e.name))}))}else"function"==typeof n?(r=n(t),r=Array.isArray(r)?r:[r]):r=tu(t);var a=r.map((function(e){return e.name})),s="Debug";return-1!==a.indexOf(s)&&r.push.apply(r,tu(r.splice(a.indexOf(s),1))),r}(e).forEach((function(e){t[e.name]=e,function(e){-1===Mp.indexOf(e.name)&&(e.setupOnce(kp,Op),Mp.push(e.name),wh.log("Integration installed: "+e.name))}(e)})),t}var Dp,Fp=function(){function e(e,t){this._integrations={},this._processing=!1,this._backend=new e(t),this._options=t,t.dsn&&(this._dsn=new _p(t.dsn))}return e.prototype.captureException=function(e,t,n){var r=this,i=t&&t.event_id;return this._processing=!0,this._getBackend().eventFromException(e,t).then((function(e){i=r.captureEvent(e,t,n)})),i},e.prototype.captureMessage=function(e,t,n,r){var i=this,o=n&&n.event_id;return this._processing=!0,(pu(e)?this._getBackend().eventFromMessage(""+e,t,n):this._getBackend().eventFromException(e,n)).then((function(e){o=i.captureEvent(e,n,r)})),o},e.prototype.captureEvent=function(e,t,n){var r=this,i=t&&t.event_id;return this._processing=!0,this._processEvent(e,t,n).then((function(e){i=e&&e.event_id,r._processing=!1})).then(null,(function(e){wh.error(e),r._processing=!1})),i},e.prototype.getDsn=function(){return this._dsn},e.prototype.getOptions=function(){return this._options},e.prototype.flush=function(e){var t=this;return this._isClientProcessing(e).then((function(n){return clearInterval(n.interval),t._getBackend().getTransport().close(e).then((function(e){return n.ready&&e}))}))},e.prototype.close=function(e){var t=this;return this.flush(e).then((function(e){return t.getOptions().enabled=!1,e}))},e.prototype.setupIntegrations=function(){this._isEnabled()&&(this._integrations=Up(this._options))},e.prototype.getIntegration=function(e){try{return this._integrations[e.id]||null}catch(t){return wh.warn("Cannot retrieve integration "+e.id+" from the current Client"),null}},e.prototype._isClientProcessing=function(e){var t=this;return new Qh((function(n){var r=0,i=0;clearInterval(i),i=setInterval((function(){t._processing?(r+=1,e&&r>=e&&n({interval:i,ready:!1})):n({interval:i,ready:!0})}),1)}))},e.prototype._getBackend=function(){return this._backend},e.prototype._isEnabled=function(){return!1!==this.getOptions().enabled&&void 0!==this._dsn},e.prototype._prepareEvent=function(e,t,n){var r=this,i=this.getOptions().normalizeDepth,o=void 0===i?3:i,a=Zc(Zc({},e),{event_id:e.event_id||(n&&n.event_id?n.event_id:th()),timestamp:e.timestamp||ph()});this._applyClientOptions(a),this._applyIntegrationsMetadata(a);var s=t;n&&n.captureContext&&(s=Ep.clone(s).update(n.captureContext));var c=Qh.resolve(a);return s&&(c=s.applyToEvent(a,n)),c.then((function(e){return"number"==typeof o&&o>0?r._normalizeEvent(e,o):e}))},e.prototype._normalizeEvent=function(e,t){if(!e)return null;var n=Zc(Zc(Zc(Zc(Zc({},e),e.breadcrumbs&&{breadcrumbs:e.breadcrumbs.map((function(e){return Zc(Zc({},e),e.data&&{data:zh(e.data,t)})}))}),e.user&&{user:zh(e.user,t)}),e.contexts&&{contexts:zh(e.contexts,t)}),e.extra&&{extra:zh(e.extra,t)});return e.contexts&&e.contexts.trace&&(n.contexts.trace=e.contexts.trace),n},e.prototype._applyClientOptions=function(e){var t=this.getOptions(),n=t.environment,r=t.release,i=t.dist,o=t.maxValueLength,a=void 0===o?250:o;void 0===e.environment&&void 0!==n&&(e.environment=n),void 0===e.release&&void 0!==r&&(e.release=r),void 0===e.dist&&void 0!==i&&(e.dist=i),e.message&&(e.message=Kf(e.message,a));var s=e.exception&&e.exception.values&&e.exception.values[0];s&&s.value&&(s.value=Kf(s.value,a));var c=e.request;c&&c.url&&(c.url=Kf(c.url,a))},e.prototype._applyIntegrationsMetadata=function(e){var t=e.sdk,n=Object.keys(this._integrations);t&&n.length>0&&(t.integrations=n)},e.prototype._sendEvent=function(e){this._getBackend().sendEvent(e)},e.prototype._processEvent=function(e,t,n){var r=this,i=this.getOptions(),o=i.beforeSend,a=i.sampleRate;if(!this._isEnabled())return Qh.reject("SDK not enabled, will not send event.");var s="transaction"===e.type;return!s&&"number"==typeof a&&Math.random()>a?Qh.reject("This event has been sampled, will not send event."):new Qh((function(i,a){r._prepareEvent(e,n,t).then((function(e){if(null!==e){var n=e;if(t&&t.data&&!0===t.data.__sentry__||!o||s)return r._sendEvent(n),void i(n);var c=o(e,t);if(void 0===c)wh.error("`beforeSend` method has to return `null` or a valid event.");else if(vu(c))r._handleAsyncBeforeSend(c,i,a);else{if(null===(n=c))return wh.log("`beforeSend` returned `null`, will not send event."),void i(null);r._sendEvent(n),i(n)}}else a("An event processor returned null, will not send event.")})).then(null,(function(e){r.captureException(e,{data:{__sentry__:!0},originalException:e}),a("Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\nReason: "+e)}))}))},e.prototype._handleAsyncBeforeSend=function(e,t,n){var r=this;e.then((function(e){null!==e?(r._sendEvent(e),t(e)):n("`beforeSend` returned `null`, will not send event.")})).then(null,(function(e){n("beforeSend rejected with "+e)}))},e}(),qp=function(){function e(){}return e.prototype.sendEvent=function(e){return Qh.resolve({reason:"NoopTransport: Event has been skipped because no Dsn is configured.",status:Qc.Skipped})},e.prototype.close=function(e){return Qh.resolve(!0)},e}(),Bp=function(){function e(e){this._options=e,this._options.dsn||wh.warn("No DSN provided, backend will not do anything."),this._transport=this._setupTransport()}return e.prototype.eventFromException=function(e,t){throw new cu("Backend has to implement `eventFromException` method")},e.prototype.eventFromMessage=function(e,t,n){throw new cu("Backend has to implement `eventFromMessage` method")},e.prototype.sendEvent=function(e){this._transport.sendEvent(e).then(null,(function(e){wh.error("Error while sending event: "+e)}))},e.prototype.getTransport=function(){return this._transport},e.prototype._setupTransport=function(){return new qp},e}();function Hp(e,t){var n="transaction"===e.type,r={body:JSON.stringify(e),url:n?t.getEnvelopeEndpointWithUrlEncodedAuth():t.getStoreEndpointWithUrlEncodedAuth()};if(n){var i=JSON.stringify({event_id:e.event_id,sent_at:new Date(1e3*ph()).toISOString()})+"\n"+JSON.stringify({type:e.type})+"\n"+r.body;r.body=i}return r}var Vp=function(){function e(){this.name=e.id}return e.prototype.setupOnce=function(){Dp=Function.prototype.toString,Function.prototype.toString=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];var n=this.__sentry_original__||this;return Dp.apply(n,e)}},e.id="FunctionToString",e}(),Wp=ze.some,zp=Ye("some"),Yp=Xe("some");Ce({target:"Array",proto:!0,forced:!zp||!Yp},{some:function(e){return Wp(this,e,arguments.length>1?arguments[1]:void 0)}});var $p=[/^Script error\.?$/,/^Javascript error: Script error\.? on line 0$/],Gp=function(){function e(t){void 0===t&&(t={}),this._options=t,this.name=e.id}return e.prototype.setupOnce=function(){kp((function(t){var n=Op();if(!n)return t;var r=n.getIntegration(e);if(r){var i=n.getClient(),o=i?i.getOptions():{},a=r._mergeOptions(o);if(r._shouldDropEvent(t,a))return null}return t}))},e.prototype._shouldDropEvent=function(e,t){return this._isSentryError(e,t)?(wh.warn("Event dropped due to being internal Sentry Error.\nEvent: "+rh(e)),!0):this._isIgnoredError(e,t)?(wh.warn("Event dropped due to being matched by `ignoreErrors` option.\nEvent: "+rh(e)),!0):this._isDeniedUrl(e,t)?(wh.warn("Event dropped due to being matched by `denyUrls` option.\nEvent: "+rh(e)+".\nUrl: "+this._getEventFilterUrl(e)),!0):!this._isAllowedUrl(e,t)&&(wh.warn("Event dropped due to not being matched by `allowUrls` option.\nEvent: "+rh(e)+".\nUrl: "+this._getEventFilterUrl(e)),!0)},e.prototype._isSentryError=function(e,t){if(!t.ignoreInternal)return!1;try{return e&&e.exception&&e.exception.values&&e.exception.values[0]&&"SentryError"===e.exception.values[0].type||!1}catch(e){return!1}},e.prototype._isIgnoredError=function(e,t){return!(!t.ignoreErrors||!t.ignoreErrors.length)&&this._getPossibleEventMessages(e).some((function(e){return t.ignoreErrors.some((function(t){return Jf(e,t)}))}))},e.prototype._isDeniedUrl=function(e,t){if(!t.denyUrls||!t.denyUrls.length)return!1;var n=this._getEventFilterUrl(e);return!!n&&t.denyUrls.some((function(e){return Jf(n,e)}))},e.prototype._isAllowedUrl=function(e,t){if(!t.allowUrls||!t.allowUrls.length)return!0;var n=this._getEventFilterUrl(e);return!n||t.allowUrls.some((function(e){return Jf(n,e)}))},e.prototype._mergeOptions=function(e){return void 0===e&&(e={}),{allowUrls:tu(this._options.whitelistUrls||[],this._options.allowUrls||[],e.whitelistUrls||[],e.allowUrls||[]),denyUrls:tu(this._options.blacklistUrls||[],this._options.denyUrls||[],e.blacklistUrls||[],e.denyUrls||[]),ignoreErrors:tu(this._options.ignoreErrors||[],e.ignoreErrors||[],$p),ignoreInternal:void 0===this._options.ignoreInternal||this._options.ignoreInternal}},e.prototype._getPossibleEventMessages=function(e){if(e.message)return[e.message];if(e.exception)try{var t=e.exception.values&&e.exception.values[0]||{},n=t.type,r=void 0===n?"":n,i=t.value,o=void 0===i?"":i;return[""+o,r+": "+o]}catch(t){return wh.error("Cannot extract message for event "+rh(e)),[]}return[]},e.prototype._getEventFilterUrl=function(e){try{if(e.stacktrace){var t=e.stacktrace.frames;return t&&t[t.length-1].filename||null}if(e.exception){var n=e.exception.values&&e.exception.values[0].stacktrace&&e.exception.values[0].stacktrace.frames;return n&&n[n.length-1].filename||null}return null}catch(t){return wh.error("Cannot extract url for event "+rh(e)),null}},e.id="InboundFilters",e}(),Kp="?",Xp=/^\s*at (?:(.*?) ?\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\/).*?)(?::(\d+))?(?::(\d+))?\)?\s*$/i,Jp=/^\s*(.*?)(?:\((.*?)\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\/.*?|\[native code\]|[^@]*(?:bundle|\d+\.js))(?::(\d+))?(?::(\d+))?\s*$/i,Qp=/^\s*at (?:((?:\[object object\])?.+) )?\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\d+)(?::(\d+))?\)?\s*$/i,Zp=/(\S+) line (\d+)(?: > eval line \d+)* > eval/i,ed=/\((\S*)(?::(\d+))(?::(\d+))\)/,td=/Minified React error #\d+;/i;function nd(e){var t=null,n=0;e&&("number"==typeof e.framesToPop?n=e.framesToPop:td.test(e.message)&&(n=1));try{if(t=function(e){if(!e||!e.stacktrace)return null;for(var t,n=e.stacktrace,r=/ line (\d+).*script (?:in )?(\S+)(?:: in function (\S+))?$/i,i=/ line (\d+), column (\d+)\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\((.*)\))? in (.*):\s*$/i,o=n.split("\n"),a=[],s=0;s<o.length;s+=2){var c=null;(t=r.exec(o[s]))?c={url:t[2],func:t[3],args:[],line:+t[1],column:null}:(t=i.exec(o[s]))&&(c={url:t[6],func:t[3]||t[4],args:t[5]?t[5].split(","):[],line:+t[1],column:+t[2]}),c&&(!c.func&&c.line&&(c.func=Kp),a.push(c))}if(!a.length)return null;return{message:id(e),name:e.name,stack:a}}(e))return rd(t,n)}catch(e){}try{if(t=function(e){if(!e||!e.stack)return null;for(var t,n,r,i=[],o=e.stack.split("\n"),a=0;a<o.length;++a){if(n=Xp.exec(o[a])){var s=n[2]&&0===n[2].indexOf("native");n[2]&&0===n[2].indexOf("eval")&&(t=ed.exec(n[2]))&&(n[2]=t[1],n[3]=t[2],n[4]=t[3]),r={url:n[2]&&0===n[2].indexOf("address at ")?n[2].substr("address at ".length):n[2],func:n[1]||Kp,args:s?[n[2]]:[],line:n[3]?+n[3]:null,column:n[4]?+n[4]:null}}else if(n=Qp.exec(o[a]))r={url:n[2],func:n[1]||Kp,args:[],line:+n[3],column:n[4]?+n[4]:null};else{if(!(n=Jp.exec(o[a])))continue;n[3]&&n[3].indexOf(" > eval")>-1&&(t=Zp.exec(n[3]))?(n[1]=n[1]||"eval",n[3]=t[1],n[4]=t[2],n[5]=""):0!==a||n[5]||void 0===e.columnNumber||(i[0].column=e.columnNumber+1),r={url:n[3],func:n[1]||Kp,args:n[2]?n[2].split(","):[],line:n[4]?+n[4]:null,column:n[5]?+n[5]:null}}!r.func&&r.line&&(r.func=Kp),i.push(r)}if(!i.length)return null;return{message:id(e),name:e.name,stack:i}}(e))return rd(t,n)}catch(e){}return{message:id(e),name:e&&e.name,stack:[],failed:!0}}function rd(e,t){try{return Zc(Zc({},e),{stack:e.stack.slice(t)})}catch(t){return e}}function id(e){var t=e&&e.message;return t?t.error&&"string"==typeof t.error.message?t.error.message:t:"No error message"}function od(e){var t=sd(e.stack),n={type:e.name,value:e.message};return t&&t.length&&(n.stacktrace={frames:t}),void 0===n.type&&""===n.value&&(n.value="Unrecoverable error caught"),n}function ad(e){return{exception:{values:[od(e)]}}}function sd(e){if(!e||!e.length)return[];var t=e,n=t[0].func||"",r=t[t.length-1].func||"";return-1===n.indexOf("captureMessage")&&-1===n.indexOf("captureException")||(t=t.slice(1)),-1!==r.indexOf("sentryWrapped")&&(t=t.slice(0,-1)),t.slice(0,50).map((function(e){return{colno:null===e.column?void 0:e.column,filename:e.url||t[0].url,function:e.func||"?",in_app:!0,lineno:null===e.line?void 0:e.line}})).reverse()}function cd(e,t,n){var r,i;if(void 0===n&&(n={}),lu(e)&&e.error)return r=ad(nd(e=e.error));if(fu(e)||(i=e,"[object DOMException]"===Object.prototype.toString.call(i))){var o=e,a=o.name||(fu(o)?"DOMError":"DOMException"),s=o.message?a+": "+o.message:a;return oh(r=ud(s,t,n),s),r}return uu(e)?r=ad(nd(e)):du(e)||gu(e)?(ah(r=function(e,t,n){var r={exception:{values:[{type:gu(e)?e.constructor.name:n?"UnhandledRejection":"Error",value:"Non-Error "+(n?"promise rejection":"exception")+" captured with keys: "+Yh(e)}]},extra:{__serialized__:Hh(e)}};if(t){var i=sd(nd(t).stack);r.stacktrace={frames:i}}return r}(e,t,n.rejection),{synthetic:!0}),r):(oh(r=ud(e,t,n),""+e,void 0),ah(r,{synthetic:!0}),r)}function ud(e,t,n){void 0===n&&(n={});var r={message:e};if(n.attachStacktrace&&t){var i=sd(nd(t).stack);r.stacktrace={frames:i}}return r}var ld=function(){function e(e){this.options=e,this._buffer=new Zh(30),this._api=new Np(this.options.dsn),this.url=this._api.getStoreEndpointWithUrlEncodedAuth()}return e.prototype.sendEvent=function(e){throw new cu("Transport Class has to implement `sendEvent` method")},e.prototype.close=function(e){return this._buffer.drain(e)},e}(),fd=eh(),hd=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._disabledUntil=new Date(Date.now()),t}return Xc(t,e),t.prototype.sendEvent=function(e){var t=this;if(new Date(Date.now())<this._disabledUntil)return Promise.reject({event:e,reason:"Transport locked till "+this._disabledUntil+" due to too many requests.",status:429});var n=Hp(e,this._api),r={body:n.body,method:"POST",referrerPolicy:np()?"origin":""};return void 0!==this.options.fetchParameters&&Object.assign(r,this.options.fetchParameters),void 0!==this.options.headers&&(r.headers=this.options.headers),this._buffer.add(new Qh((function(e,i){fd.fetch(n.url,r).then((function(n){var r=Qc.fromHttpCode(n.status);if(r!==Qc.Success){if(r===Qc.RateLimit){var o=Date.now(),a=n.headers.get("Retry-After");t._disabledUntil=new Date(o+dh(o,a)),wh.warn("Too many requests, backing off till: "+t._disabledUntil)}i(n)}else e({status:r})})).catch(i)})))},t}(ld),pd=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._disabledUntil=new Date(Date.now()),t}return Xc(t,e),t.prototype.sendEvent=function(e){var t=this;if(new Date(Date.now())<this._disabledUntil)return Promise.reject({event:e,reason:"Transport locked till "+this._disabledUntil+" due to too many requests.",status:429});var n=Hp(e,this._api);return this._buffer.add(new Qh((function(e,r){var i=new XMLHttpRequest;for(var o in i.onreadystatechange=function(){if(4===i.readyState){var n=Qc.fromHttpCode(i.status);if(n!==Qc.Success){if(n===Qc.RateLimit){var o=Date.now(),a=i.getResponseHeader("Retry-After");t._disabledUntil=new Date(o+dh(o,a)),wh.warn("Too many requests, backing off till: "+t._disabledUntil)}r(i)}else e({status:n})}},i.open("POST",n.url),t.options.headers)t.options.headers.hasOwnProperty(o)&&i.setRequestHeader(o,t.options.headers[o]);i.send(n.body)})))},t}(ld),dd=function(e){function t(){return null!==e&&e.apply(this,arguments)||this}return Xc(t,e),t.prototype.eventFromException=function(e,t){return function(e,t,n){var r=cd(t,n&&n.syntheticException||void 0,{attachStacktrace:e.attachStacktrace});return ah(r,{handled:!0,type:"generic"}),r.level=Jc.Error,n&&n.event_id&&(r.event_id=n.event_id),Qh.resolve(r)}(this._options,e,t)},t.prototype.eventFromMessage=function(e,t,n){return void 0===t&&(t=Jc.Info),function(e,t,n,r){void 0===n&&(n=Jc.Info);var i=ud(t,r&&r.syntheticException||void 0,{attachStacktrace:e.attachStacktrace});return i.level=n,r&&r.event_id&&(i.event_id=r.event_id),Qh.resolve(i)}(this._options,e,t,n)},t.prototype._setupTransport=function(){if(!this._options.dsn)return e.prototype._setupTransport.call(this);var t=Zc(Zc({},this._options.transportOptions),{dsn:this._options.dsn});return this._options.transport?new this._options.transport(t):ep()?new hd(t):new pd(t)},t}(Bp),gd=0;function md(){return gd>0}function vd(){gd+=1,setTimeout((function(){gd-=1}))}function yd(e,t,n){if(void 0===t&&(t={}),"function"!=typeof e)return e;try{if(e.__sentry__)return e;if(e.__sentry_wrapped__)return e.__sentry_wrapped__}catch(t){return e}var r=function(){var r=Array.prototype.slice.call(arguments);try{n&&"function"==typeof n&&n.apply(this,arguments);var i=r.map((function(e){return yd(e,t)}));return e.handleEvent?e.handleEvent.apply(this,i):e.apply(this,i)}catch(e){throw vd(),Lp((function(n){n.addEventProcessor((function(e){var n=Zc({},e);return t.mechanism&&(oh(n,void 0,void 0),ah(n,t.mechanism)),n.extra=Zc(Zc({},n.extra),{arguments:r}),n})),Rp(e)})),e}};try{for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&(r[i]=e[i])}catch(e){}e.prototype=e.prototype||{},r.prototype=e.prototype,Object.defineProperty(e,"__sentry_wrapped__",{enumerable:!1,value:r}),Object.defineProperties(r,{__sentry__:{enumerable:!1,value:!0},__sentry_original__:{enumerable:!1,value:e}});try{Object.getOwnPropertyDescriptor(r,"name").configurable&&Object.defineProperty(r,"name",{get:function(){return e.name}})}catch(e){}return r}function bd(e){if(void 0===e&&(e={}),e.eventId)if(e.dsn){var t=document.createElement("script");t.async=!0,t.src=new Np(e.dsn).getReportDialogEndpoint(e),e.onLoad&&(t.onload=e.onLoad),(document.head||document.body).appendChild(t)}else wh.error("Missing dsn option in showReportDialog call");else wh.error("Missing eventId option in showReportDialog call")}var wd=function(){function e(t){this.name=e.id,this._onErrorHandlerInstalled=!1,this._onUnhandledRejectionHandlerInstalled=!1,this._options=Zc({onerror:!0,onunhandledrejection:!0},t)}return e.prototype.setupOnce=function(){Error.stackTraceLimit=50,this._options.onerror&&(wh.log("Global Handler attached: onerror"),this._installGlobalOnErrorHandler()),this._options.onunhandledrejection&&(wh.log("Global Handler attached: onunhandledrejection"),this._installGlobalOnUnhandledRejectionHandler())},e.prototype._installGlobalOnErrorHandler=function(){var t=this;this._onErrorHandlerInstalled||(cp({callback:function(n){var r=n.error,i=Op(),o=i.getIntegration(e),a=r&&!0===r.__sentry_own_request__;if(o&&!md()&&!a){var s=i.getClient(),c=pu(r)?t._eventFromIncompleteOnError(n.msg,n.url,n.line,n.column):t._enhanceEventWithInitialFrame(cd(r,void 0,{attachStacktrace:s&&s.getOptions().attachStacktrace,rejection:!1}),n.url,n.line,n.column);ah(c,{handled:!1,type:"onerror"}),i.captureEvent(c,{originalException:r})}},type:"error"}),this._onErrorHandlerInstalled=!0)},e.prototype._installGlobalOnUnhandledRejectionHandler=function(){var t=this;this._onUnhandledRejectionHandlerInstalled||(cp({callback:function(n){var r=n;try{"reason"in n?r=n.reason:"detail"in n&&"reason"in n.detail&&(r=n.detail.reason)}catch(e){}var i=Op(),o=i.getIntegration(e),a=r&&!0===r.__sentry_own_request__;if(!o||md()||a)return!0;var s=i.getClient(),c=pu(r)?t._eventFromIncompleteRejection(r):cd(r,void 0,{attachStacktrace:s&&s.getOptions().attachStacktrace,rejection:!0});c.level=Jc.Error,ah(c,{handled:!1,type:"onunhandledrejection"}),i.captureEvent(c,{originalException:r})},type:"unhandledrejection"}),this._onUnhandledRejectionHandlerInstalled=!0)},e.prototype._eventFromIncompleteOnError=function(e,t,n,r){var i,o=lu(e)?e.message:e;if(hu(o)){var a=o.match(/^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i);a&&(i=a[1],o=a[2])}var s={exception:{values:[{type:i||"Error",value:o}]}};return this._enhanceEventWithInitialFrame(s,t,n,r)},e.prototype._eventFromIncompleteRejection=function(e){return{exception:{values:[{type:"UnhandledRejection",value:"Non-Error promise rejection captured with value: "+e}]}}},e.prototype._enhanceEventWithInitialFrame=function(e,t,n,r){e.exception=e.exception||{},e.exception.values=e.exception.values||[],e.exception.values[0]=e.exception.values[0]||{},e.exception.values[0].stacktrace=e.exception.values[0].stacktrace||{},e.exception.values[0].stacktrace.frames=e.exception.values[0].stacktrace.frames||[];var i=isNaN(parseInt(r,10))?void 0:r,o=isNaN(parseInt(n,10))?void 0:n,a=hu(t)&&t.length>0?t:function(){try{return document.location.href}catch(e){return""}}();return 0===e.exception.values[0].stacktrace.frames.length&&e.exception.values[0].stacktrace.frames.push({colno:i,filename:a,function:"?",in_app:!0,lineno:o}),e},e.id="GlobalHandlers",e}(),_d=["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"],Ed=function(){function e(t){this.name=e.id,this._options=Zc({XMLHttpRequest:!0,eventTarget:!0,requestAnimationFrame:!0,setInterval:!0,setTimeout:!0},t)}return e.prototype.setupOnce=function(){var e=eh();(this._options.setTimeout&&Fh(e,"setTimeout",this._wrapTimeFunction.bind(this)),this._options.setInterval&&Fh(e,"setInterval",this._wrapTimeFunction.bind(this)),this._options.requestAnimationFrame&&Fh(e,"requestAnimationFrame",this._wrapRAF.bind(this)),this._options.XMLHttpRequest&&"XMLHttpRequest"in e&&Fh(XMLHttpRequest.prototype,"send",this._wrapXHR.bind(this)),this._options.eventTarget)&&(Array.isArray(this._options.eventTarget)?this._options.eventTarget:_d).forEach(this._wrapEventTarget.bind(this))},e.prototype._wrapTimeFunction=function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=t[0];return t[0]=yd(r,{mechanism:{data:{function:mh(e)},handled:!0,type:"instrument"}}),e.apply(this,t)}},e.prototype._wrapRAF=function(e){return function(t){return e.call(this,yd(t,{mechanism:{data:{function:"requestAnimationFrame",handler:mh(e)},handled:!0,type:"instrument"}}))}},e.prototype._wrapEventTarget=function(e){var t=eh(),n=t[e]&&t[e].prototype;n&&n.hasOwnProperty&&n.hasOwnProperty("addEventListener")&&(Fh(n,"addEventListener",(function(t){return function(n,r,i){try{"function"==typeof r.handleEvent&&(r.handleEvent=yd(r.handleEvent.bind(r),{mechanism:{data:{function:"handleEvent",handler:mh(r),target:e},handled:!0,type:"instrument"}}))}catch(e){}return t.call(this,n,yd(r,{mechanism:{data:{function:"addEventListener",handler:mh(r),target:e},handled:!0,type:"instrument"}}),i)}})),Fh(n,"removeEventListener",(function(e){return function(t,n,r){try{e.call(this,t,n.__sentry_wrapped__,r)}catch(e){}return e.call(this,t,n,r)}})))},e.prototype._wrapXHR=function(e){return function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];var r=this,i=["onload","onerror","onprogress","onreadystatechange"];return i.forEach((function(e){e in r&&"function"==typeof r[e]&&Fh(r,e,(function(t){var n={mechanism:{data:{function:e,handler:mh(t)},handled:!0,type:"instrument"}};return t.__sentry_original__&&(n.mechanism.data.handler=mh(t.__sentry_original__)),yd(t,n)}))})),e.apply(this,t)}},e.id="TryCatch",e}(),Sd=function(){function e(t){this.name=e.id,this._options=Zc({console:!0,dom:!0,fetch:!0,history:!0,sentry:!0,xhr:!0},t)}return e.prototype.addSentryBreadcrumb=function(e){this._options.sentry&&Op().addBreadcrumb({category:"sentry."+("transaction"===e.type?"transaction":"event"),event_id:e.event_id,level:e.level,message:rh(e)},{event:e})},e.prototype.setupOnce=function(){var e=this;this._options.console&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._consoleBreadcrumb.apply(e,tu(t))},type:"console"}),this._options.dom&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._domBreadcrumb.apply(e,tu(t))},type:"dom"}),this._options.xhr&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._xhrBreadcrumb.apply(e,tu(t))},type:"xhr"}),this._options.fetch&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._fetchBreadcrumb.apply(e,tu(t))},type:"fetch"}),this._options.history&&cp({callback:function(){for(var t=[],n=0;n<arguments.length;n++)t[n]=arguments[n];e._historyBreadcrumb.apply(e,tu(t))},type:"history"})},e.prototype._consoleBreadcrumb=function(e){var t={category:"console",data:{arguments:e.args,logger:"console"},level:Jc.fromString(e.level),message:Xf(e.args," ")};if("assert"===e.level){if(!1!==e.args[0])return;t.message="Assertion failed: "+(Xf(e.args.slice(1)," ")||"console.assert"),t.data.arguments=e.args.slice(1)}Op().addBreadcrumb(t,{input:e.args,level:e.level})},e.prototype._domBreadcrumb=function(e){var t;try{t=e.event.target?sh(e.event.target):sh(e.event)}catch(e){t="<unknown>"}0!==t.length&&Op().addBreadcrumb({category:"ui."+e.name,message:t},{event:e.event,name:e.name})},e.prototype._xhrBreadcrumb=function(e){if(e.endTimestamp){if(e.xhr.__sentry_own_request__)return;Op().addBreadcrumb({category:"xhr",data:e.xhr.__sentry_xhr__,type:"http"},{xhr:e.xhr})}else;},e.prototype._fetchBreadcrumb=function(e){e.endTimestamp&&(e.fetchData.url.match(/sentry_key/)&&"POST"===e.fetchData.method||(e.error?Op().addBreadcrumb({category:"fetch",data:e.fetchData,level:Jc.Error,type:"http"},{data:e.error,input:e.args}):Op().addBreadcrumb({category:"fetch",data:Zc(Zc({},e.fetchData),{status_code:e.response.status}),type:"http"},{input:e.args,response:e.response})))},e.prototype._historyBreadcrumb=function(e){var t=eh(),n=e.from,r=e.to,i=nh(t.location.href),o=nh(n),a=nh(r);o.path||(o=i),i.protocol===a.protocol&&i.host===a.host&&(r=a.relative),i.protocol===o.protocol&&i.host===o.host&&(n=o.relative),Op().addBreadcrumb({category:"navigation",data:{from:n,to:r}})},e.id="Breadcrumbs",e}(),kd=function(){function e(t){void 0===t&&(t={}),this.name=e.id,this._key=t.key||"cause",this._limit=t.limit||5}return e.prototype.setupOnce=function(){kp((function(t,n){var r=Op().getIntegration(e);return r?r._handler(t,n):t}))},e.prototype._handler=function(e,t){if(!(e.exception&&e.exception.values&&t&&yu(t.originalException,Error)))return e;var n=this._walkErrorTree(t.originalException,this._key);return e.exception.values=tu(n,e.exception.values),e},e.prototype._walkErrorTree=function(e,t,n){if(void 0===n&&(n=[]),!yu(e[t],Error)||n.length+1>=this._limit)return n;var r=od(nd(e[t]));return this._walkErrorTree(e[t],t,tu([r],n))},e.id="LinkedErrors",e}(),Td=eh(),xd=function(){function e(){this.name=e.id}return e.prototype.setupOnce=function(){kp((function(t){if(Op().getIntegration(e)){if(!Td.navigator||!Td.location)return t;var n=t.request||{};return n.url=n.url||Td.location.href,n.headers=n.headers||{},n.headers["User-Agent"]=Td.navigator.userAgent,Zc(Zc({},t),{request:n})}return t}))},e.id="UserAgent",e}(),Ad="5.22.3",Od=function(e){function t(t){return void 0===t&&(t={}),e.call(this,dd,t)||this}return Xc(t,e),t.prototype.showReportDialog=function(e){void 0===e&&(e={}),eh().document&&(this._isEnabled()?bd(Zc(Zc({},e),{dsn:e.dsn||this.getDsn()})):wh.error("Trying to call showReportDialog with Sentry Client disabled"))},t.prototype._prepareEvent=function(t,n,r){return t.platform=t.platform||"javascript",t.sdk=Zc(Zc({},t.sdk),{name:"sentry.javascript.browser",packages:tu(t.sdk&&t.sdk.packages||[],[{name:"npm:@sentry/browser",version:Ad}]),version:Ad}),e.prototype._prepareEvent.call(this,t,n,r)},t.prototype._sendEvent=function(t){var n=this.getIntegration(Sd);n&&n.addSentryBreadcrumb(t),e.prototype._sendEvent.call(this,t)},t}(Fp),Id=[new Gp,new Vp,new Ed,new Sd,new wd,new kd,new xd];function Cd(e){if(void 0===e&&(e={}),void 0===e.defaultIntegrations&&(e.defaultIntegrations=Id),void 0===e.release){var t=eh();t.SENTRY_RELEASE&&t.SENTRY_RELEASE.id&&(e.release=t.SENTRY_RELEASE.id)}!function(e,t){!0===t.debug&&wh.enable();var n=Op(),r=new e(t);n.bindClient(r)}(Od,e)}var Pd=ze.find,jd="find",Rd=!0,Ld=Xe(jd);jd in[]&&Array(1).find((function(){Rd=!1})),Ce({target:"Array",proto:!0,forced:Rd||!Ld},{find:function(e){return Pd(this,e,arguments.length>1?arguments[1]:void 0)}}),jt(jd);var Nd="[\t\n\v\f\r                 \u2028\u2029\ufeff]",Md=RegExp("^"+Nd+Nd+"*"),Ud=RegExp(Nd+Nd+"*$"),Dd=function(e){return function(t){var n=String(d(t));return 1&e&&(n=n.replace(Md,"")),2&e&&(n=n.replace(Ud,"")),n}},Fd={start:Dd(1),end:Dd(2),trim:Dd(3)},qd=ye.f,Bd=T.f,Hd=O.f,Vd=Fd.trim,Wd="Number",zd=r.Number,Yd=zd.prototype,$d=f(It(Yd))==Wd,Gd=function(e){var t,n,r,i,o,a,s,c,u=v(e,!1);if("string"==typeof u&&u.length>2)if(43===(t=(u=Vd(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+u}for(a=(o=u.slice(2)).length,s=0;s<a;s++)if((c=o.charCodeAt(s))<48||c>i)return NaN;return parseInt(o,r)}return+u};if(Oe(Wd,!zd(" 0o1")||!zd("0b1")||zd("+0x1"))){for(var Kd,Xd=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof Xd&&($d?i((function(){Yd.valueOf.call(n)})):f(n)!=Wd)?Kt(new zd(Gd(t)),n,Xd):Gd(t)},Jd=o?qd(zd):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Qd=0;Jd.length>Qd;Qd++)b(zd,Kd=Jd[Qd])&&!b(Xd,Kd)&&Hd(Xd,Kd,Bd(zd,Kd));Xd.prototype=Yd,Yd.constructor=Xd,ee(r,Wd,Xd)}Ce({target:"Number",stat:!0},{isNaN:function(e){return e!=e}});var Zd=c.f,eg=function(e){return function(t){for(var n,r=g(t),i=Et(r),a=i.length,s=0,c=[];a>s;)n=i[s++],o&&!Zd.call(r,n)||c.push(e?[n,r[n]]:r[n]);return c}},tg={entries:eg(!0),values:eg(!1)}.entries;function ng(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function rg(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function ig(e,t,n){return t&&rg(e.prototype,t),n&&rg(e,n),e}function og(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ag(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw o}}return n}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance")}()}Ce({target:"Object",stat:!0},{entries:function(e){return tg(e)}});var sg=function(e){return null!=e?e.constructor:null},cg=function(e,t){return!!(e&&t&&e instanceof t)},ug=function(e){return null==e},lg=function(e){return sg(e)===Object},fg=function(e){return sg(e)===String},hg=function(e){return Array.isArray(e)},pg=function(e){return cg(e,NodeList)},dg=ug,gg=lg,mg=function(e){return sg(e)===Number&&!Number.isNaN(e)},vg=fg,yg=function(e){return sg(e)===Boolean},bg=hg,wg=pg,_g=function(e){return cg(e,Element)},Eg=function(e){return cg(e,Event)},Sg=function(e){return ug(e)||(fg(e)||hg(e)||pg(e))&&!e.length||lg(e)&&!Object.keys(e).length},kg={facebook:{domain:"facebook.com",url:function(e){return"https://graph.facebook.com/?id=".concat(e,"&fields=og_object{engagement}")},shareCount:function(e){return e.og_object.engagement.count},popup:{width:640,height:360}},twitter:{domain:"twitter.com",url:function(){return null},shareCount:function(){return null},popup:{width:640,height:240}},pinterest:{domain:"pinterest.com",url:function(e){return"https://widgets.pinterest.com/v1/urls/count.json?url=".concat(e)},shareCount:function(e){return e.count},popup:{width:830,height:700}},github:{domain:"github.com",url:function(e,t){return"https://api.github.com/repos/".concat(e).concat(vg(t)?"?access_token=".concat(t):"")},shareCount:function(e){return e.data.stargazers_count}},youtube:{domain:"youtube.com",url:function(e,t){return"https://www.googleapis.com/youtube/v3/channels?part=statistics&id=".concat(e,"&key=").concat(t)},shareCount:function(e){if(!Sg(e.error))return null;var t=ag(e.items,1)[0];return Sg(t)?null:t.statistics.subscriberCount}}},Tg={debug:!1,wrapper:{className:"shr"},count:{className:"shr__count",displayZero:!1,format:!0,position:"after",increment:!0},tokens:{github:"",youtube:""},storage:{enabled:!0,key:"shr",ttl:3e5}};function xg(e){return new Promise((function(t,n){var r="jsonp_callback_".concat(Math.round(1e5*Math.random())),i=document.createElement("script");i.addEventListener("error",(function(e){return n(e)})),window[r]=function(e){delete window[r],document.body.removeChild(i),t(e)};var o=new URL(e);o.searchParams.set("callback",r),i.setAttribute("src",o.toString()),document.body.appendChild(i)}))}var Ag=function(){},Og=function(){function e(){var t=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0];ng(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return ig(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):Ag}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):Ag}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):Ag}}]),e}();function Ig(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function Cg(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach((function(e,n){var r=0<n?t.cloneNode(!0):t,i=e.parentNode,o=e.nextSibling;r.appendChild(e),o?i.insertBefore(r,o):i.appendChild(r)}))}function Pg(e,t,n){var r=document.createElement(e);return gg(t)&&function(e,t){!_g(e)||Sg(t)||Object.entries(t).filter((function(e){var t=ag(e,2)[1];return!dg(t)})).forEach((function(t){var n=ag(t,2),r=n[0],i=n[1];return e.setAttribute(r,i)}))}(r,t),vg(n)&&(r.innerText=n),r}function jg(e){var t=/\./.test(1.1.toLocaleString())?".":",",n=new RegExp("\\".concat(t,"\\d+$"));return Math.round(e).toLocaleString().replace(n,"")}function Rg(){for(var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(1<t?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(!n.length)return e;var i=n.shift();return gg(i)?(Object.keys(i).forEach((function(t){gg(i[t])?(!Object.keys(e).includes(t)&&Object.assign(e,og({},t,{})),Rg(e[t],i[t])):Object.assign(e,og({},t,i[t]))})),Rg.apply(void 0,[e].concat(n))):e}var Lg=function(){function e(t,n){var r=!(2<arguments.length&&void 0!==arguments[2])||arguments[2];ng(this,e),this.enabled=r&&e.supported,this.key=t,this.ttl=n}return ig(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(Sg(n))return null;var r=window.localStorage.getItem("".concat(this.key,"_ttl"));if(Sg(r)||r<Date.now())return null;var i=JSON.parse(n);return vg(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&gg(t)){var n=this.get();Sg(n)&&(n={}),Rg(n,t),window.localStorage.setItem(this.key,JSON.stringify(n)),window.localStorage.setItem("".concat(this.key,"_ttl"),Date.now()+this.ttl)}}}],[{key:"supported",get:function(){try{return"localStorage"in window&&(window.localStorage.setItem("___test","___test"),window.localStorage.removeItem("___test"),!0)}catch(e){return!1}}}]),e}();var Ng=function(){function e(t,n){var r=this;ng(this,e),this.elements={count:null,trigger:null,popup:null},_g(t)?this.elements.trigger=t:vg(t)&&(this.elements.trigger=document.querySelector(t)),_g(this.elements.trigger)&&Sg(this.elements.trigger.shr)&&(this.config=Rg({},Tg,n,{networks:kg}),this.console=new Og(this.config.debug),this.storage=new Lg(this.config.storage.key,this.config.storage.ttl,this.config.storage.enabled),this.getCount().then((function(e){return r.updateDisplay(e)})).catch((function(){})),this.listeners(!0),this.elements.trigger.shr=this)}return ig(e,[{key:"destroy",value:function(){this.listeners(!1)}},{key:"listeners",value:function(){var e=this,t=0<arguments.length&&void 0!==arguments[0]&&arguments[0]?"addEventListener":"removeEventListener";this.elements.trigger[t]("click",(function(t){return e.share(t)}),!1)}},{key:"share",value:function(e){var t=this;this.openPopup(e);var n=this.config.count.increment;this.getCount().then((function(e){return t.updateDisplay(e,n)})).catch((function(){}))}},{key:"openPopup",value:function(e){if(!Sg(this.network)&&this.networkConfig.popup){Eg(e)&&e.preventDefault();var t=this.networkConfig.popup,n=t.width,r=t.height,i="shr-popup--".concat(this.network);if(this.popup&&!this.popup.closed)this.popup.focus(),this.console.log("Popup re-focused.");else{var o=void 0===window.screenLeft?window.screen.left:window.screenLeft,a=void 0===window.screenTop?window.screen.top:window.screenTop,s=window.screen.width/2-n/2+o,c=window.screen.height/2-r/2+a;this.popup=window.open(this.href,i,"top=".concat(c,",left=").concat(s,",width=").concat(n,",height=").concat(r)),this.popup&&!this.popup.closed&&yg(this.popup.closed)?(this.popup.focus(),this.console.log("Popup opened.")):this.console.error("Popup blocked.")}}}},{key:"getCount",value:function(){var e=this,t=!(0<arguments.length&&void 0!==arguments[0])||arguments[0];return new Promise((function(n,r){var i=e.apiUrl;if(Sg(i))r(new Error("No URL available for ".concat(e.network,".")));else{if(t){var o=e.storage.get(e.target);if(!Sg(o)&&Object.keys(o).includes(e.network)){var a=o[e.network];return n(mg(a)?a:0),void e.console.log("getCount for '".concat(e.target,"' for '").concat(e.network,"' resolved from cache."))}}xg(i).then((function(t){var r=0,i=e.elements.trigger.getAttribute("data-shr-display");r=Sg(i)?e.networkConfig.shareCount(t):t[i],Sg(r)?r=0:(r=parseInt(r,10),!mg(r)&&(r=0)),e.storage.set(og({},e.target,og({},e.network,r))),n(r)})).catch(r)}}))}},{key:"updateDisplay",value:function(e){var t=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],n=this.config,r=n.count,i=n.wrapper,o=t?e+1:e,a=r.position.toLowerCase();if(0<o||r.displayZero){var s=function(e){return Math.round(o/e*10)/10},c=jg(o);r.format&&(1e6<o?c="".concat(s(1e6),"M"):1e3<o&&(c="".concat(s(1e3),"K"))),_g(this.elements.count)?this.elements.count.textContent=c:(Cg(this.elements.trigger,Pg("span",{class:i.className})),this.elements.count=Pg("span",{class:"".concat(r.className," ").concat(r.className,"--").concat(a)},c),this.elements.trigger.insertAdjacentElement("after"===a?"afterend":"beforebegin",this.elements.count))}}},{key:"href",get:function(){return _g(this.elements.trigger)?this.elements.trigger.href:null}},{key:"network",get:function(){var e=this;if(!_g(this.elements.trigger))return null;var t=this.config.networks;return Object.keys(t).find((function(n){return function(e){var t=new URL(e).hostname,n=t.split("."),r=n.length;return 2<r&&(t="".concat(n[r-2],".").concat(n[r-1]),2===n[r-2].length&&2===n[r-1].length&&(t="".concat(n[r-3],".").concat(t))),t}(e.href)===t[n].domain}))}},{key:"networkConfig",get:function(){return Sg(this.network)?null:this.config.networks[this.network]}},{key:"target",get:function(){if(Sg(this.network))return null;var e=new URL(this.href);switch(this.network){case"facebook":return e.searchParams.get("u");case"github":return e.pathname.substring(1);case"youtube":return e.pathname.split("/").pop();default:return e.searchParams.get("url")}}},{key:"apiUrl",get:function(){if(Sg(this.network))return null;var e=this.config.tokens;switch(this.network){case"github":return this.networkConfig.url(this.target,e.github);case"youtube":return this.networkConfig.url(this.target,e.youtube);default:return this.networkConfig.url(encodeURIComponent(this.target))}}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(vg(t)?r=Array.from(document.querySelectorAll(t)):_g(t)?r=[t]:wg(t)?r=Array.from(t):bg(t)&&(r=t.filter(_g)),Sg(r))return null;var i=Object.assign({},Tg,n);return vg(t)&&i.watch&&new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){_g(n)&&Ig(n,t)&&new e(n,i)}))}))})).observe(document.body,{childList:!0,subtree:!0}),r.map((function(t){return new e(t,n)}))}}]),e}(),Mg=function(e){return e&&e.Math==Math&&e},Ug=Mg("object"==typeof globalThis&&globalThis)||Mg("object"==typeof window&&window)||Mg("object"==typeof self&&self)||Mg("object"==typeof e&&e)||function(){return this}()||Function("return this")(),Dg=function(e){try{return!!e()}catch(e){return!0}},Fg=!Dg((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),qg={}.propertyIsEnumerable,Bg=Object.getOwnPropertyDescriptor,Hg={f:Bg&&!qg.call({1:2},1)?function(e){var t=Bg(this,e);return!!t&&t.enumerable}:qg},Vg=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},Wg={}.toString,zg=function(e){return Wg.call(e).slice(8,-1)},Yg="".split,$g=Dg((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==zg(e)?Yg.call(e,""):Object(e)}:Object,Gg=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},Kg=function(e){return $g(Gg(e))},Xg=function(e){return"object"==typeof e?null!==e:"function"==typeof e},Jg=function(e,t){if(!Xg(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!Xg(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!Xg(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!Xg(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},Qg={}.hasOwnProperty,Zg=function(e,t){return Qg.call(e,t)},em=Ug.document,tm=Xg(em)&&Xg(em.createElement),nm=function(e){return tm?em.createElement(e):{}},rm=!Fg&&!Dg((function(){return 7!=Object.defineProperty(nm("div"),"a",{get:function(){return 7}}).a})),im=Object.getOwnPropertyDescriptor,om={f:Fg?im:function(e,t){if(e=Kg(e),t=Jg(t,!0),rm)try{return im(e,t)}catch(e){}if(Zg(e,t))return Vg(!Hg.f.call(e,t),e[t])}},am=function(e){if(!Xg(e))throw TypeError(String(e)+" is not an object");return e},sm=Object.defineProperty,cm={f:Fg?sm:function(e,t,n){if(am(e),t=Jg(t,!0),am(n),rm)try{return sm(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}},um=Fg?function(e,t,n){return cm.f(e,t,Vg(1,n))}:function(e,t,n){return e[t]=n,e},lm=function(e,t){try{um(Ug,e,t)}catch(n){Ug[e]=t}return t},fm="__core-js_shared__",hm=Ug[fm]||lm(fm,{}),pm=Function.toString;"function"!=typeof hm.inspectSource&&(hm.inspectSource=function(e){return pm.call(e)});var dm,gm,mm,vm=hm.inspectSource,ym=Ug.WeakMap,bm="function"==typeof ym&&/native code/.test(vm(ym)),wm=t((function(e){(e.exports=function(e,t){return hm[e]||(hm[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.7.0",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),_m=0,Em=Math.random(),Sm=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++_m+Em).toString(36)},km=wm("keys"),Tm=function(e){return km[e]||(km[e]=Sm(e))},xm={},Am=Ug.WeakMap;if(bm){var Om=hm.state||(hm.state=new Am),Im=Om.get,Cm=Om.has,Pm=Om.set;dm=function(e,t){return t.facade=e,Pm.call(Om,e,t),t},gm=function(e){return Im.call(Om,e)||{}},mm=function(e){return Cm.call(Om,e)}}else{var jm=Tm("state");xm[jm]=!0,dm=function(e,t){return t.facade=e,um(e,jm,t),t},gm=function(e){return Zg(e,jm)?e[jm]:{}},mm=function(e){return Zg(e,jm)}}var Rm,Lm,Nm={set:dm,get:gm,has:mm,enforce:function(e){return mm(e)?gm(e):dm(e,{})},getterFor:function(e){return function(t){var n;if(!Xg(t)||(n=gm(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},Mm=t((function(e){var t=Nm.get,n=Nm.enforce,r=String(String).split("String");(e.exports=function(e,t,i,o){var a,s=!!o&&!!o.unsafe,c=!!o&&!!o.enumerable,u=!!o&&!!o.noTargetGet;"function"==typeof i&&("string"!=typeof t||Zg(i,"name")||um(i,"name",t),(a=n(i)).source||(a.source=r.join("string"==typeof t?t:""))),e!==Ug?(s?!u&&e[t]&&(c=!0):delete e[t],c?e[t]=i:um(e,t,i)):c?e[t]=i:lm(t,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||vm(this)}))})),Um=Ug,Dm=function(e){return"function"==typeof e?e:void 0},Fm=function(e,t){return arguments.length<2?Dm(Um[e])||Dm(Ug[e]):Um[e]&&Um[e][t]||Ug[e]&&Ug[e][t]},qm=Math.ceil,Bm=Math.floor,Hm=function(e){return isNaN(e=+e)?0:(e>0?Bm:qm)(e)},Vm=Math.min,Wm=function(e){return e>0?Vm(Hm(e),9007199254740991):0},zm=Math.max,Ym=Math.min,$m=function(e,t){var n=Hm(e);return n<0?zm(n+t,0):Ym(n,t)},Gm=function(e){return function(t,n,r){var i,o=Kg(t),a=Wm(o.length),s=$m(r,a);if(e&&n!=n){for(;a>s;)if((i=o[s++])!=i)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},Km={includes:Gm(!0),indexOf:Gm(!1)},Xm=Km.indexOf,Jm=function(e,t){var n,r=Kg(e),i=0,o=[];for(n in r)!Zg(xm,n)&&Zg(r,n)&&o.push(n);for(;t.length>i;)Zg(r,n=t[i++])&&(~Xm(o,n)||o.push(n));return o},Qm=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],Zm=Qm.concat("length","prototype"),ev={f:Object.getOwnPropertyNames||function(e){return Jm(e,Zm)}},tv={f:Object.getOwnPropertySymbols},nv=Fm("Reflect","ownKeys")||function(e){var t=ev.f(am(e)),n=tv.f;return n?t.concat(n(e)):t},rv=function(e,t){for(var n=nv(t),r=cm.f,i=om.f,o=0;o<n.length;o++){var a=n[o];Zg(e,a)||r(e,a,i(t,a))}},iv=/#|\.prototype\./,ov=function(e,t){var n=sv[av(e)];return n==uv||n!=cv&&("function"==typeof t?Dg(t):!!t)},av=ov.normalize=function(e){return String(e).replace(iv,".").toLowerCase()},sv=ov.data={},cv=ov.NATIVE="N",uv=ov.POLYFILL="P",lv=ov,fv=om.f,hv=function(e,t){var n,r,i,o,a,s=e.target,c=e.global,u=e.stat;if(n=c?Ug:u?Ug[s]||lm(s,{}):(Ug[s]||{}).prototype)for(r in t){if(o=t[r],i=e.noTargetGet?(a=fv(n,r))&&a.value:n[r],!lv(c?r:s+(u?".":"#")+r,e.forced)&&void 0!==i){if(typeof o==typeof i)continue;rv(o,i)}(e.sham||i&&i.sham)&&um(o,"sham",!0),Mm(n,r,o,e)}},pv=Array.isArray||function(e){return"Array"==zg(e)},dv=function(e){return Object(Gg(e))},gv=function(e,t,n){var r=Jg(t);r in e?cm.f(e,r,Vg(0,n)):e[r]=n},mv=!!Object.getOwnPropertySymbols&&!Dg((function(){return!String(Symbol())})),vv=mv&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,yv=wm("wks"),bv=Ug.Symbol,wv=vv?bv:bv&&bv.withoutSetter||Sm,_v=function(e){return Zg(yv,e)||(mv&&Zg(bv,e)?yv[e]=bv[e]:yv[e]=wv("Symbol."+e)),yv[e]},Ev=_v("species"),Sv=function(e,t){var n;return pv(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!pv(n.prototype)?Xg(n)&&null===(n=n[Ev])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},kv=Fm("navigator","userAgent")||"",Tv=Ug.process,xv=Tv&&Tv.versions,Av=xv&&xv.v8;Av?Lm=(Rm=Av.split("."))[0]+Rm[1]:kv&&(!(Rm=kv.match(/Edge\/(\d+)/))||Rm[1]>=74)&&(Rm=kv.match(/Chrome\/(\d+)/))&&(Lm=Rm[1]);var Ov=Lm&&+Lm,Iv=_v("species"),Cv=function(e){return Ov>=51||!Dg((function(){var t=[];return(t.constructor={})[Iv]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Pv=_v("isConcatSpreadable"),jv=9007199254740991,Rv="Maximum allowed index exceeded",Lv=Ov>=51||!Dg((function(){var e=[];return e[Pv]=!1,e.concat()[0]!==e})),Nv=Cv("concat"),Mv=function(e){if(!Xg(e))return!1;var t=e[Pv];return void 0!==t?!!t:pv(e)};hv({target:"Array",proto:!0,forced:!Lv||!Nv},{concat:function(e){var t,n,r,i,o,a=dv(this),s=Sv(a,0),c=0;for(t=-1,r=arguments.length;t<r;t++)if(Mv(o=-1===t?a:arguments[t])){if(c+(i=Wm(o.length))>jv)throw TypeError(Rv);for(n=0;n<i;n++,c++)n in o&&gv(s,c,o[n])}else{if(c>=jv)throw TypeError(Rv);gv(s,c++,o)}return s.length=c,s}});var Uv=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},Dv=function(e,t,n){if(Uv(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},Fv=[].push,qv=function(e){var t=1==e,n=2==e,r=3==e,i=4==e,o=6==e,a=5==e||o;return function(s,c,u,l){for(var f,h,p=dv(s),d=$g(p),g=Dv(c,u,3),m=Wm(d.length),v=0,y=l||Sv,b=t?y(s,m):n?y(s,0):void 0;m>v;v++)if((a||v in d)&&(h=g(f=d[v],v,p),e))if(t)b[v]=h;else if(h)switch(e){case 3:return!0;case 5:return f;case 6:return v;case 2:Fv.call(b,f)}else if(i)return!1;return o?-1:r||i?i:b}},Bv={forEach:qv(0),map:qv(1),filter:qv(2),some:qv(3),every:qv(4),find:qv(5),findIndex:qv(6)},Hv=Object.defineProperty,Vv={},Wv=function(e){throw e},zv=function(e,t){if(Zg(Vv,e))return Vv[e];t||(t={});var n=[][e],r=!!Zg(t,"ACCESSORS")&&t.ACCESSORS,i=Zg(t,0)?t[0]:Wv,o=Zg(t,1)?t[1]:void 0;return Vv[e]=!!n&&!Dg((function(){if(r&&!Fg)return!0;var e={length:-1};r?Hv(e,1,{enumerable:!0,get:Wv}):e[1]=1,n.call(e,i,o)}))},Yv=Bv.filter,$v=Cv("filter"),Gv=zv("filter");hv({target:"Array",proto:!0,forced:!$v||!Gv},{filter:function(e){return Yv(this,e,arguments.length>1?arguments[1]:void 0)}});var Kv,Xv=Object.keys||function(e){return Jm(e,Qm)},Jv=Fg?Object.defineProperties:function(e,t){am(e);for(var n,r=Xv(t),i=r.length,o=0;i>o;)cm.f(e,n=r[o++],t[n]);return e},Qv=Fm("document","documentElement"),Zv=Tm("IE_PROTO"),ey=function(){},ty=function(e){return"<script>"+e+"</"+"script>"},ny=function(){try{Kv=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t;ny=Kv?function(e){e.write(ty("")),e.close();var t=e.parentWindow.Object;return e=null,t}(Kv):((t=nm("iframe")).style.display="none",Qv.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(ty("document.F=Object")),e.close(),e.F);for(var n=Qm.length;n--;)delete ny.prototype[Qm[n]];return ny()};xm[Zv]=!0;var ry=Object.create||function(e,t){var n;return null!==e?(ey.prototype=am(e),n=new ey,ey.prototype=null,n[Zv]=e):n=ny(),void 0===t?n:Jv(n,t)},iy=_v("unscopables"),oy=Array.prototype;null==oy[iy]&&cm.f(oy,iy,{configurable:!0,value:ry(null)});var ay=function(e){oy[iy][e]=!0},sy=Bv.find,cy="find",uy=!0,ly=zv(cy);cy in[]&&Array(1).find((function(){uy=!1})),hv({target:"Array",proto:!0,forced:uy||!ly},{find:function(e){return sy(this,e,arguments.length>1?arguments[1]:void 0)}}),ay(cy);var fy=function(e){var t=e.return;if(void 0!==t)return am(t.call(e)).value},hy=function(e,t,n,r){try{return r?t(am(n)[0],n[1]):t(n)}catch(t){throw fy(e),t}},py={},dy=_v("iterator"),gy=Array.prototype,my=function(e){return void 0!==e&&(py.Array===e||gy[dy]===e)},vy={};vy[_v("toStringTag")]="z";var yy="[object z]"===String(vy),by=_v("toStringTag"),wy="Arguments"==zg(function(){return arguments}()),_y=yy?zg:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=function(e,t){try{return e[t]}catch(e){}}(t=Object(e),by))?n:wy?zg(t):"Object"==(r=zg(t))&&"function"==typeof t.callee?"Arguments":r},Ey=_v("iterator"),Sy=function(e){if(null!=e)return e[Ey]||e["@@iterator"]||py[_y(e)]},ky=function(e){var t,n,r,i,o,a,s=dv(e),c="function"==typeof this?this:Array,u=arguments.length,l=u>1?arguments[1]:void 0,f=void 0!==l,h=Sy(s),p=0;if(f&&(l=Dv(l,u>2?arguments[2]:void 0,2)),null==h||c==Array&&my(h))for(n=new c(t=Wm(s.length));t>p;p++)a=f?l(s[p],p):s[p],gv(n,p,a);else for(o=(i=h.call(s)).next,n=new c;!(r=o.call(i)).done;p++)a=f?hy(i,l,[r.value,p],!0):r.value,gv(n,p,a);return n.length=p,n},Ty=_v("iterator"),xy=!1;try{var Ay=0,Oy={next:function(){return{done:!!Ay++}},return:function(){xy=!0}};Oy[Ty]=function(){return this},Array.from(Oy,(function(){throw 2}))}catch(e){}var Iy=function(e,t){if(!t&&!xy)return!1;var n=!1;try{var r={};r[Ty]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},Cy=!Iy((function(e){Array.from(e)}));hv({target:"Array",stat:!0,forced:Cy},{from:ky});var Py=Km.includes,jy=zv("indexOf",{ACCESSORS:!0,1:0});hv({target:"Array",proto:!0,forced:!jy},{includes:function(e){return Py(this,e,arguments.length>1?arguments[1]:void 0)}}),ay("includes");var Ry,Ly,Ny,My=!Dg((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),Uy=Tm("IE_PROTO"),Dy=Object.prototype,Fy=My?Object.getPrototypeOf:function(e){return e=dv(e),Zg(e,Uy)?e[Uy]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?Dy:null},qy=_v("iterator"),By=!1;[].keys&&("next"in(Ny=[].keys())?(Ly=Fy(Fy(Ny)))!==Object.prototype&&(Ry=Ly):By=!0),null==Ry&&(Ry={}),Zg(Ry,qy)||um(Ry,qy,(function(){return this}));var Hy={IteratorPrototype:Ry,BUGGY_SAFARI_ITERATORS:By},Vy=cm.f,Wy=_v("toStringTag"),zy=function(e,t,n){e&&!Zg(e=n?e:e.prototype,Wy)&&Vy(e,Wy,{configurable:!0,value:t})},Yy=Hy.IteratorPrototype,$y=function(){return this},Gy=function(e,t,n){var r=t+" Iterator";return e.prototype=ry(Yy,{next:Vg(1,n)}),zy(e,r,!1),py[r]=$y,e},Ky=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return am(n),function(e){if(!Xg(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype")}(r),t?e.call(n,r):n.__proto__=r,n}}():void 0),Xy=Hy.IteratorPrototype,Jy=Hy.BUGGY_SAFARI_ITERATORS,Qy=_v("iterator"),Zy="keys",eb="values",tb="entries",nb=function(){return this},rb=function(e,t,n,r,i,o,a){Gy(n,t,r);var s,c,u,l=function(e){if(e===i&&g)return g;if(!Jy&&e in p)return p[e];switch(e){case Zy:case eb:case tb:return function(){return new n(this,e)}}return function(){return new n(this)}},f=t+" Iterator",h=!1,p=e.prototype,d=p[Qy]||p["@@iterator"]||i&&p[i],g=!Jy&&d||l(i),m="Array"==t&&p.entries||d;if(m&&(s=Fy(m.call(new e)),Xy!==Object.prototype&&s.next&&(Fy(s)!==Xy&&(Ky?Ky(s,Xy):"function"!=typeof s[Qy]&&um(s,Qy,nb)),zy(s,f,!0))),i==eb&&d&&d.name!==eb&&(h=!0,g=function(){return d.call(this)}),p[Qy]!==g&&um(p,Qy,g),py[t]=g,i)if(c={values:l(eb),keys:o?g:l(Zy),entries:l(tb)},a)for(u in c)(Jy||h||!(u in p))&&Mm(p,u,c[u]);else hv({target:t,proto:!0,forced:Jy||h},c);return c},ib="Array Iterator",ob=Nm.set,ab=Nm.getterFor(ib),sb=rb(Array,"Array",(function(e,t){ob(this,{type:ib,target:Kg(e),index:0,kind:t})}),(function(){var e=ab(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");py.Arguments=py.Array,ay("keys"),ay("values"),ay("entries");var cb=function(e,t){var n=[][e];return!!n&&Dg((function(){n.call(null,t||function(){throw 1},1)}))},ub=[].join,lb=$g!=Object,fb=cb("join",",");hv({target:"Array",proto:!0,forced:lb||!fb},{join:function(e){return ub.call(Kg(this),void 0===e?",":e)}});var hb=Bv.map,pb=Cv("map"),db=zv("map");hv({target:"Array",proto:!0,forced:!pb||!db},{map:function(e){return hb(this,e,arguments.length>1?arguments[1]:void 0)}});var gb=function(e,t,n){var r,i;return Ky&&"function"==typeof(r=t.constructor)&&r!==n&&Xg(i=r.prototype)&&i!==n.prototype&&Ky(e,i),e},mb="\t\n\v\f\r                 \u2028\u2029\ufeff",vb="["+mb+"]",yb=RegExp("^"+vb+vb+"*"),bb=RegExp(vb+vb+"*$"),wb=function(e){return function(t){var n=String(Gg(t));return 1&e&&(n=n.replace(yb,"")),2&e&&(n=n.replace(bb,"")),n}},_b={start:wb(1),end:wb(2),trim:wb(3)},Eb=ev.f,Sb=om.f,kb=cm.f,Tb=_b.trim,xb="Number",Ab=Ug.Number,Ob=Ab.prototype,Ib=zg(ry(Ob))==xb,Cb=function(e){var t,n,r,i,o,a,s,c,u=Jg(e,!1);if("string"==typeof u&&u.length>2)if(43===(t=(u=Tb(u)).charCodeAt(0))||45===t){if(88===(n=u.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(u.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+u}for(a=(o=u.slice(2)).length,s=0;s<a;s++)if((c=o.charCodeAt(s))<48||c>i)return NaN;return parseInt(o,r)}return+u};if(lv(xb,!Ab(" 0o1")||!Ab("0b1")||Ab("+0x1"))){for(var Pb,jb=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof jb&&(Ib?Dg((function(){Ob.valueOf.call(n)})):zg(n)!=xb)?gb(new Ab(Cb(t)),n,jb):Cb(t)},Rb=Fg?Eb(Ab):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Lb=0;Rb.length>Lb;Lb++)Zg(Ab,Pb=Rb[Lb])&&!Zg(jb,Pb)&&kb(jb,Pb,Sb(Ab,Pb));jb.prototype=Ob,Ob.constructor=jb,Mm(Ug,xb,jb)}var Nb=Dg((function(){Xv(1)}));hv({target:"Object",stat:!0,forced:Nb},{keys:function(e){return Xv(dv(e))}});var Mb=yy?{}.toString:function(){return"[object "+_y(this)+"]"};yy||Mm(Object.prototype,"toString",Mb,{unsafe:!0});var Ub=Hg.f,Db=function(e){return function(t){for(var n,r=Kg(t),i=Xv(r),o=i.length,a=0,s=[];o>a;)n=i[a++],Fg&&!Ub.call(r,n)||s.push(e?[n,r[n]]:r[n]);return s}},Fb={entries:Db(!0),values:Db(!1)},qb=Fb.values;hv({target:"Object",stat:!0},{values:function(e){return qb(e)}});var Bb=function(){var e=am(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function Hb(e,t){return RegExp(e,t)}var Vb={UNSUPPORTED_Y:Dg((function(){var e=Hb("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:Dg((function(){var e=Hb("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},Wb=RegExp.prototype.exec,zb=String.prototype.replace,Yb=Wb,$b=function(){var e=/a/,t=/b*/g;return Wb.call(e,"a"),Wb.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),Gb=Vb.UNSUPPORTED_Y||Vb.BROKEN_CARET,Kb=void 0!==/()??/.exec("")[1];($b||Kb||Gb)&&(Yb=function(e){var t,n,r,i,o=this,a=Gb&&o.sticky,s=Bb.call(o),c=o.source,u=0,l=e;return a&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),l=String(e).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==e[o.lastIndex-1])&&(c="(?: "+c+")",l=" "+l,u++),n=new RegExp("^(?:"+c+")",s)),Kb&&(n=new RegExp("^"+c+"$(?!\\s)",s)),$b&&(t=o.lastIndex),r=Wb.call(a?n:o,l),a?r?(r.input=r.input.slice(u),r[0]=r[0].slice(u),r.index=o.lastIndex,o.lastIndex+=r[0].length):o.lastIndex=0:$b&&r&&(o.lastIndex=o.global?r.index+r[0].length:t),Kb&&r&&r.length>1&&zb.call(r[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r});var Xb=Yb;hv({target:"RegExp",proto:!0,forced:/./.exec!==Xb},{exec:Xb});var Jb="toString",Qb=RegExp.prototype,Zb=Qb.toString,ew=Dg((function(){return"/a/b"!=Zb.call({source:"a",flags:"b"})})),tw=Zb.name!=Jb;(ew||tw)&&Mm(RegExp.prototype,Jb,(function(){var e=am(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in Qb)?Bb.call(e):n)}),{unsafe:!0});var nw=_v("match"),rw=function(e){var t;return Xg(e)&&(void 0!==(t=e[nw])?!!t:"RegExp"==zg(e))},iw=function(e){if(rw(e))throw TypeError("The method doesn't accept regular expressions");return e},ow=_v("match"),aw=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[ow]=!1,"/./"[e](t)}catch(e){}}return!1};hv({target:"String",proto:!0,forced:!aw("includes")},{includes:function(e){return!!~String(Gg(this)).indexOf(iw(e),arguments.length>1?arguments[1]:void 0)}});var sw=function(e){return function(t,n){var r,i,o=String(Gg(t)),a=Hm(n),s=o.length;return a<0||a>=s?e?"":void 0:(r=o.charCodeAt(a))<55296||r>56319||a+1===s||(i=o.charCodeAt(a+1))<56320||i>57343?e?o.charAt(a):r:e?o.slice(a,a+2):i-56320+(r-55296<<10)+65536}},cw={codeAt:sw(!1),charAt:sw(!0)},uw=cw.charAt,lw="String Iterator",fw=Nm.set,hw=Nm.getterFor(lw);rb(String,"String",(function(e){fw(this,{type:lw,string:String(e),index:0})}),(function(){var e,t=hw(this),n=t.string,r=t.index;return r>=n.length?{value:void 0,done:!0}:(e=uw(n,r),t.index+=e.length,{value:e,done:!1})}));var pw=_v("species"),dw=!Dg((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),gw="$0"==="a".replace(/./,"$0"),mw=_v("replace"),vw=!!/./[mw]&&""===/./[mw]("a","$0"),yw=!Dg((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),bw=function(e,t,n,r){var i=_v(e),o=!Dg((function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})),a=o&&!Dg((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[pw]=function(){return n},n.flags="",n[i]=/./[i]),n.exec=function(){return t=!0,null},n[i](""),!t}));if(!o||!a||"replace"===e&&(!dw||!gw||vw)||"split"===e&&!yw){var s=/./[i],c=n(i,""[e],(function(e,t,n,r,i){return t.exec===Xb?o&&!i?{done:!0,value:s.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:gw,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:vw}),u=c[0],l=c[1];Mm(String.prototype,e,u),Mm(RegExp.prototype,i,2==t?function(e,t){return l.call(e,this,t)}:function(e){return l.call(e,this)})}r&&um(RegExp.prototype[i],"sham",!0)},ww=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t},_w=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==zg(e))throw TypeError("RegExp#exec called on incompatible receiver");return Xb.call(e,t)};bw("search",1,(function(e,t,n){return[function(t){var n=Gg(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=am(e),o=String(this),a=i.lastIndex;ww(a,0)||(i.lastIndex=0);var s=_w(i,o);return ww(i.lastIndex,a)||(i.lastIndex=a),null===s?-1:s.index}]}));var Ew=function(e,t,n){for(var r in t)Mm(e,r,t[r],n);return e},Sw=!Dg((function(){return Object.isExtensible(Object.preventExtensions({}))})),kw=t((function(e){var t=cm.f,n=Sm("meta"),r=0,i=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:"O"+ ++r,weakData:{}}})},a=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!Xg(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!Zg(e,n)){if(!i(e))return"F";if(!t)return"E";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!Zg(e,n)){if(!i(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return Sw&&a.REQUIRED&&i(e)&&!Zg(e,n)&&o(e),e}};xm[n]=!0})),Tw=(kw.REQUIRED,kw.fastKey,kw.getWeakData,kw.onFreeze,function(e,t){this.stopped=e,this.result=t}),xw=function(e,t,n){var r,i,o,a,s,c,u,l=n&&n.that,f=!(!n||!n.AS_ENTRIES),h=!(!n||!n.IS_ITERATOR),p=!(!n||!n.INTERRUPTED),d=Dv(t,l,1+f+p),g=function(e){return r&&fy(r),new Tw(!0,e)},m=function(e){return f?(am(e),p?d(e[0],e[1],g):d(e[0],e[1])):p?d(e,g):d(e)};if(h)r=e;else{if("function"!=typeof(i=Sy(e)))throw TypeError("Target is not iterable");if(my(i)){for(o=0,a=Wm(e.length);a>o;o++)if((s=m(e[o]))&&s instanceof Tw)return s;return new Tw(!1)}r=i.call(e)}for(c=r.next;!(u=c.call(r)).done;){try{s=m(u.value)}catch(e){throw fy(r),e}if("object"==typeof s&&s&&s instanceof Tw)return s}return new Tw(!1)},Aw=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},Ow=kw.getWeakData,Iw=Nm.set,Cw=Nm.getterFor,Pw=Bv.find,jw=Bv.findIndex,Rw=0,Lw=function(e){return e.frozen||(e.frozen=new Nw)},Nw=function(){this.entries=[]},Mw=function(e,t){return Pw(e.entries,(function(e){return e[0]===t}))};Nw.prototype={get:function(e){var t=Mw(this,e);if(t)return t[1]},has:function(e){return!!Mw(this,e)},set:function(e,t){var n=Mw(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=jw(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}};var Uw={getConstructor:function(e,t,n,r){var i=e((function(e,o){Aw(e,i,t),Iw(e,{type:t,id:Rw++,frozen:void 0}),null!=o&&xw(o,e[r],{that:e,AS_ENTRIES:n})})),o=Cw(t),a=function(e,t,n){var r=o(e),i=Ow(am(t),!0);return!0===i?Lw(r).set(t,n):i[r.id]=n,e};return Ew(i.prototype,{delete:function(e){var t=o(this);if(!Xg(e))return!1;var n=Ow(e);return!0===n?Lw(t).delete(e):n&&Zg(n,t.id)&&delete n[t.id]},has:function(e){var t=o(this);if(!Xg(e))return!1;var n=Ow(e);return!0===n?Lw(t).has(e):n&&Zg(n,t.id)}}),Ew(i.prototype,n?{get:function(e){var t=o(this);if(Xg(e)){var n=Ow(e);return!0===n?Lw(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return a(this,e,t)}}:{add:function(e){return a(this,e,!0)}}),i}},Dw=(t((function(e){var t,n=Nm.enforce,r=!Ug.ActiveXObject&&"ActiveXObject"in Ug,i=Object.isExtensible,o=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},a=e.exports=function(e,t,n){var r=-1!==e.indexOf("Map"),i=-1!==e.indexOf("Weak"),o=r?"set":"add",a=Ug[e],s=a&&a.prototype,c=a,u={},l=function(e){var t=s[e];Mm(s,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(i&&!Xg(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return i&&!Xg(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(i&&!Xg(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(lv(e,"function"!=typeof a||!(i||s.forEach&&!Dg((function(){(new a).entries().next()})))))c=n.getConstructor(t,e,r,o),kw.REQUIRED=!0;else if(lv(e,!0)){var f=new c,h=f[o](i?{}:-0,1)!=f,p=Dg((function(){f.has(1)})),d=Iy((function(e){new a(e)})),g=!i&&Dg((function(){for(var e=new a,t=5;t--;)e[o](t,t);return!e.has(-0)}));d||((c=t((function(t,n){Aw(t,c,e);var i=gb(new a,t,c);return null!=n&&xw(n,i[o],{that:i,AS_ENTRIES:r}),i}))).prototype=s,s.constructor=c),(p||g)&&(l("delete"),l("has"),r&&l("get")),(g||h)&&l(o),i&&s.clear&&delete s.clear}return u[e]=c,hv({global:!0,forced:c!=a},u),zy(c,e),i||n.setStrong(c,e,r),c}("WeakMap",o,Uw);if(bm&&r){t=Uw.getConstructor(o,"WeakMap",!0),kw.REQUIRED=!0;var s=a.prototype,c=s.delete,u=s.has,l=s.get,f=s.set;Ew(s,{delete:function(e){if(Xg(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),c.call(this,e)||r.frozen.delete(e)}return c.call(this,e)},has:function(e){if(Xg(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),u.call(this,e)||r.frozen.has(e)}return u.call(this,e)},get:function(e){if(Xg(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),u.call(this,e)?l.call(this,e):r.frozen.get(e)}return l.call(this,e)},set:function(e,r){if(Xg(e)&&!i(e)){var o=n(this);o.frozen||(o.frozen=new t),u.call(this,e)?f.call(this,e,r):o.frozen.set(e,r)}else f.call(this,e,r);return this}})}})),{CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}),Fw=_v("iterator"),qw=_v("toStringTag"),Bw=sb.values;for(var Hw in Dw){var Vw=Ug[Hw],Ww=Vw&&Vw.prototype;if(Ww){if(Ww[Fw]!==Bw)try{um(Ww,Fw,Bw)}catch(e){Ww[Fw]=Bw}if(Ww[qw]||um(Ww,qw,Hw),Dw[Hw])for(var zw in sb)if(Ww[zw]!==sb[zw])try{um(Ww,zw,sb[zw])}catch(e){Ww[zw]=sb[zw]}}}var Yw=Bv.every,$w=cb("every"),Gw=zv("every");hv({target:"Array",proto:!0,forced:!$w||!Gw},{every:function(e){return Yw(this,e,arguments.length>1?arguments[1]:void 0)}});var Kw=Bv.forEach,Xw=cb("forEach"),Jw=zv("forEach"),Qw=Xw&&Jw?[].forEach:function(e){return Kw(this,e,arguments.length>1?arguments[1]:void 0)};hv({target:"Array",proto:!0,forced:[].forEach!=Qw},{forEach:Qw});var Zw=Km.indexOf,e_=[].indexOf,t_=!!e_&&1/[1].indexOf(1,-0)<0,n_=cb("indexOf"),r_=zv("indexOf",{ACCESSORS:!0,1:0});hv({target:"Array",proto:!0,forced:t_||!n_||!r_},{indexOf:function(e){return t_?e_.apply(this,arguments)||0:Zw(this,e,arguments.length>1?arguments[1]:void 0)}});var i_=Object.assign,o_=Object.defineProperty,a_=!i_||Dg((function(){if(Fg&&1!==i_({b:1},i_(o_({},"a",{enumerable:!0,get:function(){o_(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=i_({},e)[n]||Xv(i_({},t)).join("")!=r}))?function(e,t){for(var n=dv(e),r=arguments.length,i=1,o=tv.f,a=Hg.f;r>i;)for(var s,c=$g(arguments[i++]),u=o?Xv(c).concat(o(c)):Xv(c),l=u.length,f=0;l>f;)s=u[f++],Fg&&!a.call(c,s)||(n[s]=c[s]);return n}:i_;hv({target:"Object",stat:!0,forced:Object.assign!==a_},{assign:a_});var s_=_v("species"),c_=function(e,t){var n,r=am(e).constructor;return void 0===r||null==(n=am(r)[s_])?t:Uv(n)},u_=cw.charAt,l_=function(e,t,n){return t+(n?u_(e,t).length:1)},f_=[].push,h_=Math.min,p_=4294967295,d_=!Dg((function(){return!RegExp(p_,"y")}));bw("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(Gg(this)),i=void 0===n?p_:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!rw(e))return t.call(r,e,i);for(var o,a,s,c=[],u=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),l=0,f=new RegExp(e.source,u+"g");(o=Xb.call(f,r))&&!((a=f.lastIndex)>l&&(c.push(r.slice(l,o.index)),o.length>1&&o.index<r.length&&f_.apply(c,o.slice(1)),s=o[0].length,l=a,c.length>=i));)f.lastIndex===o.index&&f.lastIndex++;return l===r.length?!s&&f.test("")||c.push(""):c.push(r.slice(l)),c.length>i?c.slice(0,i):c}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=Gg(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var o=n(r,e,this,i,r!==t);if(o.done)return o.value;var a=am(e),s=String(this),c=c_(a,RegExp),u=a.unicode,l=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(d_?"y":"g"),f=new c(d_?a:"^(?:"+a.source+")",l),h=void 0===i?p_:i>>>0;if(0===h)return[];if(0===s.length)return null===_w(f,s)?[s]:[];for(var p=0,d=0,g=[];d<s.length;){f.lastIndex=d_?d:0;var m,v=_w(f,d_?s:s.slice(d));if(null===v||(m=h_(Wm(f.lastIndex+(d_?0:d)),s.length))===p)d=l_(s,d,u);else{if(g.push(s.slice(p,d)),g.length===h)return g;for(var y=1;y<=v.length-1;y++)if(g.push(v[y]),g.length===h)return g;d=p=m}}return g.push(s.slice(p)),g}]}),!d_);var g_=_b.trim;for(var m_ in hv({target:"String",proto:!0,forced:function(e){return Dg((function(){return!!mb[e]()||"​…᠎"!="​…᠎"[e]()||mb[e].name!==e}))}("trim")},{trim:function(){return g_(this)}}),Dw){var v_=Ug[m_],y_=v_&&v_.prototype;if(y_&&y_.forEach!==Qw)try{um(y_,"forEach",Qw)}catch(e){y_.forEach=Qw}}var b_=_v("iterator"),w_=!Dg((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,r){t.delete("b"),n+=r+e})),!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[b_]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})),__=2147483647,E_=/[^\0-\u007E]/,S_=/[.\u3002\uFF0E\uFF61]/g,k_="Overflow: input needs wider integers to process",T_=Math.floor,x_=String.fromCharCode,A_=function(e){return e+22+75*(e<26)},O_=function(e,t,n){var r=0;for(e=n?T_(e/700):e>>1,e+=T_(e/t);e>455;r+=36)e=T_(e/35);return T_(r+36*e/(e+38))},I_=function(e){var t,n,r=[],i=(e=function(e){for(var t=[],n=0,r=e.length;n<r;){var i=e.charCodeAt(n++);if(i>=55296&&i<=56319&&n<r){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&i)<<10)+(1023&o)+65536):(t.push(i),n--)}else t.push(i)}return t}(e)).length,o=128,a=0,s=72;for(t=0;t<e.length;t++)(n=e[t])<128&&r.push(x_(n));var c=r.length,u=c;for(c&&r.push("-");u<i;){var l=__;for(t=0;t<e.length;t++)(n=e[t])>=o&&n<l&&(l=n);var f=u+1;if(l-o>T_((__-a)/f))throw RangeError(k_);for(a+=(l-o)*f,o=l,t=0;t<e.length;t++){if((n=e[t])<o&&++a>__)throw RangeError(k_);if(n==o){for(var h=a,p=36;;p+=36){var d=p<=s?1:p>=s+26?26:p-s;if(h<d)break;var g=h-d,m=36-d;r.push(x_(A_(d+g%m))),h=T_(g/m)}r.push(x_(A_(h))),s=O_(a,f,u==c),a=0,++u}}++a,++o}return r.join("")},C_=function(e){var t=Sy(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return am(t.call(e))},P_=Fm("fetch"),j_=Fm("Headers"),R_=_v("iterator"),L_="URLSearchParams",N_="URLSearchParamsIterator",M_=Nm.set,U_=Nm.getterFor(L_),D_=Nm.getterFor(N_),F_=/\+/g,q_=Array(4),B_=function(e){return q_[e-1]||(q_[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},H_=function(e){try{return decodeURIComponent(e)}catch(t){return e}},V_=function(e){var t=e.replace(F_," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(B_(n--),H_);return t}},W_=/[!'()~]|%20/g,z_={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},Y_=function(e){return z_[e]},$_=function(e){return encodeURIComponent(e).replace(W_,Y_)},G_=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o<i.length;)(n=i[o++]).length&&(r=n.split("="),e.push({key:V_(r.shift()),value:V_(r.join("="))}))},K_=function(e){this.entries.length=0,G_(this.entries,e)},X_=function(e,t){if(e<t)throw TypeError("Not enough arguments")},J_=Gy((function(e,t){M_(this,{type:N_,iterator:C_(U_(e).entries),kind:t})}),"Iterator",(function(){var e=D_(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value="keys"===t?r.key:"values"===t?r.value:[r.key,r.value]),n})),Q_=function(){Aw(this,Q_,L_);var e,t,n,r,i,o,a,s,c,u=arguments.length>0?arguments[0]:void 0,l=this,f=[];if(M_(l,{type:L_,entries:f,updateURL:function(){},updateSearchParams:K_}),void 0!==u)if(Xg(u))if("function"==typeof(e=Sy(u)))for(n=(t=e.call(u)).next;!(r=n.call(t)).done;){if((a=(o=(i=C_(am(r.value))).next).call(i)).done||(s=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");f.push({key:a.value+"",value:s.value+""})}else for(c in u)Zg(u,c)&&f.push({key:c,value:u[c]+""});else G_(f,"string"==typeof u?"?"===u.charAt(0)?u.slice(1):u:u+"")},Z_=Q_.prototype;Ew(Z_,{append:function(e,t){X_(arguments.length,2);var n=U_(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){X_(arguments.length,1);for(var t=U_(this),n=t.entries,r=e+"",i=0;i<n.length;)n[i].key===r?n.splice(i,1):i++;t.updateURL()},get:function(e){X_(arguments.length,1);for(var t=U_(this).entries,n=e+"",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){X_(arguments.length,1);for(var t=U_(this).entries,n=e+"",r=[],i=0;i<t.length;i++)t[i].key===n&&r.push(t[i].value);return r},has:function(e){X_(arguments.length,1);for(var t=U_(this).entries,n=e+"",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){X_(arguments.length,1);for(var n,r=U_(this),i=r.entries,o=!1,a=e+"",s=t+"",c=0;c<i.length;c++)(n=i[c]).key===a&&(o?i.splice(c--,1):(o=!0,n.value=s));o||i.push({key:a,value:s}),r.updateURL()},sort:function(){var e,t,n,r=U_(this),i=r.entries,o=i.slice();for(i.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(i[t].key>e.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=U_(this).entries,r=Dv(e,arguments.length>1?arguments[1]:void 0,3),i=0;i<n.length;)r((t=n[i++]).value,t.key,this)},keys:function(){return new J_(this,"keys")},values:function(){return new J_(this,"values")},entries:function(){return new J_(this,"entries")}},{enumerable:!0}),Mm(Z_,R_,Z_.entries),Mm(Z_,"toString",(function(){for(var e,t=U_(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push($_(e.key)+"="+$_(e.value));return n.join("&")}),{enumerable:!0}),zy(Q_,L_),hv({global:!0,forced:!w_},{URLSearchParams:Q_}),w_||"function"!=typeof P_||"function"!=typeof j_||hv({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,i=[e];return arguments.length>1&&(Xg(t=arguments[1])&&(n=t.body,_y(n)===L_&&((r=t.headers?new j_(t.headers):new j_).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=ry(t,{body:Vg(0,String(n)),headers:Vg(0,r)}))),i.push(t)),P_.apply(this,i)}});var eE,tE={URLSearchParams:Q_,getState:U_},nE=cw.codeAt,rE=Ug.URL,iE=tE.URLSearchParams,oE=tE.getState,aE=Nm.set,sE=Nm.getterFor("URL"),cE=Math.floor,uE=Math.pow,lE="Invalid scheme",fE="Invalid host",hE="Invalid port",pE=/[A-Za-z]/,dE=/[\d+-.A-Za-z]/,gE=/\d/,mE=/^(0x|0X)/,vE=/^[0-7]+$/,yE=/^\d+$/,bE=/^[\dA-Fa-f]+$/,wE=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,_E=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,EE=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,SE=/[\u0009\u000A\u000D]/g,kE=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return fE;if(!(n=xE(t.slice(1,-1))))return fE;e.host=n}else if(LE(e)){if(t=function(e){var t,n,r=[],i=e.toLowerCase().replace(S_,".").split(".");for(t=0;t<i.length;t++)n=i[t],r.push(E_.test(n)?"xn--"+I_(n):n);return r.join(".")}(t),wE.test(t))return fE;if(null===(n=TE(t)))return fE;e.host=n}else{if(_E.test(t))return fE;for(n="",r=ky(t),i=0;i<r.length;i++)n+=jE(r[i],OE);e.host=n}},TE=function(e){var t,n,r,i,o,a,s,c=e.split(".");if(c.length&&""==c[c.length-1]&&c.pop(),(t=c.length)>4)return e;for(n=[],r=0;r<t;r++){if(""==(i=c[r]))return e;if(o=10,i.length>1&&"0"==i.charAt(0)&&(o=mE.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)a=0;else{if(!(10==o?yE:8==o?vE:bE).test(i))return e;a=parseInt(i,o)}n.push(a)}for(r=0;r<t;r++)if(a=n[r],r==t-1){if(a>=uE(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*uE(256,3-r);return s},xE=function(e){var t,n,r,i,o,a,s,c=[0,0,0,0,0,0,0,0],u=0,l=null,f=0,h=function(){return e.charAt(f)};if(":"==h()){if(":"!=e.charAt(1))return;f+=2,l=++u}for(;h();){if(8==u)return;if(":"!=h()){for(t=n=0;n<4&&bE.test(h());)t=16*t+parseInt(h(),16),f++,n++;if("."==h()){if(0==n)return;if(f-=n,u>6)return;for(r=0;h();){if(i=null,r>0){if(!("."==h()&&r<4))return;f++}if(!gE.test(h()))return;for(;gE.test(h());){if(o=parseInt(h(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;f++}c[u]=256*c[u]+i,2!=++r&&4!=r||u++}if(4!=r)return;break}if(":"==h()){if(f++,!h())return}else if(h())return;c[u++]=t}else{if(null!==l)return;f++,l=++u}}if(null!==l)for(a=u-l,u=7;0!=u&&a>0;)s=c[u],c[u--]=c[l+a-1],c[l+--a]=s;else if(8!=u)return;return c},AE=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=cE(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t}(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},OE={},IE=a_({},OE,{" ":1,'"':1,"<":1,">":1,"`":1}),CE=a_({},IE,{"#":1,"?":1,"{":1,"}":1}),PE=a_({},CE,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),jE=function(e,t){var n=nE(e,0);return n>32&&n<127&&!Zg(t,e)?e:encodeURIComponent(e)},RE={ftp:21,file:null,http:80,https:443,ws:80,wss:443},LE=function(e){return Zg(RE,e.scheme)},NE=function(e){return""!=e.username||""!=e.password},ME=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},UE=function(e,t){var n;return 2==e.length&&pE.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},DE=function(e){var t;return e.length>1&&UE(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},FE=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&UE(t[0],!0)||t.pop()},qE=function(e){return"."===e||"%2e"===e.toLowerCase()},BE={},HE={},VE={},WE={},zE={},YE={},$E={},GE={},KE={},XE={},JE={},QE={},ZE={},eS={},tS={},nS={},rS={},iS={},oS={},aS={},sS={},cS=function(e,t,n,r){var i,o,a,s,c,u=n||BE,l=0,f="",h=!1,p=!1,d=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(EE,"")),t=t.replace(SE,""),i=ky(t);l<=i.length;){switch(o=i[l],u){case BE:if(!o||!pE.test(o)){if(n)return lE;u=VE;continue}f+=o.toLowerCase(),u=HE;break;case HE:if(o&&(dE.test(o)||"+"==o||"-"==o||"."==o))f+=o.toLowerCase();else{if(":"!=o){if(n)return lE;f="",u=VE,l=0;continue}if(n&&(LE(e)!=Zg(RE,f)||"file"==f&&(NE(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(LE(e)&&RE[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?u=eS:LE(e)&&r&&r.scheme==e.scheme?u=WE:LE(e)?u=GE:"/"==i[l+1]?(u=zE,l++):(e.cannotBeABaseURL=!0,e.path.push(""),u=oS)}break;case VE:if(!r||r.cannotBeABaseURL&&"#"!=o)return lE;if(r.cannotBeABaseURL&&"#"==o){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,u=sS;break}u="file"==r.scheme?eS:YE;continue;case WE:if("/"!=o||"/"!=i[l+1]){u=YE;continue}u=KE,l++;break;case zE:if("/"==o){u=XE;break}u=iS;continue;case YE:if(e.scheme=r.scheme,o==eE)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==o||"\\"==o&&LE(e))u=$E;else if("?"==o)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",u=aS;else{if("#"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),u=iS;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=sS}break;case $E:if(!LE(e)||"/"!=o&&"\\"!=o){if("/"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,u=iS;continue}u=XE}else u=KE;break;case GE:if(u=KE,"/"!=o||"/"!=f.charAt(l+1))continue;l++;break;case KE:if("/"!=o&&"\\"!=o){u=XE;continue}break;case XE:if("@"==o){h&&(f="%40"+f),h=!0,a=ky(f);for(var g=0;g<a.length;g++){var m=a[g];if(":"!=m||d){var v=jE(m,PE);d?e.password+=v:e.username+=v}else d=!0}f=""}else if(o==eE||"/"==o||"?"==o||"#"==o||"\\"==o&&LE(e)){if(h&&""==f)return"Invalid authority";l-=ky(f).length+1,f="",u=JE}else f+=o;break;case JE:case QE:if(n&&"file"==e.scheme){u=nS;continue}if(":"!=o||p){if(o==eE||"/"==o||"?"==o||"#"==o||"\\"==o&&LE(e)){if(LE(e)&&""==f)return fE;if(n&&""==f&&(NE(e)||null!==e.port))return;if(s=kE(e,f))return s;if(f="",u=rS,n)return;continue}"["==o?p=!0:"]"==o&&(p=!1),f+=o}else{if(""==f)return fE;if(s=kE(e,f))return s;if(f="",u=ZE,n==QE)return}break;case ZE:if(!gE.test(o)){if(o==eE||"/"==o||"?"==o||"#"==o||"\\"==o&&LE(e)||n){if(""!=f){var y=parseInt(f,10);if(y>65535)return hE;e.port=LE(e)&&y===RE[e.scheme]?null:y,f=""}if(n)return;u=rS;continue}return hE}f+=o;break;case eS:if(e.scheme="file","/"==o||"\\"==o)u=tS;else{if(!r||"file"!=r.scheme){u=iS;continue}if(o==eE)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==o)e.host=r.host,e.path=r.path.slice(),e.query="",u=aS;else{if("#"!=o){DE(i.slice(l).join(""))||(e.host=r.host,e.path=r.path.slice(),FE(e)),u=iS;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",u=sS}}break;case tS:if("/"==o||"\\"==o){u=nS;break}r&&"file"==r.scheme&&!DE(i.slice(l).join(""))&&(UE(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),u=iS;continue;case nS:if(o==eE||"/"==o||"\\"==o||"?"==o||"#"==o){if(!n&&UE(f))u=iS;else if(""==f){if(e.host="",n)return;u=rS}else{if(s=kE(e,f))return s;if("localhost"==e.host&&(e.host=""),n)return;f="",u=rS}continue}f+=o;break;case rS:if(LE(e)){if(u=iS,"/"!=o&&"\\"!=o)continue}else if(n||"?"!=o)if(n||"#"!=o){if(o!=eE&&(u=iS,"/"!=o))continue}else e.fragment="",u=sS;else e.query="",u=aS;break;case iS:if(o==eE||"/"==o||"\\"==o&&LE(e)||!n&&("?"==o||"#"==o)){if(".."===(c=(c=f).toLowerCase())||"%2e."===c||".%2e"===c||"%2e%2e"===c?(FE(e),"/"==o||"\\"==o&&LE(e)||e.path.push("")):qE(f)?"/"==o||"\\"==o&&LE(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&UE(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(o==eE||"?"==o||"#"==o))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==o?(e.query="",u=aS):"#"==o&&(e.fragment="",u=sS)}else f+=jE(o,CE);break;case oS:"?"==o?(e.query="",u=aS):"#"==o?(e.fragment="",u=sS):o!=eE&&(e.path[0]+=jE(o,OE));break;case aS:n||"#"!=o?o!=eE&&("'"==o&&LE(e)?e.query+="%27":e.query+="#"==o?"%23":jE(o,OE)):(e.fragment="",u=sS);break;case sS:o!=eE&&(e.fragment+=jE(o,IE))}l++}},uS=function(e){var t,n,r=Aw(this,uS,"URL"),i=arguments.length>1?arguments[1]:void 0,o=String(e),a=aE(r,{type:"URL"});if(void 0!==i)if(i instanceof uS)t=sE(i);else if(n=cS(t={},String(i)))throw TypeError(n);if(n=cS(a,o,null,t))throw TypeError(n);var s=a.searchParams=new iE,c=oE(s);c.updateSearchParams(a.query),c.updateURL=function(){a.query=String(s)||null},Fg||(r.href=fS.call(r),r.origin=hS.call(r),r.protocol=pS.call(r),r.username=dS.call(r),r.password=gS.call(r),r.host=mS.call(r),r.hostname=vS.call(r),r.port=yS.call(r),r.pathname=bS.call(r),r.search=wS.call(r),r.searchParams=_S.call(r),r.hash=ES.call(r))},lS=uS.prototype,fS=function(){var e=sE(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,a=e.path,s=e.query,c=e.fragment,u=t+":";return null!==i?(u+="//",NE(e)&&(u+=n+(r?":"+r:"")+"@"),u+=AE(i),null!==o&&(u+=":"+o)):"file"==t&&(u+="//"),u+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(u+="?"+s),null!==c&&(u+="#"+c),u},hS=function(){var e=sE(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&LE(e)?t+"://"+AE(e.host)+(null!==n?":"+n:""):"null"},pS=function(){return sE(this).scheme+":"},dS=function(){return sE(this).username},gS=function(){return sE(this).password},mS=function(){var e=sE(this),t=e.host,n=e.port;return null===t?"":null===n?AE(t):AE(t)+":"+n},vS=function(){var e=sE(this).host;return null===e?"":AE(e)},yS=function(){var e=sE(this).port;return null===e?"":String(e)},bS=function(){var e=sE(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},wS=function(){var e=sE(this).query;return e?"?"+e:""},_S=function(){return sE(this).searchParams},ES=function(){var e=sE(this).fragment;return e?"#"+e:""},SS=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(Fg&&Jv(lS,{href:SS(fS,(function(e){var t=sE(this),n=String(e),r=cS(t,n);if(r)throw TypeError(r);oE(t.searchParams).updateSearchParams(t.query)})),origin:SS(hS),protocol:SS(pS,(function(e){var t=sE(this);cS(t,String(e)+":",BE)})),username:SS(dS,(function(e){var t=sE(this),n=ky(String(e));if(!ME(t)){t.username="";for(var r=0;r<n.length;r++)t.username+=jE(n[r],PE)}})),password:SS(gS,(function(e){var t=sE(this),n=ky(String(e));if(!ME(t)){t.password="";for(var r=0;r<n.length;r++)t.password+=jE(n[r],PE)}})),host:SS(mS,(function(e){var t=sE(this);t.cannotBeABaseURL||cS(t,String(e),JE)})),hostname:SS(vS,(function(e){var t=sE(this);t.cannotBeABaseURL||cS(t,String(e),QE)})),port:SS(yS,(function(e){var t=sE(this);ME(t)||(""==(e=String(e))?t.port=null:cS(t,e,ZE))})),pathname:SS(bS,(function(e){var t=sE(this);t.cannotBeABaseURL||(t.path=[],cS(t,e+"",rS))})),search:SS(wS,(function(e){var t=sE(this);""==(e=String(e))?t.query=null:("?"==e.charAt(0)&&(e=e.slice(1)),t.query="",cS(t,e,aS)),oE(t.searchParams).updateSearchParams(t.query)})),searchParams:SS(_S),hash:SS(ES,(function(e){var t=sE(this);""!=(e=String(e))?("#"==e.charAt(0)&&(e=e.slice(1)),t.fragment="",cS(t,e,sS)):t.fragment=null}))}),Mm(lS,"toJSON",(function(){return fS.call(this)}),{enumerable:!0}),Mm(lS,"toString",(function(){return fS.call(this)}),{enumerable:!0}),rE){var kS=rE.createObjectURL,TS=rE.revokeObjectURL;kS&&Mm(uS,"createObjectURL",(function(e){return kS.apply(rE,arguments)})),TS&&Mm(uS,"revokeObjectURL",(function(e){return TS.apply(rE,arguments)}))}zy(uS,"URL"),hv({global:!0,forced:!w_,sham:!Fg},{URL:uS});var xS=Bv.some,AS=cb("some"),OS=zv("some");hv({target:"Array",proto:!0,forced:!AS||!OS},{some:function(e){return xS(this,e,arguments.length>1?arguments[1]:void 0)}});var IS="".repeat||function(e){var t=String(Gg(this)),n="",r=Hm(e);if(r<0||r==1/0)throw RangeError("Wrong number of repetitions");for(;r>0;(r>>>=1)&&(t+=t))1&r&&(n+=t);return n},CS=1..toFixed,PS=Math.floor,jS=function(e,t,n){return 0===t?n:t%2==1?jS(e,t-1,n*e):jS(e*e,t/2,n)},RS=CS&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!Dg((function(){CS.call({})}));hv({target:"Number",proto:!0,forced:RS},{toFixed:function(e){var t,n,r,i,o=function(e){if("number"!=typeof e&&"Number"!=zg(e))throw TypeError("Incorrect invocation");return+e}(this),a=Hm(e),s=[0,0,0,0,0,0],c="",u="0",l=function(e,t){for(var n=-1,r=t;++n<6;)r+=e*s[n],s[n]=r%1e7,r=PS(r/1e7)},f=function(e){for(var t=6,n=0;--t>=0;)n+=s[t],s[t]=PS(n/e),n=n%e*1e7},h=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==s[e]){var n=String(s[e]);t=""===t?n:t+IS.call("0",7-n.length)+n}return t};if(a<0||a>20)throw RangeError("Incorrect fraction digits");if(o!=o)return"NaN";if(o<=-1e21||o>=1e21)return String(o);if(o<0&&(c="-",o=-o),o>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(o*jS(2,69,1))-69)<0?o*jS(2,-t,1):o/jS(2,t,1),n*=4503599627370496,(t=52-t)>0){for(l(0,n),r=a;r>=7;)l(1e7,0),r-=7;for(l(jS(10,r,1),0),r=t-1;r>=23;)f(1<<23),r-=23;f(1<<r),l(1,1),f(2),u=h()}else l(0,n),l(1<<-t,0),u=h()+IS.call("0",a);return u=a>0?c+((i=u.length)<=a?"0."+IS.call("0",a-i)+u:u.slice(0,i-a)+"."+u.slice(i-a)):c+u}});var LS=Fb.entries;hv({target:"Object",stat:!0},{entries:function(e){return LS(e)}});var NS=Math.max,MS=Math.min,US=Math.floor,DS=/\$([$&'`]|\d\d?|<[^>]*>)/g,FS=/\$([$&'`]|\d\d?)/g;bw("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=r.REPLACE_KEEPS_$0,a=i?"$":"$0";return[function(n,r){var i=Gg(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&o||"string"==typeof r&&-1===r.indexOf(a)){var c=n(t,e,this,r);if(c.done)return c.value}var u=am(e),l=String(this),f="function"==typeof r;f||(r=String(r));var h=u.global;if(h){var p=u.unicode;u.lastIndex=0}for(var d=[];;){var g=_w(u,l);if(null===g)break;if(d.push(g),!h)break;""===String(g[0])&&(u.lastIndex=l_(l,Wm(u.lastIndex),p))}for(var m,v="",y=0,b=0;b<d.length;b++){g=d[b];for(var w=String(g[0]),_=NS(MS(Hm(g.index),l.length),0),E=[],S=1;S<g.length;S++)E.push(void 0===(m=g[S])?m:String(m));var k=g.groups;if(f){var T=[w].concat(E,_,l);void 0!==k&&T.push(k);var x=String(r.apply(void 0,T))}else x=s(w,l,_,E,k,r);_>=y&&(v+=l.slice(y,_)+x,y=_+w.length)}return v+l.slice(y)}];function s(e,n,r,i,o,a){var s=r+e.length,c=i.length,u=FS;return void 0!==o&&(o=dv(o),u=DS),t.call(a,u,(function(t,a){var u;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":u=o[a.slice(1,-1)];break;default:var l=+a;if(0===l)return t;if(l>c){var f=US(l/10);return 0===f?t:f<=c?void 0===i[f-1]?a.charAt(1):i[f-1]+a.charAt(1):t}u=i[l-1]}return void 0===u?"":u}))}}));var qS=ev.f,BS={}.toString,HS="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],VS={f:function(e){return HS&&"[object Window]"==BS.call(e)?function(e){try{return qS(e)}catch(e){return HS.slice()}}(e):qS(Kg(e))}},WS={f:_v},zS=cm.f,YS=Bv.forEach,$S=Tm("hidden"),GS="Symbol",KS=_v("toPrimitive"),XS=Nm.set,JS=Nm.getterFor(GS),QS=Object.prototype,ZS=Ug.Symbol,ek=Fm("JSON","stringify"),tk=om.f,nk=cm.f,rk=VS.f,ik=Hg.f,ok=wm("symbols"),ak=wm("op-symbols"),sk=wm("string-to-symbol-registry"),ck=wm("symbol-to-string-registry"),uk=wm("wks"),lk=Ug.QObject,fk=!lk||!lk.prototype||!lk.prototype.findChild,hk=Fg&&Dg((function(){return 7!=ry(nk({},"a",{get:function(){return nk(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=tk(QS,t);r&&delete QS[t],nk(e,t,n),r&&e!==QS&&nk(QS,t,r)}:nk,pk=function(e,t){var n=ok[e]=ry(ZS.prototype);return XS(n,{type:GS,tag:e,description:t}),Fg||(n.description=t),n},dk=vv?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof ZS},gk=function(e,t,n){e===QS&&gk(ak,t,n),am(e);var r=Jg(t,!0);return am(n),Zg(ok,r)?(n.enumerable?(Zg(e,$S)&&e[$S][r]&&(e[$S][r]=!1),n=ry(n,{enumerable:Vg(0,!1)})):(Zg(e,$S)||nk(e,$S,Vg(1,{})),e[$S][r]=!0),hk(e,r,n)):nk(e,r,n)},mk=function(e,t){am(e);var n=Kg(t),r=Xv(n).concat(wk(n));return YS(r,(function(t){Fg&&!vk.call(n,t)||gk(e,t,n[t])})),e},vk=function(e){var t=Jg(e,!0),n=ik.call(this,t);return!(this===QS&&Zg(ok,t)&&!Zg(ak,t))&&(!(n||!Zg(this,t)||!Zg(ok,t)||Zg(this,$S)&&this[$S][t])||n)},yk=function(e,t){var n=Kg(e),r=Jg(t,!0);if(n!==QS||!Zg(ok,r)||Zg(ak,r)){var i=tk(n,r);return!i||!Zg(ok,r)||Zg(n,$S)&&n[$S][r]||(i.enumerable=!0),i}},bk=function(e){var t=rk(Kg(e)),n=[];return YS(t,(function(e){Zg(ok,e)||Zg(xm,e)||n.push(e)})),n},wk=function(e){var t=e===QS,n=rk(t?ak:Kg(e)),r=[];return YS(n,(function(e){!Zg(ok,e)||t&&!Zg(QS,e)||r.push(ok[e])})),r};if(mv||(Mm((ZS=function(){if(this instanceof ZS)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=Sm(e),n=function(e){this===QS&&n.call(ak,e),Zg(this,$S)&&Zg(this[$S],t)&&(this[$S][t]=!1),hk(this,t,Vg(1,e))};return Fg&&fk&&hk(QS,t,{configurable:!0,set:n}),pk(t,e)}).prototype,"toString",(function(){return JS(this).tag})),Mm(ZS,"withoutSetter",(function(e){return pk(Sm(e),e)})),Hg.f=vk,cm.f=gk,om.f=yk,ev.f=VS.f=bk,tv.f=wk,WS.f=function(e){return pk(_v(e),e)},Fg&&(nk(ZS.prototype,"description",{configurable:!0,get:function(){return JS(this).description}}),Mm(QS,"propertyIsEnumerable",vk,{unsafe:!0}))),hv({global:!0,wrap:!0,forced:!mv,sham:!mv},{Symbol:ZS}),YS(Xv(uk),(function(e){!function(e){var t=Um.Symbol||(Um.Symbol={});Zg(t,e)||zS(t,e,{value:WS.f(e)})}(e)})),hv({target:GS,stat:!0,forced:!mv},{for:function(e){var t=String(e);if(Zg(sk,t))return sk[t];var n=ZS(t);return sk[t]=n,ck[n]=t,n},keyFor:function(e){if(!dk(e))throw TypeError(e+" is not a symbol");if(Zg(ck,e))return ck[e]},useSetter:function(){fk=!0},useSimple:function(){fk=!1}}),hv({target:"Object",stat:!0,forced:!mv,sham:!Fg},{create:function(e,t){return void 0===t?ry(e):mk(ry(e),t)},defineProperty:gk,defineProperties:mk,getOwnPropertyDescriptor:yk}),hv({target:"Object",stat:!0,forced:!mv},{getOwnPropertyNames:bk,getOwnPropertySymbols:wk}),hv({target:"Object",stat:!0,forced:Dg((function(){tv.f(1)}))},{getOwnPropertySymbols:function(e){return tv.f(dv(e))}}),ek){var _k=!mv||Dg((function(){var e=ZS();return"[null]"!=ek([e])||"{}"!=ek({a:e})||"{}"!=ek(Object(e))}));hv({target:"JSON",stat:!0,forced:_k},{stringify:function(e,t,n){for(var r,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(r=t,(Xg(t)||void 0!==e)&&!dk(e))return pv(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!dk(t))return t}),i[1]=t,ek.apply(null,i)}})}ZS.prototype[KS]||um(ZS.prototype,KS,ZS.prototype.valueOf),zy(ZS,GS),xm[$S]=!0,hv({target:"Number",stat:!0},{isNaN:function(e){return e!=e}});var Ek=om.f,Sk=Dg((function(){Ek(1)}));function kk(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Tk(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function xk(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function Ak(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?xk(Object(n),!0).forEach((function(t){Tk(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):xk(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}hv({target:"Object",stat:!0,forced:!Fg||Sk,sham:!Fg},{getOwnPropertyDescriptor:function(e,t){return Ek(Kg(e),t)}}),hv({target:"Object",stat:!0,sham:!Fg},{getOwnPropertyDescriptors:function(e){for(var t,n,r=Kg(e),i=om.f,o=nv(r),a={},s=0;o.length>s;)void 0!==(n=i(r,t=o[s++]))&&gv(a,t,n);return a}}),bw("match",1,(function(e,t,n){return[function(t){var n=Gg(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=am(e),o=String(this);if(!i.global)return _w(i,o);var a=i.unicode;i.lastIndex=0;for(var s,c=[],u=0;null!==(s=_w(i,o));){var l=String(s[0]);c[u]=l,""===l&&(i.lastIndex=l_(o,Wm(i.lastIndex),a)),u++}return 0===u?null:c}]}));var Ok={addCSS:!0,thumbWidth:15,watch:!0};function Ik(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}var Ck=function(e){return null!=e?e.constructor:null},Pk=function(e,t){return!!(e&&t&&e instanceof t)},jk=function(e){return null==e},Rk=function(e){return Ck(e)===Object},Lk=function(e){return Ck(e)===String},Nk=function(e){return Array.isArray(e)},Mk=function(e){return Pk(e,NodeList)},Uk=Lk,Dk=Nk,Fk=Mk,qk=function(e){return Pk(e,Element)},Bk=function(e){return Pk(e,Event)},Hk=function(e){return jk(e)||(Lk(e)||Nk(e)||Mk(e))&&!e.length||Rk(e)&&!Object.keys(e).length};function Vk(e,t){if(1>t){var n=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var Wk,zk,Yk,$k=function(){function e(t,n){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),qk(t)?this.element=t:Uk(t)&&(this.element=document.querySelector(t)),qk(this.element)&&Hk(this.element.rangeTouch)&&(this.config=Ak({},Ok,{},n),this.init())}return function(e,t,n){t&&kk(e.prototype,t),n&&kk(e,n)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!Bk(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute("min"))||0,a=parseFloat(r.getAttribute("max"))||100,s=parseFloat(r.getAttribute("step"))||1,c=r.getBoundingClientRect(),u=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*u:50<n&&(n+=2*(n-50)*u),o+Vk(n/100*(a-o),s)}},{key:"set",value:function(t){e.enabled&&Bk(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(Hk(t)||Uk(t)?r=Array.from(document.querySelectorAll(Uk(t)?t:'input[type="range"]')):qk(t)?r=[t]:Fk(t)?r=Array.from(t):Dk(t)&&(r=t.filter(qk)),Hk(r))return null;var i=Ak({},Ok,{},n);if(Uk(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){qk(n)&&Ik(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),Gk=Ug.Promise,Kk=_v("species"),Xk=function(e){var t=Fm(e),n=cm.f;Fg&&t&&!t[Kk]&&n(t,Kk,{configurable:!0,get:function(){return this}})},Jk=/(iphone|ipod|ipad).*applewebkit/i.test(kv),Qk="process"==zg(Ug.process),Zk=Ug.location,eT=Ug.setImmediate,tT=Ug.clearImmediate,nT=Ug.process,rT=Ug.MessageChannel,iT=Ug.Dispatch,oT=0,aT={},sT="onreadystatechange",cT=function(e){if(aT.hasOwnProperty(e)){var t=aT[e];delete aT[e],t()}},uT=function(e){return function(){cT(e)}},lT=function(e){cT(e.data)},fT=function(e){Ug.postMessage(e+"",Zk.protocol+"//"+Zk.host)};eT&&tT||(eT=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return aT[++oT]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},Wk(oT),oT},tT=function(e){delete aT[e]},Qk?Wk=function(e){nT.nextTick(uT(e))}:iT&&iT.now?Wk=function(e){iT.now(uT(e))}:rT&&!Jk?(Yk=(zk=new rT).port2,zk.port1.onmessage=lT,Wk=Dv(Yk.postMessage,Yk,1)):Ug.addEventListener&&"function"==typeof postMessage&&!Ug.importScripts&&Zk&&"file:"!==Zk.protocol&&!Dg(fT)?(Wk=fT,Ug.addEventListener("message",lT,!1)):Wk=sT in nm("script")?function(e){Qv.appendChild(nm("script")).onreadystatechange=function(){Qv.removeChild(this),cT(e)}}:function(e){setTimeout(uT(e),0)});var hT,pT,dT,gT,mT,vT,yT,bT,wT={set:eT,clear:tT},_T=om.f,ET=wT.set,ST=Ug.MutationObserver||Ug.WebKitMutationObserver,kT=Ug.document,TT=Ug.process,xT=Ug.Promise,AT=_T(Ug,"queueMicrotask"),OT=AT&&AT.value;OT||(hT=function(){var e,t;for(Qk&&(e=TT.domain)&&e.exit();pT;){t=pT.fn,pT=pT.next;try{t()}catch(e){throw pT?gT():dT=void 0,e}}dT=void 0,e&&e.enter()},!Jk&&!Qk&&ST&&kT?(mT=!0,vT=kT.createTextNode(""),new ST(hT).observe(vT,{characterData:!0}),gT=function(){vT.data=mT=!mT}):xT&&xT.resolve?(yT=xT.resolve(void 0),bT=yT.then,gT=function(){bT.call(yT,hT)}):gT=Qk?function(){TT.nextTick(hT)}:function(){ET.call(Ug,hT)});var IT,CT,PT,jT,RT=OT||function(e){var t={fn:e,next:void 0};dT&&(dT.next=t),pT||(pT=t,gT()),dT=t},LT=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=Uv(t),this.reject=Uv(n)},NT={f:function(e){return new LT(e)}},MT=function(e,t){if(am(e),Xg(t)&&t.constructor===e)return t;var n=NT.f(e);return(0,n.resolve)(t),n.promise},UT=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},DT=wT.set,FT=_v("species"),qT="Promise",BT=Nm.get,HT=Nm.set,VT=Nm.getterFor(qT),WT=Gk,zT=Ug.TypeError,YT=Ug.document,$T=Ug.process,GT=Fm("fetch"),KT=NT.f,XT=KT,JT=!!(YT&&YT.createEvent&&Ug.dispatchEvent),QT="function"==typeof PromiseRejectionEvent,ZT="unhandledrejection",ex=lv(qT,(function(){if(!(vm(WT)!==String(WT))){if(66===Ov)return!0;if(!Qk&&!QT)return!0}if(Ov>=51&&/native code/.test(WT))return!1;var e=WT.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[FT]=t,!(e.then((function(){}))instanceof t)})),tx=ex||!Iy((function(e){WT.all(e).catch((function(){}))})),nx=function(e){var t;return!(!Xg(e)||"function"!=typeof(t=e.then))&&t},rx=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;RT((function(){for(var r=e.value,i=1==e.state,o=0;n.length>o;){var a,s,c,u=n[o++],l=i?u.ok:u.fail,f=u.resolve,h=u.reject,p=u.domain;try{l?(i||(2===e.rejection&&sx(e),e.rejection=1),!0===l?a=r:(p&&p.enter(),a=l(r),p&&(p.exit(),c=!0)),a===u.promise?h(zT("Promise-chain cycle")):(s=nx(a))?s.call(a,f,h):f(a)):h(r)}catch(e){p&&!c&&p.exit(),h(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&ox(e)}))}},ix=function(e,t,n){var r,i;JT?((r=YT.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),Ug.dispatchEvent(r)):r={promise:t,reason:n},!QT&&(i=Ug["on"+e])?i(r):e===ZT&&function(e,t){var n=Ug.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}("Unhandled promise rejection",n)},ox=function(e){DT.call(Ug,(function(){var t,n=e.facade,r=e.value;if(ax(e)&&(t=UT((function(){Qk?$T.emit("unhandledRejection",r,n):ix(ZT,n,r)})),e.rejection=Qk||ax(e)?2:1,t.error))throw t.value}))},ax=function(e){return 1!==e.rejection&&!e.parent},sx=function(e){DT.call(Ug,(function(){var t=e.facade;Qk?$T.emit("rejectionHandled",t):ix("rejectionhandled",t,e.value)}))},cx=function(e,t,n){return function(r){e(t,r,n)}},ux=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,rx(e,!0))},lx=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw zT("Promise can't be resolved itself");var r=nx(t);r?RT((function(){var n={done:!1};try{r.call(t,cx(lx,n,e),cx(ux,n,e))}catch(t){ux(n,t,e)}})):(e.value=t,e.state=1,rx(e,!1))}catch(t){ux({done:!1},t,e)}}};ex&&(WT=function(e){Aw(this,WT,qT),Uv(e),IT.call(this);var t=BT(this);try{e(cx(lx,t),cx(ux,t))}catch(e){ux(t,e)}},(IT=function(e){HT(this,{type:qT,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=Ew(WT.prototype,{then:function(e,t){var n=VT(this),r=KT(c_(this,WT));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=Qk?$T.domain:void 0,n.parent=!0,n.reactions.push(r),0!=n.state&&rx(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),CT=function(){var e=new IT,t=BT(e);this.promise=e,this.resolve=cx(lx,t),this.reject=cx(ux,t)},NT.f=KT=function(e){return e===WT||e===PT?new CT(e):XT(e)},"function"==typeof Gk&&(jT=Gk.prototype.then,Mm(Gk.prototype,"then",(function(e,t){var n=this;return new WT((function(e,t){jT.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof GT&&hv({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return MT(WT,GT.apply(Ug,arguments))}}))),hv({global:!0,wrap:!0,forced:ex},{Promise:WT}),zy(WT,qT,!1),Xk(qT),PT=Fm(qT),hv({target:qT,stat:!0,forced:ex},{reject:function(e){var t=KT(this);return t.reject.call(void 0,e),t.promise}}),hv({target:qT,stat:!0,forced:ex},{resolve:function(e){return MT(this,e)}}),hv({target:qT,stat:!0,forced:tx},{all:function(e){var t=this,n=KT(t),r=n.resolve,i=n.reject,o=UT((function(){var n=Uv(t.resolve),o=[],a=0,s=1;xw(e,(function(e){var c=a++,u=!1;o.push(void 0),s++,n.call(t,e).then((function(e){u||(u=!0,o[c]=e,--s||r(o))}),i)})),--s||r(o)}));return o.error&&i(o.value),n.promise},race:function(e){var t=this,n=KT(t),r=n.reject,i=UT((function(){var i=Uv(t.resolve);xw(e,(function(e){i.call(t,e).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}});var fx,hx=om.f,px="".startsWith,dx=Math.min,gx=aw("startsWith"),mx=!(gx||(fx=hx(String.prototype,"startsWith"),!fx||fx.writable));hv({target:"String",proto:!0,forced:!mx&&!gx},{startsWith:function(e){var t=String(Gg(this));iw(e);var n=Wm(dx(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return px?px.call(t,r,n):t.slice(n,n+r.length)===r}});var vx,yx,bx,wx=function(e){return null!=e?e.constructor:null},_x=function(e,t){return Boolean(e&&t&&e instanceof t)},Ex=function(e){return null==e},Sx=function(e){return wx(e)===Object},kx=function(e){return wx(e)===String},Tx=function(e){return wx(e)===Function},xx=function(e){return Array.isArray(e)},Ax=function(e){return _x(e,NodeList)},Ox=function(e){return Ex(e)||(kx(e)||xx(e)||Ax(e))&&!e.length||Sx(e)&&!Object.keys(e).length},Ix=Ex,Cx=Sx,Px=function(e){return wx(e)===Number&&!Number.isNaN(e)},jx=kx,Rx=function(e){return wx(e)===Boolean},Lx=Tx,Nx=xx,Mx=Ax,Ux=function(e){return null!==e&&"object"===fs(e)&&1===e.nodeType&&"object"===fs(e.style)&&"object"===fs(e.ownerDocument)},Dx=function(e){return _x(e,Event)},Fx=function(e){return _x(e,KeyboardEvent)},qx=function(e){return _x(e,TextTrack)||!Ex(e)&&kx(e.kind)},Bx=function(e){return _x(e,Promise)&&Tx(e.then)},Hx=function(e){if(_x(e,window.URL))return!0;if(!kx(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!Ox(new URL(t).hostname)}catch(e){return!1}},Vx=Ox,Wx=(vx=document.createElement("span"),yx={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},bx=Object.keys(yx).find((function(e){return void 0!==vx.style[e]})),!!jx(bx)&&yx[bx]);function zx(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var Yx={isIE:
/* @cc_on!@ */
-!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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)},Wx=function(e){return function(t,n,r,i){Lv(n);var o=fv(t),a=Wg(o),s=qm(o.length),c=e?s-1:0,u=e?-1:1;if(r<2)for(;;){if(c in a){i=a[c],c+=u;break}if(c+=u,e?c<0:s<=c)throw TypeError("Reduce of empty array with no initial value")}for(;e?c>=0:s>c;c+=u)c in a&&(i=n(i,a[c],c,o));return i}},zx={left:Wx(!1),right:Wx(!0)}.left,Yx=ob("reduce"),$x=Hv("reduce",{1:0});function Gx(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function Kx(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(!n.length)return e;var i=n.shift();return Ax(i)?(Object.keys(i).forEach((function(t){Ax(i[t])?(Object.keys(e).includes(t)||Object.assign(e,gs({},t,{})),Kx(e[t],i[t])):Object.assign(e,gs({},t,i[t]))})),Kx.apply(void 0,[e].concat(n))):e}function Xx(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach((function(e,n){var r=n>0?t.cloneNode(!0):t,i=e.parentNode,o=e.nextSibling;r.appendChild(e),o?i.insertBefore(r,o):i.appendChild(r)}))}function Jx(e,t){Lx(e)&&!Bx(t)&&Object.entries(t).filter((function(e){var t=bs(e,2)[1];return!xx(t)})).forEach((function(t){var n=bs(t,2),r=n[0],i=n[1];return e.setAttribute(r,i)}))}function Qx(e,t,n){var r=document.createElement(e);return Ax(t)&&Jx(r,t),Px(n)&&(r.innerText=n),r}function Zx(e,t,n,r){Lx(t)&&t.appendChild(Qx(e,n,r))}function eA(e){Rx(e)||jx(e)?Array.from(e).forEach(eA):Lx(e)&&Lx(e.parentNode)&&e.parentNode.removeChild(e)}function tA(e){if(Lx(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function nA(e,t){return Lx(t)&&Lx(t.parentNode)&&Lx(e)?(t.parentNode.replaceChild(e,t),e):null}function rA(e,t){if(!Px(e)||Bx(e))return{};var n={},r=Kx({},t);return e.split(",").forEach((function(e){var t=e.trim(),i=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=bs(o,1)[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":Px(r.class)?n.class="".concat(r.class," ").concat(i):n.class=i;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}})),Kx(r,n)}function iA(e,t){if(Lx(e)){var n=t;Cx(n)||(n=!e.hidden),e.hidden=n}}function oA(e,t,n){if(Rx(e))return Array.from(e).map((function(e){return oA(e,t,n)}));if(Lx(e)){var r="toggle";return void 0!==n&&(r=n?"add":"remove"),e.classList[r](t),e.classList.contains(t)}return!1}function aA(e,t){return Lx(e)&&e.classList.contains(t)}function sA(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function cA(e){return this.elements.container.querySelectorAll(e)}function uA(e){return this.elements.container.querySelector(e)}function lA(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];Lx(e)&&(e.focus({preventScroll:!0}),t&&oA(e,this.config.classNames.tabFocus))}uv({target:"Array",proto:!0,forced:!Yx||!$x||!KS&&Tv>79&&Tv<83},{reduce:function(e){return zx(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var fA,hA={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},pA={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var r=Vx.isIPhone&&n&&pA.playsinline,i=pA[e]||"html5"!==t;return{api:i,ui:i&&pA.rangeInput&&("video"!==e||!Vx.isIPhone||r)}},pip:!(Vx.isIPhone||!Ix(Qx("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||Qx("video").disablePictureInPicture)),airplay:Ix(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(Bx(e))return!1;var t=bs(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(hA).includes(n)&&(n+='; codecs="'.concat(hA[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(fA=document.createElement("input"),fA.type="range","range"===fA.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==qx,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},dA=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 gA(e,t,n){var r=this,i=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&&!Bx(t)&&Ix(n)){var s=t.split(" "),c=a;dA&&(c={passive:o,capture:a}),s.forEach((function(t){r&&r.eventListeners&&i&&r.eventListeners.push({element:e,type:t,callback:n,options:c}),e[i?"addEventListener":"removeEventListener"](t,n,c)}))}}function mA(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];gA.call(this,e,t,n,!0,r,i)}function vA(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];gA.call(this,e,t,n,!1,r,i)}function yA(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],a=function a(){vA(e,n,a,i,o);for(var s=arguments.length,c=new Array(s),u=0;u<s;u++)c[u]=arguments[u];r.apply(t,c)};gA.call(this,e,n,a,!0,i,o)}function bA(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(Lx(e)&&!Bx(t)){var i=new CustomEvent(t,{bubbles:n,detail:vs(vs({},r),{},{plyr:this})});e.dispatchEvent(i)}}function wA(){this&&this.eventListeners&&(this.eventListeners.forEach((function(e){var t=e.element,n=e.type,r=e.callback,i=e.options;t.removeEventListener(n,r,i)})),this.eventListeners=[])}function _A(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):mA.call(e,e.elements.container,"ready",t)})).then((function(){}))}function EA(e){Dx(e)&&e.then(null,(function(){}))}function kA(e){return!!(jx(e)||Px(e)&&e.includes(":"))&&(jx(e)?e:e.split(":")).map(Number).every(Ox)}function SA(e){if(!jx(e)||!e.every(Ox))return null;var t=bs(e,2),n=t[0],r=t[1],i=function e(t,n){return 0===n?t:e(n,t%n)}(n,r);return[n/i,r/i]}function TA(e){var t=function(e){return kA(e)?e.split(":").map(Number):null},n=t(e);if(null===n&&(n=t(this.config.ratio)),null===n&&!Bx(this.embed)&&jx(this.embed.ratio)&&(n=this.embed.ratio),null===n&&this.isHTML5){var r=this.media;n=SA([r.videoWidth,r.videoHeight])}return n}function xA(e){if(!this.isVideo)return{};var t=this.elements.wrapper,n=TA.call(this,e),r=bs(jx(n)?n:[0,0],2),i=100/r[0]*r[1];if(t.style.paddingBottom="".concat(i,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var o=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),a=(o-i)/(o/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(a,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==n);return{padding:i,ratio:n}}var AA={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var n=t.getAttribute("type");return!!Bx(n)||pA.mime.call(e,n)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:AA.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,Bx(this.config.ratio)||xA.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=AA.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&Ix(e.config.quality.onChange))e.config.quality.onChange(t);else{var n=AA.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!n)return;var r=e.media,i=r.currentTime,o=r.paused,a=r.preload,s=r.readyState,c=r.playbackRate;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",(function(){e.speed=c,e.currentTime=i,o||EA(e.play())})),e.media.load())}bA.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(eA(AA.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function OA(e){return jx(e)?e.filter((function(t,n){return e.indexOf(t)===n})):e}var PA=Av("slice"),CA=Hv("slice",{ACCESSORS:!0,0:0,1:2}),IA=yv("species"),jA=[].slice,RA=Math.max;uv({target:"Array",proto:!0,forced:!PA||!CA},{slice:function(e,t){var n,r,i,o=Yg(this),a=qm(o.length),s=Wm(e,a),c=Wm(void 0===t?a:t,a);if(lv(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!lv(n.prototype)?$g(n)&&null===(n=n[IA])&&(n=void 0):n=void 0,n===Array||void 0===n))return jA.call(o,s,c);for(r=new(void 0===n?Array:n)(RA(c-s,0)),i=0;s<c;s++,i++)s in o&&hv(r,i,o[s]);return r.length=i,r}});var LA=om.f,NA=Jm.f,MA=jm.set,UA=yv("match"),DA=Lg.RegExp,FA=DA.prototype,BA=/a/g,qA=/a/g,HA=new DA(BA)!==BA,VA=Mb.UNSUPPORTED_Y;if(Mg&&sv("RegExp",!HA||VA||Ng((function(){return qA[UA]=!1,DA(BA)!=BA||DA(qA)==qA||"/a/i"!=DA(BA,"i")})))){for(var WA=function(e,t){var n,r=this instanceof WA,i=Xb(e),o=void 0===t;if(!r&&i&&e.constructor===WA&&o)return e;HA?i&&!o&&(e=e.source):e instanceof WA&&(o&&(t=Lb.call(e)),e=e.source),VA&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var a=hb(HA?new DA(e,t):DA(e,t),r?this:FA,WA);return VA&&n&&MA(a,{sticky:n}),a},zA=function(e){e in WA||LA(WA,e,{configurable:!0,get:function(){return DA[e]},set:function(t){DA[e]=t}})},YA=NA(DA),$A=0;YA.length>$A;)zA(YA[$A++]);FA.constructor=WA,WA.prototype=FA,Rm(Lg,"RegExp",WA)}function GA(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return Bx(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return n[t].toString()}))}$S("RegExp");var KA=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())},XA=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function JA(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=KA(t,"-"," "),t=KA(t,"_"," "),t=XA(t),KA(t," ","")}function QA(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var ZA={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},eO=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Bx(e)||Bx(t))return"";var n=Gx(t.i18n,e);if(Bx(n))return Object.keys(ZA).includes(e)?ZA[e]:"";var r={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(r).forEach((function(e){var t=bs(e,2),r=t[0],i=t[1];n=KA(n,r,i)})),n},tO=function(){function e(t){hs(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return ds(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(Bx(n))return null;var r=JSON.parse(n);return Px(t)&&t.length?r[t]:r}},{key:"set",value:function(t){if(e.supported&&this.enabled&&Ax(t)){var n=this.get();Bx(n)&&(n={}),Kx(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function nO(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise((function(n,r){try{var i=new XMLHttpRequest;if(!("withCredentials"in i))return;i.addEventListener("load",(function(){if("text"===t)try{n(JSON.parse(i.responseText))}catch(e){n(i.responseText)}else n(i.response)})),i.addEventListener("error",(function(){throw new Error(i.status)})),i.open("GET",e,!0),i.responseType=t,i.send()}catch(e){r(e)}}))}function rO(e,t){if(Px(e)){var n="cache",r=Px(t),i=function(){return null!==document.getElementById(t)},o=function(e,t){e.innerHTML=t,r&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!r||!i()){var a=tO.supported,s=document.createElement("div");if(s.setAttribute("hidden",""),r&&s.setAttribute("id",t),a){var c=window.localStorage.getItem("".concat(n,"-").concat(t));if(null!==c){var u=JSON.parse(c);o(s,u.content)}}nO(e).then((function(e){Bx(e)||(a&&window.localStorage.setItem("".concat(n,"-").concat(t),JSON.stringify({content:e})),o(s,e))})).catch((function(){}))}}}var iO=Math.ceil,oO=Math.floor;uv({target:"Math",stat:!0},{trunc:function(e){return(e>0?oO:iO)(e)}});var aO=function(e){return Math.trunc(e/60/60%60,10)},sO=function(e){return Math.trunc(e/60%60,10)},cO=function(e){return Math.trunc(e%60,10)};function uO(){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(!Ox(e))return uO(void 0,t,n);var r=function(e){return"0".concat(e).slice(-2)},i=aO(e),o=sO(e),a=cO(e);return i=t||i>0?"".concat(i,":"):"","".concat(n&&e>0?"-":"").concat(i).concat(r(o),":").concat(r(a))}var lO={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||Vx.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=uA.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:cA.call(this,this.config.selectors.buttons.play),pause:uA.call(this,this.config.selectors.buttons.pause),restart:uA.call(this,this.config.selectors.buttons.restart),rewind:uA.call(this,this.config.selectors.buttons.rewind),fastForward:uA.call(this,this.config.selectors.buttons.fastForward),mute:uA.call(this,this.config.selectors.buttons.mute),pip:uA.call(this,this.config.selectors.buttons.pip),airplay:uA.call(this,this.config.selectors.buttons.airplay),settings:uA.call(this,this.config.selectors.buttons.settings),captions:uA.call(this,this.config.selectors.buttons.captions),fullscreen:uA.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=uA.call(this,this.config.selectors.progress),this.elements.inputs={seek:uA.call(this,this.config.selectors.inputs.seek),volume:uA.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:uA.call(this,this.config.selectors.display.buffer),currentTime:uA.call(this,this.config.selectors.display.currentTime),duration:uA.call(this,this.config.selectors.display.duration)},Lx(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="http://www.w3.org/2000/svg",r=lO.getIconUrl.call(this),i="".concat(r.cors?"":r.url,"#").concat(this.config.iconPrefix),o=document.createElementNS(n,"svg");Jx(o,Kx(t,{"aria-hidden":"true",focusable:"false"}));var a=document.createElementNS(n,"use"),s="".concat(i,"-").concat(e);return"href"in a&&a.setAttributeNS("http://www.w3.org/1999/xlink","href",s),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",s),o.appendChild(a),o},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=eO(e,this.config),r=vs(vs({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return Qx("span",r,n)},createBadge:function(e){if(Bx(e))return null;var t=Qx("span",{class:this.config.classNames.menu.value});return t.appendChild(Qx("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=this,r=Kx({},t),i=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=JA(e)).charAt(0).toLowerCase()+e.slice(1)}(e),o={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(r).includes(e)&&(o[e]=r[e],delete r[e])})),"button"!==o.element||Object.keys(r).includes("type")||(r.type="button"),Object.keys(r).includes("class")?r.class.split(" ").some((function(e){return e===n.config.classNames.control}))||Kx(r,{class:"".concat(r.class," ").concat(this.config.classNames.control)}):r.class=this.config.classNames.control,e){case"play":o.toggle=!0,o.label="play",o.labelPressed="pause",o.icon="play",o.iconPressed="pause";break;case"mute":o.toggle=!0,o.label="mute",o.labelPressed="unmute",o.icon="volume",o.iconPressed="muted";break;case"captions":o.toggle=!0,o.label="enableCaptions",o.labelPressed="disableCaptions",o.icon="captions-off",o.iconPressed="captions-on";break;case"fullscreen":o.toggle=!0,o.label="enterFullscreen",o.labelPressed="exitFullscreen",o.icon="enter-fullscreen",o.iconPressed="exit-fullscreen";break;case"play-large":r.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",o.label="play",o.icon="play";break;default:Bx(o.label)&&(o.label=i),Bx(o.icon)&&(o.icon=e)}var a=Qx(o.element);return o.toggle?(a.appendChild(lO.createIcon.call(this,o.iconPressed,{class:"icon--pressed"})),a.appendChild(lO.createIcon.call(this,o.icon,{class:"icon--not-pressed"})),a.appendChild(lO.createLabel.call(this,o.labelPressed,{class:"label--pressed"})),a.appendChild(lO.createLabel.call(this,o.label,{class:"label--not-pressed"}))):(a.appendChild(lO.createIcon.call(this,o.icon)),a.appendChild(lO.createLabel.call(this,o.label))),Kx(r,rA(this.config.selectors.buttons[i],r)),Jx(a,r),"play"===i?(jx(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(a)):this.elements.buttons[i]=a,a},createRange:function(e,t){var n=Qx("input",Kx(rA(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":eO(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,lO.updateRangeFill.call(this,n),WS.setup(n),n},createProgress:function(e,t){var n=Qx("progress",Kx(rA(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(Qx("span",null,"0"));var r={played:"played",buffer:"buffered"}[e],i=r?eO(r,this.config):"";n.innerText="% ".concat(i.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e,t){var n=rA(this.config.selectors.display[e],t),r=Qx("div",Kx(n,{class:"".concat(n.class?n.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":eO(e,this.config)}),"00:00");return this.elements.display[e]=r,r},bindMenuItemShortcuts:function(e,t){var n=this;mA.call(this,e,"keydown keyup",(function(r){if([32,38,39,40].includes(r.which)&&(r.preventDefault(),r.stopPropagation(),"keydown"!==r.type)){var i,o=sA(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(r.which))lO.showMenuPanel.call(n,t,!0);else 32!==r.which&&(40===r.which||o&&39===r.which?(i=e.nextElementSibling,Lx(i)||(i=e.parentNode.firstElementChild)):(i=e.previousElementSibling,Lx(i)||(i=e.parentNode.lastElementChild)),lA.call(n,i,!0))}}),!1),mA.call(this,e,"keyup",(function(e){13===e.which&&lO.focusFirstMenuItem.call(n,null,!0)}))},createMenuItem:function(e){var t=this,n=e.value,r=e.list,i=e.type,o=e.title,a=e.badge,s=void 0===a?null:a,c=e.checked,u=void 0!==c&&c,l=rA(this.config.selectors.inputs[i]),f=Qx("button",Kx(l,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(l.class?l.class:"").trim(),"aria-checked":u,value:n})),h=Qx("span");h.innerHTML=o,Lx(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 sA(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(!Mx(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),f.checked=!0,i){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}lO.showMenuPanel.call(t,"home",Mx(e))}}),i,!1),lO.bindMenuItemShortcuts.call(this,f,i),r.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];if(!Ox(e))return e;var n=aO(this.duration)>0;return uO(e,n,t)},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];Lx(e)&&Ox(t)&&(e.innerText=lO.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(Lx(this.elements.inputs.volume)&&lO.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),Lx(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;Lx(e)&&(e.value=t,lO.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&Nx(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=function(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}(this.currentTime,this.duration),"timeupdate"===e.type&&lO.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var r=Ox(n)?n:0,i=Lx(e)?e:t.elements.display.buffer;if(Lx(i)){i.value=r;var o=i.getElementsByTagName("span")[0];Lx(o)&&(o.childNodes[0].nodeValue=r)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=Nx(e)?e.target:e;if(Lx(t)&&"range"===t.getAttribute("type")){if(sA(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=lO.formatTime(this.currentTime),r=lO.formatTime(this.duration),i=eO("seekLabel",this.config);t.setAttribute("aria-valuetext",i.replace("{currentTime}",n).replace("{duration}",r))}else if(sA(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);Vx.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&Lx(this.elements.inputs.seek)&&Lx(this.elements.display.seekTooltip)&&0!==this.duration){var n="".concat(this.config.classNames.tooltip,"--visible"),r=function(e){return oA(t.elements.display.seekTooltip,n,e)};if(this.touch)r(!1);else{var i=0,o=this.elements.progress.getBoundingClientRect();if(Nx(e))i=100/o.width*(e.pageX-o.left);else{if(!aA(this.elements.display.seekTooltip,n))return;i=parseFloat(this.elements.display.seekTooltip.style.left,10)}i<0?i=0:i>100&&(i=100),lO.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*i),this.elements.display.seekTooltip.style.left="".concat(i,"%"),Nx(e)&&["mouseenter","mouseleave"].includes(e.type)&&r("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!Lx(this.elements.display.duration)&&this.config.invertTime;lO.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||lO.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return iA(this.elements.display.currentTime,!0),void iA(this.elements.progress,!0);Lx(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=Lx(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&lO.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&lO.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),lO.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){iA(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var r=this.elements.settings.panels[e],i=null,o=t;if("captions"===e)i=this.currentTrack;else{if(i=Bx(n)?this[e]:n,Bx(i)&&(i=this.config[e].default),!Bx(this.options[e])&&!this.options[e].includes(i))return void this.debug.warn("Unsupported value of '".concat(i,"' for ").concat(e));if(!this.config[e].options.includes(i))return void this.debug.warn("Disabled value of '".concat(i,"' for ").concat(e))}if(Lx(o)||(o=r&&r.querySelector('[role="menu"]')),Lx(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=lO.getLabel.call(this,e,i);var a=o&&o.querySelector('[value="'.concat(i,'"]'));Lx(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?eO("normal",this.config):"".concat(t,"&times;");case"quality":if(Ox(t)){var n=eO("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return XA(t);case"captions":return pO.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(Lx(this.elements.settings.panels.quality)){var n="quality",r=this.elements.settings.panels.quality.querySelector('[role="menu"]');jx(e)&&(this.options.quality=OA(e).filter((function(e){return t.config.quality.options.includes(e)})));var i=!Bx(this.options.quality)&&this.options.quality.length>1;if(lO.toggleMenuButton.call(this,n,i),tA(r),lO.checkMenu.call(this),i){var o=function(e){var n=eO("qualityBadge.".concat(e),t.config);return n.length?lO.createBadge.call(t,n):null};this.options.quality.sort((function(e,n){var r=t.config.quality.options;return r.indexOf(e)>r.indexOf(n)?1:-1})).forEach((function(e){lO.createMenuItem.call(t,{value:e,list:r,type:n,title:lO.getLabel.call(t,"quality",e),badge:o(e)})})),lO.updateSetting.call(this,n,r)}}},setCaptionsMenu:function(){var e=this;if(Lx(this.elements.settings.panels.captions)){var t="captions",n=this.elements.settings.panels.captions.querySelector('[role="menu"]'),r=pO.getTracks.call(this),i=Boolean(r.length);if(lO.toggleMenuButton.call(this,t,i),tA(n),lO.checkMenu.call(this),i){var o=r.map((function(t,r){return{value:r,checked:e.captions.toggled&&e.currentTrack===r,title:pO.getLabel.call(e,t),badge:t.language&&lO.createBadge.call(e,t.language.toUpperCase()),list:n,type:"language"}}));o.unshift({value:-1,checked:!this.captions.toggled,title:eO("disabled",this.config),list:n,type:"language"}),o.forEach(lO.createMenuItem.bind(this)),lO.updateSetting.call(this,t,n)}}},setSpeedMenu:function(){var e=this;if(Lx(this.elements.settings.panels.speed)){var t="speed",n=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var r=!Bx(this.options.speed)&&this.options.speed.length>1;lO.toggleMenuButton.call(this,t,r),tA(n),lO.checkMenu.call(this),r&&(this.options.speed.forEach((function(r){lO.createMenuItem.call(e,{value:r,list:n,type:t,title:lO.getLabel.call(e,"speed",r)})})),lO.updateSetting.call(this,t,n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!Bx(e)&&Object.values(e).some((function(e){return!e.hidden}));iA(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;Lx(n)||(n=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var r=n.querySelector('[role^="menuitem"]');lA.call(this,r,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(Lx(t)&&Lx(n)){var r=t.hidden,i=r;if(Cx(e))i=e;else if(Mx(e)&&27===e.which)i=!1;else if(Nx(e)){var o=Ix(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(o);if(a||!a&&e.target!==n&&i)return}n.setAttribute("aria-expanded",i),iA(t,!i),oA(this.elements.container,this.config.classNames.menu.open,i),i&&Mx(e)?lO.focusFirstMenuItem.call(this,null,!0):i||r||lA.call(this,n,Mx(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,r=t.scrollHeight;return eA(t),{width:n,height:r}},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],r=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(Lx(r)){var i=r.parentNode,o=Array.from(i.children).find((function(e){return!e.hidden}));if(pA.transitions&&!pA.reducedMotion){i.style.width="".concat(o.scrollWidth,"px"),i.style.height="".concat(o.scrollHeight,"px");var a=lO.getMenuSize.call(this,r),s=function t(n){n.target===i&&["width","height"].includes(n.propertyName)&&(i.style.width="",i.style.height="",vA.call(e,i,qx,t))};mA.call(this,i,qx,s),i.style.width="".concat(a.width,"px"),i.style.height="".concat(a.height,"px")}iA(o,!0),iA(r,!1),lO.focusFirstMenuItem.call(this,r,n)}},setDownloadUrl:function(){var e=this.elements.buttons.download;Lx(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=lO.bindMenuItemShortcuts,r=lO.createButton,i=lO.createProgress,o=lO.createRange,a=lO.createTime,s=lO.setQualityMenu,c=lO.setSpeedMenu,u=lO.showMenuPanel;this.elements.controls=null,jx(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(r.call(this,"play-large"));var l=Qx("div",rA(this.config.selectors.controls.wrapper));this.elements.controls=l;var f={class:"plyr__controls__item"};return OA(jx(this.config.controls)?this.config.controls:[]).forEach((function(s){if("restart"===s&&l.appendChild(r.call(t,"restart",f)),"rewind"===s&&l.appendChild(r.call(t,"rewind",f)),"play"===s&&l.appendChild(r.call(t,"play",f)),"fast-forward"===s&&l.appendChild(r.call(t,"fast-forward",f)),"progress"===s){var c=Qx("div",{class:"".concat(f.class," plyr__progress__container")}),h=Qx("div",rA(t.config.selectors.progress));if(h.appendChild(o.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),h.appendChild(i.call(t,"buffer")),t.config.tooltips.seek){var p=Qx("span",{class:t.config.classNames.tooltip},"00:00");h.appendChild(p),t.elements.display.seekTooltip=p}t.elements.progress=h,c.appendChild(t.elements.progress),l.appendChild(c)}if("current-time"===s&&l.appendChild(a.call(t,"currentTime",f)),"duration"===s&&l.appendChild(a.call(t,"duration",f)),"mute"===s||"volume"===s){var d=t.elements.volume;if(Lx(d)&&l.contains(d)||(d=Qx("div",Kx({},f,{class:"".concat(f.class," plyr__volume").trim()})),t.elements.volume=d,l.appendChild(d)),"mute"===s&&d.appendChild(r.call(t,"mute")),"volume"===s&&!Vx.isIos){var g={max:1,step:.05,value:t.config.volume};d.appendChild(o.call(t,"volume",Kx(g,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===s&&l.appendChild(r.call(t,"captions",f)),"settings"===s&&!Bx(t.config.settings)){var m=Qx("div",Kx({},f,{class:"".concat(f.class," plyr__menu").trim(),hidden:""}));m.appendChild(r.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var v=Qx("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),y=Qx("div"),b=Qx("div",{id:"plyr-settings-".concat(e.id,"-home")}),w=Qx("div",{role:"menu"});b.appendChild(w),y.appendChild(b),t.elements.settings.panels.home=b,t.config.settings.forEach((function(r){var i=Qx("button",Kx(rA(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:""}));n.call(t,i,r),mA.call(t,i,"click",(function(){u.call(t,r,!1)}));var o=Qx("span",null,eO(r,t.config)),a=Qx("span",{class:t.config.classNames.menu.value});a.innerHTML=e[r],o.appendChild(a),i.appendChild(o),w.appendChild(i);var s=Qx("div",{id:"plyr-settings-".concat(e.id,"-").concat(r),hidden:""}),c=Qx("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});c.appendChild(Qx("span",{"aria-hidden":!0},eO(r,t.config))),c.appendChild(Qx("span",{class:t.config.classNames.hidden},eO("menuBack",t.config))),mA.call(t,s,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),u.call(t,"home",!0))}),!1),mA.call(t,c,"click",(function(){u.call(t,"home",!1)})),s.appendChild(c),s.appendChild(Qx("div",{role:"menu"})),y.appendChild(s),t.elements.settings.buttons[r]=i,t.elements.settings.panels[r]=s})),v.appendChild(y),m.appendChild(v),l.appendChild(m),t.elements.settings.popup=v,t.elements.settings.menu=m}if("pip"===s&&pA.pip&&l.appendChild(r.call(t,"pip",f)),"airplay"===s&&pA.airplay&&l.appendChild(r.call(t,"airplay",f)),"download"===s){var _=Kx({},f,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(_.download="");var E=t.config.urls.download;!Fx(E)&&t.isEmbed&&Kx(_,{icon:"logo-".concat(t.provider),label:t.provider}),l.appendChild(r.call(t,"download",_))}"fullscreen"===s&&l.appendChild(r.call(t,"fullscreen",f))})),this.isHTML5&&s.call(this,AA.getQualityOptions.call(this)),c.call(this),l},inject:function(){var e=this;if(this.config.loadSprite){var t=lO.getIconUrl.call(this);t.cors&&rO(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var r={id:this.id,seektime:this.config.seekTime,title:this.config.title},i=!0;Ix(this.config.controls)&&(this.config.controls=this.config.controls.call(this,r)),this.config.controls||(this.config.controls=[]),Lx(this.config.controls)||Px(this.config.controls)?n=this.config.controls:(n=lO.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:pO.getLabel.call(this)}),i=!1);var o,a;if(i&&Px(this.config.controls)&&(o=n,Object.entries(r).forEach((function(e){var t=bs(e,2),n=t[0],r=t[1];o=KA(o,"{".concat(n,"}"),r)})),n=o),Px(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),Lx(a)||(a=this.elements.container),a[Lx(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),Lx(this.elements.controls)||lO.findElements.call(this),!Bx(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return aA(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];oA(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){jx(e)||Rx(e)?Array.from(e).filter(Boolean).forEach(s):s(e)}))}if(Vx.isEdge&&Hx(a),this.config.tooltips.controls){var c=this.config,u=c.classNames,l=c.selectors,f="".concat(l.controls.wrapper," ").concat(l.labels," .").concat(u.hidden),h=cA.call(this,f);Array.from(h).forEach((function(t){oA(t,e.config.classNames.hidden,!1),oA(t,e.config.classNames.tooltip,!0)}))}}};function fO(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=e;if(t){var r=document.createElement("a");r.href=n,n=r.href}try{return new URL(n)}catch(e){return null}}function hO(e){var t=new URLSearchParams;return Ax(e)&&Object.entries(e).forEach((function(e){var n=bs(e,2),r=n[0],i=n[1];t.set(r,i)})),t}var pO={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!pA.textTracks)jx(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&lO.setCaptionsMenu.call(this);else{if(Lx(this.elements.captions)||(this.elements.captions=Qx("div",rA(this.config.selectors.captions)),function(e,t){Lx(e)&&Lx(t)&&t.parentNode.insertBefore(e,t.nextSibling)}(this.elements.captions,this.elements.wrapper)),Vx.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),n=fO(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&nO(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){eA(e)}))}))}var t=OA((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=bs(t,1)[0];var r=this.storage.get("captions");if(Cx(r)||(r=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:r,language:n,languages:t}),this.isHTML5){var i=this.config.captions.update?"addtrack removetrack":"removetrack";mA.call(this,this.media.textTracks,i,pO.update.bind(this))}setTimeout(pO.update.bind(this),0)}},update:function(){var e=this,t=pO.getTracks.call(this,!0),n=this.captions,r=n.active,i=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find((function(e){return e.language===i})));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}),"showing"===t.mode&&(t.mode="hidden"),mA.call(e,t,"cuechange",(function(){return pO.updateCues.call(e)}))})),(s&&this.language!==i||!t.includes(a))&&(pO.setLanguage.call(this,i),pO.toggle.call(this,r&&s)),oA(this.elements.container,this.config.classNames.captions.enabled,!Bx(t)),jx(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&lO.setCaptionsMenu.call(this)},toggle:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var r=this.captions.toggled,i=this.config.classNames.captions.active,o=xx(e)?!r:e;if(o!==r){if(n||(this.captions.active=o,this.storage.set({captions:o})),!this.language&&o&&!n){var a=pO.getTracks.call(this),s=pO.findTrack.call(this,[this.captions.language].concat(ws(this.captions.languages)),!0);return this.captions.language=s.language,void pO.set.call(this,a.indexOf(s))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=o),oA(this.elements.container,i,o),this.captions.toggled=o,lO.updateSetting.call(this,"captions"),bA.call(this,this.media,o?"captionsenabled":"captionsdisabled")}setTimeout((function(){o&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=pO.getTracks.call(this);if(-1!==e)if(Ox(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var r=n[e],i=r||{},o=i.language;this.captions.currentTrackNode=r,lO.updateSetting.call(this,"captions"),t||(this.captions.language=o,this.storage.set({language:o})),this.isVimeo&&this.embed.enableTextTrack(o),bA.call(this,this.media,"languagechange")}pO.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&pO.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else pO.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(Px(e)){var n=e.toLowerCase();this.captions.language=n;var r=pO.getTracks.call(this),i=pO.findTrack.call(this,[n]);pO.set.call(this,r.indexOf(i),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=Array.from((this.media||{}).textTracks||[]);return n.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,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=pO.getTracks.call(this),o=function(e){return Number((n.captions.meta.get(e)||{}).default)},a=Array.from(i).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||(r?a[0]:void 0)},getCurrentTrack:function(){return pO.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!Ux(t)&&pA.textTracks&&this.captions.toggled&&(t=pO.getCurrentTrack.call(this)),Ux(t)?Bx(t.label)?Bx(t.language)?eO("enabled",this.config):e.language.toUpperCase():t.label:eO("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(Lx(this.elements.captions))if(xx(e)||Array.isArray(e)){var t=e;if(!t){var n=pO.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(QA)}var r=t.map((function(e){return e.trim()})).join("\n");if(r!==this.elements.captions.innerHTML){tA(this.elements.captions);var i=Qx("span",rA(this.config.selectors.caption));i.innerHTML=r,this.elements.captions.appendChild(i),bA.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},dO={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.3/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},gO="picture-in-picture",mO="inline",vO={html5:"html5",youtube:"youtube",vimeo:"vimeo"},yO="audio",bO="video";var wO=function(){},_O=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];hs(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return ds(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):wO}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):wO}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):wO}}]),e}(),EO=function(){function e(t){var n=this;hs(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&function(e,t){return(Element.prototype.closest||function(){var e=this;do{if(sA.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,t.config.fullscreen.container),mA.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){n.onChange()})),mA.call(this.player,this.player.elements.container,"dblclick",(function(e){Lx(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.player.listeners.proxy(e,n.toggle,"fullscreen")})),mA.call(this,this.player.elements.container,"keydown",(function(e){return n.trapFocus(e)})),this.update()}return ds(e,[{key:"onChange",value:function(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;Lx(e)&&(e.pressed=this.active);var t=this.target===this.player.media?this.target:this.player.elements.container;bA.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)}}},{key:"toggleFallback",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(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":"",oA(this.target,this.player.config.classNames.fullscreen.fallback,e),Vx.isIos){var t=document.head.querySelector('meta[name="viewport"]'),n="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var r=Px(t.content)&&t.content.includes(n);e?(this.cleanupViewport=!r,r||(t.content+=",".concat(n))):this.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==n})).join(","))}this.onChange()}},{key:"trapFocus",value:function(e){if(!Vx.isIos&&this.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,n=cA.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),r=bs(n,1)[0],i=n[n.length-1];t!==i||e.shiftKey?t===r&&e.shiftKey&&(i.focus(),e.preventDefault()):(r.focus(),e.preventDefault())}}},{key:"update",value:function(){var t;this.enabled?(t=this.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",this.player.debug.log("".concat(t," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");oA(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(Vx.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!e.native||this.forceFallback?this.toggleFallback(!0):this.prefix?Bx(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen({navigationUI:"hide"}))}},{key:"exit",value:function(){if(this.enabled)if(Vx.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),EA(this.player.play());else if(!e.native||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!Bx(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)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return aA(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return Vx.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(Ix(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!Ix(document["".concat(t,"ExitFullscreen")])&&!Ix(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),kO=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function SO(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise((function(n,r){var i=new Image,o=function(){delete i.onload,delete i.onerror,(i.naturalWidth>=t?n:r)(i)};Object.assign(i,{onload:o,onerror:o,src:e})}))}uv({target:"Math",stat:!0},{sign:kO});var TO={addStyleHook:function(){oA(this.elements.container,this.config.selectors.container.replace(".",""),!0),oA(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 TO.toggleNativeControls.call(this,!0);Lx(this.elements.controls)||(lO.inject.call(this),this.listeners.controls()),TO.toggleNativeControls.call(this),this.isHTML5&&pO.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,lO.updateVolume.call(this),lO.timeUpdate.call(this),TO.checkPlaying.call(this),oA(this.elements.container,this.config.classNames.pip.supported,pA.pip&&this.isHTML5&&this.isVideo),oA(this.elements.container,this.config.classNames.airplay.supported,pA.airplay&&this.isHTML5),oA(this.elements.container,this.config.classNames.isIos,Vx.isIos),oA(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){bA.call(e,e.media,"ready")}),0),TO.setTitle.call(this),this.poster&&TO.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&lO.durationUpdate.call(this)},setTitle:function(){var e=eO("play",this.config);if(Px(this.config.title)&&!Bx(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=uA.call(this,"iframe");if(!Lx(t))return;var n=Bx(this.config.title)?"video":this.config.title,r=eO("frameTitle",this.config);t.setAttribute("title",r.replace("{title}",n))}},togglePoster:function(e){oA(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),_A.call(this).then((function(){return SO(e)})).catch((function(n){throw e===t.poster&&TO.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:""}),TO.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;oA(this.elements.container,this.config.classNames.playing,this.playing),oA(this.elements.container,this.config.classNames.paused,this.paused),oA(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",eO(t.playing?"pause":"play",t.config))})),Nx(e)&&"timeupdate"===e.type||TO.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(){oA(t.elements.container,t.config.classNames.loading,t.loading),TO.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}},migrateStyles:function(){var e=this;Object.values(vs({},this.media.style)).filter((function(e){return!Bx(e)&&Px(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),Bx(this.media.style)&&this.media.removeAttribute("style")}},xO=function(){function e(t){hs(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 ds(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,r=e.keyCode?e.keyCode:e.which,i="keydown"===e.type,o=i&&r===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&Ox(r)){if(i){var a=document.activeElement;if(Lx(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&sA(a,s))return;if(32===e.which&&sA(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(r)&&(e.preventDefault(),e.stopPropagation()),r){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*(r-48));break;case 32:case 75:o||EA(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}27===r&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=r}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){lO.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,oA(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 r,i=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||i)r=t.config.classNames.tabFocus,oA(cA.call(t,".".concat(r)),r,!1),"focusout"!==e.type&&(this.focusTimer=setTimeout((function(){var e=document.activeElement;n.container.contains(e)&&oA(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&&gA.call(t,window,"keydown keyup",this.handleKey,e,!1),gA.call(t,document.body,"click",this.toggleMenu,e),yA.call(t,document.body,"touchstart",this.firstTouch),gA.call(t,document.body,"keydown focus blur focusout",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,n=e.elements,r=e.timers;!t.keyboard.global&&t.keyboard.focused&&mA.call(e,n.container,"keydown keyup",this.handleKey,!1),mA.call(e,n.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var i=n.controls;i&&"enterfullscreen"===t.type&&(i.pressed=!1,i.hover=!1);var o=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(TO.toggleControls.call(e,!0),o=e.touch?3e3:2e3),clearTimeout(r.controls),r.controls=setTimeout((function(){return TO.toggleControls.call(e,!1)}),o)}));var i=function(t){if(!t)return xA.call(e);var r=n.container.getBoundingClientRect(),i=r.width,o=r.height;return xA.call(e,"".concat(i,":").concat(o))},o=function(){clearTimeout(r.resized),r.resized=setTimeout(i,50)};mA.call(e,n.container,"enterfullscreen exitfullscreen",(function(t){var r=e.fullscreen,a=r.target,s=r.usingNative;if(a===n.container&&(e.isEmbed||!Bx(e.config.ratio))){var c="enterfullscreen"===t.type,u=i(c);u.padding;!function(t,n,r){if(e.isVimeo&&!e.config.vimeo.premium){var i=e.elements.wrapper.firstChild,o=bs(t,2)[1],a=bs(TA.call(e),2),s=a[0],c=a[1];i.style.maxWidth=r?"".concat(o/c*s,"px"):null,i.style.margin=r?"0 auto":null}}(u.ratio,0,c),c&&setTimeout((function(){return Hx(n.container)}),100),s||(c?mA.call(e,window,"resize",o):vA.call(e,window,"resize",o))}}))}},{key:"media",value:function(){var e=this,t=this.player,n=t.elements;if(mA.call(t,t.media,"timeupdate seeking seeked",(function(e){return lO.timeUpdate.call(t,e)})),mA.call(t,t.media,"durationchange loadeddata loadedmetadata",(function(e){return lO.durationUpdate.call(t,e)})),mA.call(t,t.media,"ended",(function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&(t.restart(),t.pause())})),mA.call(t,t.media,"progress playing seeking seeked",(function(e){return lO.updateProgress.call(t,e)})),mA.call(t,t.media,"volumechange",(function(e){return lO.updateVolume.call(t,e)})),mA.call(t,t.media,"playing play pause ended emptied timeupdate",(function(e){return TO.checkPlaying.call(t,e)})),mA.call(t,t.media,"waiting canplay seeked playing",(function(e){return TO.checkLoading.call(t,e)})),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var r=uA.call(t,".".concat(t.config.classNames.video));if(!Lx(r))return;mA.call(t,n.container,"click",(function(i){([n.container,r].includes(i.target)||r.contains(i.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(i,t.restart,"restart"),e.proxy(i,(function(){EA(t.play())}),"play")):e.proxy(i,(function(){EA(t.togglePlay())}),"play")))}))}t.supported.ui&&t.config.disableContextMenu&&mA.call(t,n.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),mA.call(t,t.media,"volumechange",(function(){t.storage.set({volume:t.volume,muted:t.muted})})),mA.call(t,t.media,"ratechange",(function(){lO.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})})),mA.call(t,t.media,"qualitychange",(function(e){lO.updateSetting.call(t,"quality",null,e.detail.quality)})),mA.call(t,t.media,"ready qualitychange",(function(){lO.setDownloadUrl.call(t)}));var i=t.config.events.concat(["keyup","keydown"]).join(" ");mA.call(t,t.media,i,(function(e){var r=e.detail,i=void 0===r?{}:r;"error"===e.type&&(i=t.media.error),bA.call(t,n.container,e.type,!0,i)}))}},{key:"proxy",value:function(e,t,n){var r=this.player,i=r.config.listeners[n],o=!0;Ix(i)&&(o=i.call(r,e)),!1!==o&&Ix(t)&&t.call(r,e)}},{key:"bind",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=this.player,s=a.config.listeners[r],c=Ix(s);mA.call(a,e,t,(function(e){return i.proxy(e,n,r)}),o&&!c)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,r=Vx.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach((function(n){e.bind(n,"click",(function(){EA(t.togglePlay())}),"play")})),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",(function(){t.lastSeekTime=Date.now(),t.rewind()}),"rewind"),this.bind(n.buttons.fastForward,"click",(function(){t.lastSeekTime=Date.now(),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.download,"click",(function(){bA.call(t,t.media,"download")}),"download"),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(),e.preventDefault(),lO.toggleMenu.call(t,e)}),null,!1),this.bind(n.buttons.settings,"keyup",(function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),lO.toggleMenu.call(t,e)):lO.focusFirstMenuItem.call(t,null,!0))}),null,!1),this.bind(n.settings.menu,"keydown",(function(e){27===e.which&&lO.toggleMenu.call(t,e)})),this.bind(n.inputs.seek,"mousedown mousemove",(function(e){var t=n.progress.getBoundingClientRect(),r=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",r)})),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(function(e){var n=e.currentTarget,r=e.keyCode?e.keyCode:e.which,i="play-on-seeked";if(!Mx(e)||39===r||37===r){t.lastSeekTime=Date.now();var o=n.hasAttribute(i),a=["mouseup","touchend","keyup"].includes(e.type);o&&a?(n.removeAttribute(i),EA(t.play())):!a&&t.playing&&(n.setAttribute(i,""),t.pause())}})),Vx.isIos){var i=cA.call(t,'input[type="range"]');Array.from(i).forEach((function(t){return e.bind(t,r,(function(e){return Hx(e.target)}))}))}this.bind(n.inputs.seek,r,(function(e){var n=e.currentTarget,r=n.getAttribute("seek-value");Bx(r)&&(r=n.value),n.removeAttribute("seek-value"),t.currentTime=r/n.max*t.duration}),"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",(function(e){return lO.updateSeekTooltip.call(t,e)})),this.bind(n.progress,"mousemove touchmove",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startMove(e)})),this.bind(n.progress,"mouseleave touchend click",(function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)})),this.bind(n.progress,"mousedown touchstart",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startScrubbing(e)})),this.bind(n.progress,"mouseup touchend",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.endScrubbing(e)})),Vx.isWebkit&&Array.from(cA.call(t,'input[type="range"]')).forEach((function(n){e.bind(n,"input",(function(e){return lO.updateRangeFill.call(t,e.target)}))})),t.config.toggleInvert&&!Lx(n.display.duration)&&this.bind(n.display.currentTime,"click",(function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,lO.timeUpdate.call(t))})),this.bind(n.inputs.volume,r,(function(e){t.volume=e.target.value}),"volume"),this.bind(n.controls,"mouseenter mouseleave",(function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type})),n.fullscreen&&Array.from(n.fullscreen.children).filter((function(e){return!e.contains(n.container)})).forEach((function(r){e.bind(r,"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",(function(){var r=t.config,i=t.timers;oA(n.controls,r.classNames.noTransition,!0),TO.toggleControls.call(t,!0),setTimeout((function(){oA(n.controls,r.classNames.noTransition,!1)}),0);var o=e.touch?3e3:4e3;clearTimeout(i.controls),i.controls=setTimeout((function(){return TO.toggleControls.call(t,!1)}),o)})),this.bind(n.inputs.volume,"wheel",(function(e){var n=e.webkitDirectionInvertedFromDevice,r=bs([e.deltaX,-e.deltaY].map((function(e){return n?-e:e})),2),i=r[0],o=r[1],a=Math.sign(Math.abs(i)>Math.abs(o)?i:o);t.increaseVolume(a/50);var s=t.media.volume;(1===a&&s<1||-1===a&&s>0)&&e.preventDefault()}),"volume",!1)}}]),e}(),AO=Av("splice"),OO=Hv("splice",{ACCESSORS:!0,0:0,1:2}),PO=Math.max,CO=Math.min,IO=9007199254740991,jO="Maximum allowed length exceeded";uv({target:"Array",proto:!0,forced:!AO||!OO},{splice:function(e,t){var n,r,i,o,a,s,c=fv(this),u=qm(c.length),l=Wm(e,u),f=arguments.length;if(0===f?n=r=0:1===f?(n=0,r=u-l):(n=f-2,r=CO(PO(Fm(t),0),u-l)),u+n-r>IO)throw TypeError(jO);for(i=wv(c,r),o=0;o<r;o++)(a=l+o)in c&&hv(i,o,c[a]);if(i.length=r,n<r){for(o=l;o<u-r;o++)s=o+n,(a=o+r)in c?c[s]=c[a]:delete c[s];for(o=u;o>u-r+n;o--)delete c[o-1]}else if(n>r)for(o=u-r;o>l;o--)s=o+n-1,(a=o+r-1)in c?c[s]=c[a]:delete c[s];for(o=0;o<n;o++)c[o+l]=arguments[o+2];return c.length=u-r+n,i}});var RO=t((function(e,t){e.exports=function(){var e=function(){},t={},n={},r={};function i(e,t){e=e.push?e:[e];var i,o,a,s=[],c=e.length,u=c;for(i=function(e,n){n.length&&s.push(e),--u||t(s)};c--;)o=e[c],(a=n[o])?i(o,a):(r[o]=r[o]||[]).push(i)}function o(e,t){if(e){var i=r[e];if(n[e]=t,i)for(;i.length;)i[0](e,t),i.splice(0,1)}}function a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function s(t,n,r,i){var o,a,c=document,u=r.async,l=(r.numRetries||0)+1,f=r.before||e,h=t.replace(/[\?|#].*$/,""),p=t.replace(/^(css|img)!/,"");i=i||0,/(^css!|\.css$)/.test(h)?((a=c.createElement("link")).rel="stylesheet",a.href=p,(o="hideFocus"in a)&&a.relList&&(o=0,a.rel="preload",a.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(h)?(a=c.createElement("img")).src=p:((a=c.createElement("script")).src=t,a.async=void 0===u||u),a.onload=a.onerror=a.onbeforeload=function(e){var c=e.type[0];if(o)try{a.sheet.cssText.length||(c="e")}catch(e){18!=e.code&&(c="e")}if("e"==c){if((i+=1)<l)return s(t,n,r,i)}else if("preload"==a.rel&&"style"==a.as)return a.rel="stylesheet";n(t,c,e.defaultPrevented)},!1!==f(t,a)&&c.head.appendChild(a)}function c(e,t,n){var r,i,o=(e=e.push?e:[e]).length,a=o,c=[];for(r=function(e,n,r){if("e"==n&&c.push(e),"b"==n){if(!r)return;c.push(e)}--o||t(c)},i=0;i<a;i++)s(e[i],r,n)}function u(e,n,r){var i,s;if(n&&n.trim&&(i=n),s=(i?r:n)||{},i){if(i in t)throw"LoadJS";t[i]=!0}function u(t,n){c(e,(function(e){a(s,e),t&&a({success:t,error:n},e),o(i,e)}),s)}if(s.returnPromise)return new Promise(u);u()}return u.ready=function(e,t){return i(e,(function(e){a(t,e)})),u},u.done=function(e){o(e,[])},u.reset=function(){t={},n={},r={}},u.isDefined=function(e){return e in t},u}()}));function LO(e){return new Promise((function(t,n){RO(e,{success:t,error:n})}))}function NO(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,bA.call(this,this.media,e?"play":"pause"))}var MO={setup:function(){var e=this;oA(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,xA.call(e),Ax(window.Vimeo)?MO.ready.call(e):LO(e.config.urls.vimeo.sdk).then((function(){MO.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,n=t.config.vimeo,r=n.premium,i=n.referrerPolicy,o=ys(n,["premium","referrerPolicy"]);r&&Object.assign(o,{controls:!1,sidedock:!1});var a=hO(vs({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},o)),s=t.media.getAttribute("src");Bx(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var c,u=Bx(c=s)?null:Ox(Number(c))?c:c.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:c,l=Qx("iframe"),f=GA(t.config.urls.vimeo.iframe,u,a);if(l.setAttribute("src",f),l.setAttribute("allowfullscreen",""),l.setAttribute("allow","autoplay,fullscreen,picture-in-picture"),Bx(i)||l.setAttribute("referrerPolicy",i),r||!n.customControls)l.setAttribute("data-poster",t.poster),t.media=nA(l,t.media);else{var h=Qx("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});h.appendChild(l),t.media=nA(h,t.media)}n.customControls||nO(GA(t.config.urls.vimeo.api,f)).then((function(e){!Bx(e)&&e.thumbnail_url&&TO.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(l,{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 NO.call(t,!0),t.embed.play()},t.media.pause=function(){return NO.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var p=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return p},set:function(e){var n=t.embed,r=t.media,i=t.paused,o=t.volume,a=i&&!n.hasPlayed;r.seeking=!0,bA.call(t,r,"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 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,bA.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});var g=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return g},set:function(e){t.embed.setVolume(e).then((function(){g=e,bA.call(t,t.media,"volumechange")}))}});var m=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return m},set:function(e){var n=!!Cx(e)&&e;t.embed.setVolume(n?0:t.config.volume).then((function(){m=n,bA.call(t,t.media,"volumechange")}))}});var v,y=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return y},set:function(e){var n=Cx(e)?e:t.config.loop.active;t.embed.setLoop(n).then((function(){y=n}))}}),t.embed.getVideoUrl().then((function(e){v=e,lO.setDownloadUrl.call(t)})).catch((function(t){e.debug.warn(t)})),Object.defineProperty(t.media,"currentSrc",{get:function(){return v}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then((function(n){var r=bs(n,2),i=r[0],o=r[1];t.embed.ratio=[i,o],xA.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(n){t.config.title=n,TO.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){p=e,bA.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,bA.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,pO.setup.call(t)})),t.embed.on("cuechange",(function(e){var n=e.cues,r=(void 0===n?[]:n).map((function(e){return function(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}(e.text)}));pO.updateCues.call(t,r)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){NO.call(t,!e),e||bA.call(t,t.media,"playing")})),Lx(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){bA.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){bA.call(t,t.media,"playing")})),t.embed.on("play",(function(){NO.call(t,!0),bA.call(t,t.media,"playing")})),t.embed.on("pause",(function(){NO.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,p=e.seconds,bA.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,bA.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&bA.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,bA.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,bA.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,bA.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,bA.call(t,t.media,"error")})),n.customControls&&setTimeout((function(){return TO.build.call(t)}),0)}};function UO(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,bA.call(this,this.media,e?"play":"pause"))}function DO(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var FO={setup:function(){var e=this;if(oA(this.elements.wrapper,this.config.classNames.embed,!0),Ax(window.YT)&&Ix(window.YT.Player))FO.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){Ix(t)&&t(),FO.ready.call(e)},LO(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;nO(GA(this.config.urls.youtube.api,e)).then((function(e){if(Ax(e)){var n=e.title,r=e.height,i=e.width;t.config.title=n,TO.setTitle.call(t),t.embed.ratio=[i,r]}xA.call(t)})).catch((function(){xA.call(t)}))},ready:function(){var e=this,t=e.config.youtube,n=e.media&&e.media.getAttribute("id");if(Bx(n)||!n.startsWith("youtube-")){var r=e.media.getAttribute("src");Bx(r)&&(r=e.media.getAttribute(this.config.attributes.embed.id));var i,o,a=Bx(i=r)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i,s=Qx("div",{id:(o=e.provider,"".concat(o,"-").concat(Math.floor(1e4*Math.random()))),"data-poster":t.customControls?e.poster:void 0});if(e.media=nA(s,e.media),t.customControls){var c=function(e){return"https://i.ytimg.com/vi/".concat(a,"/").concat(e,"default.jpg")};SO(c("maxres"),121).catch((function(){return SO(c("sd"),121)})).catch((function(){return SO(c("hq"))})).then((function(t){return TO.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(e.media,{videoId:a,host:DO(t),playerVars:Kx({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError:function(t){if(!e.media.error){var n=t.data,r={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:r},bA.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),bA.call(e,e.media,"ratechange")},onReady:function(n){if(!Ix(e.media.play)){var r=n.target;FO.getTitle.call(e,a),e.media.play=function(){UO.call(e,!0),r.playVideo()},e.media.pause=function(){UO.call(e,!1),r.pauseVideo()},e.media.stop=function(){r.stopVideo()},e.media.duration=r.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(r.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,bA.call(e,e.media,"seeking"),r.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return r.getPlaybackRate()},set:function(e){r.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,r.setVolume(100*i),bA.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var n=Cx(t)?t:o;o=n,r[n?"mute":"unMute"](),r.setVolume(100*i),bA.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return r.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}});var s=r.getAvailablePlaybackRates();e.options.speed=s.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),bA.call(e,e.media,"timeupdate"),bA.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval((function(){e.media.buffered=r.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&bA.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),bA.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return TO.build.call(e)}),50)}},onStateChange:function(n){var r=n.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(n.data)&&(e.media.seeking=!1,bA.call(e,e.media,"seeked")),n.data){case-1:bA.call(e,e.media,"timeupdate"),e.media.buffered=r.getVideoLoadedFraction(),bA.call(e,e.media,"progress");break;case 0:UO.call(e,!1),e.media.loop?(r.stopVideo(),r.playVideo()):bA.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(UO.call(e,!0),bA.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){bA.call(e,e.media,"timeupdate")}),50),e.media.duration!==r.getDuration()&&(e.media.duration=r.getDuration(),bA.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),UO.call(e,!1);break;case 3:bA.call(e,e.media,"waiting")}bA.call(e,e.elements.container,"statechange",!1,{code:n.data})}}})}}},BO={setup:function(){this.media?(oA(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),oA(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&oA(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Qx("div",{class:this.config.classNames.video}),Xx(this.media,this.elements.wrapper),this.elements.poster=Qx("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?AA.setup.call(this):this.isYouTube?FO.setup.call(this):this.isVimeo&&MO.setup.call(this)):this.debug.warn("No media element found!")}},qO=function(){function e(t){var n=this;hs(this,e),this.player=t,this.config=t.config.ads,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 ds(e,[{key:"load",value:function(){var e=this;this.enabled&&(Ax(window.google)&&Ax(window.google.ima)?this.ready():LO(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,t=this;this.enabled||((e=this).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then((function(){t.clearSafetyTimer("onAdsManagerLoaded()")})),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){var e=this;this.elements.container=Qx("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),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),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),this.requestAds()}},{key:"requestAds",value:function(){var e=this.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!t)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");var n=function(){var t=uO(Math.max(e.manager.getRemainingTime(),0)),n="".concat(eO("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)};this.countdownTimer=setInterval(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(),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:"addCuePoints",value:function(){var e=this;Bx(this.cuePoints)||this.cuePoints.forEach((function(t){if(0!==t&&-1!==t&&t<e.player.duration){var n=e.player.elements.progress;if(Lx(n)){var r=100/e.player.duration*t,i=Qx("span",{class:e.player.config.classNames.cues});i.style.left="".concat(r.toString(),"%"),n.appendChild(i)}}}))}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,r=e.getAd(),i=e.getAdData();switch(function(e){bA.call(t.player,t.player.media,"ads".concat(e.replace(/_/g,"").toLowerCase()))}(e.type),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),r.isLinear()||(r.width=n.offsetWidth,r.height=n.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:i.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(i.adError.getMessage()))}}},{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("canplay",(function(){t.addCuePoints()})),this.player.on("ended",(function(){t.loader.contentComplete()})),this.player.on("timeupdate",(function(){e=t.player.currentTime})),this.player.on("seeked",(function(){var n=t.player.currentTime;Bx(t.cuePoints)||t.cuePoints.forEach((function(r,i){e<r&&r<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(i,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.manager.setVolume(e.player.volume),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,EA(this.player.media.play())}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.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.initialized=!1,e.requestAds()})).catch((function(){}))}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,r=new Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];var o=this.events[e];jx(o)&&o.forEach((function(e){Ix(e)&&e.apply(t,r)}))}},{key:"on",value:function(e,t){return jx(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){xx(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!Bx(e.publisherId)||Fx(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(Fx(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(hO(t))}}]),e}(),HO=Dv.findIndex,VO="findIndex",WO=!0,zO=Hv(VO);VO in[]&&Array(1).findIndex((function(){WO=!1})),uv({target:"Array",proto:!0,forced:WO||!zO},{findIndex:function(e){return HO(this,e,arguments.length>1?arguments[1]:void 0)}}),ry(VO);var YO=Math.min,$O=[].lastIndexOf,GO=!!$O&&1/[1].lastIndexOf(1,-0)<0,KO=ob("lastIndexOf"),XO=Hv("indexOf",{ACCESSORS:!0,1:0}),JO=GO||!KO||!XO?function(e){if(GO)return $O.apply(this,arguments)||0;var t=Yg(this),n=qm(t.length),r=n-1;for(arguments.length>1&&(r=YO(r,Fm(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:$O;uv({target:"Array",proto:!0,forced:JO!==[].lastIndexOf},{lastIndexOf:JO});var QO=function(e,t){var n={};return e>t.width/t.height?(n.width=t.width,n.height=1/e*t.width):(n.height=t.height,n.width=e*t.height),n},ZO=function(){function e(t){hs(this,e),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return ds(e,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then((function(){e.enabled&&(e.render(),e.determineContainerAutoSizing(),e.loaded=!0)}))}},{key:"getThumbnails",value:function(){var e=this;return new Promise((function(t){var n=e.player.config.previewThumbnails.src;if(Bx(n))throw new Error("Missing previewThumbnails.src config attribute");var r=function(){e.thumbnails.sort((function(e,t){return e.height-t.height})),e.player.debug.log("Preview thumbnails",e.thumbnails),t()};if(Ix(n))n((function(t){e.thumbnails=t,r()}));else{var i=(Px(n)?[n]:n).map((function(t){return e.getThumbnail(t)}));Promise.all(i).then(r)}}))}},{key:"getThumbnail",value:function(e){var t=this;return new Promise((function(n){nO(e).then((function(r){var i,o,a={frames:(i=r,o=[],i.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var t={};e.split(/\r\n|\n|\r/).forEach((function(e){if(Ox(t.startTime)){if(!Bx(e.trim())&&Bx(t.text)){var n=e.trim().split("#xywh="),r=bs(n,1);if(t.text=r[0],n[1]){var i=bs(n[1].split(","),4);t.x=i[0],t.y=i[1],t.w=i[2],t.h=i[3]}}}else{var o=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);o&&(t.startTime=60*Number(o[1]||0)*60+60*Number(o[2])+Number(o[3])+Number("0.".concat(o[4])),t.endTime=60*Number(o[6]||0)*60+60*Number(o[7])+Number(o[8])+Number("0.".concat(o[9])))}})),t.text&&o.push(t)})),o),height:null,urlPrefix:""};a.frames[0].text.startsWith("/")||a.frames[0].text.startsWith("http://")||a.frames[0].text.startsWith("https://")||(a.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var s=new Image;s.onload=function(){a.height=s.naturalHeight,a.width=s.naturalWidth,t.thumbnails.push(a),n()},s.src=a.urlPrefix+a.frames[0].text}))}))}},{key:"startMove",value:function(e){if(this.loaded&&Nx(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=uO(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){(xx(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):yA.call(this.player,this.player.media,"timeupdate",(function(){e.mouseDown||e.toggleScrubbingContainer(!1)}))}},{key:"listeners",value:function(){var e=this;this.player.on("play",(function(){e.toggleThumbContainer(!1,!0)})),this.player.on("seeked",(function(){e.toggleThumbContainer(!1)})),this.player.on("timeupdate",(function(){e.lastTime=e.player.media.currentTime}))}},{key:"render",value:function(){this.elements.thumb.container=Qx("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=Qx("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=Qx("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=Qx("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),Lx(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=Qx("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"destroy",value:function(){this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();var t=this.thumbnails[0].frames.findIndex((function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime})),n=t>=0,r=0;this.mouseDown||this.toggleThumbContainer(n),n&&(this.thumbnails.forEach((function(n,i){e.loadedImages.includes(n.frames[t].text)&&(r=i)})),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(r)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=this.showingThumb,r=this.thumbnails[t],i=r.urlPrefix,o=r.frames[n],a=r.frames[n].text,s=i+a;if(this.currentImageElement&&this.currentImageElement.dataset.filename===a)this.showImage(this.currentImageElement,o,t,n,a,!1),this.currentImageElement.dataset.index=n,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var c=new Image;c.src=s,c.dataset.index=n,c.dataset.filename=a,this.showingThumbFilename=a,this.player.debug.log("Loading image: ".concat(s)),c.onload=function(){return e.showImage(c,o,t,n,a,!0)},this.loadingImage=c,this.removeOldImages(c)}}},{key:"showImage",value:function(e,t,n,r,i){var o=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(i,". num: ").concat(r,". qual: ").concat(n,". newimg: ").concat(o)),this.setImageSizeAndOffset(e,t),o&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(i)||this.loadedImages.push(i)),this.preloadNearby(r,!0).then(this.preloadNearby(r,!1)).then(this.getHigherQuality(n,e,t,i))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach((function(n){if("img"===n.tagName.toLowerCase()){var r=t.usingSprites?500:1e3;if(n.dataset.index!==e.dataset.index&&!n.dataset.deleting){n.dataset.deleting=!0;var i=t.currentImageContainer;setTimeout((function(){i.removeChild(n),t.player.debug.log("Removing thumb: ".concat(n.dataset.filename))}),r)}}}))}},{key:"preloadNearby",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(r){setTimeout((function(){var i=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===i){var o;o=n?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var a=!1;o.forEach((function(e){var n=e.text;if(n!==i&&!t.loadedImages.includes(n)){a=!0,t.player.debug.log("Preloading thumb filename: ".concat(n));var o=t.thumbnails[0].urlPrefix+n,s=new Image;s.src=o,s.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(n)),t.loadedImages.includes(n)||t.loadedImages.push(n),r()}}})),a||r()}}),300)}))}},{key:"getHigherQuality",value:function(e,t,n,r){var i=this;if(e<this.thumbnails.length-1){var o=t.naturalHeight;this.usingSprites&&(o=n.h),o<this.thumbContainerHeight&&setTimeout((function(){i.showingThumbFilename===r&&(i.player.debug.log("Showing higher quality thumb for: ".concat(r)),i.loadImage(e+1))}),300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(n,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(this.sizeSpecifiedInCSS){if(this.elements.thumb.imageContainer.clientHeight>20&&this.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(this.elements.thumb.imageContainer.clientHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(this.elements.thumb.imageContainer.clientHeight<20&&this.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(this.elements.thumb.imageContainer.clientWidth/this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var n=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(n,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),n=this.elements.thumb.container,r=t.left-e.left+10,i=t.right-e.left-n.clientWidth-10,o=this.mousePosX-e.left-n.clientWidth/2;o<r&&(o=r),o>i&&(o=i),n.style.left="".concat(o,"px")}},{key:"setScrubbingContainerSize",value:function(){var e=QO(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}),t=e.width,n=e.height;this.elements.scrubbing.container.style.width="".concat(t,"px"),this.elements.scrubbing.container.style.height="".concat(n,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var n=this.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*n,"px"),e.style.width="".concat(e.naturalWidth*n,"px"),e.style.left="-".concat(t.x*n,"px"),e.style.top="-".concat(t.y*n,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?QO(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),eP={insertElements:function(e,t){var n=this;Px(t)?Zx(e,this.media,{src:t}):jx(t)&&t.forEach((function(t){Zx(e,n.media,t)}))},change:function(e){var t=this;Gx(e,"sources.length")?(AA.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],eA(t.media),t.media=null,Lx(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,r=e.type,i=bs(n,1)[0],o=i.provider,a=void 0===o?vO.html5:o,s=i.src,c="html5"===a?r:"div",u="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:r,supported:pA.check(r,a,t.config.playsinline),media:Qx(c,u)}),t.elements.container.appendChild(t.media),Cx(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),Bx(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","")),TO.addStyleHook.call(t),t.isHTML5&&eP.insertElements.call(t,"source",n),t.config.title=e.title,BO.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&eP.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&TO.build.call(t),t.isHTML5&&t.media.load(),Bx(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new ZO(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};var tP,nP=function(){function e(t,n){var r=this;if(hs(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=pA.touch,this.media=t,Px(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||Rx(this.media)||jx(this.media))&&(this.media=this.media[0]),this.config=Kx({},dO,e.defaults,n||{},function(){try{return JSON.parse(r.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 _O(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",pA),!xx(this.media)&&Lx(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(pA.check().api){var i=this.media.cloneNode(!0);i.autoplay=!1,this.elements.original=i;var o=this.media.tagName.toLowerCase(),a=null,s=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),Lx(a)){if(s=fO(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?vO.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?vO.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",s.search.length){var c=["1","true"];c.includes(s.searchParams.get("autoplay"))&&(this.config.autoplay=!0),c.includes(s.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=c.includes(s.searchParams.get("playsinline")),this.config.youtube.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(Bx(this.provider)||!Object.keys(vO).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=bO;break;case"video":case"audio":this.type=o,this.provider=vO.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=pA.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new xO(this),this.storage=new tO(this),this.media.plyr=this,Lx(this.elements.container)||(this.elements.container=Qx("div",{tabindex:0}),Xx(this.media,this.elements.container)),TO.migrateStyles.call(this),TO.addStyleHook.call(this),BO.setup.call(this),this.config.debug&&mA.call(this,this.elements.container,this.config.events.join(" "),(function(e){r.debug.log("event: ".concat(e.type))})),this.fullscreen=new EO(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&TO.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new qO(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return EA(r.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new ZO(this))):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 ds(e,[{key:"play",value:function(){var e=this;return Ix(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then((function(){return e.ads.play()})).catch((function(){return EA(e.media.play())})),this.media.play()):null}},{key:"pause",value:function(){return this.playing&&Ix(this.media.pause)?this.media.pause():null}},{key:"togglePlay",value:function(e){return(Cx(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):Ix(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime-=Ox(e)?e:this.config.seekTime}},{key:"forward",value:function(e){this.currentTime+=Ox(e)?e:this.config.seekTime}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(Ox(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){pO.toggle.call(this,e,!1)}},{key:"airplay",value:function(){pA.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=aA(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,r=oA(this.elements.container,this.config.classNames.hideControls,n);if(r&&jx(this.config.controls)&&this.config.controls.includes("settings")&&!Bx(this.config.settings)&&lO.toggleMenu.call(this,!1),r!==t){var i=r?"controlshidden":"controlsshown";bA.call(this,this.media,i)}return!r}return!1}},{key:"on",value:function(e,t){mA.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){yA.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){vA(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 r=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(eA(t.elements.buttons.play),eA(t.elements.captions),eA(t.elements.controls),eA(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),Ix(e)&&e()):(wA.call(t),AA.cancelRequests.call(t),nA(t.elements.original,t.elements.container),bA.call(t,t.elements.original,"destroyed",!0),Ix(e)&&e.call(t.elements.original),t.ready=!1,setTimeout((function(){t.elements=null,t.media=null}),200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(TO.toggleNativeControls.call(this,!0),r()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&Ix(this.embed.destroy)&&this.embed.destroy(),r()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(r),setTimeout(r,200))}}},{key:"supports",value:function(e){return pA.mime.call(this,e)}},{key:"isHTML5",get:function(){return this.provider===vO.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===vO.youtube}},{key:"isVimeo",get:function(){return this.provider===vO.vimeo}},{key:"isVideo",get:function(){return this.type===bO}},{key:"isAudio",get:function(){return this.type===yO}},{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=Ox(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 Ox(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=Ox(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;Px(t)&&(t=Number(t)),Ox(t)||(t=this.storage.get("volume")),Ox(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!Bx(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;Cx(t)||(t=this.storage.get("muted")),Cx(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=this,n=null;Ox(e)&&(n=e),Ox(n)||(n=this.storage.get("speed")),Ox(n)||(n=this.config.speed.selected);var r=this.minimumSpeed,i=this.maximumSpeed;n=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),n)}(n,r,i),this.config.speed.selected=n,setTimeout((function(){t.media.playbackRate=n}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,ws(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,ws(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var r=[!Bx(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(Ox),i=!0;if(!n.includes(r)){var o=function(e,t){return jx(e)&&e.length?e.reduce((function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e})):null}(n,r);this.debug.warn("Unsupported quality option: ".concat(r,", using ").concat(o," instead")),r=o,i=!1}t.selected=r,this.media.quality=r,i&&this.storage.set({quality:r})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=Cx(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){eP.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return Fx(e)?e:this.source},set:function(e){Fx(e)&&(this.config.urls.download=e,lO.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?TO.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=SA(TA.call(this));return jx(e)?e.join(":"):e},set:function(e){this.isVideo?Px(e)&&kA(e)?(this.config.ratio=e,xA.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=Cx(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){pO.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){pO.setLanguage.call(this,e,!1)},get:function(){return(pO.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(pA.pip){var t=Cx(e)?e:!this.pip;Ix(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?gO:mO),Ix(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return pA.pip?Bx(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===gO:null}}],[{key:"supported",value:function(e,t,n){return pA.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return rO(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=null;return Px(t)?r=Array.from(document.querySelectorAll(t)):Rx(t)?r=Array.from(t):jx(t)&&(r=t.filter(Lx)),Bx(r)?null:r.map((function(t){return new e(t,n)}))}}]),e}();nP.defaults=(tP=dO,JSON.parse(JSON.stringify(tP)));var rP,iP={video:{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"}],previewThumbnails:{src:["https://cdn.plyr.io/static/demo/thumbs/100p.vtt","https://cdn.plyr.io/static/demo/thumbs/240p.vtt"]}},audio:{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"}]},youtube:{type:"video",sources:[{src:"https://youtube.com/watch?v=bTqVqk7FSmY",provider:"youtube"}]},vimeo:{type:"video",sources:[{src:"https://vimeo.com/40648169",provider:"vimeo"}]}},oP=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return e&&e.classList[n?"add":"remove"](t)};rP="plyr.io",window.location.host===rP&&Ad({dsn:"https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555",whitelistUrls:[rP].map((function(e){return new RegExp("https://(([a-z0-9])+(.))*".concat(e))}))}),document.addEventListener("DOMContentLoaded",(function(){jg.setup(".js-shr",{count:{className:"button__count"},wrapper:{className:"button--with-count"}});var e=new nP("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"dist/demo.svg",keyboard:{global:!0},tooltips:{controls:!0},captions:{active:!0},ads:{enabled:window.location.host.includes(rP),publisherId:"918848828995742"},previewThumbnails:{enabled:!0,src:["https://cdn.plyr.io/static/demo/thumbs/100p.vtt","https://cdn.plyr.io/static/demo/thumbs/240p.vtt"]},vimeo:{referrerPolicy:"no-referrer"}});window.player=e;var t=document.querySelectorAll("[data-source]"),n=Object.keys(iP),r=Boolean(window.history&&window.history.pushState),i=window.location.hash.substring(1),o=i.length;function a(e){Array.from(t).forEach((function(e){return oP(e.parentElement,"active",!1)})),oP(document.querySelector('[data-source="'.concat(e,'"]')),"active",!0),Array.from(document.querySelectorAll(".plyr__cite")).forEach((function(e){e.hidden=!0})),document.querySelector(".plyr__cite--".concat(e)).hidden=!1}function s(t,r){!n.includes(t)||!r&&t===i||!i.length&&"video"===t||(e.source=iP[t],i=t,a(t))}Array.from(t).forEach((function(e){e.addEventListener("click",(function(){var t=e.getAttribute("data-source");s(t),r&&window.history.pushState({type:t},"","#".concat(t))}))})),window.addEventListener("popstate",(function(e){e.state&&Object.keys(e.state).includes("type")&&s(e.state.type)})),o||(i="video"),r&&n.includes(i)&&window.history.replaceState({type:i},"",o?"#".concat(i):""),"video"!==i&&s(i,!0),a(i)}))}();
+!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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)},$x=function(e){return function(t,n,r,i){Uv(n);var o=dv(t),a=$g(o),s=Wm(o.length),c=e?s-1:0,u=e?-1:1;if(r<2)for(;;){if(c in a){i=a[c],c+=u;break}if(c+=u,e?c<0:s<=c)throw TypeError("Reduce of empty array with no initial value")}for(;e?c>=0:s>c;c+=u)c in a&&(i=n(i,a[c],c,o));return i}},Gx={left:$x(!1),right:$x(!0)}.left,Kx=cb("reduce"),Xx=zv("reduce",{1:0});function Jx(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function Qx(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(!n.length)return e;var i=n.shift();return Cx(i)?(Object.keys(i).forEach((function(t){Cx(i[t])?(Object.keys(e).includes(t)||Object.assign(e,gs({},t,{})),Qx(e[t],i[t])):Object.assign(e,gs({},t,i[t]))})),Qx.apply(void 0,[e].concat(n))):e}function Zx(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach((function(e,n){var r=n>0?t.cloneNode(!0):t,i=e.parentNode,o=e.nextSibling;r.appendChild(e),o?i.insertBefore(r,o):i.appendChild(r)}))}function eA(e,t){Ux(e)&&!Vx(t)&&Object.entries(t).filter((function(e){var t=bs(e,2)[1];return!Ix(t)})).forEach((function(t){var n=bs(t,2),r=n[0],i=n[1];return e.setAttribute(r,i)}))}function tA(e,t,n){var r=document.createElement(e);return Cx(t)&&eA(r,t),jx(n)&&(r.innerText=n),r}function nA(e,t,n,r){Ux(t)&&t.appendChild(tA(e,n,r))}function rA(e){Mx(e)||Nx(e)?Array.from(e).forEach(rA):Ux(e)&&Ux(e.parentNode)&&e.parentNode.removeChild(e)}function iA(e){if(Ux(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function oA(e,t){return Ux(t)&&Ux(t.parentNode)&&Ux(e)?(t.parentNode.replaceChild(e,t),e):null}function aA(e,t){if(!jx(e)||Vx(e))return{};var n={},r=Qx({},t);return e.split(",").forEach((function(e){var t=e.trim(),i=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=bs(o,1)[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":jx(r.class)?n.class="".concat(r.class," ").concat(i):n.class=i;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}})),Qx(r,n)}function sA(e,t){if(Ux(e)){var n=t;Rx(n)||(n=!e.hidden),e.hidden=n}}function cA(e,t,n){if(Mx(e))return Array.from(e).map((function(e){return cA(e,t,n)}));if(Ux(e)){var r="toggle";return void 0!==n&&(r=n?"add":"remove"),e.classList[r](t),e.classList.contains(t)}return!1}function uA(e,t){return Ux(e)&&e.classList.contains(t)}function lA(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function fA(e){return this.elements.container.querySelectorAll(e)}function hA(e){return this.elements.container.querySelector(e)}function pA(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];Ux(e)&&(e.focus({preventScroll:!0}),t&&cA(e,this.config.classNames.tabFocus))}hv({target:"Array",proto:!0,forced:!Kx||!Xx||!Qk&&Ov>79&&Ov<83},{reduce:function(e){return Gx(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var dA,gA={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},mA={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var r=Yx.isIPhone&&n&&mA.playsinline,i=mA[e]||"html5"!==t;return{api:i,ui:i&&mA.rangeInput&&("video"!==e||!Yx.isIPhone||r)}},pip:!(Yx.isIPhone||!Lx(tA("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||tA("video").disablePictureInPicture)),airplay:Lx(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(Vx(e))return!1;var t=bs(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(gA).includes(n)&&(n+='; codecs="'.concat(gA[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(dA=document.createElement("input"),dA.type="range","range"===dA.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==Wx,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},vA=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 yA(e,t,n){var r=this,i=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&&!Vx(t)&&Lx(n)){var s=t.split(" "),c=a;vA&&(c={passive:o,capture:a}),s.forEach((function(t){r&&r.eventListeners&&i&&r.eventListeners.push({element:e,type:t,callback:n,options:c}),e[i?"addEventListener":"removeEventListener"](t,n,c)}))}}function bA(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];yA.call(this,e,t,n,!0,r,i)}function wA(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];yA.call(this,e,t,n,!1,r,i)}function _A(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],a=function a(){wA(e,n,a,i,o);for(var s=arguments.length,c=new Array(s),u=0;u<s;u++)c[u]=arguments[u];r.apply(t,c)};yA.call(this,e,n,a,!0,i,o)}function EA(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(Ux(e)&&!Vx(t)){var i=new CustomEvent(t,{bubbles:n,detail:vs(vs({},r),{},{plyr:this})});e.dispatchEvent(i)}}function SA(){this&&this.eventListeners&&(this.eventListeners.forEach((function(e){var t=e.element,n=e.type,r=e.callback,i=e.options;t.removeEventListener(n,r,i)})),this.eventListeners=[])}function kA(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):bA.call(e,e.elements.container,"ready",t)})).then((function(){}))}function TA(e){Bx(e)&&e.then(null,(function(){}))}function xA(e){return!!(Nx(e)||jx(e)&&e.includes(":"))&&(Nx(e)?e:e.split(":")).map(Number).every(Px)}function AA(e){if(!Nx(e)||!e.every(Px))return null;var t=bs(e,2),n=t[0],r=t[1],i=function e(t,n){return 0===n?t:e(n,t%n)}(n,r);return[n/i,r/i]}function OA(e){var t=function(e){return xA(e)?e.split(":").map(Number):null},n=t(e);if(null===n&&(n=t(this.config.ratio)),null===n&&!Vx(this.embed)&&Nx(this.embed.ratio)&&(n=this.embed.ratio),null===n&&this.isHTML5){var r=this.media;n=AA([r.videoWidth,r.videoHeight])}return n}function IA(e){if(!this.isVideo)return{};var t=this.elements.wrapper,n=OA.call(this,e),r=bs(Nx(n)?n:[0,0],2),i=100/r[0]*r[1];if(t.style.paddingBottom="".concat(i,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var o=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),a=(o-i)/(o/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(a,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==n);return{padding:i,ratio:n}}var CA={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var n=t.getAttribute("type");return!!Vx(n)||mA.mime.call(e,n)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:CA.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,Vx(this.config.ratio)||IA.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=CA.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&Lx(e.config.quality.onChange))e.config.quality.onChange(t);else{var n=CA.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!n)return;var r=e.media,i=r.currentTime,o=r.paused,a=r.preload,s=r.readyState,c=r.playbackRate;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",(function(){e.speed=c,e.currentTime=i,o||TA(e.play())})),e.media.load())}EA.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(rA(CA.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function PA(e){return Nx(e)?e.filter((function(t,n){return e.indexOf(t)===n})):e}var jA=Cv("slice"),RA=zv("slice",{ACCESSORS:!0,0:0,1:2}),LA=_v("species"),NA=[].slice,MA=Math.max;hv({target:"Array",proto:!0,forced:!jA||!RA},{slice:function(e,t){var n,r,i,o=Kg(this),a=Wm(o.length),s=$m(e,a),c=$m(void 0===t?a:t,a);if(pv(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!pv(n.prototype)?Xg(n)&&null===(n=n[LA])&&(n=void 0):n=void 0,n===Array||void 0===n))return NA.call(o,s,c);for(r=new(void 0===n?Array:n)(MA(c-s,0)),i=0;s<c;s++,i++)s in o&&gv(r,i,o[s]);return r.length=i,r}});var UA=cm.f,DA=ev.f,FA=Nm.set,qA=_v("match"),BA=Ug.RegExp,HA=BA.prototype,VA=/a/g,WA=/a/g,zA=new BA(VA)!==VA,YA=Vb.UNSUPPORTED_Y;if(Fg&&lv("RegExp",!zA||YA||Dg((function(){return WA[qA]=!1,BA(VA)!=VA||BA(WA)==WA||"/a/i"!=BA(VA,"i")})))){for(var $A=function(e,t){var n,r=this instanceof $A,i=rw(e),o=void 0===t;if(!r&&i&&e.constructor===$A&&o)return e;zA?i&&!o&&(e=e.source):e instanceof $A&&(o&&(t=Bb.call(e)),e=e.source),YA&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var a=gb(zA?new BA(e,t):BA(e,t),r?this:HA,$A);return YA&&n&&FA(a,{sticky:n}),a},GA=function(e){e in $A||UA($A,e,{configurable:!0,get:function(){return BA[e]},set:function(t){BA[e]=t}})},KA=DA(BA),XA=0;KA.length>XA;)GA(KA[XA++]);HA.constructor=$A,$A.prototype=HA,Mm(Ug,"RegExp",$A)}function JA(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return Vx(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return n[t].toString()}))}Xk("RegExp");var QA=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())},ZA=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function eO(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=QA(t,"-"," "),t=QA(t,"_"," "),t=ZA(t),QA(t," ","")}function tO(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var nO={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},rO=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Vx(e)||Vx(t))return"";var n=Jx(t.i18n,e);if(Vx(n))return Object.keys(nO).includes(e)?nO[e]:"";var r={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(r).forEach((function(e){var t=bs(e,2),r=t[0],i=t[1];n=QA(n,r,i)})),n},iO=function(){function e(t){var n=this;hs(this,e),gs(this,"get",(function(t){if(!e.supported||!n.enabled)return null;var r=window.localStorage.getItem(n.key);if(Vx(r))return null;var i=JSON.parse(r);return jx(t)&&t.length?i[t]:i})),gs(this,"set",(function(t){if(e.supported&&n.enabled&&Cx(t)){var r=n.get();Vx(r)&&(r={}),Qx(r,t),window.localStorage.setItem(n.key,JSON.stringify(r))}})),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return ds(e,null,[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function oO(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise((function(n,r){try{var i=new XMLHttpRequest;if(!("withCredentials"in i))return;i.addEventListener("load",(function(){if("text"===t)try{n(JSON.parse(i.responseText))}catch(e){n(i.responseText)}else n(i.response)})),i.addEventListener("error",(function(){throw new Error(i.status)})),i.open("GET",e,!0),i.responseType=t,i.send()}catch(e){r(e)}}))}function aO(e,t){if(jx(e)){var n="cache",r=jx(t),i=function(){return null!==document.getElementById(t)},o=function(e,t){e.innerHTML=t,r&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!r||!i()){var a=iO.supported,s=document.createElement("div");if(s.setAttribute("hidden",""),r&&s.setAttribute("id",t),a){var c=window.localStorage.getItem("".concat(n,"-").concat(t));if(null!==c){var u=JSON.parse(c);o(s,u.content)}}oO(e).then((function(e){Vx(e)||(a&&window.localStorage.setItem("".concat(n,"-").concat(t),JSON.stringify({content:e})),o(s,e))})).catch((function(){}))}}}var sO=Math.ceil,cO=Math.floor;hv({target:"Math",stat:!0},{trunc:function(e){return(e>0?cO:sO)(e)}});var uO=function(e){return Math.trunc(e/60/60%60,10)},lO=function(e){return Math.trunc(e/60%60,10)},fO=function(e){return Math.trunc(e%60,10)};function hO(){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(!Px(e))return hO(void 0,t,n);var r=function(e){return"0".concat(e).slice(-2)},i=uO(e),o=lO(e),a=fO(e);return i=t||i>0?"".concat(i,":"):"","".concat(n&&e>0?"-":"").concat(i).concat(r(o),":").concat(r(a))}var pO={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||Yx.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=hA.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:fA.call(this,this.config.selectors.buttons.play),pause:hA.call(this,this.config.selectors.buttons.pause),restart:hA.call(this,this.config.selectors.buttons.restart),rewind:hA.call(this,this.config.selectors.buttons.rewind),fastForward:hA.call(this,this.config.selectors.buttons.fastForward),mute:hA.call(this,this.config.selectors.buttons.mute),pip:hA.call(this,this.config.selectors.buttons.pip),airplay:hA.call(this,this.config.selectors.buttons.airplay),settings:hA.call(this,this.config.selectors.buttons.settings),captions:hA.call(this,this.config.selectors.buttons.captions),fullscreen:hA.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=hA.call(this,this.config.selectors.progress),this.elements.inputs={seek:hA.call(this,this.config.selectors.inputs.seek),volume:hA.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:hA.call(this,this.config.selectors.display.buffer),currentTime:hA.call(this,this.config.selectors.display.currentTime),duration:hA.call(this,this.config.selectors.display.duration)},Ux(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="http://www.w3.org/2000/svg",r=pO.getIconUrl.call(this),i="".concat(r.cors?"":r.url,"#").concat(this.config.iconPrefix),o=document.createElementNS(n,"svg");eA(o,Qx(t,{"aria-hidden":"true",focusable:"false"}));var a=document.createElementNS(n,"use"),s="".concat(i,"-").concat(e);return"href"in a&&a.setAttributeNS("http://www.w3.org/1999/xlink","href",s),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",s),o.appendChild(a),o},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=rO(e,this.config),r=vs(vs({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return tA("span",r,n)},createBadge:function(e){if(Vx(e))return null;var t=tA("span",{class:this.config.classNames.menu.value});return t.appendChild(tA("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=this,r=Qx({},t),i=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=eO(e)).charAt(0).toLowerCase()+e.slice(1)}(e),o={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(r).includes(e)&&(o[e]=r[e],delete r[e])})),"button"!==o.element||Object.keys(r).includes("type")||(r.type="button"),Object.keys(r).includes("class")?r.class.split(" ").some((function(e){return e===n.config.classNames.control}))||Qx(r,{class:"".concat(r.class," ").concat(this.config.classNames.control)}):r.class=this.config.classNames.control,e){case"play":o.toggle=!0,o.label="play",o.labelPressed="pause",o.icon="play",o.iconPressed="pause";break;case"mute":o.toggle=!0,o.label="mute",o.labelPressed="unmute",o.icon="volume",o.iconPressed="muted";break;case"captions":o.toggle=!0,o.label="enableCaptions",o.labelPressed="disableCaptions",o.icon="captions-off",o.iconPressed="captions-on";break;case"fullscreen":o.toggle=!0,o.label="enterFullscreen",o.labelPressed="exitFullscreen",o.icon="enter-fullscreen",o.iconPressed="exit-fullscreen";break;case"play-large":r.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",o.label="play",o.icon="play";break;default:Vx(o.label)&&(o.label=i),Vx(o.icon)&&(o.icon=e)}var a=tA(o.element);return o.toggle?(a.appendChild(pO.createIcon.call(this,o.iconPressed,{class:"icon--pressed"})),a.appendChild(pO.createIcon.call(this,o.icon,{class:"icon--not-pressed"})),a.appendChild(pO.createLabel.call(this,o.labelPressed,{class:"label--pressed"})),a.appendChild(pO.createLabel.call(this,o.label,{class:"label--not-pressed"}))):(a.appendChild(pO.createIcon.call(this,o.icon)),a.appendChild(pO.createLabel.call(this,o.label))),Qx(r,aA(this.config.selectors.buttons[i],r)),eA(a,r),"play"===i?(Nx(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(a)):this.elements.buttons[i]=a,a},createRange:function(e,t){var n=tA("input",Qx(aA(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":rO(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,pO.updateRangeFill.call(this,n),$k.setup(n),n},createProgress:function(e,t){var n=tA("progress",Qx(aA(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(tA("span",null,"0"));var r={played:"played",buffer:"buffered"}[e],i=r?rO(r,this.config):"";n.innerText="% ".concat(i.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e,t){var n=aA(this.config.selectors.display[e],t),r=tA("div",Qx(n,{class:"".concat(n.class?n.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":rO(e,this.config)}),"00:00");return this.elements.display[e]=r,r},bindMenuItemShortcuts:function(e,t){var n=this;bA.call(this,e,"keydown keyup",(function(r){if([32,38,39,40].includes(r.which)&&(r.preventDefault(),r.stopPropagation(),"keydown"!==r.type)){var i,o=lA(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(r.which))pO.showMenuPanel.call(n,t,!0);else 32!==r.which&&(40===r.which||o&&39===r.which?(i=e.nextElementSibling,Ux(i)||(i=e.parentNode.firstElementChild)):(i=e.previousElementSibling,Ux(i)||(i=e.parentNode.lastElementChild)),pA.call(n,i,!0))}}),!1),bA.call(this,e,"keyup",(function(e){13===e.which&&pO.focusFirstMenuItem.call(n,null,!0)}))},createMenuItem:function(e){var t=this,n=e.value,r=e.list,i=e.type,o=e.title,a=e.badge,s=void 0===a?null:a,c=e.checked,u=void 0!==c&&c,l=aA(this.config.selectors.inputs[i]),f=tA("button",Qx(l,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(l.class?l.class:"").trim(),"aria-checked":u,value:n})),h=tA("span");h.innerHTML=o,Ux(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 lA(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(!Fx(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),f.checked=!0,i){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}pO.showMenuPanel.call(t,"home",Fx(e))}}),i,!1),pO.bindMenuItemShortcuts.call(this,f,i),r.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];if(!Px(e))return e;var n=uO(this.duration)>0;return hO(e,n,t)},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];Ux(e)&&Px(t)&&(e.innerText=pO.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(Ux(this.elements.inputs.volume)&&pO.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),Ux(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;Ux(e)&&(e.value=t,pO.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&Dx(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=function(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}(this.currentTime,this.duration),"timeupdate"===e.type&&pO.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var r=Px(n)?n:0,i=Ux(e)?e:t.elements.display.buffer;if(Ux(i)){i.value=r;var o=i.getElementsByTagName("span")[0];Ux(o)&&(o.childNodes[0].nodeValue=r)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=Dx(e)?e.target:e;if(Ux(t)&&"range"===t.getAttribute("type")){if(lA(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=pO.formatTime(this.currentTime),r=pO.formatTime(this.duration),i=rO("seekLabel",this.config);t.setAttribute("aria-valuetext",i.replace("{currentTime}",n).replace("{duration}",r))}else if(lA(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);Yx.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&Ux(this.elements.inputs.seek)&&Ux(this.elements.display.seekTooltip)&&0!==this.duration){var n="".concat(this.config.classNames.tooltip,"--visible"),r=function(e){return cA(t.elements.display.seekTooltip,n,e)};if(this.touch)r(!1);else{var i=0,o=this.elements.progress.getBoundingClientRect();if(Dx(e))i=100/o.width*(e.pageX-o.left);else{if(!uA(this.elements.display.seekTooltip,n))return;i=parseFloat(this.elements.display.seekTooltip.style.left,10)}i<0?i=0:i>100&&(i=100),pO.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*i),this.elements.display.seekTooltip.style.left="".concat(i,"%"),Dx(e)&&["mouseenter","mouseleave"].includes(e.type)&&r("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!Ux(this.elements.display.duration)&&this.config.invertTime;pO.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||pO.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return sA(this.elements.display.currentTime,!0),void sA(this.elements.progress,!0);Ux(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=Ux(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&pO.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&pO.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),pO.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){sA(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var r=this.elements.settings.panels[e],i=null,o=t;if("captions"===e)i=this.currentTrack;else{if(i=Vx(n)?this[e]:n,Vx(i)&&(i=this.config[e].default),!Vx(this.options[e])&&!this.options[e].includes(i))return void this.debug.warn("Unsupported value of '".concat(i,"' for ").concat(e));if(!this.config[e].options.includes(i))return void this.debug.warn("Disabled value of '".concat(i,"' for ").concat(e))}if(Ux(o)||(o=r&&r.querySelector('[role="menu"]')),Ux(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=pO.getLabel.call(this,e,i);var a=o&&o.querySelector('[value="'.concat(i,'"]'));Ux(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?rO("normal",this.config):"".concat(t,"&times;");case"quality":if(Px(t)){var n=rO("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return ZA(t);case"captions":return mO.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(Ux(this.elements.settings.panels.quality)){var n="quality",r=this.elements.settings.panels.quality.querySelector('[role="menu"]');Nx(e)&&(this.options.quality=PA(e).filter((function(e){return t.config.quality.options.includes(e)})));var i=!Vx(this.options.quality)&&this.options.quality.length>1;if(pO.toggleMenuButton.call(this,n,i),iA(r),pO.checkMenu.call(this),i){var o=function(e){var n=rO("qualityBadge.".concat(e),t.config);return n.length?pO.createBadge.call(t,n):null};this.options.quality.sort((function(e,n){var r=t.config.quality.options;return r.indexOf(e)>r.indexOf(n)?1:-1})).forEach((function(e){pO.createMenuItem.call(t,{value:e,list:r,type:n,title:pO.getLabel.call(t,"quality",e),badge:o(e)})})),pO.updateSetting.call(this,n,r)}}},setCaptionsMenu:function(){var e=this;if(Ux(this.elements.settings.panels.captions)){var t="captions",n=this.elements.settings.panels.captions.querySelector('[role="menu"]'),r=mO.getTracks.call(this),i=Boolean(r.length);if(pO.toggleMenuButton.call(this,t,i),iA(n),pO.checkMenu.call(this),i){var o=r.map((function(t,r){return{value:r,checked:e.captions.toggled&&e.currentTrack===r,title:mO.getLabel.call(e,t),badge:t.language&&pO.createBadge.call(e,t.language.toUpperCase()),list:n,type:"language"}}));o.unshift({value:-1,checked:!this.captions.toggled,title:rO("disabled",this.config),list:n,type:"language"}),o.forEach(pO.createMenuItem.bind(this)),pO.updateSetting.call(this,t,n)}}},setSpeedMenu:function(){var e=this;if(Ux(this.elements.settings.panels.speed)){var t="speed",n=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var r=!Vx(this.options.speed)&&this.options.speed.length>1;pO.toggleMenuButton.call(this,t,r),iA(n),pO.checkMenu.call(this),r&&(this.options.speed.forEach((function(r){pO.createMenuItem.call(e,{value:r,list:n,type:t,title:pO.getLabel.call(e,"speed",r)})})),pO.updateSetting.call(this,t,n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!Vx(e)&&Object.values(e).some((function(e){return!e.hidden}));sA(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;Ux(n)||(n=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var r=n.querySelector('[role^="menuitem"]');pA.call(this,r,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(Ux(t)&&Ux(n)){var r=t.hidden,i=r;if(Rx(e))i=e;else if(Fx(e)&&27===e.which)i=!1;else if(Dx(e)){var o=Lx(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(o);if(a||!a&&e.target!==n&&i)return}n.setAttribute("aria-expanded",i),sA(t,!i),cA(this.elements.container,this.config.classNames.menu.open,i),i&&Fx(e)?pO.focusFirstMenuItem.call(this,null,!0):i||r||pA.call(this,n,Fx(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,r=t.scrollHeight;return rA(t),{width:n,height:r}},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],r=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(Ux(r)){var i=r.parentNode,o=Array.from(i.children).find((function(e){return!e.hidden}));if(mA.transitions&&!mA.reducedMotion){i.style.width="".concat(o.scrollWidth,"px"),i.style.height="".concat(o.scrollHeight,"px");var a=pO.getMenuSize.call(this,r),s=function t(n){n.target===i&&["width","height"].includes(n.propertyName)&&(i.style.width="",i.style.height="",wA.call(e,i,Wx,t))};bA.call(this,i,Wx,s),i.style.width="".concat(a.width,"px"),i.style.height="".concat(a.height,"px")}sA(o,!0),sA(r,!1),pO.focusFirstMenuItem.call(this,r,n)}},setDownloadUrl:function(){var e=this.elements.buttons.download;Ux(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=pO.bindMenuItemShortcuts,r=pO.createButton,i=pO.createProgress,o=pO.createRange,a=pO.createTime,s=pO.setQualityMenu,c=pO.setSpeedMenu,u=pO.showMenuPanel;this.elements.controls=null,Nx(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(r.call(this,"play-large"));var l=tA("div",aA(this.config.selectors.controls.wrapper));this.elements.controls=l;var f={class:"plyr__controls__item"};return PA(Nx(this.config.controls)?this.config.controls:[]).forEach((function(s){if("restart"===s&&l.appendChild(r.call(t,"restart",f)),"rewind"===s&&l.appendChild(r.call(t,"rewind",f)),"play"===s&&l.appendChild(r.call(t,"play",f)),"fast-forward"===s&&l.appendChild(r.call(t,"fast-forward",f)),"progress"===s){var c=tA("div",{class:"".concat(f.class," plyr__progress__container")}),h=tA("div",aA(t.config.selectors.progress));if(h.appendChild(o.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),h.appendChild(i.call(t,"buffer")),t.config.tooltips.seek){var p=tA("span",{class:t.config.classNames.tooltip},"00:00");h.appendChild(p),t.elements.display.seekTooltip=p}t.elements.progress=h,c.appendChild(t.elements.progress),l.appendChild(c)}if("current-time"===s&&l.appendChild(a.call(t,"currentTime",f)),"duration"===s&&l.appendChild(a.call(t,"duration",f)),"mute"===s||"volume"===s){var d=t.elements.volume;if(Ux(d)&&l.contains(d)||(d=tA("div",Qx({},f,{class:"".concat(f.class," plyr__volume").trim()})),t.elements.volume=d,l.appendChild(d)),"mute"===s&&d.appendChild(r.call(t,"mute")),"volume"===s&&!Yx.isIos){var g={max:1,step:.05,value:t.config.volume};d.appendChild(o.call(t,"volume",Qx(g,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===s&&l.appendChild(r.call(t,"captions",f)),"settings"===s&&!Vx(t.config.settings)){var m=tA("div",Qx({},f,{class:"".concat(f.class," plyr__menu").trim(),hidden:""}));m.appendChild(r.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var v=tA("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),y=tA("div"),b=tA("div",{id:"plyr-settings-".concat(e.id,"-home")}),w=tA("div",{role:"menu"});b.appendChild(w),y.appendChild(b),t.elements.settings.panels.home=b,t.config.settings.forEach((function(r){var i=tA("button",Qx(aA(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:""}));n.call(t,i,r),bA.call(t,i,"click",(function(){u.call(t,r,!1)}));var o=tA("span",null,rO(r,t.config)),a=tA("span",{class:t.config.classNames.menu.value});a.innerHTML=e[r],o.appendChild(a),i.appendChild(o),w.appendChild(i);var s=tA("div",{id:"plyr-settings-".concat(e.id,"-").concat(r),hidden:""}),c=tA("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});c.appendChild(tA("span",{"aria-hidden":!0},rO(r,t.config))),c.appendChild(tA("span",{class:t.config.classNames.hidden},rO("menuBack",t.config))),bA.call(t,s,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),u.call(t,"home",!0))}),!1),bA.call(t,c,"click",(function(){u.call(t,"home",!1)})),s.appendChild(c),s.appendChild(tA("div",{role:"menu"})),y.appendChild(s),t.elements.settings.buttons[r]=i,t.elements.settings.panels[r]=s})),v.appendChild(y),m.appendChild(v),l.appendChild(m),t.elements.settings.popup=v,t.elements.settings.menu=m}if("pip"===s&&mA.pip&&l.appendChild(r.call(t,"pip",f)),"airplay"===s&&mA.airplay&&l.appendChild(r.call(t,"airplay",f)),"download"===s){var _=Qx({},f,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(_.download="");var E=t.config.urls.download;!Hx(E)&&t.isEmbed&&Qx(_,{icon:"logo-".concat(t.provider),label:t.provider}),l.appendChild(r.call(t,"download",_))}"fullscreen"===s&&l.appendChild(r.call(t,"fullscreen",f))})),this.isHTML5&&s.call(this,CA.getQualityOptions.call(this)),c.call(this),l},inject:function(){var e=this;if(this.config.loadSprite){var t=pO.getIconUrl.call(this);t.cors&&aO(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var r={id:this.id,seektime:this.config.seekTime,title:this.config.title},i=!0;Lx(this.config.controls)&&(this.config.controls=this.config.controls.call(this,r)),this.config.controls||(this.config.controls=[]),Ux(this.config.controls)||jx(this.config.controls)?n=this.config.controls:(n=pO.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:mO.getLabel.call(this)}),i=!1);var o,a;if(i&&jx(this.config.controls)&&(o=n,Object.entries(r).forEach((function(e){var t=bs(e,2),n=t[0],r=t[1];o=QA(o,"{".concat(n,"}"),r)})),n=o),jx(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),Ux(a)||(a=this.elements.container),a[Ux(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),Ux(this.elements.controls)||pO.findElements.call(this),!Vx(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return uA(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];cA(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){Nx(e)||Mx(e)?Array.from(e).filter(Boolean).forEach(s):s(e)}))}if(Yx.isEdge&&zx(a),this.config.tooltips.controls){var c=this.config,u=c.classNames,l=c.selectors,f="".concat(l.controls.wrapper," ").concat(l.labels," .").concat(u.hidden),h=fA.call(this,f);Array.from(h).forEach((function(t){cA(t,e.config.classNames.hidden,!1),cA(t,e.config.classNames.tooltip,!0)}))}}};function dO(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=e;if(t){var r=document.createElement("a");r.href=n,n=r.href}try{return new URL(n)}catch(e){return null}}function gO(e){var t=new URLSearchParams;return Cx(e)&&Object.entries(e).forEach((function(e){var n=bs(e,2),r=n[0],i=n[1];t.set(r,i)})),t}var mO={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!mA.textTracks)Nx(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&pO.setCaptionsMenu.call(this);else{if(Ux(this.elements.captions)||(this.elements.captions=tA("div",aA(this.config.selectors.captions)),function(e,t){Ux(e)&&Ux(t)&&t.parentNode.insertBefore(e,t.nextSibling)}(this.elements.captions,this.elements.wrapper)),Yx.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),n=dO(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&oO(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){rA(e)}))}))}var t=PA((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=bs(t,1)[0];var r=this.storage.get("captions");if(Rx(r)||(r=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:r,language:n,languages:t}),this.isHTML5){var i=this.config.captions.update?"addtrack removetrack":"removetrack";bA.call(this,this.media.textTracks,i,mO.update.bind(this))}setTimeout(mO.update.bind(this),0)}},update:function(){var e=this,t=mO.getTracks.call(this,!0),n=this.captions,r=n.active,i=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find((function(e){return e.language===i})));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}),"showing"===t.mode&&(t.mode="hidden"),bA.call(e,t,"cuechange",(function(){return mO.updateCues.call(e)}))})),(s&&this.language!==i||!t.includes(a))&&(mO.setLanguage.call(this,i),mO.toggle.call(this,r&&s)),cA(this.elements.container,this.config.classNames.captions.enabled,!Vx(t)),Nx(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&pO.setCaptionsMenu.call(this)},toggle:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var r=this.captions.toggled,i=this.config.classNames.captions.active,o=Ix(e)?!r:e;if(o!==r){if(n||(this.captions.active=o,this.storage.set({captions:o})),!this.language&&o&&!n){var a=mO.getTracks.call(this),s=mO.findTrack.call(this,[this.captions.language].concat(ws(this.captions.languages)),!0);return this.captions.language=s.language,void mO.set.call(this,a.indexOf(s))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=o),cA(this.elements.container,i,o),this.captions.toggled=o,pO.updateSetting.call(this,"captions"),EA.call(this,this.media,o?"captionsenabled":"captionsdisabled")}setTimeout((function(){o&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=mO.getTracks.call(this);if(-1!==e)if(Px(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var r=n[e],i=r||{},o=i.language;this.captions.currentTrackNode=r,pO.updateSetting.call(this,"captions"),t||(this.captions.language=o,this.storage.set({language:o})),this.isVimeo&&this.embed.enableTextTrack(o),EA.call(this,this.media,"languagechange")}mO.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&mO.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else mO.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(jx(e)){var n=e.toLowerCase();this.captions.language=n;var r=mO.getTracks.call(this),i=mO.findTrack.call(this,[n]);mO.set.call(this,r.indexOf(i),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=Array.from((this.media||{}).textTracks||[]);return n.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,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=mO.getTracks.call(this),o=function(e){return Number((n.captions.meta.get(e)||{}).default)},a=Array.from(i).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||(r?a[0]:void 0)},getCurrentTrack:function(){return mO.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!qx(t)&&mA.textTracks&&this.captions.toggled&&(t=mO.getCurrentTrack.call(this)),qx(t)?Vx(t.label)?Vx(t.language)?rO("enabled",this.config):e.language.toUpperCase():t.label:rO("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(Ux(this.elements.captions))if(Ix(e)||Array.isArray(e)){var t=e;if(!t){var n=mO.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(tO)}var r=t.map((function(e){return e.trim()})).join("\n");if(r!==this.elements.captions.innerHTML){iA(this.elements.captions);var i=tA("span",aA(this.config.selectors.caption));i.innerHTML=r,this.elements.captions.appendChild(i),EA.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},vO={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.4/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},yO="picture-in-picture",bO="inline",wO={html5:"html5",youtube:"youtube",vimeo:"vimeo"},_O="audio",EO="video";var SO=function(){},kO=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];hs(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return ds(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):SO}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):SO}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):SO}}]),e}(),TO=function(){function e(t){var n=this;hs(this,e),gs(this,"onChange",(function(){if(n.enabled){var e=n.player.elements.buttons.fullscreen;Ux(e)&&(e.pressed=n.active);var t=n.target===n.player.media?n.target:n.player.elements.container;EA.call(n.player,t,n.active?"enterfullscreen":"exitfullscreen",!0)}})),gs(this,"toggleFallback",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e?n.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(n.scrollPosition.x,n.scrollPosition.y),document.body.style.overflow=e?"hidden":"",cA(n.target,n.player.config.classNames.fullscreen.fallback,e),Yx.isIos){var t=document.head.querySelector('meta[name="viewport"]'),r="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var i=jx(t.content)&&t.content.includes(r);e?(n.cleanupViewport=!i,i||(t.content+=",".concat(r))):n.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==r})).join(","))}n.onChange()})),gs(this,"trapFocus",(function(e){if(!Yx.isIos&&n.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,r=fA.call(n.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),i=bs(r,1)[0],o=r[r.length-1];t!==o||e.shiftKey?t===i&&e.shiftKey&&(o.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}})),gs(this,"update",(function(){var t;n.enabled?(t=n.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",n.player.debug.log("".concat(t," fullscreen enabled"))):n.player.debug.log("Fullscreen not supported and fallback disabled");cA(n.player.elements.container,n.player.config.classNames.fullscreen.enabled,n.enabled)})),gs(this,"enter",(function(){n.enabled&&(Yx.isIos&&n.player.config.fullscreen.iosNative?n.player.isVimeo?n.player.embed.requestFullscreen():n.target.webkitEnterFullscreen():!e.native||n.forceFallback?n.toggleFallback(!0):n.prefix?Vx(n.prefix)||n.target["".concat(n.prefix,"Request").concat(n.property)]():n.target.requestFullscreen({navigationUI:"hide"}))})),gs(this,"exit",(function(){if(n.enabled)if(Yx.isIos&&n.player.config.fullscreen.iosNative)n.target.webkitExitFullscreen(),TA(n.player.play());else if(!e.native||n.forceFallback)n.toggleFallback(!1);else if(n.prefix){if(!Vx(n.prefix)){var t="moz"===n.prefix?"Cancel":"Exit";document["".concat(n.prefix).concat(t).concat(n.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)})),gs(this,"toggle",(function(){n.active?n.exit():n.enter()})),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&function(e,t){return(Element.prototype.closest||function(){var e=this;do{if(lA.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,t.config.fullscreen.container),bA.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){n.onChange()})),bA.call(this.player,this.player.elements.container,"dblclick",(function(e){Ux(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.player.listeners.proxy(e,n.toggle,"fullscreen")})),bA.call(this,this.player.elements.container,"keydown",(function(e){return n.trapFocus(e)})),this.update()}return ds(e,[{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return uA(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return Yx.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(Lx(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!Lx(document["".concat(t,"ExitFullscreen")])&&!Lx(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),xO=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function AO(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise((function(n,r){var i=new Image,o=function(){delete i.onload,delete i.onerror,(i.naturalWidth>=t?n:r)(i)};Object.assign(i,{onload:o,onerror:o,src:e})}))}hv({target:"Math",stat:!0},{sign:xO});var OO={addStyleHook:function(){cA(this.elements.container,this.config.selectors.container.replace(".",""),!0),cA(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 OO.toggleNativeControls.call(this,!0);Ux(this.elements.controls)||(pO.inject.call(this),this.listeners.controls()),OO.toggleNativeControls.call(this),this.isHTML5&&mO.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,pO.updateVolume.call(this),pO.timeUpdate.call(this),OO.checkPlaying.call(this),cA(this.elements.container,this.config.classNames.pip.supported,mA.pip&&this.isHTML5&&this.isVideo),cA(this.elements.container,this.config.classNames.airplay.supported,mA.airplay&&this.isHTML5),cA(this.elements.container,this.config.classNames.isIos,Yx.isIos),cA(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){EA.call(e,e.media,"ready")}),0),OO.setTitle.call(this),this.poster&&OO.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&pO.durationUpdate.call(this)},setTitle:function(){var e=rO("play",this.config);if(jx(this.config.title)&&!Vx(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=hA.call(this,"iframe");if(!Ux(t))return;var n=Vx(this.config.title)?"video":this.config.title,r=rO("frameTitle",this.config);t.setAttribute("title",r.replace("{title}",n))}},togglePoster:function(e){cA(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),kA.call(this).then((function(){return AO(e)})).catch((function(n){throw e===t.poster&&OO.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:""}),OO.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;cA(this.elements.container,this.config.classNames.playing,this.playing),cA(this.elements.container,this.config.classNames.paused,this.paused),cA(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",rO(t.playing?"pause":"play",t.config))})),Dx(e)&&"timeupdate"===e.type||OO.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(){cA(t.elements.container,t.config.classNames.loading,t.loading),OO.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}},migrateStyles:function(){var e=this;Object.values(vs({},this.media.style)).filter((function(e){return!Vx(e)&&jx(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),Vx(this.media.style)&&this.media.removeAttribute("style")}},IO=function(){function e(t){var n=this;hs(this,e),gs(this,"firstTouch",(function(){var e=n.player,t=e.elements;e.touch=!0,cA(t.container,e.config.classNames.isTouch,!0)})),gs(this,"setTabFocus",(function(e){var t=n.player,r=t.elements;if(clearTimeout(n.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(n.lastKeyDown=e.timeStamp);var i,o=e.timeStamp-n.lastKeyDown<=20;if("focus"!==e.type||o)i=t.config.classNames.tabFocus,cA(fA.call(t,".".concat(i)),i,!1),"focusout"!==e.type&&(n.focusTimer=setTimeout((function(){var e=document.activeElement;r.container.contains(e)&&cA(document.activeElement,t.config.classNames.tabFocus,!0)}),10))}})),gs(this,"global",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=n.player;t.config.keyboard.global&&yA.call(t,window,"keydown keyup",n.handleKey,e,!1),yA.call(t,document.body,"click",n.toggleMenu,e),_A.call(t,document.body,"touchstart",n.firstTouch),yA.call(t,document.body,"keydown focus blur focusout",n.setTabFocus,e,!1,!0)})),gs(this,"container",(function(){var e=n.player,t=e.config,r=e.elements,i=e.timers;!t.keyboard.global&&t.keyboard.focused&&bA.call(e,r.container,"keydown keyup",n.handleKey,!1),bA.call(e,r.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var n=r.controls;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);var o=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(OO.toggleControls.call(e,!0),o=e.touch?3e3:2e3),clearTimeout(i.controls),i.controls=setTimeout((function(){return OO.toggleControls.call(e,!1)}),o)}));var o=function(t){if(!t)return IA.call(e);var n=r.container.getBoundingClientRect(),i=n.width,o=n.height;return IA.call(e,"".concat(i,":").concat(o))},a=function(){clearTimeout(i.resized),i.resized=setTimeout(o,50)};bA.call(e,r.container,"enterfullscreen exitfullscreen",(function(t){var n=e.fullscreen,i=n.target,s=n.usingNative;if(i===r.container&&(e.isEmbed||!Vx(e.config.ratio))){var c="enterfullscreen"===t.type,u=o(c);u.padding;!function(t,n,r){if(e.isVimeo&&!e.config.vimeo.premium){var i=e.elements.wrapper.firstChild,o=bs(t,2)[1],a=bs(OA.call(e),2),s=a[0],c=a[1];i.style.maxWidth=r?"".concat(o/c*s,"px"):null,i.style.margin=r?"0 auto":null}}(u.ratio,0,c),c&&setTimeout((function(){return zx(r.container)}),100),s||(c?bA.call(e,window,"resize",a):wA.call(e,window,"resize",a))}}))})),gs(this,"media",(function(){var e=n.player,t=e.elements;if(bA.call(e,e.media,"timeupdate seeking seeked",(function(t){return pO.timeUpdate.call(e,t)})),bA.call(e,e.media,"durationchange loadeddata loadedmetadata",(function(t){return pO.durationUpdate.call(e,t)})),bA.call(e,e.media,"ended",(function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())})),bA.call(e,e.media,"progress playing seeking seeked",(function(t){return pO.updateProgress.call(e,t)})),bA.call(e,e.media,"volumechange",(function(t){return pO.updateVolume.call(e,t)})),bA.call(e,e.media,"playing play pause ended emptied timeupdate",(function(t){return OO.checkPlaying.call(e,t)})),bA.call(e,e.media,"waiting canplay seeked playing",(function(t){return OO.checkLoading.call(e,t)})),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var r=hA.call(e,".".concat(e.config.classNames.video));if(!Ux(r))return;bA.call(e,t.container,"click",(function(i){([t.container,r].includes(i.target)||r.contains(i.target))&&(e.touch&&e.config.hideControls||(e.ended?(n.proxy(i,e.restart,"restart"),n.proxy(i,(function(){TA(e.play())}),"play")):n.proxy(i,(function(){TA(e.togglePlay())}),"play")))}))}e.supported.ui&&e.config.disableContextMenu&&bA.call(e,t.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),bA.call(e,e.media,"volumechange",(function(){e.storage.set({volume:e.volume,muted:e.muted})})),bA.call(e,e.media,"ratechange",(function(){pO.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})})),bA.call(e,e.media,"qualitychange",(function(t){pO.updateSetting.call(e,"quality",null,t.detail.quality)})),bA.call(e,e.media,"ready qualitychange",(function(){pO.setDownloadUrl.call(e)}));var i=e.config.events.concat(["keyup","keydown"]).join(" ");bA.call(e,e.media,i,(function(n){var r=n.detail,i=void 0===r?{}:r;"error"===n.type&&(i=e.media.error),EA.call(e,t.container,n.type,!0,i)}))})),gs(this,"proxy",(function(e,t,r){var i=n.player,o=i.config.listeners[r],a=!0;Lx(o)&&(a=o.call(i,e)),!1!==a&&Lx(t)&&t.call(i,e)})),gs(this,"bind",(function(e,t,r,i){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=n.player,s=a.config.listeners[i],c=Lx(s);bA.call(a,e,t,(function(e){return n.proxy(e,r,i)}),o&&!c)})),gs(this,"controls",(function(){var e=n.player,t=e.elements,r=Yx.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach((function(t){n.bind(t,"click",(function(){TA(e.togglePlay())}),"play")})),n.bind(t.buttons.restart,"click",e.restart,"restart"),n.bind(t.buttons.rewind,"click",(function(){e.lastSeekTime=Date.now(),e.rewind()}),"rewind"),n.bind(t.buttons.fastForward,"click",(function(){e.lastSeekTime=Date.now(),e.forward()}),"fastForward"),n.bind(t.buttons.mute,"click",(function(){e.muted=!e.muted}),"mute"),n.bind(t.buttons.captions,"click",(function(){return e.toggleCaptions()})),n.bind(t.buttons.download,"click",(function(){EA.call(e,e.media,"download")}),"download"),n.bind(t.buttons.fullscreen,"click",(function(){e.fullscreen.toggle()}),"fullscreen"),n.bind(t.buttons.pip,"click",(function(){e.pip="toggle"}),"pip"),n.bind(t.buttons.airplay,"click",e.airplay,"airplay"),n.bind(t.buttons.settings,"click",(function(t){t.stopPropagation(),t.preventDefault(),pO.toggleMenu.call(e,t)}),null,!1),n.bind(t.buttons.settings,"keyup",(function(t){var n=t.which;[13,32].includes(n)&&(13!==n?(t.preventDefault(),t.stopPropagation(),pO.toggleMenu.call(e,t)):pO.focusFirstMenuItem.call(e,null,!0))}),null,!1),n.bind(t.settings.menu,"keydown",(function(t){27===t.which&&pO.toggleMenu.call(e,t)})),n.bind(t.inputs.seek,"mousedown mousemove",(function(e){var n=t.progress.getBoundingClientRect(),r=100/n.width*(e.pageX-n.left);e.currentTarget.setAttribute("seek-value",r)})),n.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(function(t){var n=t.currentTarget,r=t.keyCode?t.keyCode:t.which,i="play-on-seeked";if(!Fx(t)||39===r||37===r){e.lastSeekTime=Date.now();var o=n.hasAttribute(i),a=["mouseup","touchend","keyup"].includes(t.type);o&&a?(n.removeAttribute(i),TA(e.play())):!a&&e.playing&&(n.setAttribute(i,""),e.pause())}})),Yx.isIos){var i=fA.call(e,'input[type="range"]');Array.from(i).forEach((function(e){return n.bind(e,r,(function(e){return zx(e.target)}))}))}n.bind(t.inputs.seek,r,(function(t){var n=t.currentTarget,r=n.getAttribute("seek-value");Vx(r)&&(r=n.value),n.removeAttribute("seek-value"),e.currentTime=r/n.max*e.duration}),"seek"),n.bind(t.progress,"mouseenter mouseleave mousemove",(function(t){return pO.updateSeekTooltip.call(e,t)})),n.bind(t.progress,"mousemove touchmove",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startMove(t)})),n.bind(t.progress,"mouseleave touchend click",(function(){var t=e.previewThumbnails;t&&t.loaded&&t.endMove(!1,!0)})),n.bind(t.progress,"mousedown touchstart",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startScrubbing(t)})),n.bind(t.progress,"mouseup touchend",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.endScrubbing(t)})),Yx.isWebkit&&Array.from(fA.call(e,'input[type="range"]')).forEach((function(t){n.bind(t,"input",(function(t){return pO.updateRangeFill.call(e,t.target)}))})),e.config.toggleInvert&&!Ux(t.display.duration)&&n.bind(t.display.currentTime,"click",(function(){0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,pO.timeUpdate.call(e))})),n.bind(t.inputs.volume,r,(function(t){e.volume=t.target.value}),"volume"),n.bind(t.controls,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type})),t.fullscreen&&Array.from(t.fullscreen.children).filter((function(e){return!e.contains(t.container)})).forEach((function(r){n.bind(r,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type}))})),n.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",(function(e){t.controls.pressed=["mousedown","touchstart"].includes(e.type)})),n.bind(t.controls,"focusin",(function(){var r=e.config,i=e.timers;cA(t.controls,r.classNames.noTransition,!0),OO.toggleControls.call(e,!0),setTimeout((function(){cA(t.controls,r.classNames.noTransition,!1)}),0);var o=n.touch?3e3:4e3;clearTimeout(i.controls),i.controls=setTimeout((function(){return OO.toggleControls.call(e,!1)}),o)})),n.bind(t.inputs.volume,"wheel",(function(t){var n=t.webkitDirectionInvertedFromDevice,r=bs([t.deltaX,-t.deltaY].map((function(e){return n?-e:e})),2),i=r[0],o=r[1],a=Math.sign(Math.abs(i)>Math.abs(o)?i:o);e.increaseVolume(a/50);var s=e.media.volume;(1===a&&s<1||-1===a&&s>0)&&t.preventDefault()}),"volume",!1)})),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 ds(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,r=e.keyCode?e.keyCode:e.which,i="keydown"===e.type,o=i&&r===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&Px(r)){if(i){var a=document.activeElement;if(Ux(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&lA(a,s))return;if(32===e.which&&lA(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(r)&&(e.preventDefault(),e.stopPropagation()),r){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*(r-48));break;case 32:case 75:o||TA(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}27===r&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=r}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){pO.toggleMenu.call(this.player,e)}}]),e}(),CO=Cv("splice"),PO=zv("splice",{ACCESSORS:!0,0:0,1:2}),jO=Math.max,RO=Math.min,LO=9007199254740991,NO="Maximum allowed length exceeded";hv({target:"Array",proto:!0,forced:!CO||!PO},{splice:function(e,t){var n,r,i,o,a,s,c=dv(this),u=Wm(c.length),l=$m(e,u),f=arguments.length;if(0===f?n=r=0:1===f?(n=0,r=u-l):(n=f-2,r=RO(jO(Hm(t),0),u-l)),u+n-r>LO)throw TypeError(NO);for(i=Sv(c,r),o=0;o<r;o++)(a=l+o)in c&&gv(i,o,c[a]);if(i.length=r,n<r){for(o=l;o<u-r;o++)s=o+n,(a=o+r)in c?c[s]=c[a]:delete c[s];for(o=u;o>u-r+n;o--)delete c[o-1]}else if(n>r)for(o=u-r;o>l;o--)s=o+n-1,(a=o+r-1)in c?c[s]=c[a]:delete c[s];for(o=0;o<n;o++)c[o+l]=arguments[o+2];return c.length=u-r+n,i}});var MO=t((function(e,t){e.exports=function(){var e=function(){},t={},n={},r={};function i(e,t){e=e.push?e:[e];var i,o,a,s=[],c=e.length,u=c;for(i=function(e,n){n.length&&s.push(e),--u||t(s)};c--;)o=e[c],(a=n[o])?i(o,a):(r[o]=r[o]||[]).push(i)}function o(e,t){if(e){var i=r[e];if(n[e]=t,i)for(;i.length;)i[0](e,t),i.splice(0,1)}}function a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function s(t,n,r,i){var o,a,c=document,u=r.async,l=(r.numRetries||0)+1,f=r.before||e,h=t.replace(/[\?|#].*$/,""),p=t.replace(/^(css|img)!/,"");i=i||0,/(^css!|\.css$)/.test(h)?((a=c.createElement("link")).rel="stylesheet",a.href=p,(o="hideFocus"in a)&&a.relList&&(o=0,a.rel="preload",a.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(h)?(a=c.createElement("img")).src=p:((a=c.createElement("script")).src=t,a.async=void 0===u||u),a.onload=a.onerror=a.onbeforeload=function(e){var c=e.type[0];if(o)try{a.sheet.cssText.length||(c="e")}catch(e){18!=e.code&&(c="e")}if("e"==c){if((i+=1)<l)return s(t,n,r,i)}else if("preload"==a.rel&&"style"==a.as)return a.rel="stylesheet";n(t,c,e.defaultPrevented)},!1!==f(t,a)&&c.head.appendChild(a)}function c(e,t,n){var r,i,o=(e=e.push?e:[e]).length,a=o,c=[];for(r=function(e,n,r){if("e"==n&&c.push(e),"b"==n){if(!r)return;c.push(e)}--o||t(c)},i=0;i<a;i++)s(e[i],r,n)}function u(e,n,r){var i,s;if(n&&n.trim&&(i=n),s=(i?r:n)||{},i){if(i in t)throw"LoadJS";t[i]=!0}function u(t,n){c(e,(function(e){a(s,e),t&&a({success:t,error:n},e),o(i,e)}),s)}if(s.returnPromise)return new Promise(u);u()}return u.ready=function(e,t){return i(e,(function(e){a(t,e)})),u},u.done=function(e){o(e,[])},u.reset=function(){t={},n={},r={}},u.isDefined=function(e){return e in t},u}()}));function UO(e){return new Promise((function(t,n){MO(e,{success:t,error:n})}))}function DO(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,EA.call(this,this.media,e?"play":"pause"))}var FO={setup:function(){var e=this;cA(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,IA.call(e),Cx(window.Vimeo)?FO.ready.call(e):UO(e.config.urls.vimeo.sdk).then((function(){FO.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,n=t.config.vimeo,r=n.premium,i=n.referrerPolicy,o=ys(n,["premium","referrerPolicy"]);r&&Object.assign(o,{controls:!1,sidedock:!1});var a=gO(vs({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},o)),s=t.media.getAttribute("src");Vx(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var c,u=Vx(c=s)?null:Px(Number(c))?c:c.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:c,l=tA("iframe"),f=JA(t.config.urls.vimeo.iframe,u,a);if(l.setAttribute("src",f),l.setAttribute("allowfullscreen",""),l.setAttribute("allow",["autoplay","fullscreen","picture-in-picture"].join("; ")),Vx(i)||l.setAttribute("referrerPolicy",i),r||!n.customControls)l.setAttribute("data-poster",t.poster),t.media=oA(l,t.media);else{var h=tA("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});h.appendChild(l),t.media=oA(h,t.media)}n.customControls||oO(JA(t.config.urls.vimeo.api,f)).then((function(e){!Vx(e)&&e.thumbnail_url&&OO.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(l,{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 DO.call(t,!0),t.embed.play()},t.media.pause=function(){return DO.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var p=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return p},set:function(e){var n=t.embed,r=t.media,i=t.paused,o=t.volume,a=i&&!n.hasPlayed;r.seeking=!0,EA.call(t,r,"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 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,EA.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});var g=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return g},set:function(e){t.embed.setVolume(e).then((function(){g=e,EA.call(t,t.media,"volumechange")}))}});var m=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return m},set:function(e){var n=!!Rx(e)&&e;t.embed.setVolume(n?0:t.config.volume).then((function(){m=n,EA.call(t,t.media,"volumechange")}))}});var v,y=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return y},set:function(e){var n=Rx(e)?e:t.config.loop.active;t.embed.setLoop(n).then((function(){y=n}))}}),t.embed.getVideoUrl().then((function(e){v=e,pO.setDownloadUrl.call(t)})).catch((function(t){e.debug.warn(t)})),Object.defineProperty(t.media,"currentSrc",{get:function(){return v}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then((function(n){var r=bs(n,2),i=r[0],o=r[1];t.embed.ratio=[i,o],IA.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(n){t.config.title=n,OO.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){p=e,EA.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,EA.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,mO.setup.call(t)})),t.embed.on("cuechange",(function(e){var n=e.cues,r=(void 0===n?[]:n).map((function(e){return function(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}(e.text)}));mO.updateCues.call(t,r)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){DO.call(t,!e),e||EA.call(t,t.media,"playing")})),Ux(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){EA.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){EA.call(t,t.media,"playing")})),t.embed.on("play",(function(){DO.call(t,!0),EA.call(t,t.media,"playing")})),t.embed.on("pause",(function(){DO.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,p=e.seconds,EA.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,EA.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&EA.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,EA.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,EA.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,EA.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,EA.call(t,t.media,"error")})),n.customControls&&setTimeout((function(){return OO.build.call(t)}),0)}};function qO(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,EA.call(this,this.media,e?"play":"pause"))}function BO(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var HO={setup:function(){var e=this;if(cA(this.elements.wrapper,this.config.classNames.embed,!0),Cx(window.YT)&&Lx(window.YT.Player))HO.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){Lx(t)&&t(),HO.ready.call(e)},UO(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;oO(JA(this.config.urls.youtube.api,e)).then((function(e){if(Cx(e)){var n=e.title,r=e.height,i=e.width;t.config.title=n,OO.setTitle.call(t),t.embed.ratio=[i,r]}IA.call(t)})).catch((function(){IA.call(t)}))},ready:function(){var e=this,t=e.config.youtube,n=e.media&&e.media.getAttribute("id");if(Vx(n)||!n.startsWith("youtube-")){var r=e.media.getAttribute("src");Vx(r)&&(r=e.media.getAttribute(this.config.attributes.embed.id));var i,o,a=Vx(i=r)?null:i.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:i,s=tA("div",{id:(o=e.provider,"".concat(o,"-").concat(Math.floor(1e4*Math.random()))),"data-poster":t.customControls?e.poster:void 0});if(e.media=oA(s,e.media),t.customControls){var c=function(e){return"https://i.ytimg.com/vi/".concat(a,"/").concat(e,"default.jpg")};AO(c("maxres"),121).catch((function(){return AO(c("sd"),121)})).catch((function(){return AO(c("hq"))})).then((function(t){return OO.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(e.media,{videoId:a,host:BO(t),playerVars:Qx({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError:function(t){if(!e.media.error){var n=t.data,r={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:r},EA.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),EA.call(e,e.media,"ratechange")},onReady:function(n){if(!Lx(e.media.play)){var r=n.target;HO.getTitle.call(e,a),e.media.play=function(){qO.call(e,!0),r.playVideo()},e.media.pause=function(){qO.call(e,!1),r.pauseVideo()},e.media.stop=function(){r.stopVideo()},e.media.duration=r.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(r.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,EA.call(e,e.media,"seeking"),r.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return r.getPlaybackRate()},set:function(e){r.setPlaybackRate(e)}});var i=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return i},set:function(t){i=t,r.setVolume(100*i),EA.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var n=Rx(t)?t:o;o=n,r[n?"mute":"unMute"](),r.setVolume(100*i),EA.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return r.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}});var s=r.getAvailablePlaybackRates();e.options.speed=s.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),EA.call(e,e.media,"timeupdate"),EA.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval((function(){e.media.buffered=r.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&EA.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),EA.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return OO.build.call(e)}),50)}},onStateChange:function(n){var r=n.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(n.data)&&(e.media.seeking=!1,EA.call(e,e.media,"seeked")),n.data){case-1:EA.call(e,e.media,"timeupdate"),e.media.buffered=r.getVideoLoadedFraction(),EA.call(e,e.media,"progress");break;case 0:qO.call(e,!1),e.media.loop?(r.stopVideo(),r.playVideo()):EA.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(qO.call(e,!0),EA.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){EA.call(e,e.media,"timeupdate")}),50),e.media.duration!==r.getDuration()&&(e.media.duration=r.getDuration(),EA.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),qO.call(e,!1);break;case 3:EA.call(e,e.media,"waiting")}EA.call(e,e.elements.container,"statechange",!1,{code:n.data})}}})}}},VO={setup:function(){this.media?(cA(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),cA(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&cA(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=tA("div",{class:this.config.classNames.video}),Zx(this.media,this.elements.wrapper),this.elements.poster=tA("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?CA.setup.call(this):this.isYouTube?HO.setup.call(this):this.isVimeo&&FO.setup.call(this)):this.debug.warn("No media element found!")}},WO=function(){function e(t){var n=this;hs(this,e),gs(this,"load",(function(){n.enabled&&(Cx(window.google)&&Cx(window.google.ima)?n.ready():UO(n.player.config.urls.googleIMA.sdk).then((function(){n.ready()})).catch((function(){n.trigger("error",new Error("Google IMA SDK failed to load"))})))})),gs(this,"ready",(function(){var e;n.enabled||((e=n).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),n.startSafetyTimer(12e3,"ready()"),n.managerPromise.then((function(){n.clearSafetyTimer("onAdsManagerLoaded()")})),n.listeners(),n.setupIMA()})),gs(this,"setupIMA",(function(){n.elements.container=tA("div",{class:n.player.config.classNames.ads}),n.player.elements.container.appendChild(n.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(n.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(n.player.config.playsinline),n.elements.displayContainer=new google.ima.AdDisplayContainer(n.elements.container,n.player.media),n.loader=new google.ima.AdsLoader(n.elements.displayContainer),n.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(function(e){return n.onAdsManagerLoaded(e)}),!1),n.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return n.onAdError(e)}),!1),n.requestAds()})),gs(this,"requestAds",(function(){var e=n.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=n.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!n.player.muted),n.loader.requestAds(t)}catch(e){n.onAdError(e)}})),gs(this,"pollCountdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!e)return clearInterval(n.countdownTimer),void n.elements.container.removeAttribute("data-badge-text");var t=function(){var e=hO(Math.max(n.manager.getRemainingTime(),0)),t="".concat(rO("advertisement",n.player.config)," - ").concat(e);n.elements.container.setAttribute("data-badge-text",t)};n.countdownTimer=setInterval(t,100)})),gs(this,"onAdsManagerLoaded",(function(e){if(n.enabled){var t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,n.manager=e.getAdsManager(n.player,t),n.cuePoints=n.manager.getCuePoints(),n.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return n.onAdError(e)})),Object.keys(google.ima.AdEvent.Type).forEach((function(e){n.manager.addEventListener(google.ima.AdEvent.Type[e],(function(e){return n.onAdEvent(e)}))})),n.trigger("loaded")}})),gs(this,"addCuePoints",(function(){Vx(n.cuePoints)||n.cuePoints.forEach((function(e){if(0!==e&&-1!==e&&e<n.player.duration){var t=n.player.elements.progress;if(Ux(t)){var r=100/n.player.duration*e,i=tA("span",{class:n.player.config.classNames.cues});i.style.left="".concat(r.toString(),"%"),t.appendChild(i)}}}))})),gs(this,"onAdEvent",(function(e){var t=n.player.elements.container,r=e.getAd(),i=e.getAdData();switch(function(e){EA.call(n.player,n.player.media,"ads".concat(e.replace(/_/g,"").toLowerCase()))}(e.type),e.type){case google.ima.AdEvent.Type.LOADED:n.trigger("loaded"),n.pollCountdown(!0),r.isLinear()||(r.width=t.offsetWidth,r.height=t.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:n.manager.setVolume(n.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:n.player.ended?n.loadAds():n.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:n.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:n.pollCountdown(),n.resumeContent();break;case google.ima.AdEvent.Type.LOG:i.adError&&n.player.debug.warn("Non-fatal ad error: ".concat(i.adError.getMessage()))}})),gs(this,"onAdError",(function(e){n.cancel(),n.player.debug.warn("Ads error",e)})),gs(this,"listeners",(function(){var e,t=n.player.elements.container;n.player.on("canplay",(function(){n.addCuePoints()})),n.player.on("ended",(function(){n.loader.contentComplete()})),n.player.on("timeupdate",(function(){e=n.player.currentTime})),n.player.on("seeked",(function(){var t=n.player.currentTime;Vx(n.cuePoints)||n.cuePoints.forEach((function(r,i){e<r&&r<t&&(n.manager.discardAdBreak(),n.cuePoints.splice(i,1))}))})),window.addEventListener("resize",(function(){n.manager&&n.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)}))})),gs(this,"play",(function(){var e=n.player.elements.container;n.managerPromise||n.resumeContent(),n.managerPromise.then((function(){n.manager.setVolume(n.player.volume),n.elements.displayContainer.initialize();try{n.initialized||(n.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),n.manager.start()),n.initialized=!0}catch(e){n.onAdError(e)}})).catch((function(){}))})),gs(this,"resumeContent",(function(){n.elements.container.style.zIndex="",n.playing=!1,TA(n.player.media.play())})),gs(this,"pauseContent",(function(){n.elements.container.style.zIndex=3,n.playing=!0,n.player.media.pause()})),gs(this,"cancel",(function(){n.initialized&&n.resumeContent(),n.trigger("error"),n.loadAds()})),gs(this,"loadAds",(function(){n.managerPromise.then((function(){n.manager&&n.manager.destroy(),n.managerPromise=new Promise((function(e){n.on("loaded",e),n.player.debug.log(n.manager)})),n.initialized=!1,n.requestAds()})).catch((function(){}))})),gs(this,"trigger",(function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),i=1;i<t;i++)r[i-1]=arguments[i];var o=n.events[e];Nx(o)&&o.forEach((function(e){Lx(e)&&e.apply(n,r)}))})),gs(this,"on",(function(e,t){return Nx(n.events[e])||(n.events[e]=[]),n.events[e].push(t),n})),gs(this,"startSafetyTimer",(function(e,t){n.player.debug.log("Safety timer invoked from: ".concat(t)),n.safetyTimer=setTimeout((function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")}),e)})),gs(this,"clearSafetyTimer",(function(e){Ix(n.safetyTimer)||(n.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(n.safetyTimer),n.safetyTimer=null)})),this.player=t,this.config=t.config.ads,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 ds(e,[{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!Vx(e.publisherId)||Hx(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(Hx(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(gO(t))}}]),e}(),zO=Bv.findIndex,YO="findIndex",$O=!0,GO=zv(YO);YO in[]&&Array(1).findIndex((function(){$O=!1})),hv({target:"Array",proto:!0,forced:$O||!GO},{findIndex:function(e){return zO(this,e,arguments.length>1?arguments[1]:void 0)}}),ay(YO);var KO=Math.min,XO=[].lastIndexOf,JO=!!XO&&1/[1].lastIndexOf(1,-0)<0,QO=cb("lastIndexOf"),ZO=zv("indexOf",{ACCESSORS:!0,1:0}),eI=JO||!QO||!ZO?function(e){if(JO)return XO.apply(this,arguments)||0;var t=Kg(this),n=Wm(t.length),r=n-1;for(arguments.length>1&&(r=KO(r,Hm(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:XO;hv({target:"Array",proto:!0,forced:eI!==[].lastIndexOf},{lastIndexOf:eI});var tI=function(e,t){var n={};return e>t.width/t.height?(n.width=t.width,n.height=1/e*t.width):(n.height=t.height,n.width=e*t.height),n},nI=function(){function e(t){var n=this;hs(this,e),gs(this,"load",(function(){n.player.elements.display.seekTooltip&&(n.player.elements.display.seekTooltip.hidden=n.enabled),n.enabled&&n.getThumbnails().then((function(){n.enabled&&(n.render(),n.determineContainerAutoSizing(),n.loaded=!0)}))})),gs(this,"getThumbnails",(function(){return new Promise((function(e){var t=n.player.config.previewThumbnails.src;if(Vx(t))throw new Error("Missing previewThumbnails.src config attribute");var r=function(){n.thumbnails.sort((function(e,t){return e.height-t.height})),n.player.debug.log("Preview thumbnails",n.thumbnails),e()};if(Lx(t))t((function(e){n.thumbnails=e,r()}));else{var i=(jx(t)?[t]:t).map((function(e){return n.getThumbnail(e)}));Promise.all(i).then(r)}}))})),gs(this,"getThumbnail",(function(e){return new Promise((function(t){oO(e).then((function(r){var i,o,a={frames:(i=r,o=[],i.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var t={};e.split(/\r\n|\n|\r/).forEach((function(e){if(Px(t.startTime)){if(!Vx(e.trim())&&Vx(t.text)){var n=e.trim().split("#xywh="),r=bs(n,1);if(t.text=r[0],n[1]){var i=bs(n[1].split(","),4);t.x=i[0],t.y=i[1],t.w=i[2],t.h=i[3]}}}else{var o=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);o&&(t.startTime=60*Number(o[1]||0)*60+60*Number(o[2])+Number(o[3])+Number("0.".concat(o[4])),t.endTime=60*Number(o[6]||0)*60+60*Number(o[7])+Number(o[8])+Number("0.".concat(o[9])))}})),t.text&&o.push(t)})),o),height:null,urlPrefix:""};a.frames[0].text.startsWith("/")||a.frames[0].text.startsWith("http://")||a.frames[0].text.startsWith("https://")||(a.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var s=new Image;s.onload=function(){a.height=s.naturalHeight,a.width=s.naturalWidth,n.thumbnails.push(a),t()},s.src=a.urlPrefix+a.frames[0].text}))}))})),gs(this,"startMove",(function(e){if(n.loaded&&Dx(e)&&["touchmove","mousemove"].includes(e.type)&&n.player.media.duration){if("touchmove"===e.type)n.seekTime=n.player.media.duration*(n.player.elements.inputs.seek.value/100);else{var t=n.player.elements.progress.getBoundingClientRect(),r=100/t.width*(e.pageX-t.left);n.seekTime=n.player.media.duration*(r/100),n.seekTime<0&&(n.seekTime=0),n.seekTime>n.player.media.duration-1&&(n.seekTime=n.player.media.duration-1),n.mousePosX=e.pageX,n.elements.thumb.time.innerText=hO(n.seekTime)}n.showImageAtCurrentTime()}})),gs(this,"endMove",(function(){n.toggleThumbContainer(!1,!0)})),gs(this,"startScrubbing",(function(e){(Ix(e.button)||!1===e.button||0===e.button)&&(n.mouseDown=!0,n.player.media.duration&&(n.toggleScrubbingContainer(!0),n.toggleThumbContainer(!1,!0),n.showImageAtCurrentTime()))})),gs(this,"endScrubbing",(function(){n.mouseDown=!1,Math.ceil(n.lastTime)===Math.ceil(n.player.media.currentTime)?n.toggleScrubbingContainer(!1):_A.call(n.player,n.player.media,"timeupdate",(function(){n.mouseDown||n.toggleScrubbingContainer(!1)}))})),gs(this,"listeners",(function(){n.player.on("play",(function(){n.toggleThumbContainer(!1,!0)})),n.player.on("seeked",(function(){n.toggleThumbContainer(!1)})),n.player.on("timeupdate",(function(){n.lastTime=n.player.media.currentTime}))})),gs(this,"render",(function(){n.elements.thumb.container=tA("div",{class:n.player.config.classNames.previewThumbnails.thumbContainer}),n.elements.thumb.imageContainer=tA("div",{class:n.player.config.classNames.previewThumbnails.imageContainer}),n.elements.thumb.container.appendChild(n.elements.thumb.imageContainer);var e=tA("div",{class:n.player.config.classNames.previewThumbnails.timeContainer});n.elements.thumb.time=tA("span",{},"00:00"),e.appendChild(n.elements.thumb.time),n.elements.thumb.container.appendChild(e),Ux(n.player.elements.progress)&&n.player.elements.progress.appendChild(n.elements.thumb.container),n.elements.scrubbing.container=tA("div",{class:n.player.config.classNames.previewThumbnails.scrubbingContainer}),n.player.elements.wrapper.appendChild(n.elements.scrubbing.container)})),gs(this,"destroy",(function(){n.elements.thumb.container&&n.elements.thumb.container.remove(),n.elements.scrubbing.container&&n.elements.scrubbing.container.remove()})),gs(this,"showImageAtCurrentTime",(function(){n.mouseDown?n.setScrubbingContainerSize():n.setThumbContainerSizeAndPos();var e=n.thumbnails[0].frames.findIndex((function(e){return n.seekTime>=e.startTime&&n.seekTime<=e.endTime})),t=e>=0,r=0;n.mouseDown||n.toggleThumbContainer(t),t&&(n.thumbnails.forEach((function(t,i){n.loadedImages.includes(t.frames[e].text)&&(r=i)})),e!==n.showingThumb&&(n.showingThumb=e,n.loadImage(r)))})),gs(this,"loadImage",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=n.showingThumb,r=n.thumbnails[e],i=r.urlPrefix,o=r.frames[t],a=r.frames[t].text,s=i+a;if(n.currentImageElement&&n.currentImageElement.dataset.filename===a)n.showImage(n.currentImageElement,o,e,t,a,!1),n.currentImageElement.dataset.index=t,n.removeOldImages(n.currentImageElement);else{n.loadingImage&&n.usingSprites&&(n.loadingImage.onload=null);var c=new Image;c.src=s,c.dataset.index=t,c.dataset.filename=a,n.showingThumbFilename=a,n.player.debug.log("Loading image: ".concat(s)),c.onload=function(){return n.showImage(c,o,e,t,a,!0)},n.loadingImage=c,n.removeOldImages(c)}})),gs(this,"showImage",(function(e,t,r,i,o){var a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];n.player.debug.log("Showing thumb: ".concat(o,". num: ").concat(i,". qual: ").concat(r,". newimg: ").concat(a)),n.setImageSizeAndOffset(e,t),a&&(n.currentImageContainer.appendChild(e),n.currentImageElement=e,n.loadedImages.includes(o)||n.loadedImages.push(o)),n.preloadNearby(i,!0).then(n.preloadNearby(i,!1)).then(n.getHigherQuality(r,e,t,o))})),gs(this,"removeOldImages",(function(e){Array.from(n.currentImageContainer.children).forEach((function(t){if("img"===t.tagName.toLowerCase()){var r=n.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;var i=n.currentImageContainer;setTimeout((function(){i.removeChild(t),n.player.debug.log("Removing thumb: ".concat(t.dataset.filename))}),r)}}}))})),gs(this,"preloadNearby",(function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(r){setTimeout((function(){var i=n.thumbnails[0].frames[e].text;if(n.showingThumbFilename===i){var o;o=t?n.thumbnails[0].frames.slice(e):n.thumbnails[0].frames.slice(0,e).reverse();var a=!1;o.forEach((function(e){var t=e.text;if(t!==i&&!n.loadedImages.includes(t)){a=!0,n.player.debug.log("Preloading thumb filename: ".concat(t));var o=n.thumbnails[0].urlPrefix+t,s=new Image;s.src=o,s.onload=function(){n.player.debug.log("Preloaded thumb filename: ".concat(t)),n.loadedImages.includes(t)||n.loadedImages.push(t),r()}}})),a||r()}}),300)}))})),gs(this,"getHigherQuality",(function(e,t,r,i){if(e<n.thumbnails.length-1){var o=t.naturalHeight;n.usingSprites&&(o=r.h),o<n.thumbContainerHeight&&setTimeout((function(){n.showingThumbFilename===i&&(n.player.debug.log("Showing higher quality thumb for: ".concat(i)),n.loadImage(e+1))}),300)}})),gs(this,"toggleThumbContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.player.config.classNames.previewThumbnails.thumbContainerShown;n.elements.thumb.container.classList.toggle(r,e),!e&&t&&(n.showingThumb=null,n.showingThumbFilename=null)})),gs(this,"toggleScrubbingContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=n.player.config.classNames.previewThumbnails.scrubbingContainerShown;n.elements.scrubbing.container.classList.toggle(t,e),e||(n.showingThumb=null,n.showingThumbFilename=null)})),gs(this,"determineContainerAutoSizing",(function(){(n.elements.thumb.imageContainer.clientHeight>20||n.elements.thumb.imageContainer.clientWidth>20)&&(n.sizeSpecifiedInCSS=!0)})),gs(this,"setThumbContainerSizeAndPos",(function(){if(n.sizeSpecifiedInCSS){if(n.elements.thumb.imageContainer.clientHeight>20&&n.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(n.elements.thumb.imageContainer.clientHeight*n.thumbAspectRatio);n.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(n.elements.thumb.imageContainer.clientHeight<20&&n.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(n.elements.thumb.imageContainer.clientWidth/n.thumbAspectRatio);n.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var r=Math.floor(n.thumbContainerHeight*n.thumbAspectRatio);n.elements.thumb.imageContainer.style.height="".concat(n.thumbContainerHeight,"px"),n.elements.thumb.imageContainer.style.width="".concat(r,"px")}n.setThumbContainerPos()})),gs(this,"setThumbContainerPos",(function(){var e=n.player.elements.progress.getBoundingClientRect(),t=n.player.elements.container.getBoundingClientRect(),r=n.elements.thumb.container,i=t.left-e.left+10,o=t.right-e.left-r.clientWidth-10,a=n.mousePosX-e.left-r.clientWidth/2;a<i&&(a=i),a>o&&(a=o),r.style.left="".concat(a,"px")})),gs(this,"setScrubbingContainerSize",(function(){var e=tI(n.thumbAspectRatio,{width:n.player.media.clientWidth,height:n.player.media.clientHeight}),t=e.width,r=e.height;n.elements.scrubbing.container.style.width="".concat(t,"px"),n.elements.scrubbing.container.style.height="".concat(r,"px")})),gs(this,"setImageSizeAndOffset",(function(e,t){if(n.usingSprites){var r=n.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*r,"px"),e.style.width="".concat(e.naturalWidth*r,"px"),e.style.left="-".concat(t.x*r,"px"),e.style.top="-".concat(t.y*r,"px")}})),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return ds(e,[{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?tI(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),rI={insertElements:function(e,t){var n=this;jx(t)?nA(e,this.media,{src:t}):Nx(t)&&t.forEach((function(t){nA(e,n.media,t)}))},change:function(e){var t=this;Jx(e,"sources.length")?(CA.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],rA(t.media),t.media=null,Ux(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,r=e.type,i=bs(n,1)[0],o=i.provider,a=void 0===o?wO.html5:o,s=i.src,c="html5"===a?r:"div",u="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:r,supported:mA.check(r,a,t.config.playsinline),media:tA(c,u)}),t.elements.container.appendChild(t.media),Rx(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),Vx(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","")),OO.addStyleHook.call(t),t.isHTML5&&rI.insertElements.call(t,"source",n),t.config.title=e.title,VO.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&rI.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&OO.build.call(t),t.isHTML5&&t.media.load(),Vx(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new nI(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};var iI,oI=function(){function e(t,n){var r=this;if(hs(this,e),gs(this,"play",(function(){return Lx(r.media.play)?(r.ads&&r.ads.enabled&&r.ads.managerPromise.then((function(){return r.ads.play()})).catch((function(){return TA(r.media.play())})),r.media.play()):null})),gs(this,"pause",(function(){return r.playing&&Lx(r.media.pause)?r.media.pause():null})),gs(this,"togglePlay",(function(e){return(Rx(e)?e:!r.playing)?r.play():r.pause()})),gs(this,"stop",(function(){r.isHTML5?(r.pause(),r.restart()):Lx(r.media.stop)&&r.media.stop()})),gs(this,"restart",(function(){r.currentTime=0})),gs(this,"rewind",(function(e){r.currentTime-=Px(e)?e:r.config.seekTime})),gs(this,"forward",(function(e){r.currentTime+=Px(e)?e:r.config.seekTime})),gs(this,"increaseVolume",(function(e){var t=r.media.muted?0:r.volume;r.volume=t+(Px(e)?e:0)})),gs(this,"decreaseVolume",(function(e){r.increaseVolume(-e)})),gs(this,"airplay",(function(){mA.airplay&&r.media.webkitShowPlaybackTargetPicker()})),gs(this,"toggleControls",(function(e){if(r.supported.ui&&!r.isAudio){var t=uA(r.elements.container,r.config.classNames.hideControls),n=void 0===e?void 0:!e,i=cA(r.elements.container,r.config.classNames.hideControls,n);if(i&&Nx(r.config.controls)&&r.config.controls.includes("settings")&&!Vx(r.config.settings)&&pO.toggleMenu.call(r,!1),i!==t){var o=i?"controlshidden":"controlsshown";EA.call(r,r.media,o)}return!i}return!1})),gs(this,"on",(function(e,t){bA.call(r,r.elements.container,e,t)})),gs(this,"once",(function(e,t){_A.call(r,r.elements.container,e,t)})),gs(this,"off",(function(e,t){wA(r.elements.container,e,t)})),gs(this,"destroy",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(r.ready){var n=function(){document.body.style.overflow="",r.embed=null,t?(Object.keys(r.elements).length&&(rA(r.elements.buttons.play),rA(r.elements.captions),rA(r.elements.controls),rA(r.elements.wrapper),r.elements.buttons.play=null,r.elements.captions=null,r.elements.controls=null,r.elements.wrapper=null),Lx(e)&&e()):(SA.call(r),CA.cancelRequests.call(r),oA(r.elements.original,r.elements.container),EA.call(r,r.elements.original,"destroyed",!0),Lx(e)&&e.call(r.elements.original),r.ready=!1,setTimeout((function(){r.elements=null,r.media=null}),200))};r.stop(),clearTimeout(r.timers.loading),clearTimeout(r.timers.controls),clearTimeout(r.timers.resized),r.isHTML5?(OO.toggleNativeControls.call(r,!0),n()):r.isYouTube?(clearInterval(r.timers.buffering),clearInterval(r.timers.playing),null!==r.embed&&Lx(r.embed.destroy)&&r.embed.destroy(),n()):r.isVimeo&&(null!==r.embed&&r.embed.unload().then(n),setTimeout(n,200))}})),gs(this,"supports",(function(e){return mA.mime.call(r,e)})),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=mA.touch,this.media=t,jx(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||Mx(this.media)||Nx(this.media))&&(this.media=this.media[0]),this.config=Qx({},vO,e.defaults,n||{},function(){try{return JSON.parse(r.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 kO(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",mA),!Ix(this.media)&&Ux(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(mA.check().api){var i=this.media.cloneNode(!0);i.autoplay=!1,this.elements.original=i;var o=this.media.tagName.toLowerCase(),a=null,s=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),Ux(a)){if(s=dO(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?wO.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?wO.vimeo:null}(s.toString()),this.elements.container=this.media,this.media=a,this.elements.container.className="",s.search.length){var c=["1","true"];c.includes(s.searchParams.get("autoplay"))&&(this.config.autoplay=!0),c.includes(s.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=c.includes(s.searchParams.get("playsinline")),this.config.youtube.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(Vx(this.provider)||!Object.values(wO).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=EO;break;case"video":case"audio":this.type=o,this.provider=wO.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=mA.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new IO(this),this.storage=new iO(this),this.media.plyr=this,Ux(this.elements.container)||(this.elements.container=tA("div",{tabindex:0}),Zx(this.media,this.elements.container)),OO.migrateStyles.call(this),OO.addStyleHook.call(this),VO.setup.call(this),this.config.debug&&bA.call(this,this.elements.container,this.config.events.join(" "),(function(e){r.debug.log("event: ".concat(e.type))})),this.fullscreen=new TO(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&OO.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new WO(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return TA(r.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new nI(this))):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 ds(e,[{key:"toggleCaptions",value:function(e){mO.toggle.call(this,e,!1)}},{key:"isHTML5",get:function(){return this.provider===wO.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===wO.youtube}},{key:"isVimeo",get:function(){return this.provider===wO.vimeo}},{key:"isVideo",get:function(){return this.type===EO}},{key:"isAudio",get:function(){return this.type===_O}},{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=Px(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 Px(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=Px(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;jx(t)&&(t=Number(t)),Px(t)||(t=this.storage.get("volume")),Px(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!Vx(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;Rx(t)||(t=this.storage.get("muted")),Rx(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=this,n=null;Px(e)&&(n=e),Px(n)||(n=this.storage.get("speed")),Px(n)||(n=this.config.speed.selected);var r=this.minimumSpeed,i=this.maximumSpeed;n=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),n)}(n,r,i),this.config.speed.selected=n,setTimeout((function(){t.media.playbackRate=n}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,ws(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,ws(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var r=[!Vx(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(Px),i=!0;if(!n.includes(r)){var o=function(e,t){return Nx(e)&&e.length?e.reduce((function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e})):null}(n,r);this.debug.warn("Unsupported quality option: ".concat(r,", using ").concat(o," instead")),r=o,i=!1}t.selected=r,this.media.quality=r,i&&this.storage.set({quality:r})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=Rx(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){rI.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return Hx(e)?e:this.source},set:function(e){Hx(e)&&(this.config.urls.download=e,pO.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?OO.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=AA(OA.call(this));return Nx(e)?e.join(":"):e},set:function(e){this.isVideo?jx(e)&&xA(e)?(this.config.ratio=e,IA.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=Rx(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){mO.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){mO.setLanguage.call(this,e,!1)},get:function(){return(mO.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(mA.pip){var t=Rx(e)?e:!this.pip;Lx(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?yO:bO),Lx(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return mA.pip?Vx(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===yO:null}}],[{key:"supported",value:function(e,t,n){return mA.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return aO(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=null;return jx(t)?r=Array.from(document.querySelectorAll(t)):Mx(t)?r=Array.from(t):Nx(t)&&(r=t.filter(Ux)),Vx(r)?null:r.map((function(t){return new e(t,n)}))}}]),e}();oI.defaults=(iI=vO,JSON.parse(JSON.stringify(iI)));var aI,sI={video:{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"}],previewThumbnails:{src:["https://cdn.plyr.io/static/demo/thumbs/100p.vtt","https://cdn.plyr.io/static/demo/thumbs/240p.vtt"]}},audio:{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"}]},youtube:{type:"video",sources:[{src:"https://youtube.com/watch?v=bTqVqk7FSmY",provider:"youtube"}]},vimeo:{type:"video",sources:[{src:"https://vimeo.com/40648169",provider:"vimeo"}]}},cI=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2];return e&&e.classList[n?"add":"remove"](t)};aI="plyr.io",window.location.host===aI&&Cd({dsn:"https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555",whitelistUrls:[aI].map((function(e){return new RegExp("https://(([a-z0-9])+(.))*".concat(e))}))}),document.addEventListener("DOMContentLoaded",(function(){Ng.setup(".js-shr",{count:{className:"button__count"},wrapper:{className:"button--with-count"}});var e=new oI("#player",{debug:!0,title:"View From A Blue Moon",iconUrl:"dist/demo.svg",keyboard:{global:!0},tooltips:{controls:!0},captions:{active:!0},ads:{enabled:window.location.host.includes(aI),publisherId:"918848828995742"},previewThumbnails:{enabled:!0,src:["https://cdn.plyr.io/static/demo/thumbs/100p.vtt","https://cdn.plyr.io/static/demo/thumbs/240p.vtt"]},vimeo:{referrerPolicy:"no-referrer"}});window.player=e;var t=document.querySelectorAll("[data-source]"),n=Object.keys(sI),r=Boolean(window.history&&window.history.pushState),i=window.location.hash.substring(1),o=i.length;function a(e){Array.from(t).forEach((function(e){return cI(e.parentElement,"active",!1)})),cI(document.querySelector('[data-source="'.concat(e,'"]')),"active",!0),Array.from(document.querySelectorAll(".plyr__cite")).forEach((function(e){e.hidden=!0})),document.querySelector(".plyr__cite--".concat(e)).hidden=!1}function s(t,r){!n.includes(t)||!r&&t===i||!i.length&&"video"===t||(e.source=sI[t],i=t,a(t))}Array.from(t).forEach((function(e){e.addEventListener("click",(function(){var t=e.getAttribute("data-source");s(t),r&&window.history.pushState({type:t},"","#".concat(t))}))})),window.addEventListener("popstate",(function(e){e.state&&Object.keys(e.state).includes("type")&&s(e.state.type)})),o||(i="video"),r&&n.includes(i)&&window.history.replaceState({type:i},"",o?"#".concat(i):""),"video"!==i&&s(i,!0),a(i)}))}();
//# sourceMappingURL=demo.min.js.map
diff --git a/demo/dist/demo.min.js.map b/demo/dist/demo.min.js.map
index a02eaad5..c13429f1 100644
--- a/demo/dist/demo.min.js.map
+++ b/demo/dist/demo.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["demo.js","demo/node_modules/core-js/internals/global.js","demo/node_modules/core-js/internals/fails.js","demo/node_modules/core-js/internals/descriptors.js","demo/node_modules/core-js/internals/object-property-is-enumerable.js","demo/node_modules/core-js/internals/create-property-descriptor.js","demo/node_modules/core-js/internals/classof-raw.js","demo/node_modules/core-js/internals/indexed-object.js","demo/node_modules/core-js/internals/require-object-coercible.js","demo/node_modules/core-js/internals/to-indexed-object.js","demo/node_modules/core-js/internals/is-object.js","demo/node_modules/core-js/internals/to-primitive.js","demo/node_modules/core-js/internals/has.js","demo/node_modules/core-js/internals/document-create-element.js","demo/node_modules/core-js/internals/ie8-dom-define.js","demo/node_modules/core-js/internals/object-get-own-property-descriptor.js","demo/node_modules/core-js/internals/an-object.js","demo/node_modules/core-js/internals/object-define-property.js","demo/node_modules/core-js/internals/create-non-enumerable-property.js","demo/node_modules/core-js/internals/set-global.js","demo/node_modules/core-js/internals/shared-store.js","demo/node_modules/core-js/internals/inspect-source.js","demo/node_modules/core-js/internals/internal-state.js","demo/node_modules/core-js/internals/native-weak-map.js","demo/node_modules/core-js/internals/shared.js","demo/node_modules/core-js/internals/uid.js","demo/node_modules/core-js/internals/shared-key.js","demo/node_modules/core-js/internals/hidden-keys.js","demo/node_modules/core-js/internals/redefine.js","demo/node_modules/core-js/internals/path.js","demo/node_modules/core-js/internals/get-built-in.js","demo/node_modules/core-js/internals/to-integer.js","demo/node_modules/core-js/internals/to-length.js","demo/node_modules/core-js/internals/to-absolute-index.js","demo/node_modules/core-js/internals/array-includes.js","demo/node_modules/core-js/internals/object-keys-internal.js","demo/node_modules/core-js/internals/enum-bug-keys.js","demo/node_modules/core-js/internals/object-get-own-property-names.js","demo/node_modules/core-js/internals/object-get-own-property-symbols.js","demo/node_modules/core-js/internals/own-keys.js","demo/node_modules/core-js/internals/copy-constructor-properties.js","demo/node_modules/core-js/internals/is-forced.js","demo/node_modules/core-js/internals/export.js","demo/node_modules/core-js/internals/a-function.js","demo/node_modules/core-js/internals/function-bind-context.js","demo/node_modules/core-js/internals/to-object.js","demo/node_modules/core-js/internals/is-array.js","demo/node_modules/core-js/internals/native-symbol.js","demo/node_modules/core-js/internals/use-symbol-as-uid.js","demo/node_modules/core-js/internals/well-known-symbol.js","demo/node_modules/core-js/internals/array-species-create.js","demo/node_modules/core-js/internals/array-iteration.js","demo/node_modules/core-js/internals/array-method-is-strict.js","demo/node_modules/core-js/internals/array-method-uses-to-length.js","demo/node_modules/core-js/internals/array-for-each.js","demo/node_modules/core-js/modules/es.array.for-each.js","demo/node_modules/core-js/internals/call-with-safe-iteration-closing.js","demo/node_modules/core-js/internals/iterators.js","demo/node_modules/core-js/internals/is-array-iterator-method.js","demo/node_modules/core-js/internals/create-property.js","demo/node_modules/core-js/internals/to-string-tag-support.js","demo/node_modules/core-js/internals/classof.js","demo/node_modules/core-js/internals/get-iterator-method.js","demo/node_modules/core-js/internals/array-from.js","demo/node_modules/core-js/internals/check-correctness-of-iteration.js","demo/node_modules/core-js/modules/es.array.from.js","demo/node_modules/core-js/internals/object-keys.js","demo/node_modules/core-js/internals/object-create.js","demo/node_modules/core-js/internals/object-define-properties.js","demo/node_modules/core-js/internals/html.js","demo/node_modules/core-js/internals/add-to-unscopables.js","demo/node_modules/core-js/modules/es.array.includes.js","demo/node_modules/core-js/internals/engine-user-agent.js","demo/node_modules/core-js/internals/engine-v8-version.js","demo/node_modules/core-js/internals/array-method-has-species-support.js","demo/node_modules/core-js/modules/es.array.map.js","demo/node_modules/core-js/modules/es.object.keys.js","demo/node_modules/core-js/internals/a-possible-prototype.js","demo/node_modules/core-js/internals/object-set-prototype-of.js","demo/node_modules/core-js/internals/inherit-if-required.js","demo/node_modules/core-js/internals/is-regexp.js","demo/node_modules/core-js/internals/regexp-flags.js","demo/node_modules/core-js/internals/regexp-sticky-helpers.js","demo/node_modules/core-js/internals/set-species.js","demo/node_modules/core-js/modules/es.regexp.constructor.js","demo/node_modules/core-js/internals/regexp-exec.js","demo/node_modules/core-js/modules/es.regexp.exec.js","demo/node_modules/core-js/modules/es.regexp.to-string.js","demo/node_modules/core-js/internals/not-a-regexp.js","demo/node_modules/core-js/internals/correct-is-regexp-logic.js","demo/node_modules/core-js/modules/es.string.includes.js","demo/node_modules/core-js/internals/string-multibyte.js","demo/node_modules/core-js/internals/iterators-core.js","demo/node_modules/core-js/internals/correct-prototype-getter.js","demo/node_modules/core-js/internals/object-get-prototype-of.js","demo/node_modules/core-js/internals/set-to-string-tag.js","demo/node_modules/core-js/internals/create-iterator-constructor.js","demo/node_modules/core-js/internals/define-iterator.js","demo/node_modules/core-js/modules/es.string.iterator.js","demo/node_modules/core-js/internals/dom-iterables.js","demo/node_modules/core-js/modules/web.dom-collections.for-each.js","demo/src/js/tab-focus.js","demo/node_modules/custom-event-polyfill/polyfill.js","demo/node_modules/core-js/internals/object-get-own-property-names-external.js","demo/node_modules/core-js/internals/well-known-symbol-wrapped.js","demo/node_modules/core-js/internals/define-well-known-symbol.js","demo/node_modules/core-js/modules/es.symbol.js","demo/node_modules/core-js/modules/es.symbol.description.js","demo/node_modules/core-js/modules/es.symbol.iterator.js","demo/node_modules/core-js/modules/es.array.index-of.js","demo/node_modules/core-js/modules/es.array.iterator.js","demo/node_modules/core-js/modules/es.array.join.js","demo/node_modules/core-js/modules/es.array.slice.js","demo/node_modules/core-js/internals/object-to-string.js","demo/node_modules/core-js/modules/es.object.to-string.js","demo/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","demo/node_modules/core-js/internals/advance-string-index.js","demo/node_modules/core-js/internals/regexp-exec-abstract.js","demo/node_modules/core-js/modules/es.string.replace.js","demo/node_modules/core-js/internals/same-value.js","demo/node_modules/core-js/modules/es.string.search.js","demo/node_modules/core-js/internals/species-constructor.js","demo/node_modules/core-js/modules/es.string.split.js","demo/node_modules/core-js/modules/web.dom-collections.iterator.js","demo/node_modules/core-js/internals/native-url.js","demo/node_modules/core-js/internals/an-instance.js","demo/node_modules/core-js/internals/object-assign.js","demo/node_modules/core-js/internals/string-punycode-to-ascii.js","demo/node_modules/core-js/internals/redefine-all.js","demo/node_modules/core-js/internals/get-iterator.js","demo/node_modules/core-js/modules/web.url-search-params.js","demo/node_modules/core-js/modules/web.url.js","demo/node_modules/url-polyfill/url-polyfill.js","demo/node_modules/core-js/modules/es.symbol.async-iterator.js","demo/node_modules/core-js/modules/es.array.concat.js","demo/node_modules/core-js/modules/es.object.assign.js","demo/node_modules/core-js/modules/es.object.get-own-property-descriptor.js","demo/node_modules/core-js/internals/native-promise-constructor.js","demo/node_modules/core-js/internals/task.js","demo/node_modules/core-js/internals/iterate.js","demo/node_modules/core-js/internals/engine-is-ios.js","demo/node_modules/core-js/internals/microtask.js","demo/node_modules/core-js/modules/es.promise.js","demo/node_modules/core-js/internals/new-promise-capability.js","demo/node_modules/core-js/internals/promise-resolve.js","demo/node_modules/core-js/internals/perform.js","demo/node_modules/core-js/internals/host-report-errors.js","demo/node_modules/tslib/tslib.es6.js","demo/node_modules/@sentry/types/esm/severity.js","demo/node_modules/@sentry/types/esm/status.js","demo/node_modules/core-js/modules/es.function.name.js","demo/node_modules/@sentry/utils/esm/polyfill.js","demo/node_modules/@sentry/utils/esm/error.js","demo/node_modules/@sentry/utils/esm/is.js","demo/node_modules/core-js/modules/es.string.match.js","demo/node_modules/core-js/internals/array-buffer-native.js","demo/node_modules/core-js/internals/array-buffer-view-core.js","demo/node_modules/core-js/internals/typed-array-constructors-require-wrappers.js","demo/node_modules/core-js/internals/to-index.js","demo/node_modules/core-js/internals/ieee754.js","demo/node_modules/core-js/internals/array-fill.js","demo/node_modules/core-js/internals/array-buffer.js","demo/node_modules/core-js/internals/to-offset.js","demo/node_modules/core-js/internals/to-positive-integer.js","demo/node_modules/core-js/internals/typed-array-from.js","demo/node_modules/core-js/internals/typed-array-constructor.js","demo/node_modules/core-js/modules/es.typed-array.uint16-array.js","demo/node_modules/core-js/internals/array-copy-within.js","demo/node_modules/core-js/modules/es.typed-array.copy-within.js","demo/node_modules/core-js/modules/es.typed-array.every.js","demo/node_modules/core-js/modules/es.typed-array.fill.js","demo/node_modules/core-js/modules/es.typed-array.filter.js","demo/node_modules/core-js/modules/es.typed-array.find.js","demo/node_modules/core-js/modules/es.typed-array.find-index.js","demo/node_modules/core-js/modules/es.typed-array.for-each.js","demo/node_modules/core-js/modules/es.typed-array.includes.js","demo/node_modules/core-js/modules/es.typed-array.index-of.js","demo/node_modules/core-js/modules/es.typed-array.iterator.js","demo/node_modules/core-js/modules/es.typed-array.join.js","demo/node_modules/core-js/internals/array-last-index-of.js","demo/node_modules/core-js/modules/es.typed-array.last-index-of.js","demo/node_modules/core-js/modules/es.typed-array.map.js","demo/node_modules/core-js/internals/array-reduce.js","demo/node_modules/core-js/modules/es.typed-array.reduce.js","demo/node_modules/core-js/modules/es.typed-array.reduce-right.js","demo/node_modules/core-js/modules/es.typed-array.reverse.js","demo/node_modules/core-js/modules/es.typed-array.set.js","demo/node_modules/core-js/modules/es.typed-array.slice.js","demo/node_modules/core-js/modules/es.typed-array.some.js","demo/node_modules/core-js/modules/es.typed-array.sort.js","demo/node_modules/core-js/modules/es.typed-array.subarray.js","demo/node_modules/core-js/modules/es.typed-array.to-locale-string.js","demo/node_modules/core-js/modules/es.typed-array.to-string.js","demo/node_modules/@sentry/utils/esm/string.js","demo/node_modules/@sentry/utils/esm/misc.js","demo/node_modules/@sentry/utils/esm/logger.js","demo/node_modules/core-js/modules/es.array.splice.js","demo/node_modules/core-js/internals/freezing.js","demo/node_modules/core-js/internals/internal-metadata.js","demo/node_modules/core-js/internals/collection-weak.js","demo/node_modules/core-js/internals/collection.js","demo/node_modules/core-js/modules/es.weak-set.js","demo/node_modules/@sentry/utils/esm/memo.js","demo/node_modules/@sentry/utils/esm/object.js","demo/node_modules/core-js/modules/web.url.to-json.js","demo/node_modules/core-js/modules/es.array.filter.js","demo/node_modules/core-js/modules/es.promise.finally.js","demo/node_modules/@sentry/utils/esm/syncpromise.js","demo/node_modules/@sentry/utils/esm/promisebuffer.js","demo/node_modules/@sentry/utils/esm/supports.js","demo/node_modules/@sentry/utils/esm/instrument.js","demo/node_modules/@sentry/utils/esm/dsn.js","demo/node_modules/@sentry/hub/esm/scope.js","demo/node_modules/@sentry/hub/esm/hub.js","demo/node_modules/@sentry/minimal/esm/index.js","demo/node_modules/@sentry/core/esm/api.js","demo/node_modules/@sentry/core/esm/integration.js","demo/node_modules/@sentry/core/esm/baseclient.js","demo/node_modules/@sentry/core/esm/integrations/functiontostring.js","demo/node_modules/@sentry/core/esm/transports/noop.js","demo/node_modules/@sentry/core/esm/basebackend.js","demo/node_modules/core-js/modules/es.array.some.js","demo/node_modules/@sentry/core/esm/integrations/inboundfilters.js","demo/node_modules/@sentry/browser/esm/tracekit.js","demo/node_modules/@sentry/browser/esm/parsers.js","demo/node_modules/@sentry/browser/esm/eventbuilder.js","demo/node_modules/@sentry/browser/esm/transports/base.js","demo/node_modules/@sentry/browser/esm/transports/fetch.js","demo/node_modules/@sentry/browser/esm/transports/xhr.js","demo/node_modules/@sentry/browser/esm/backend.js","demo/node_modules/@sentry/browser/esm/version.js","demo/node_modules/@sentry/browser/esm/client.js","demo/node_modules/@sentry/browser/esm/helpers.js","demo/node_modules/@sentry/browser/esm/integrations/globalhandlers.js","demo/node_modules/@sentry/browser/esm/integrations/trycatch.js","demo/node_modules/@sentry/browser/esm/integrations/breadcrumbs.js","demo/node_modules/@sentry/browser/esm/integrations/linkederrors.js","demo/node_modules/@sentry/browser/esm/integrations/useragent.js","demo/node_modules/@sentry/browser/esm/sdk.js","demo/node_modules/@sentry/core/esm/sdk.js","demo/node_modules/core-js/modules/es.array.find.js","demo/node_modules/core-js/internals/whitespaces.js","demo/node_modules/core-js/internals/string-trim.js","demo/node_modules/core-js/modules/es.number.constructor.js","demo/node_modules/core-js/modules/es.number.is-nan.js","demo/node_modules/core-js/internals/object-to-array.js","demo/node_modules/core-js/modules/es.object.entries.js","demo/node_modules/shr-buttons/dist/shr.mjs","node_modules/core-js/internals/global.js","node_modules/core-js/internals/fails.js","node_modules/core-js/internals/descriptors.js","node_modules/core-js/internals/object-property-is-enumerable.js","node_modules/core-js/internals/create-property-descriptor.js","node_modules/core-js/internals/classof-raw.js","node_modules/core-js/internals/indexed-object.js","node_modules/core-js/internals/require-object-coercible.js","node_modules/core-js/internals/to-indexed-object.js","node_modules/core-js/internals/is-object.js","node_modules/core-js/internals/to-primitive.js","node_modules/core-js/internals/has.js","node_modules/core-js/internals/document-create-element.js","node_modules/core-js/internals/ie8-dom-define.js","node_modules/core-js/internals/object-get-own-property-descriptor.js","node_modules/core-js/internals/an-object.js","node_modules/core-js/internals/object-define-property.js","node_modules/core-js/internals/create-non-enumerable-property.js","node_modules/core-js/internals/set-global.js","node_modules/core-js/internals/shared-store.js","node_modules/core-js/internals/inspect-source.js","node_modules/core-js/internals/internal-state.js","node_modules/core-js/internals/native-weak-map.js","node_modules/core-js/internals/shared.js","node_modules/core-js/internals/uid.js","node_modules/core-js/internals/shared-key.js","node_modules/core-js/internals/hidden-keys.js","node_modules/core-js/internals/engine-v8-version.js","node_modules/core-js/internals/redefine.js","node_modules/core-js/internals/path.js","node_modules/core-js/internals/get-built-in.js","node_modules/core-js/internals/to-integer.js","node_modules/core-js/internals/to-length.js","node_modules/core-js/internals/to-absolute-index.js","node_modules/core-js/internals/array-includes.js","node_modules/core-js/internals/object-keys-internal.js","node_modules/core-js/internals/enum-bug-keys.js","node_modules/core-js/internals/object-get-own-property-names.js","node_modules/core-js/internals/object-get-own-property-symbols.js","node_modules/core-js/internals/own-keys.js","node_modules/core-js/internals/copy-constructor-properties.js","node_modules/core-js/internals/is-forced.js","node_modules/core-js/internals/export.js","node_modules/core-js/internals/is-array.js","node_modules/core-js/internals/to-object.js","node_modules/core-js/internals/create-property.js","node_modules/core-js/internals/native-symbol.js","node_modules/core-js/internals/use-symbol-as-uid.js","node_modules/core-js/internals/well-known-symbol.js","node_modules/core-js/internals/array-species-create.js","node_modules/core-js/internals/engine-user-agent.js","node_modules/core-js/internals/array-method-has-species-support.js","node_modules/core-js/modules/es.array.concat.js","node_modules/core-js/internals/a-function.js","node_modules/core-js/internals/function-bind-context.js","node_modules/core-js/internals/array-iteration.js","node_modules/core-js/internals/array-method-uses-to-length.js","node_modules/core-js/modules/es.array.filter.js","node_modules/core-js/internals/object-keys.js","node_modules/core-js/internals/object-create.js","node_modules/core-js/internals/object-define-properties.js","node_modules/core-js/internals/html.js","node_modules/core-js/internals/add-to-unscopables.js","node_modules/core-js/modules/es.array.find.js","node_modules/core-js/internals/iterator-close.js","node_modules/core-js/internals/call-with-safe-iteration-closing.js","node_modules/core-js/internals/iterators.js","node_modules/core-js/internals/is-array-iterator-method.js","node_modules/core-js/internals/to-string-tag-support.js","node_modules/core-js/internals/classof.js","node_modules/core-js/internals/get-iterator-method.js","node_modules/core-js/internals/array-from.js","node_modules/core-js/internals/check-correctness-of-iteration.js","node_modules/core-js/modules/es.array.from.js","node_modules/core-js/modules/es.array.includes.js","node_modules/core-js/internals/correct-prototype-getter.js","node_modules/core-js/internals/iterators-core.js","node_modules/core-js/internals/object-get-prototype-of.js","node_modules/core-js/internals/set-to-string-tag.js","node_modules/core-js/internals/create-iterator-constructor.js","node_modules/core-js/internals/object-set-prototype-of.js","node_modules/core-js/internals/a-possible-prototype.js","node_modules/core-js/internals/define-iterator.js","node_modules/core-js/modules/es.array.iterator.js","node_modules/core-js/internals/array-method-is-strict.js","node_modules/core-js/modules/es.array.join.js","node_modules/core-js/modules/es.array.map.js","node_modules/core-js/internals/inherit-if-required.js","node_modules/core-js/internals/whitespaces.js","node_modules/core-js/internals/string-trim.js","node_modules/core-js/modules/es.number.constructor.js","node_modules/core-js/modules/es.object.keys.js","node_modules/core-js/internals/object-to-string.js","node_modules/core-js/modules/es.object.to-string.js","node_modules/core-js/internals/regexp-flags.js","node_modules/core-js/internals/regexp-sticky-helpers.js","node_modules/core-js/internals/regexp-exec.js","node_modules/core-js/modules/es.regexp.exec.js","node_modules/core-js/modules/es.regexp.to-string.js","node_modules/core-js/internals/is-regexp.js","node_modules/core-js/internals/not-a-regexp.js","node_modules/core-js/internals/correct-is-regexp-logic.js","node_modules/core-js/modules/es.string.includes.js","node_modules/core-js/internals/string-multibyte.js","node_modules/core-js/modules/es.string.iterator.js","node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","node_modules/core-js/internals/same-value.js","node_modules/core-js/internals/regexp-exec-abstract.js","node_modules/core-js/modules/es.string.search.js","node_modules/core-js/internals/redefine-all.js","node_modules/core-js/internals/freezing.js","node_modules/core-js/internals/internal-metadata.js","node_modules/core-js/internals/iterate.js","node_modules/core-js/internals/an-instance.js","node_modules/core-js/internals/collection-weak.js","node_modules/core-js/internals/dom-iterables.js","node_modules/core-js/modules/es.weak-map.js","node_modules/core-js/internals/collection.js","node_modules/core-js/modules/web.dom-collections.iterator.js","node_modules/core-js/modules/es.array.every.js","node_modules/core-js/internals/array-for-each.js","node_modules/core-js/modules/es.array.for-each.js","node_modules/core-js/modules/es.array.index-of.js","node_modules/core-js/internals/object-assign.js","node_modules/core-js/modules/es.object.assign.js","node_modules/core-js/internals/species-constructor.js","node_modules/core-js/internals/advance-string-index.js","node_modules/core-js/modules/es.string.split.js","node_modules/core-js/internals/string-trim-forced.js","node_modules/core-js/modules/es.string.trim.js","node_modules/core-js/modules/web.dom-collections.for-each.js","node_modules/core-js/internals/native-url.js","node_modules/core-js/internals/string-punycode-to-ascii.js","node_modules/core-js/internals/get-iterator.js","node_modules/core-js/modules/web.url-search-params.js","node_modules/core-js/modules/web.url.js","node_modules/core-js/modules/es.array.some.js","node_modules/core-js/internals/this-number-value.js","node_modules/core-js/internals/string-repeat.js","node_modules/core-js/modules/es.number.to-fixed.js","node_modules/core-js/internals/object-to-array.js","node_modules/core-js/modules/es.object.entries.js","node_modules/core-js/modules/es.object.values.js","node_modules/core-js/modules/es.string.replace.js","node_modules/core-js/internals/object-get-own-property-names-external.js","node_modules/core-js/internals/well-known-symbol-wrapped.js","node_modules/core-js/internals/define-well-known-symbol.js","node_modules/core-js/modules/es.symbol.js","node_modules/core-js/modules/es.number.is-nan.js","node_modules/core-js/modules/es.object.get-own-property-descriptor.js","node_modules/rangetouch/dist/rangetouch.mjs","node_modules/core-js/modules/es.object.get-own-property-descriptors.js","node_modules/core-js/modules/es.string.match.js","node_modules/core-js/internals/task.js","node_modules/core-js/internals/native-promise-constructor.js","node_modules/core-js/internals/set-species.js","node_modules/core-js/internals/engine-is-ios.js","node_modules/core-js/internals/engine-is-node.js","node_modules/core-js/internals/microtask.js","node_modules/core-js/modules/es.promise.js","node_modules/core-js/internals/new-promise-capability.js","node_modules/core-js/internals/promise-resolve.js","node_modules/core-js/internals/perform.js","node_modules/core-js/internals/host-report-errors.js","node_modules/core-js/modules/es.string.starts-with.js","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","node_modules/core-js/internals/array-reduce.js","node_modules/core-js/modules/es.array.reduce.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","node_modules/core-js/modules/es.array.slice.js","node_modules/core-js/modules/es.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/load-sprite.js","node_modules/core-js/modules/es.math.trunc.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/internals/math-sign.js","src/js/utils/load-image.js","node_modules/core-js/modules/es.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es.array.splice.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","node_modules/core-js/modules/es.array.find-index.js","node_modules/core-js/internals/array-last-index-of.js","node_modules/core-js/modules/es.array.last-index-of.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js","src/js/utils/numbers.js","demo/src/js/sources.js","demo/src/js/demo.js","demo/src/js/toggle-class.js"],"names":["navigator","commonjsGlobal","globalThis","window","global","self","createCommonjsModule","fn","module","exports","check","it","Math","global_1","Function","fails","exec","error","descriptors","Object","defineProperty","get","nativePropertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor","objectPropertyIsEnumerable","f","call","1","V","descriptor","this","enumerable","createPropertyDescriptor","bitmap","value","configurable","writable","toString","classofRaw","slice","split","indexedObject","classof","requireObjectCoercible","undefined","TypeError","toIndexedObject","IndexedObject","isObject","toPrimitive","input","PREFERRED_STRING","val","valueOf","hasOwnProperty","has","key","document","EXISTS","createElement","documentCreateElement","ie8DomDefine","DESCRIPTORS","a","nativeGetOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","O","P","IE8_DOM_DEFINE","propertyIsEnumerableModule","anObject","String","nativeDefineProperty","objectDefineProperty","Attributes","createNonEnumerableProperty","object","definePropertyModule","setGlobal","SHARED","sharedStore","functionToString","store","inspectSource","set","WeakMap","nativeWeakMap","test","shared","push","version","mode","copyright","id","postfix","random","uid","keys","sharedKey","hiddenKeys","NATIVE_WEAK_MAP","wmget","wmhas","wmset","metadata","STATE","objectHas","internalState","enforce","getterFor","TYPE","state","type","redefine","getInternalState","InternalStateModule","enforceInternalState","TEMPLATE","options","unsafe","simple","noTargetGet","source","join","prototype","path","aFunction","variable","getBuiltIn","namespace","method","arguments","length","ceil","floor","toInteger","argument","isNaN","min","toLength","max","toAbsoluteIndex","index","integer","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayIncludes","includes","indexOf","require$$0","objectKeysInternal","names","i","result","enumBugKeys","concat","objectGetOwnPropertyNames","getOwnPropertyNames","internalObjectKeys","objectGetOwnPropertySymbols","getOwnPropertySymbols","ownKeys","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","copyConstructorProperties","target","getOwnPropertyDescriptorModule","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","replace","toLowerCase","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","sham","aFunction$1","functionBindContext","that","b","c","apply","toObject","isArray","Array","arg","nativeSymbol","Symbol","useSymbolAsUid","NATIVE_SYMBOL","iterator","WellKnownSymbolsStore","createWellKnownSymbol","USE_SYMBOL_AS_UID","withoutSetter","wellKnownSymbol","name","SPECIES","arraySpeciesCreate","originalArray","C","constructor","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","callbackfn","specificCreate","boundFunction","bind","create","arrayIteration","forEach","map","filter","some","every","find","findIndex","arrayMethodIsStrict","METHOD_NAME","cache","thrower","arrayMethodUsesToLength","ACCESSORS","argument0","argument1","$forEach","STRICT_METHOD","USES_TO_LENGTH","arrayForEach","$","proto","callWithSafeIterationClosing","ENTRIES","returnMethod","iterators","ITERATOR","ArrayPrototype","isArrayIteratorMethod","Iterators","createProperty","propertyKey","toStringTagSupport","TO_STRING_TAG","CORRECT_ARGUMENTS","TO_STRING_TAG_SUPPORT","tag","tryGet","callee","getIteratorMethod","arrayFrom","arrayLike","step","next","argumentsLength","mapfn","mapping","iteratorMethod","done","SAFE_CLOSING","called","iteratorWithReturn","return","from","checkCorrectnessOfIteration","SKIP_CLOSING","ITERATION_SUPPORT","INCORRECT_ITERATION","iterable","activeXDocument","objectKeys","objectDefineProperties","defineProperties","Properties","html","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObject","domain","ActiveXObject","iframeDocument","iframe","write","close","temp","parentWindow","NullProtoObjectViaActiveX","style","display","appendChild","src","contentWindow","open","F","objectCreate","UNSCOPABLES","addToUnscopables","$includes","match","engineUserAgent","process","versions","v8","userAgent","engineV8Version","arrayMethodHasSpeciesSupport","V8_VERSION","array","foo","Boolean","$map","HAS_SPECIES_SUPPORT","FAILS_ON_PRIMITIVES","nativeKeys","objectSetPrototypeOf","setPrototypeOf","setter","CORRECT_SETTER","aPossiblePrototype","__proto__","inheritIfRequired","dummy","Wrapper","NewTarget","NewTargetPrototype","MATCH","isRegexp","isRegExp","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","s","RegExp","regexpStickyHelpers","UNSUPPORTED_Y","re","lastIndex","BROKEN_CARET","setSpecies","CONSTRUCTOR_NAME","Constructor","require$$1","setInternalState","require$$2","NativeRegExp","RegExpPrototype","re1","re2","CORRECT_NEW","stickyHelpers","RegExpWrapper","pattern","flags","thisIsRegExp","patternIsRegExp","flagsAreUndefined","getFlags","proxy","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","NPCG_INCLUDED","str","reCopy","charsAdded","strCopy","regexpExec","TO_STRING","nativeToString","NOT_GENERIC","INCORRECT_NAME","R","p","rf","notARegexp","regexp","e","correctIsRegExpLogic","searchString","notARegExp","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","CONVERT_TO_STRING","pos","first","second","S","position","size","charCodeAt","charAt","stringMultibyte","codeAt","correctPrototypeGetter","getPrototypeOf","ObjectPrototype","objectGetPrototypeOf","CORRECT_PROTOTYPE_GETTER","BUGGY_SAFARI_ITERATORS","iteratorsCore","setToStringTag","TAG","returnThis","createIteratorConstructor","IteratorConstructor","NAME","IteratorsCore","KEYS","VALUES","defineIterator","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","entries","values","STRING_ITERATOR","iterated","point","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","COLLECTION_NAME","DOMIterables","Collection","CollectionPrototype","container","getElementById","tabClassName","addEventListener","event","classList","contains","remove","keyCode","setTimeout","focused","activeElement","add","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","params","evt","origPrevent","bubbles","createEvent","initCustomEvent","detail","Event","nativeGetOwnPropertyNames","windowNames","objectGetOwnPropertyNamesExternal","getWindowNames","wellKnownSymbolWrapped","defineWellKnownSymbol","wrappedWellKnownSymbolModule","HIDDEN","SYMBOL","TO_PRIMITIVE","$Symbol","$stringify","getOwnPropertyNamesExternal","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","QObject","USE_SETTER","findChild","setSymbolDescriptor","nativeObjectCreate","ObjectPrototypeDescriptor","wrap","description","symbol","isSymbol","$defineProperty","$defineProperties","properties","$getOwnPropertySymbols","$propertyIsEnumerable","$getOwnPropertyDescriptor","$getOwnPropertyNames","IS_OBJECT_PROTOTYPE","for","keyFor","sym","useSetter","useSimple","FORCED_JSON_STRINGIFY","stringify","replacer","space","$replacer","args","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","symbolPrototype","symbolToString","native","desc","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","ARRAY_ITERATOR","es_array_iterator","kind","Arguments","nativeJoin","ES3_STRINGS","separator","0","nativeSlice","start","end","n","k","fin","objectToString","REPLACE_SUPPORTS_NAMED_GROUPS","groups","REPLACE_KEEPS_$0","REPLACE","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","fixRegexpWellKnownSymbolLogic","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","stringMethod","regexMethod","advanceStringIndex","regexpExecAbstract","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","fixRegExpWellKnownSymbolLogic","maybeCallNative","reason","UNSAFE_SUBSTITUTE","searchValue","replaceValue","res","rx","functionalReplace","fullUnicode","results","regExpExec","accumulatedResult","nextSourcePosition","matched","captures","j","namedCaptures","replacerArgs","getSubstitution","tailPos","m","symbols","ch","capture","sameValue","is","x","y","SEARCH","nativeSearch","searcher","previousLastIndex","speciesConstructor","defaultConstructor","arrayPush","MAX_UINT32","SUPPORTS_Y","SPLIT","nativeSplit","internalSplit","limit","lim","lastLength","output","lastLastIndex","separatorCopy","splitter","unicodeMatching","callRegExpExec","q","A","z","ArrayValues","ArrayIteratorMethods","nativeUrl","url","URL","searchParams","pathname","sort","href","URLSearchParams","username","host","hash","anInstance","nativeAssign","assign","objectAssign","B","alphabet","chr","T","maxInt","regexNonASCII","regexSeparators","OVERFLOW_ERROR","stringFromCharCode","fromCharCode","digitToBasic","digit","adapt","delta","numPoints","firstTime","baseMinusTMin","base","encode","currentValue","inputLength","counter","extra","ucs2decode","bias","basicLength","handledCPCount","handledCPCountPlusOne","RangeError","t","qMinusT","baseMinusT","redefineAll","getIterator","$fetch","Headers","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","getInternalIteratorState","plus","sequences","percentSequence","bytes","percentDecode","sequence","decodeURIComponent","deserialize","!","'","(",")","~","%20","serialize","encodeURIComponent","parseSearchParams","query","attribute","entry","attributes","shift","updateSearchParams","validateArgumentsLength","passed","required","URLSearchParamsIterator","URLSearchParamsConstructor","entryIterator","entryNext","init","updateURL","hasOwn","URLSearchParamsPrototype","append","delete","splice","getAll","found","entriesIndex","sliceIndex","callback","USE_NATIVE_URL","fetch","body","headers","EOF","web_urlSearchParams","getState","NativeURL","URLSearchParamsModule","getInternalSearchParamsState","getInternalURLState","pow","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","parseHost","codePoints","parseIPv6","isSpecial","label","encoded","labels","toASCII","parseIPv4","percentEncode","C0ControlPercentEncodeSet","partsLength","numbers","part","radix","number","ipv4","parts","pop","parseInt","numbersSeen","ipv4Piece","swaps","swap","address","pieceIndex","compress","pointer","char","serializeHost","ignore0","unshift","ipv6","maxIndex","maxLength","currStart","currLength","findLongestZeroSequence","fragmentPercentEncodeSet"," ","\"","<",">","`","pathPercentEncodeSet","#","?","{","}","userinfoPercentEncodeSet","/",":",";","=","@","[","\\","]","^","|","code","specialSchemes","ftp","file","http","https","ws","wss","scheme","includesCredentials","password","cannotHaveUsernamePasswordPort","cannotBeABaseURL","isWindowsDriveLetter","normalized","startsWithWindowsDriveLetter","third","shortenURLsPath","pathSize","isSingleDot","segment","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","parseURL","stateOverride","bufferCodePoints","failure","buffer","seenAt","seenBracket","seenPasswordToken","port","fragment","codePoint","encodedCodePoints","URLConstructor","baseState","urlString","searchParamsState","serializeURL","origin","getOrigin","protocol","getProtocol","getUsername","getPassword","getHost","hostname","getHostname","getPort","getPathname","search","getSearch","getSearchParams","getHash","URLPrototype","accessorDescriptor","getter","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","blob","_typeof","obj","_classCallCheck","instance","_defineProperties","props","_createClass","protoProps","staticProps","_defineProperty","ownKeys$1","enumerableOnly","_objectSpread2","getOwnPropertyDescriptors","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","_slicedToArray","arr","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","err","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","_iterableToArray","_nonIterableSpread","o","minLen","len","arr2","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","serializeParam","deserializeParam","checkIfURLSearchParamsSupported","typeofSearchString","_fromString","_this","_entries","thisArg","searchArray","polyfillURLSearchParams","u","checkIfURLIsSupported","_URL","baseElement","doc","location","implementation","createHTMLDocument","head","anchorElement","enableSearchUpdate","enableSearchParamsUpdate","methodName","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","expectedPort","http:","https:","ftp:","addPortToOrigin","polyfillURL","setInterval","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","E","defer","channel","nativePromiseConstructor","Promise","iterate_1","Result","stopped","AS_ENTRIES","IS_ITERATOR","iterFn","stop","engineIsIos","setImmediate","clear","clearImmediate","MessageChannel","Dispatch","queue","ONREADYSTATECHANGE","run","runner","listener","post","postMessage","nextTick","now","IS_IOS","port2","port1","onmessage","importScripts","removeChild","flush","last","notify","toggle","node","promise","then","task","macrotask","MutationObserver","WebKitMutationObserver","IS_NODE","queueMicrotaskDescriptor","queueMicrotask","parent","exit","enter","createTextNode","observe","characterData","resolve","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","microtask","PromiseCapability","reject","$$resolve","$$reject","newPromiseCapability","promiseResolve","promiseCapability","perform","PROMISE","getInternalPromiseState","PromiseConstructor","NativePromise","newPromiseCapabilityModule","newGenericPromiseCapability","DISPATCH_EVENT","dispatchEvent","UNHANDLED_REJECTION","PromiseRejectionEvent","FakePromise","all","isThenable","isReject","notified","chain","reactions","ok","exited","reaction","handler","fail","rejection","onHandleUnhandled","onUnhandled","initEvent","console","hostReportErrors","isUnhandled","emit","unwrap","internalReject","internalResolve","wrapper","executor","onFulfilled","onRejected","catch","r","capability","$promiseResolve","remaining","iterate","alreadyCalled","race","extendStatics","d","__extends","__","Severity","Status","__assign","__read","ar","__spread","fromString","level","Debug","Info","Warning","Fatal","Critical","Log","fromHttpCode","Success","RateLimit","Invalid","Failed","Unknown","FunctionPrototype","FunctionPrototypeToString","nameRE","prop","SentryError","_super","message","_newTarget","tslib_1.__extends","isError","wat","isInstanceOf","isErrorEvent","isDOMError","isString","isPrimitive","isPlainObject","isEvent","isElement","Element","nativeMatch","matcher","matchStr","arrayBufferNative","ArrayBuffer","DataView","Int8Array","Int8ArrayPrototype","Uint8ClampedArray","Uint8ClampedArrayPrototype","TypedArray","TypedArrayPrototype","isPrototypeOf","TYPED_ARRAY_TAG","NATIVE_ARRAY_BUFFER_VIEWS","NATIVE_ARRAY_BUFFER","opera","TYPED_ARRAY_TAG_REQIRED","TypedArrayConstructorsList","Uint8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","isTypedArray","arrayBufferViewCore","aTypedArray","aTypedArrayConstructor","ARRAY","TypedArrayConstructor","exportTypedArrayMethod","property","exportTypedArrayStaticMethod","isView","klass","typedArrayConstructorsRequireWrappers","toIndex","Infinity","abs","log","LN2","ieee754","mantissaLength","exponent","mantissa","exponentLength","eMax","eBias","rt","sign","nBits","NaN","arrayFill","endPos","ARRAY_BUFFER","DATA_VIEW","WRONG_INDEX","NativeArrayBuffer","$ArrayBuffer","$DataView","$DataViewPrototype","packIEEE754","IEEE754","unpackIEEE754","packInt8","packInt16","packInt32","unpackInt32","packFloat32","packFloat64","addGetter","view","count","isLittleEndian","intIndex","byteLength","byteOffset","pack","reverse","conversion","ArrayBufferPrototype","testView","nativeSetInt8","setInt8","getInt8","setUint8","bufferLength","offset","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","arrayBuffer","toOffset","BYTES","toPositiveInteger","typedArrayFrom","round","ArrayBufferModule","ArrayBufferViewCore","BYTES_PER_ELEMENT","WRONG_LENGTH","fromList","list","isArrayBuffer","isTypedArrayIndex","wrappedGetOwnPropertyDescriptor","wrappedDefineProperty","CLAMPED","GETTER","SETTER","NativeTypedArrayConstructor","TypedArrayConstructorPrototype","exported","addElement","TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS","typedArrayOffset","$length","$len","createTypedArrayConstructor","arrayCopyWithin","copyWithin","to","inc","$copyWithin","$every","$fill","$filter","$find","predicate","$findIndex","arrayValues","ArrayIterators","arrayKeys","arrayEntries","nativeTypedArrayIterator","CORRECT_ITER_NAME","typedArrayValues","$join","nativeLastIndexOf","lastIndexOf","arrayLastIndexOf","$lastIndexOf","IS_RIGHT","memo","arrayReduce","left","right","$reduce","$reduceRight","middle","$slice","$some","$sort","comparefn","begin","beginIndex","$toLocaleString","toLocaleString","TO_LOCALE_STRING_BUG","Uint8ArrayPrototype","arrayToString","arrayJoin","IS_NOT_ARRAY_METHOD","truncate","substr","safeJoin","delimiter","isMatchingPattern","isNodeEnv","fallbackGlobalObject","getGlobalObject","uuid4","crypto","msCrypto","getRandomValues","pad","num","v","parseUrl","relative","getEventDescription","exception","event_id","consoleSandbox","originalConsole","wrappedLevels","__sentry_original__","addExceptionTypeValue","addExceptionMechanism","mechanism","_oO","htmlTreeAsString","elem","currentElem","out","height","sepLength","nextStr","_htmlElementAsString","parentNode","className","classes","attr","tagName","attrWhitelist","getAttribute","INITIAL_TIME","Date","prevNow","performanceFallback","timeOrigin","crossPlatformPerformance","mod","request","require","performance","_","timing","navigationStart","timestampWithMs","parseRetryAfterHeader","header","headerDelay","headerDate","parse","defaultFunctionName","getFunctionName","PREFIX","Logger","_enabled","disable","enable","warn","__SENTRY__","logger","MAXIMUM_ALLOWED_LENGTH_EXCEEDED","deleteCount","insertCount","actualDeleteCount","actualStart","freezing","isExtensible","preventExtensions","internalMetadata","METADATA","setMetadata","objectID","weakData","meta","REQUIRED","fastKey","getWeakData","onFreeze","FREEZING","internalStateGetterFor","ArrayIterationModule","uncaughtFrozenStore","frozen","UncaughtFrozenStore","findUncaughtFrozen","common","IS_WEAK","ADDER","NativeConstructor","NativePrototype","fixMethod","getConstructor","InternalMetadataModule","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","setStrong","collection","define","$has","Memo","_hasWeakSet","WeakSet","_inner","memoize","unmemoize","fill","original","wrapped","_Oo","getWalkSource","stack","event_1","currentTarget","jsonSize","encodeURI","utf8Length","JSON","normalizeToSize","depth","maxSize","serialized","normalizeValue","_events","walk","serializeValue","toJSON","acc","innerKey","extractExceptionKeysForMessage","includedKeys","States","NON_GENERIC","real","finally","onFinally","isFunction","SyncPromise","_state","PENDING","_handlers","_resolve","_setResult","RESOLVED","_reject","REJECTED","_value","_executeHandlers","_attachHandler","cachedHandlers","onfulfilled","onrejected","resolvedCollection","item","_onfulfilled","_onrejected","onfinally","isRejected","PromiseBuffer","_limit","_buffer","isReady","drain","timeout","capturedSetTimeout","clearTimeout","supportsFetch","Request","Response","isNativeFetch","func","supportsReferrerPolicy","referrerPolicy","lastHref","handlers","instrumented","instrument","originalConsoleLevel","triggerHandlers","instrumentConsole","domEventHandler","keypressEventHandler","eventName","handleEvent","innerOriginal","__sentry_wrapped__","instrumentDOM","xhrproto","XMLHttpRequest","originalOpen","__sentry_xhr__","toUpperCase","__sentry_own_request__","originalSend","xhr","commonHandlerData","startTimestamp","tslib_1.__assign","readyState","status_code","status","endTimestamp","instrumentXHR","sandbox","hidden","supportsNativeFetch","originalFetch","fetchData","getFetchMethod","getFetchUrl","response","instrumentFetch","chrome","isChromePackagedApp","app","runtime","hasHistoryApi","history","pushState","replaceState","supportsHistory","oldOnPopState","onpopstate","historyReplacementFunction","originalHistoryFunction","instrumentHistory","_oldOnErrorHandler","onerror","msg","line","column","_oldOnUnhandledRejectionHandler","onunhandledrejection","addInstrumentationHandler","e_1","_a","_b","tslib_1.__values","_c","e_1_1","fetchArgs","keypressTimeout","lastCapturedEvent","debounceTimer","debounce","isContentEditable","DSN_REGEX","ERROR_MESSAGE","Dsn","_fromComponents","_validate","withPassword","pass","projectId","user","tslib_1.__read","components","component","Scope","_notifyingListeners","_scopeListeners","_eventProcessors","_breadcrumbs","_user","_tags","_extra","_context","addScopeListener","addEventProcessor","_notifyScopeListeners","_notifyEventProcessors","processors","hint","processor","final","setUser","setTags","tags","setTag","setExtras","extras","setExtra","setFingerprint","fingerprint","_fingerprint","setLevel","_level","setTransaction","transaction","_transaction","_span","setContext","context","setSpan","span","getSpan","clone","scope","newScope","tslib_1.__spread","addBreadcrumb","breadcrumb","maxBreadcrumbs","mergedBreadcrumb","timestamp","clearBreadcrumbs","_applyFingerprint","applyToEvent","contexts","trace","getTraceContext","breadcrumbs","getGlobalEventProcessors","globalEventProcessors","addGlobalEventProcessor","Hub","client","_version","_stack","_invokeClient","top","getStackTop","isOlderThan","bindClient","setupIntegrations","pushScope","getStack","parentScope","getClient","popScope","withScope","getScope","captureException","eventId","_lastEventId","finalHint","syntheticException","originalException","captureMessage","captureEvent","lastEventId","getOptions","beforeBreadcrumb","finalBreadcrumb","configureScope","oldHub","makeMain","getIntegration","integration","startSpan","spanOrSpanContext","forceNoChild","_callExtensionMethod","traceHeaders","carrier","getMainCarrier","sentry","extensions","hub","registry","getHubFromCarrier","setHubOnCarrier","getCurrentHub","hasHubOnCarrier","activeDomain","active","registryHubTopStack","getHubFromActiveDomain","callOnHub","API","dsn","_dsnObject","getDsn","getStoreEndpoint","_getBaseUrl","getStoreEndpointPath","getStoreEndpointWithUrlEncodedAuth","auth","sentry_key","sentry_version","getRequestHeaders","clientName","clientVersion","Content-Type","X-Sentry-Auth","getReportDialogEndpoint","dialogOptions","endpoint","encodedOptions","email","installedIntegrations","integrations","defaultIntegrations","userIntegrations","userIntegrationsNames_1","pickedIntegrationsNames_1","defaultIntegration","userIntegration","integrationsNames","alwaysLastToRun","getIntegrationsToSetup","setupOnce","setupIntegration","originalFunctionToString","BaseClient","backendClass","_integrations","_processing","_backend","_options","_dsn","_getBackend","eventFromException","_processEvent","finalEvent","eventFromMessage","_isClientProcessing","clearInterval","interval","getTransport","transportFlushed","ready","enabled","_isEnabled","ticked","_prepareEvent","environment","release","dist","maxValueLength","normalizeDepth","prepared","_addIntegrations","sdk","_normalizeEvent","sdkInfo","integrationsArray","beforeSend","sampleRate","__sentry__","sendEvent","beforeSendResult","_handleAsyncBeforeSend","processedEvent","NoopTransport","Skipped","BaseBackend","_transport","_setupTransport","_exception","_hint","_message","FunctionToString","DEFAULT_IGNORE_ERRORS","InboundFilters","clientOptions","_mergeOptions","_shouldDropEvent","_isSentryError","_isIgnoredError","_isBlacklistedUrl","_getEventFilterUrl","_isWhitelistedUrl","ignoreInternal","ignoreErrors","_getPossibleEventMessages","blacklistUrls","whitelistUrls","oO","stacktrace","frames_1","frames","filename","frames_2","UNKNOWN_FUNCTION","gecko","winjs","geckoEval","chromeEval","computeStackTrace","ex","popSize","framesToPop","opera10Regex","opera11Regex","lines","element","extractMessage","computeStackTraceFromStacktraceProp","popFrames","submatch","isNative","columnNumber","computeStackTraceFromStackProp","failed","exceptionFromStacktrace","prepareFramesForEvent","eventFromStacktrace","localStack","firstFrameFunction","lastFrameFunction","frame","colno","function","in_app","lineno","eventFromUnknownInput","domException","name_1","eventFromString","__serialized__","eventFromPlainObject","synthetic","attachStacktrace","BaseTransport","FetchTransport","_disabledUntil","defaultOptions","XHRTransport","onreadystatechange","getResponseHeader","setRequestHeader","send","BrowserBackend","transportOptions","transport","handled","SDK_VERSION","BrowserClient","platform","packages","showReportDialog","script","async","onLoad","onload","ignoreOnError","shouldIgnoreOnError","ignoreNextOnError","before","sentryWrapped","wrappedArguments","GlobalHandlers","_onErrorHandlerInstalled","_onUnhandledRejectionHandlerInstalled","stackTraceLimit","_installGlobalOnErrorHandler","_installGlobalOnUnhandledRejectionHandler","currentHub","hasIntegration","isFailedOwnDelivery","_eventFromIncompleteOnError","_enhanceEventWithInitialFrame","_eventFromIncompleteRejection","getLocationHref","TryCatch","_ignoreOnError","_wrapTimeFunction","originalCallback","_wrapRAF","_wrapEventTarget","_wrapXHR","xmlHttpRequestProps","wrapOptions","Breadcrumbs","dom","_consoleBreadcrumb","handlerData","category","_domBreadcrumb","_xhrBreadcrumb","addSentryBreadcrumb","_fetchBreadcrumb","filterUrl","_historyBreadcrumb","parsedLoc","parsedFrom","parsedTo","serializedData","LinkedErrors","_key","_handler","linkedErrors","_walkErrorTree","UserAgent","CoreIntegrations.InboundFilters","CoreIntegrations.FunctionToString","window_1","SENTRY_RELEASE","clientClass","debug","initAndBind","FIND","SKIPS_HOLES","whitespace","ltrim","rtrim","stringTrim","trim","require$$3","NUMBER","NativeNumber","NumberPrototype","BROKEN_CLASSOF","toNumber","maxCode","digits","NumberWrapper","TO_ENTRIES","$entries","instanceOf","isNullOrUndefined","isNodeList","Number","constants","facebook","shareCount","og_object","engagement","popup","width","twitter","pinterest","github","stargazers_count","youtube","statistics","subscriberCount","defaults","displayZero","format","increment","tokens","storage","ttl","getJSONP","setAttribute","noop","Console","matches","querySelectorAll","cloneNode","nextSibling","insertBefore","setAttributes","innerText","formatNumber","extend","Storage","supported","localStorage","getItem","setItem","removeItem","Shr","elements","trigger","querySelector","shr","config","networks","getCount","updateDisplay","listeners","share","openPopup","network","networkConfig","closed","focus","screenLeft","screen","screenTop","apiUrl","textContent","class","insertAdjacentElement","getDomain","substring","watch","addedNodes","childList","subtree","global_1$1","fails$1","descriptors$1","objectPropertyIsEnumerable$1","createPropertyDescriptor$1","classofRaw$1","indexedObject$1","requireObjectCoercible$1","toIndexedObject$1","isObject$2","toPrimitive$1","has$2","documentCreateElement$1","ie8DomDefine$1","objectGetOwnPropertyDescriptor$1","anObject$1","objectDefineProperty$1","createNonEnumerableProperty$1","setGlobal$1","sharedStore$1","inspectSource$1","nativeWeakMap$1","shared$1","uid$1","sharedKey$1","hiddenKeys$2","facade","internalState$1","redefine$1","path$1","getBuiltIn$1","toInteger$1","toLength$1","toAbsoluteIndex$1","arrayIncludes$1","objectKeysInternal$1","enumBugKeys$1","objectGetOwnPropertyNames$1","objectGetOwnPropertySymbols$1","ownKeys$2","copyConstructorProperties$1","isForced_1$1","_export$1","isArray$2","toObject$1","createProperty$1","nativeSymbol$1","useSymbolAsUid$1","wellKnownSymbol$1","arraySpeciesCreate$1","engineUserAgent$1","engineV8Version$1","arrayMethodHasSpeciesSupport$1","aFunction$3","functionBindContext$1","arrayIteration$1","arrayMethodUsesToLength$1","objectKeys$1","objectDefineProperties$1","html$1","objectCreate$1","addToUnscopables$1","iteratorClose","callWithSafeIterationClosing$1","iterators$1","isArrayIteratorMethod$1","toStringTagSupport$1","classof$1","getIteratorMethod$1","arrayFrom$1","checkCorrectnessOfIteration$1","correctPrototypeGetter$1","objectGetPrototypeOf$1","iteratorsCore$1","setToStringTag$1","createIteratorConstructor$1","objectSetPrototypeOf$1","defineIterator$1","es_array_iterator$1","arrayMethodIsStrict$1","inheritIfRequired$1","whitespaces$1","whitespaces","stringTrim$1","objectToString$1","regexpFlags$1","regexpStickyHelpers$1","regexpExec$1","isRegexp$1","notARegexp$1","correctIsRegexpLogic$1","error1","error2","stringMultibyte$1","fixRegexpWellKnownSymbolLogic$1","sameValue$1","regexpExecAbstract$1","redefineAll$1","freezing$1","internalMetadata$1","unboundFunction","INTERRUPTED","condition","callFn","anInstance$1","collectionWeak$1","domIterables$1","InternalWeakMap","enforceIternalState","IS_IE11","$WeakMap","collectionWeak","WeakMapPrototype","nativeDelete","nativeHas","nativeGet","nativeSet","arrayForEach$1","objectAssign$1","speciesConstructor$1","advanceStringIndex$1","$trim","forcedStringTrimMethod","nativeUrl$1","getIterator$1","web_urlSearchParams$1","stringRepeat","repeat","nativeToFixed","toFixed","fractionDigits","thisNumberValue","fractDigits","multiply","c2","divide","dataToString","x2","objectToArray$1","$values","objectGetOwnPropertyNamesExternal$1","wellKnownSymbolWrapped$1","addCSS","thumbWidth","getDecimalPlaces","parseFloat","RangeTouch","rangeTouch","userSelect","webKitUserSelect","touchAction","changedTouches","getBoundingClientRect","clientX","disabled","documentElement","nativePromiseConstructor$1","setSpecies$1","engineIsIos$1","engineIsNode","task$2","microtask$1","newPromiseCapability$2","promiseResolve$1","perform$1","NATIVE_REJECTION_EVENT","nativeStartsWith","startsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","events","isEmpty","is$2","KeyboardEvent","TextTrack","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","delay","offsetHeight","browser","isIE","documentMode","isEdge","isWebkit","isIPhone","isIos","getDeep","reduce","_len","sources","targets","child","sibling","_ref","_ref3","_ref4","text","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","toggleHidden","hide","toggleClass","force","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","setFocus","tabFocus","preventScroll","classNames","CHROME_VERSION","range","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","removeEventListener","toggleListener","passive","eventListeners","on","off","once","_this2","onceCallback","triggerEvent","plyr","unbindListeners","_this3","silencePromise","validateRatio","reduceAspectRatio","ratio","_ratio","divider","getDivider","w","h","getAspectRatio","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","getComputedStyle","fullscreen","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","setup","player","speed","onChange","_player$media","currentTime","paused","preload","playbackRate","play","load","cancelRequests","blankVideo","dedupe","replaceAll","toTitleCase","toPascalCase","getHTML","innerHTML","resources","i18n","{seektime}","seekTime","{title}","title","json","responseType","responseText","loadSprite","prefix","hasId","exists","update","useStorage","cached","trunc","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","duration","seekTooltip","tooltip","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","createBadge","badge","menu","createButton","buttonType","toCamelCase","labelPressed","iconPressed","control","button","createRange","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_ref$badge","_ref$checked","checked","aria-checked","flex","children","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","current","getPercentage","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sorting","setCaptionsMenu","_this7","tracks","getTracks","track","toggled","language","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","restore","propertyName","setDownloadUrl","download","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this11","seektime","addProperty","controlPressed","_this$config","safe","parser","buildUrlParams","isYouTube","insertAfter","languages","userLanguage","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","cue","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","Fullscreen","scrollPosition","forceFallback","closest","parentElement","nodeType","trapFocus","scrollX","scrollY","scrollTo","overflow","viewport","hasProperty","cleanupViewport","shiftKey","webkitEnterFullscreen","toggleFallback","requestFullscreen","navigationUI","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","mathSign","loadImage","minWidth","image","Image","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","backgroundImage","backgroundSize","toggleControls","checkLoading","timers","controlsElement","recentTouchSeek","lastSeekTime","migrateStyles","getPropertyValue","removeProperty","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","firstChild","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","executeCallbacks","success","loadFile","numTries","isLegacyIECss","maxTries","numRetries","beforeCallbackFn","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","loadFiles","paths","loadjs","arg1","loadFn","returnPromise","deps","isDefined","factory","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","$2","data-poster","thumbnail_url","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","createDocumentFragment","stripHTML","getPaused","seconds","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","initialized","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","google","ima","destroy","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this12","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","FIND_INDEX","arrayLastIndexOf$1","fitRatio","outer","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","promises","getThumbnail","vttDataString","processedList","thumbnail","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","urlPrefix","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","previewPos","_fitRatio","multiplier","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","Plyr","jQuery","getProviderByUrl","truthy","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","soft","unload","inputIsValid","fauxDuration","realDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","clamp","updateStorage","prev","curr","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline","production","srclang","Sentry","historySupport","currentType","hasInitialType","cite","setSource"],"mappings":"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","file":"demo.min.js","sourcesContent":["typeof navigator === \"object\" && (function () {\n\t'use strict';\n\n\tvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\tfunction createCommonjsModule(fn, module) {\n\t\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n\t}\n\n\tvar check = function (it) {\n\t return it && it.Math == Math && it;\n\t};\n\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar global_1 =\n\t // eslint-disable-next-line no-undef\n\t check(typeof globalThis == 'object' && globalThis) ||\n\t check(typeof window == 'object' && window) ||\n\t check(typeof self == 'object' && self) ||\n\t check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\n\t // eslint-disable-next-line no-new-func\n\t Function('return this')();\n\n\tvar fails = function (exec) {\n\t try {\n\t return !!exec();\n\t } catch (error) {\n\t return true;\n\t }\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar descriptors = !fails(function () {\n\t return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n\t});\n\n\tvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\n\tvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n\t// Nashorn ~ JDK8 bug\n\tvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n\t// `Object.prototype.propertyIsEnumerable` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n\tvar f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n\t var descriptor = getOwnPropertyDescriptor(this, V);\n\t return !!descriptor && descriptor.enumerable;\n\t} : nativePropertyIsEnumerable;\n\n\tvar objectPropertyIsEnumerable = {\n\t\tf: f\n\t};\n\n\tvar createPropertyDescriptor = function (bitmap, value) {\n\t return {\n\t enumerable: !(bitmap & 1),\n\t configurable: !(bitmap & 2),\n\t writable: !(bitmap & 4),\n\t value: value\n\t };\n\t};\n\n\tvar toString = {}.toString;\n\n\tvar classofRaw = function (it) {\n\t return toString.call(it).slice(8, -1);\n\t};\n\n\tvar split = ''.split;\n\n\t// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\tvar indexedObject = fails(function () {\n\t // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n\t // eslint-disable-next-line no-prototype-builtins\n\t return !Object('z').propertyIsEnumerable(0);\n\t}) ? function (it) {\n\t return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n\t} : Object;\n\n\t// `RequireObjectCoercible` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n\tvar requireObjectCoercible = function (it) {\n\t if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n\t return it;\n\t};\n\n\t// toObject with fallback for non-array-like ES3 strings\n\n\n\n\tvar toIndexedObject = function (it) {\n\t return indexedObject(requireObjectCoercible(it));\n\t};\n\n\tvar isObject = function (it) {\n\t return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n\t// `ToPrimitive` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toprimitive\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tvar toPrimitive = function (input, PREFERRED_STRING) {\n\t if (!isObject(input)) return input;\n\t var fn, val;\n\t if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n\t if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\n\tvar has = function (it, key) {\n\t return hasOwnProperty.call(it, key);\n\t};\n\n\tvar document$1 = global_1.document;\n\t// typeof document.createElement is 'object' in old IE\n\tvar EXISTS = isObject(document$1) && isObject(document$1.createElement);\n\n\tvar documentCreateElement = function (it) {\n\t return EXISTS ? document$1.createElement(it) : {};\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar ie8DomDefine = !descriptors && !fails(function () {\n\t return Object.defineProperty(documentCreateElement('div'), 'a', {\n\t get: function () { return 7; }\n\t }).a != 7;\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\tvar f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n\t O = toIndexedObject(O);\n\t P = toPrimitive(P, true);\n\t if (ie8DomDefine) try {\n\t return nativeGetOwnPropertyDescriptor(O, P);\n\t } catch (error) { /* empty */ }\n\t if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n\t};\n\n\tvar objectGetOwnPropertyDescriptor = {\n\t\tf: f$1\n\t};\n\n\tvar anObject = function (it) {\n\t if (!isObject(it)) {\n\t throw TypeError(String(it) + ' is not an object');\n\t } return it;\n\t};\n\n\tvar nativeDefineProperty = Object.defineProperty;\n\n\t// `Object.defineProperty` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperty\n\tvar f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n\t anObject(O);\n\t P = toPrimitive(P, true);\n\t anObject(Attributes);\n\t if (ie8DomDefine) try {\n\t return nativeDefineProperty(O, P, Attributes);\n\t } catch (error) { /* empty */ }\n\t if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n\t if ('value' in Attributes) O[P] = Attributes.value;\n\t return O;\n\t};\n\n\tvar objectDefineProperty = {\n\t\tf: f$2\n\t};\n\n\tvar createNonEnumerableProperty = descriptors ? function (object, key, value) {\n\t return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n\t} : function (object, key, value) {\n\t object[key] = value;\n\t return object;\n\t};\n\n\tvar setGlobal = function (key, value) {\n\t try {\n\t createNonEnumerableProperty(global_1, key, value);\n\t } catch (error) {\n\t global_1[key] = value;\n\t } return value;\n\t};\n\n\tvar SHARED = '__core-js_shared__';\n\tvar store = global_1[SHARED] || setGlobal(SHARED, {});\n\n\tvar sharedStore = store;\n\n\tvar functionToString = Function.toString;\n\n\t// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\n\tif (typeof sharedStore.inspectSource != 'function') {\n\t sharedStore.inspectSource = function (it) {\n\t return functionToString.call(it);\n\t };\n\t}\n\n\tvar inspectSource = sharedStore.inspectSource;\n\n\tvar WeakMap$1 = global_1.WeakMap;\n\n\tvar nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\n\n\tvar isPure = false;\n\n\tvar shared = createCommonjsModule(function (module) {\n\t(module.exports = function (key, value) {\n\t return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\n\t})('versions', []).push({\n\t version: '3.6.5',\n\t mode: 'global',\n\t copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n\t});\n\t});\n\n\tvar id = 0;\n\tvar postfix = Math.random();\n\n\tvar uid = function (key) {\n\t return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n\t};\n\n\tvar keys = shared('keys');\n\n\tvar sharedKey = function (key) {\n\t return keys[key] || (keys[key] = uid(key));\n\t};\n\n\tvar hiddenKeys = {};\n\n\tvar WeakMap$2 = global_1.WeakMap;\n\tvar set, get, has$1;\n\n\tvar enforce = function (it) {\n\t return has$1(it) ? get(it) : set(it, {});\n\t};\n\n\tvar getterFor = function (TYPE) {\n\t return function (it) {\n\t var state;\n\t if (!isObject(it) || (state = get(it)).type !== TYPE) {\n\t throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n\t } return state;\n\t };\n\t};\n\n\tif (nativeWeakMap) {\n\t var store$1 = new WeakMap$2();\n\t var wmget = store$1.get;\n\t var wmhas = store$1.has;\n\t var wmset = store$1.set;\n\t set = function (it, metadata) {\n\t wmset.call(store$1, it, metadata);\n\t return metadata;\n\t };\n\t get = function (it) {\n\t return wmget.call(store$1, it) || {};\n\t };\n\t has$1 = function (it) {\n\t return wmhas.call(store$1, it);\n\t };\n\t} else {\n\t var STATE = sharedKey('state');\n\t hiddenKeys[STATE] = true;\n\t set = function (it, metadata) {\n\t createNonEnumerableProperty(it, STATE, metadata);\n\t return metadata;\n\t };\n\t get = function (it) {\n\t return has(it, STATE) ? it[STATE] : {};\n\t };\n\t has$1 = function (it) {\n\t return has(it, STATE);\n\t };\n\t}\n\n\tvar internalState = {\n\t set: set,\n\t get: get,\n\t has: has$1,\n\t enforce: enforce,\n\t getterFor: getterFor\n\t};\n\n\tvar redefine = createCommonjsModule(function (module) {\n\tvar getInternalState = internalState.get;\n\tvar enforceInternalState = internalState.enforce;\n\tvar TEMPLATE = String(String).split('String');\n\n\t(module.exports = function (O, key, value, options) {\n\t var unsafe = options ? !!options.unsafe : false;\n\t var simple = options ? !!options.enumerable : false;\n\t var noTargetGet = options ? !!options.noTargetGet : false;\n\t if (typeof value == 'function') {\n\t if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);\n\t enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n\t }\n\t if (O === global_1) {\n\t if (simple) O[key] = value;\n\t else setGlobal(key, value);\n\t return;\n\t } else if (!unsafe) {\n\t delete O[key];\n\t } else if (!noTargetGet && O[key]) {\n\t simple = true;\n\t }\n\t if (simple) O[key] = value;\n\t else createNonEnumerableProperty(O, key, value);\n\t// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\t})(Function.prototype, 'toString', function toString() {\n\t return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n\t});\n\t});\n\n\tvar path = global_1;\n\n\tvar aFunction = function (variable) {\n\t return typeof variable == 'function' ? variable : undefined;\n\t};\n\n\tvar getBuiltIn = function (namespace, method) {\n\t return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])\n\t : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n\t};\n\n\tvar ceil = Math.ceil;\n\tvar floor = Math.floor;\n\n\t// `ToInteger` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tointeger\n\tvar toInteger = function (argument) {\n\t return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n\t};\n\n\tvar min = Math.min;\n\n\t// `ToLength` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tolength\n\tvar toLength = function (argument) {\n\t return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n\t};\n\n\tvar max = Math.max;\n\tvar min$1 = Math.min;\n\n\t// Helper for a popular repeating case of the spec:\n\t// Let integer be ? ToInteger(index).\n\t// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\n\tvar toAbsoluteIndex = function (index, length) {\n\t var integer = toInteger(index);\n\t return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n\t};\n\n\t// `Array.prototype.{ indexOf, includes }` methods implementation\n\tvar createMethod = function (IS_INCLUDES) {\n\t return function ($this, el, fromIndex) {\n\t var O = toIndexedObject($this);\n\t var length = toLength(O.length);\n\t var index = toAbsoluteIndex(fromIndex, length);\n\t var value;\n\t // Array#includes uses SameValueZero equality algorithm\n\t // eslint-disable-next-line no-self-compare\n\t if (IS_INCLUDES && el != el) while (length > index) {\n\t value = O[index++];\n\t // eslint-disable-next-line no-self-compare\n\t if (value != value) return true;\n\t // Array#indexOf ignores holes, Array#includes - not\n\t } else for (;length > index; index++) {\n\t if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n\t } return !IS_INCLUDES && -1;\n\t };\n\t};\n\n\tvar arrayIncludes = {\n\t // `Array.prototype.includes` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t includes: createMethod(true),\n\t // `Array.prototype.indexOf` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t indexOf: createMethod(false)\n\t};\n\n\tvar indexOf = arrayIncludes.indexOf;\n\n\n\tvar objectKeysInternal = function (object, names) {\n\t var O = toIndexedObject(object);\n\t var i = 0;\n\t var result = [];\n\t var key;\n\t for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n\t // Don't enum bug & hidden keys\n\t while (names.length > i) if (has(O, key = names[i++])) {\n\t ~indexOf(result, key) || result.push(key);\n\t }\n\t return result;\n\t};\n\n\t// IE8- don't enum bug keys\n\tvar enumBugKeys = [\n\t 'constructor',\n\t 'hasOwnProperty',\n\t 'isPrototypeOf',\n\t 'propertyIsEnumerable',\n\t 'toLocaleString',\n\t 'toString',\n\t 'valueOf'\n\t];\n\n\tvar hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');\n\n\t// `Object.getOwnPropertyNames` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\tvar f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n\t return objectKeysInternal(O, hiddenKeys$1);\n\t};\n\n\tvar objectGetOwnPropertyNames = {\n\t\tf: f$3\n\t};\n\n\tvar f$4 = Object.getOwnPropertySymbols;\n\n\tvar objectGetOwnPropertySymbols = {\n\t\tf: f$4\n\t};\n\n\t// all object keys, includes non-enumerable and symbols\n\tvar ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n\t var keys = objectGetOwnPropertyNames.f(anObject(it));\n\t var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n\t};\n\n\tvar copyConstructorProperties = function (target, source) {\n\t var keys = ownKeys(source);\n\t var defineProperty = objectDefineProperty.f;\n\t var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\t for (var i = 0; i < keys.length; i++) {\n\t var key = keys[i];\n\t if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n\t }\n\t};\n\n\tvar replacement = /#|\\.prototype\\./;\n\n\tvar isForced = function (feature, detection) {\n\t var value = data[normalize(feature)];\n\t return value == POLYFILL ? true\n\t : value == NATIVE ? false\n\t : typeof detection == 'function' ? fails(detection)\n\t : !!detection;\n\t};\n\n\tvar normalize = isForced.normalize = function (string) {\n\t return String(string).replace(replacement, '.').toLowerCase();\n\t};\n\n\tvar data = isForced.data = {};\n\tvar NATIVE = isForced.NATIVE = 'N';\n\tvar POLYFILL = isForced.POLYFILL = 'P';\n\n\tvar isForced_1 = isForced;\n\n\tvar getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n\t/*\n\t options.target - name of the target object\n\t options.global - target is the global object\n\t options.stat - export as static methods of target\n\t options.proto - export as prototype methods of target\n\t options.real - real prototype method for the `pure` version\n\t options.forced - export even if the native feature is available\n\t options.bind - bind methods to the target, required for the `pure` version\n\t options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n\t options.unsafe - use the simple assignment of property instead of delete + defineProperty\n\t options.sham - add a flag to not completely full polyfills\n\t options.enumerable - export as enumerable property\n\t options.noTargetGet - prevent calling a getter on target\n\t*/\n\tvar _export = function (options, source) {\n\t var TARGET = options.target;\n\t var GLOBAL = options.global;\n\t var STATIC = options.stat;\n\t var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n\t if (GLOBAL) {\n\t target = global_1;\n\t } else if (STATIC) {\n\t target = global_1[TARGET] || setGlobal(TARGET, {});\n\t } else {\n\t target = (global_1[TARGET] || {}).prototype;\n\t }\n\t if (target) for (key in source) {\n\t sourceProperty = source[key];\n\t if (options.noTargetGet) {\n\t descriptor = getOwnPropertyDescriptor$1(target, key);\n\t targetProperty = descriptor && descriptor.value;\n\t } else targetProperty = target[key];\n\t FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n\t // contained in target\n\t if (!FORCED && targetProperty !== undefined) {\n\t if (typeof sourceProperty === typeof targetProperty) continue;\n\t copyConstructorProperties(sourceProperty, targetProperty);\n\t }\n\t // add a flag to not completely full polyfills\n\t if (options.sham || (targetProperty && targetProperty.sham)) {\n\t createNonEnumerableProperty(sourceProperty, 'sham', true);\n\t }\n\t // extend global\n\t redefine(target, key, sourceProperty, options);\n\t }\n\t};\n\n\tvar aFunction$1 = function (it) {\n\t if (typeof it != 'function') {\n\t throw TypeError(String(it) + ' is not a function');\n\t } return it;\n\t};\n\n\t// optional / simple context binding\n\tvar functionBindContext = function (fn, that, length) {\n\t aFunction$1(fn);\n\t if (that === undefined) return fn;\n\t switch (length) {\n\t case 0: return function () {\n\t return fn.call(that);\n\t };\n\t case 1: return function (a) {\n\t return fn.call(that, a);\n\t };\n\t case 2: return function (a, b) {\n\t return fn.call(that, a, b);\n\t };\n\t case 3: return function (a, b, c) {\n\t return fn.call(that, a, b, c);\n\t };\n\t }\n\t return function (/* ...args */) {\n\t return fn.apply(that, arguments);\n\t };\n\t};\n\n\t// `ToObject` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toobject\n\tvar toObject = function (argument) {\n\t return Object(requireObjectCoercible(argument));\n\t};\n\n\t// `IsArray` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isarray\n\tvar isArray = Array.isArray || function isArray(arg) {\n\t return classofRaw(arg) == 'Array';\n\t};\n\n\tvar nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n\t // Chrome 38 Symbol has incorrect toString conversion\n\t // eslint-disable-next-line no-undef\n\t return !String(Symbol());\n\t});\n\n\tvar useSymbolAsUid = nativeSymbol\n\t // eslint-disable-next-line no-undef\n\t && !Symbol.sham\n\t // eslint-disable-next-line no-undef\n\t && typeof Symbol.iterator == 'symbol';\n\n\tvar WellKnownSymbolsStore = shared('wks');\n\tvar Symbol$1 = global_1.Symbol;\n\tvar createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\n\n\tvar wellKnownSymbol = function (name) {\n\t if (!has(WellKnownSymbolsStore, name)) {\n\t if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name];\n\t else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n\t } return WellKnownSymbolsStore[name];\n\t};\n\n\tvar SPECIES = wellKnownSymbol('species');\n\n\t// `ArraySpeciesCreate` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n\tvar arraySpeciesCreate = function (originalArray, length) {\n\t var C;\n\t if (isArray(originalArray)) {\n\t C = originalArray.constructor;\n\t // cross-realm fallback\n\t if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n\t else if (isObject(C)) {\n\t C = C[SPECIES];\n\t if (C === null) C = undefined;\n\t }\n\t } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n\t};\n\n\tvar push = [].push;\n\n\t// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n\tvar createMethod$1 = function (TYPE) {\n\t var IS_MAP = TYPE == 1;\n\t var IS_FILTER = TYPE == 2;\n\t var IS_SOME = TYPE == 3;\n\t var IS_EVERY = TYPE == 4;\n\t var IS_FIND_INDEX = TYPE == 6;\n\t var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n\t return function ($this, callbackfn, that, specificCreate) {\n\t var O = toObject($this);\n\t var self = indexedObject(O);\n\t var boundFunction = functionBindContext(callbackfn, that, 3);\n\t var length = toLength(self.length);\n\t var index = 0;\n\t var create = specificCreate || arraySpeciesCreate;\n\t var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n\t var value, result;\n\t for (;length > index; index++) if (NO_HOLES || index in self) {\n\t value = self[index];\n\t result = boundFunction(value, index, O);\n\t if (TYPE) {\n\t if (IS_MAP) target[index] = result; // map\n\t else if (result) switch (TYPE) {\n\t case 3: return true; // some\n\t case 5: return value; // find\n\t case 6: return index; // findIndex\n\t case 2: push.call(target, value); // filter\n\t } else if (IS_EVERY) return false; // every\n\t }\n\t }\n\t return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n\t };\n\t};\n\n\tvar arrayIteration = {\n\t // `Array.prototype.forEach` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t forEach: createMethod$1(0),\n\t // `Array.prototype.map` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t map: createMethod$1(1),\n\t // `Array.prototype.filter` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t filter: createMethod$1(2),\n\t // `Array.prototype.some` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t some: createMethod$1(3),\n\t // `Array.prototype.every` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.every\n\t every: createMethod$1(4),\n\t // `Array.prototype.find` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t find: createMethod$1(5),\n\t // `Array.prototype.findIndex` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n\t findIndex: createMethod$1(6)\n\t};\n\n\tvar arrayMethodIsStrict = function (METHOD_NAME, argument) {\n\t var method = [][METHOD_NAME];\n\t return !!method && fails(function () {\n\t // eslint-disable-next-line no-useless-call,no-throw-literal\n\t method.call(null, argument || function () { throw 1; }, 1);\n\t });\n\t};\n\n\tvar defineProperty = Object.defineProperty;\n\tvar cache = {};\n\n\tvar thrower = function (it) { throw it; };\n\n\tvar arrayMethodUsesToLength = function (METHOD_NAME, options) {\n\t if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n\t if (!options) options = {};\n\t var method = [][METHOD_NAME];\n\t var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n\t var argument0 = has(options, 0) ? options[0] : thrower;\n\t var argument1 = has(options, 1) ? options[1] : undefined;\n\n\t return cache[METHOD_NAME] = !!method && !fails(function () {\n\t if (ACCESSORS && !descriptors) return true;\n\t var O = { length: -1 };\n\n\t if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n\t else O[1] = 1;\n\n\t method.call(O, argument0, argument1);\n\t });\n\t};\n\n\tvar $forEach = arrayIteration.forEach;\n\n\n\n\tvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\tvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n\t// `Array.prototype.forEach` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\tvar arrayForEach = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n\t return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t} : [].forEach;\n\n\t// `Array.prototype.forEach` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t_export({ target: 'Array', proto: true, forced: [].forEach != arrayForEach }, {\n\t forEach: arrayForEach\n\t});\n\n\t// call something on iterator step with safe closing on error\n\tvar callWithSafeIterationClosing = function (iterator, fn, value, ENTRIES) {\n\t try {\n\t return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n\t // 7.4.6 IteratorClose(iterator, completion)\n\t } catch (error) {\n\t var returnMethod = iterator['return'];\n\t if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n\t throw error;\n\t }\n\t};\n\n\tvar iterators = {};\n\n\tvar ITERATOR = wellKnownSymbol('iterator');\n\tvar ArrayPrototype = Array.prototype;\n\n\t// check on default Array iterator\n\tvar isArrayIteratorMethod = function (it) {\n\t return it !== undefined && (iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n\t};\n\n\tvar createProperty = function (object, key, value) {\n\t var propertyKey = toPrimitive(key);\n\t if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\n\t else object[propertyKey] = value;\n\t};\n\n\tvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\tvar test = {};\n\n\ttest[TO_STRING_TAG] = 'z';\n\n\tvar toStringTagSupport = String(test) === '[object z]';\n\n\tvar TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\n\t// ES3 wrong here\n\tvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n\t// fallback for IE11 Script Access Denied error\n\tvar tryGet = function (it, key) {\n\t try {\n\t return it[key];\n\t } catch (error) { /* empty */ }\n\t};\n\n\t// getting tag from ES6+ `Object.prototype.toString`\n\tvar classof = toStringTagSupport ? classofRaw : function (it) {\n\t var O, tag, result;\n\t return it === undefined ? 'Undefined' : it === null ? 'Null'\n\t // @@toStringTag case\n\t : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$1)) == 'string' ? tag\n\t // builtinTag case\n\t : CORRECT_ARGUMENTS ? classofRaw(O)\n\t // ES3 arguments fallback\n\t : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n\t};\n\n\tvar ITERATOR$1 = wellKnownSymbol('iterator');\n\n\tvar getIteratorMethod = function (it) {\n\t if (it != undefined) return it[ITERATOR$1]\n\t || it['@@iterator']\n\t || iterators[classof(it)];\n\t};\n\n\t// `Array.from` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\tvar arrayFrom = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n\t var O = toObject(arrayLike);\n\t var C = typeof this == 'function' ? this : Array;\n\t var argumentsLength = arguments.length;\n\t var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n\t var mapping = mapfn !== undefined;\n\t var iteratorMethod = getIteratorMethod(O);\n\t var index = 0;\n\t var length, result, step, iterator, next, value;\n\t if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n\t // if the target is not iterable or it's an array with the default iterator - use a simple case\n\t if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n\t iterator = iteratorMethod.call(O);\n\t next = iterator.next;\n\t result = new C();\n\t for (;!(step = next.call(iterator)).done; index++) {\n\t value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n\t createProperty(result, index, value);\n\t }\n\t } else {\n\t length = toLength(O.length);\n\t result = new C(length);\n\t for (;length > index; index++) {\n\t value = mapping ? mapfn(O[index], index) : O[index];\n\t createProperty(result, index, value);\n\t }\n\t }\n\t result.length = index;\n\t return result;\n\t};\n\n\tvar ITERATOR$2 = wellKnownSymbol('iterator');\n\tvar SAFE_CLOSING = false;\n\n\ttry {\n\t var called = 0;\n\t var iteratorWithReturn = {\n\t next: function () {\n\t return { done: !!called++ };\n\t },\n\t 'return': function () {\n\t SAFE_CLOSING = true;\n\t }\n\t };\n\t iteratorWithReturn[ITERATOR$2] = function () {\n\t return this;\n\t };\n\t // eslint-disable-next-line no-throw-literal\n\t Array.from(iteratorWithReturn, function () { throw 2; });\n\t} catch (error) { /* empty */ }\n\n\tvar checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) {\n\t if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n\t var ITERATION_SUPPORT = false;\n\t try {\n\t var object = {};\n\t object[ITERATOR$2] = function () {\n\t return {\n\t next: function () {\n\t return { done: ITERATION_SUPPORT = true };\n\t }\n\t };\n\t };\n\t exec(object);\n\t } catch (error) { /* empty */ }\n\t return ITERATION_SUPPORT;\n\t};\n\n\tvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n\t Array.from(iterable);\n\t});\n\n\t// `Array.from` method\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\t_export({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n\t from: arrayFrom\n\t});\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\tvar objectKeys = Object.keys || function keys(O) {\n\t return objectKeysInternal(O, enumBugKeys);\n\t};\n\n\t// `Object.defineProperties` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperties\n\tvar objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n\t anObject(O);\n\t var keys = objectKeys(Properties);\n\t var length = keys.length;\n\t var index = 0;\n\t var key;\n\t while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\n\t return O;\n\t};\n\n\tvar html = getBuiltIn('document', 'documentElement');\n\n\tvar GT = '>';\n\tvar LT = '<';\n\tvar PROTOTYPE = 'prototype';\n\tvar SCRIPT = 'script';\n\tvar IE_PROTO = sharedKey('IE_PROTO');\n\n\tvar EmptyConstructor = function () { /* empty */ };\n\n\tvar scriptTag = function (content) {\n\t return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n\t};\n\n\t// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\n\tvar NullProtoObjectViaActiveX = function (activeXDocument) {\n\t activeXDocument.write(scriptTag(''));\n\t activeXDocument.close();\n\t var temp = activeXDocument.parentWindow.Object;\n\t activeXDocument = null; // avoid memory leak\n\t return temp;\n\t};\n\n\t// Create object with fake `null` prototype: use iframe Object with cleared prototype\n\tvar NullProtoObjectViaIFrame = function () {\n\t // Thrash, waste and sodomy: IE GC bug\n\t var iframe = documentCreateElement('iframe');\n\t var JS = 'java' + SCRIPT + ':';\n\t var iframeDocument;\n\t iframe.style.display = 'none';\n\t html.appendChild(iframe);\n\t // https://github.com/zloirock/core-js/issues/475\n\t iframe.src = String(JS);\n\t iframeDocument = iframe.contentWindow.document;\n\t iframeDocument.open();\n\t iframeDocument.write(scriptTag('document.F=Object'));\n\t iframeDocument.close();\n\t return iframeDocument.F;\n\t};\n\n\t// Check for document.domain and active x support\n\t// No need to use active x approach when document.domain is not set\n\t// see https://github.com/es-shims/es5-shim/issues/150\n\t// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n\t// avoid IE GC bug\n\tvar activeXDocument;\n\tvar NullProtoObject = function () {\n\t try {\n\t /* global ActiveXObject */\n\t activeXDocument = document.domain && new ActiveXObject('htmlfile');\n\t } catch (error) { /* ignore */ }\n\t NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n\t var length = enumBugKeys.length;\n\t while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n\t return NullProtoObject();\n\t};\n\n\thiddenKeys[IE_PROTO] = true;\n\n\t// `Object.create` method\n\t// https://tc39.github.io/ecma262/#sec-object.create\n\tvar objectCreate = Object.create || function create(O, Properties) {\n\t var result;\n\t if (O !== null) {\n\t EmptyConstructor[PROTOTYPE] = anObject(O);\n\t result = new EmptyConstructor();\n\t EmptyConstructor[PROTOTYPE] = null;\n\t // add \"__proto__\" for Object.getPrototypeOf polyfill\n\t result[IE_PROTO] = O;\n\t } else result = NullProtoObject();\n\t return Properties === undefined ? result : objectDefineProperties(result, Properties);\n\t};\n\n\tvar UNSCOPABLES = wellKnownSymbol('unscopables');\n\tvar ArrayPrototype$1 = Array.prototype;\n\n\t// Array.prototype[@@unscopables]\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\tif (ArrayPrototype$1[UNSCOPABLES] == undefined) {\n\t objectDefineProperty.f(ArrayPrototype$1, UNSCOPABLES, {\n\t configurable: true,\n\t value: objectCreate(null)\n\t });\n\t}\n\n\t// add a key to Array.prototype[@@unscopables]\n\tvar addToUnscopables = function (key) {\n\t ArrayPrototype$1[UNSCOPABLES][key] = true;\n\t};\n\n\tvar $includes = arrayIncludes.includes;\n\n\n\n\tvar USES_TO_LENGTH$1 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n\t// `Array.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t_export({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$1 }, {\n\t includes: function includes(el /* , fromIndex = 0 */) {\n\t return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables('includes');\n\n\tvar engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\n\n\tvar process$1 = global_1.process;\n\tvar versions = process$1 && process$1.versions;\n\tvar v8 = versions && versions.v8;\n\tvar match, version;\n\n\tif (v8) {\n\t match = v8.split('.');\n\t version = match[0] + match[1];\n\t} else if (engineUserAgent) {\n\t match = engineUserAgent.match(/Edge\\/(\\d+)/);\n\t if (!match || match[1] >= 74) {\n\t match = engineUserAgent.match(/Chrome\\/(\\d+)/);\n\t if (match) version = match[1];\n\t }\n\t}\n\n\tvar engineV8Version = version && +version;\n\n\tvar SPECIES$1 = wellKnownSymbol('species');\n\n\tvar arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\n\t // We can't use this feature detection in V8 since it causes\n\t // deoptimization and serious performance degradation\n\t // https://github.com/zloirock/core-js/issues/677\n\t return engineV8Version >= 51 || !fails(function () {\n\t var array = [];\n\t var constructor = array.constructor = {};\n\t constructor[SPECIES$1] = function () {\n\t return { foo: 1 };\n\t };\n\t return array[METHOD_NAME](Boolean).foo !== 1;\n\t });\n\t};\n\n\tvar $map = arrayIteration.map;\n\n\n\n\tvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\t// FF49- issue\n\tvar USES_TO_LENGTH$2 = arrayMethodUsesToLength('map');\n\n\t// `Array.prototype.map` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t// with adding support of @@species\n\t_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$2 }, {\n\t map: function map(callbackfn /* , thisArg */) {\n\t return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tvar FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); });\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\t_export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n\t keys: function keys(it) {\n\t return objectKeys(toObject(it));\n\t }\n\t});\n\n\tvar aPossiblePrototype = function (it) {\n\t if (!isObject(it) && it !== null) {\n\t throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n\t } return it;\n\t};\n\n\t// `Object.setPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n\t// Works with __proto__ only. Old v8 can't work with null proto objects.\n\t/* eslint-disable no-proto */\n\tvar objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n\t var CORRECT_SETTER = false;\n\t var test = {};\n\t var setter;\n\t try {\n\t setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n\t setter.call(test, []);\n\t CORRECT_SETTER = test instanceof Array;\n\t } catch (error) { /* empty */ }\n\t return function setPrototypeOf(O, proto) {\n\t anObject(O);\n\t aPossiblePrototype(proto);\n\t if (CORRECT_SETTER) setter.call(O, proto);\n\t else O.__proto__ = proto;\n\t return O;\n\t };\n\t}() : undefined);\n\n\t// makes subclassing work correct for wrapped built-ins\n\tvar inheritIfRequired = function ($this, dummy, Wrapper) {\n\t var NewTarget, NewTargetPrototype;\n\t if (\n\t // it can work only with native `setPrototypeOf`\n\t objectSetPrototypeOf &&\n\t // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n\t typeof (NewTarget = dummy.constructor) == 'function' &&\n\t NewTarget !== Wrapper &&\n\t isObject(NewTargetPrototype = NewTarget.prototype) &&\n\t NewTargetPrototype !== Wrapper.prototype\n\t ) objectSetPrototypeOf($this, NewTargetPrototype);\n\t return $this;\n\t};\n\n\tvar MATCH = wellKnownSymbol('match');\n\n\t// `IsRegExp` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isregexp\n\tvar isRegexp = function (it) {\n\t var isRegExp;\n\t return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\n\t};\n\n\t// `RegExp.prototype.flags` getter implementation\n\t// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n\tvar regexpFlags = function () {\n\t var that = anObject(this);\n\t var result = '';\n\t if (that.global) result += 'g';\n\t if (that.ignoreCase) result += 'i';\n\t if (that.multiline) result += 'm';\n\t if (that.dotAll) result += 's';\n\t if (that.unicode) result += 'u';\n\t if (that.sticky) result += 'y';\n\t return result;\n\t};\n\n\t// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n\t// so we use an intermediate function.\n\tfunction RE(s, f) {\n\t return RegExp(s, f);\n\t}\n\n\tvar UNSUPPORTED_Y = fails(function () {\n\t // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n\t var re = RE('a', 'y');\n\t re.lastIndex = 2;\n\t return re.exec('abcd') != null;\n\t});\n\n\tvar BROKEN_CARET = fails(function () {\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n\t var re = RE('^r', 'gy');\n\t re.lastIndex = 2;\n\t return re.exec('str') != null;\n\t});\n\n\tvar regexpStickyHelpers = {\n\t\tUNSUPPORTED_Y: UNSUPPORTED_Y,\n\t\tBROKEN_CARET: BROKEN_CARET\n\t};\n\n\tvar SPECIES$2 = wellKnownSymbol('species');\n\n\tvar setSpecies = function (CONSTRUCTOR_NAME) {\n\t var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\t var defineProperty = objectDefineProperty.f;\n\n\t if (descriptors && Constructor && !Constructor[SPECIES$2]) {\n\t defineProperty(Constructor, SPECIES$2, {\n\t configurable: true,\n\t get: function () { return this; }\n\t });\n\t }\n\t};\n\n\tvar defineProperty$1 = objectDefineProperty.f;\n\tvar getOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n\n\n\n\n\tvar setInternalState = internalState.set;\n\n\n\n\tvar MATCH$1 = wellKnownSymbol('match');\n\tvar NativeRegExp = global_1.RegExp;\n\tvar RegExpPrototype = NativeRegExp.prototype;\n\tvar re1 = /a/g;\n\tvar re2 = /a/g;\n\n\t// \"new\" should create a new object, old webkit bug\n\tvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\n\tvar UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y;\n\n\tvar FORCED = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$1 || fails(function () {\n\t re2[MATCH$1] = false;\n\t // RegExp constructor can alter flags and IsRegExp works correct with @@match\n\t return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n\t})));\n\n\t// `RegExp` constructor\n\t// https://tc39.github.io/ecma262/#sec-regexp-constructor\n\tif (FORCED) {\n\t var RegExpWrapper = function RegExp(pattern, flags) {\n\t var thisIsRegExp = this instanceof RegExpWrapper;\n\t var patternIsRegExp = isRegexp(pattern);\n\t var flagsAreUndefined = flags === undefined;\n\t var sticky;\n\n\t if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n\t return pattern;\n\t }\n\n\t if (CORRECT_NEW) {\n\t if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n\t } else if (pattern instanceof RegExpWrapper) {\n\t if (flagsAreUndefined) flags = regexpFlags.call(pattern);\n\t pattern = pattern.source;\n\t }\n\n\t if (UNSUPPORTED_Y$1) {\n\t sticky = !!flags && flags.indexOf('y') > -1;\n\t if (sticky) flags = flags.replace(/y/g, '');\n\t }\n\n\t var result = inheritIfRequired(\n\t CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n\t thisIsRegExp ? this : RegExpPrototype,\n\t RegExpWrapper\n\t );\n\n\t if (UNSUPPORTED_Y$1 && sticky) setInternalState(result, { sticky: sticky });\n\n\t return result;\n\t };\n\t var proxy = function (key) {\n\t key in RegExpWrapper || defineProperty$1(RegExpWrapper, key, {\n\t configurable: true,\n\t get: function () { return NativeRegExp[key]; },\n\t set: function (it) { NativeRegExp[key] = it; }\n\t });\n\t };\n\t var keys$1 = getOwnPropertyNames(NativeRegExp);\n\t var index = 0;\n\t while (keys$1.length > index) proxy(keys$1[index++]);\n\t RegExpPrototype.constructor = RegExpWrapper;\n\t RegExpWrapper.prototype = RegExpPrototype;\n\t redefine(global_1, 'RegExp', RegExpWrapper);\n\t}\n\n\t// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\n\tsetSpecies('RegExp');\n\n\tvar nativeExec = RegExp.prototype.exec;\n\t// This always refers to the native implementation, because the\n\t// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n\t// which loads this file before patching the method.\n\tvar nativeReplace = String.prototype.replace;\n\n\tvar patchedExec = nativeExec;\n\n\tvar UPDATES_LAST_INDEX_WRONG = (function () {\n\t var re1 = /a/;\n\t var re2 = /b*/g;\n\t nativeExec.call(re1, 'a');\n\t nativeExec.call(re2, 'a');\n\t return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n\t})();\n\n\tvar UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\n\n\t// nonparticipating capturing group, copied from es5-shim's String#split patch.\n\tvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\n\tvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$2;\n\n\tif (PATCH) {\n\t patchedExec = function exec(str) {\n\t var re = this;\n\t var lastIndex, reCopy, match, i;\n\t var sticky = UNSUPPORTED_Y$2 && re.sticky;\n\t var flags = regexpFlags.call(re);\n\t var source = re.source;\n\t var charsAdded = 0;\n\t var strCopy = str;\n\n\t if (sticky) {\n\t flags = flags.replace('y', '');\n\t if (flags.indexOf('g') === -1) {\n\t flags += 'g';\n\t }\n\n\t strCopy = String(str).slice(re.lastIndex);\n\t // Support anchored sticky behavior.\n\t if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n\t source = '(?: ' + source + ')';\n\t strCopy = ' ' + strCopy;\n\t charsAdded++;\n\t }\n\t // ^(? + rx + ) is needed, in combination with some str slicing, to\n\t // simulate the 'y' flag.\n\t reCopy = new RegExp('^(?:' + source + ')', flags);\n\t }\n\n\t if (NPCG_INCLUDED) {\n\t reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n\t }\n\t if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n\t match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n\t if (sticky) {\n\t if (match) {\n\t match.input = match.input.slice(charsAdded);\n\t match[0] = match[0].slice(charsAdded);\n\t match.index = re.lastIndex;\n\t re.lastIndex += match[0].length;\n\t } else re.lastIndex = 0;\n\t } else if (UPDATES_LAST_INDEX_WRONG && match) {\n\t re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n\t }\n\t if (NPCG_INCLUDED && match && match.length > 1) {\n\t // Fix browsers whose `exec` methods don't consistently return `undefined`\n\t // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n\t nativeReplace.call(match[0], reCopy, function () {\n\t for (i = 1; i < arguments.length - 2; i++) {\n\t if (arguments[i] === undefined) match[i] = undefined;\n\t }\n\t });\n\t }\n\n\t return match;\n\t };\n\t}\n\n\tvar regexpExec = patchedExec;\n\n\t_export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\n\t exec: regexpExec\n\t});\n\n\tvar TO_STRING = 'toString';\n\tvar RegExpPrototype$1 = RegExp.prototype;\n\tvar nativeToString = RegExpPrototype$1[TO_STRING];\n\n\tvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n\t// FF44- RegExp#toString has a wrong name\n\tvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n\t// `RegExp.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\n\tif (NOT_GENERIC || INCORRECT_NAME) {\n\t redefine(RegExp.prototype, TO_STRING, function toString() {\n\t var R = anObject(this);\n\t var p = String(R.source);\n\t var rf = R.flags;\n\t var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype$1) ? regexpFlags.call(R) : rf);\n\t return '/' + p + '/' + f;\n\t }, { unsafe: true });\n\t}\n\n\tvar notARegexp = function (it) {\n\t if (isRegexp(it)) {\n\t throw TypeError(\"The method doesn't accept regular expressions\");\n\t } return it;\n\t};\n\n\tvar MATCH$2 = wellKnownSymbol('match');\n\n\tvar correctIsRegexpLogic = function (METHOD_NAME) {\n\t var regexp = /./;\n\t try {\n\t '/./'[METHOD_NAME](regexp);\n\t } catch (e) {\n\t try {\n\t regexp[MATCH$2] = false;\n\t return '/./'[METHOD_NAME](regexp);\n\t } catch (f) { /* empty */ }\n\t } return false;\n\t};\n\n\t// `String.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n\t_export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\n\t includes: function includes(searchString /* , position = 0 */) {\n\t return !!~String(requireObjectCoercible(this))\n\t .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// `String.prototype.{ codePointAt, at }` methods implementation\n\tvar createMethod$2 = function (CONVERT_TO_STRING) {\n\t return function ($this, pos) {\n\t var S = String(requireObjectCoercible($this));\n\t var position = toInteger(pos);\n\t var size = S.length;\n\t var first, second;\n\t if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n\t first = S.charCodeAt(position);\n\t return first < 0xD800 || first > 0xDBFF || position + 1 === size\n\t || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n\t ? CONVERT_TO_STRING ? S.charAt(position) : first\n\t : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n\t };\n\t};\n\n\tvar stringMultibyte = {\n\t // `String.prototype.codePointAt` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n\t codeAt: createMethod$2(false),\n\t // `String.prototype.at` method\n\t // https://github.com/mathiasbynens/String.prototype.at\n\t charAt: createMethod$2(true)\n\t};\n\n\tvar correctPrototypeGetter = !fails(function () {\n\t function F() { /* empty */ }\n\t F.prototype.constructor = null;\n\t return Object.getPrototypeOf(new F()) !== F.prototype;\n\t});\n\n\tvar IE_PROTO$1 = sharedKey('IE_PROTO');\n\tvar ObjectPrototype = Object.prototype;\n\n\t// `Object.getPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.getprototypeof\n\tvar objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {\n\t O = toObject(O);\n\t if (has(O, IE_PROTO$1)) return O[IE_PROTO$1];\n\t if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n\t return O.constructor.prototype;\n\t } return O instanceof Object ? ObjectPrototype : null;\n\t};\n\n\tvar ITERATOR$3 = wellKnownSymbol('iterator');\n\tvar BUGGY_SAFARI_ITERATORS = false;\n\n\tvar returnThis = function () { return this; };\n\n\t// `%IteratorPrototype%` object\n\t// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\n\tvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n\tif ([].keys) {\n\t arrayIterator = [].keys();\n\t // Safari 8 has buggy iterators w/o `next`\n\t if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n\t else {\n\t PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));\n\t if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n\t }\n\t}\n\n\tif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n\t// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\tif ( !has(IteratorPrototype, ITERATOR$3)) {\n\t createNonEnumerableProperty(IteratorPrototype, ITERATOR$3, returnThis);\n\t}\n\n\tvar iteratorsCore = {\n\t IteratorPrototype: IteratorPrototype,\n\t BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n\t};\n\n\tvar defineProperty$2 = objectDefineProperty.f;\n\n\n\n\tvar TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');\n\n\tvar setToStringTag = function (it, TAG, STATIC) {\n\t if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG$2)) {\n\t defineProperty$2(it, TO_STRING_TAG$2, { configurable: true, value: TAG });\n\t }\n\t};\n\n\tvar IteratorPrototype$1 = iteratorsCore.IteratorPrototype;\n\n\n\n\n\n\tvar returnThis$1 = function () { return this; };\n\n\tvar createIteratorConstructor = function (IteratorConstructor, NAME, next) {\n\t var TO_STRING_TAG = NAME + ' Iterator';\n\t IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });\n\t setToStringTag(IteratorConstructor, TO_STRING_TAG, false);\n\t iterators[TO_STRING_TAG] = returnThis$1;\n\t return IteratorConstructor;\n\t};\n\n\tvar IteratorPrototype$2 = iteratorsCore.IteratorPrototype;\n\tvar BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\n\tvar ITERATOR$4 = wellKnownSymbol('iterator');\n\tvar KEYS = 'keys';\n\tvar VALUES = 'values';\n\tvar ENTRIES = 'entries';\n\n\tvar returnThis$2 = function () { return this; };\n\n\tvar defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n\t createIteratorConstructor(IteratorConstructor, NAME, next);\n\n\t var getIterationMethod = function (KIND) {\n\t if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n\t if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];\n\t switch (KIND) {\n\t case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n\t case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n\t case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n\t } return function () { return new IteratorConstructor(this); };\n\t };\n\n\t var TO_STRING_TAG = NAME + ' Iterator';\n\t var INCORRECT_VALUES_NAME = false;\n\t var IterablePrototype = Iterable.prototype;\n\t var nativeIterator = IterablePrototype[ITERATOR$4]\n\t || IterablePrototype['@@iterator']\n\t || DEFAULT && IterablePrototype[DEFAULT];\n\t var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);\n\t var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n\t var CurrentIteratorPrototype, methods, KEY;\n\n\t // fix native\n\t if (anyNativeIterator) {\n\t CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));\n\t if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {\n\t if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {\n\t if (objectSetPrototypeOf) {\n\t objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);\n\t } else if (typeof CurrentIteratorPrototype[ITERATOR$4] != 'function') {\n\t createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$4, returnThis$2);\n\t }\n\t }\n\t // Set @@toStringTag to native iterators\n\t setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);\n\t }\n\t }\n\n\t // fix Array#{values, @@iterator}.name in V8 / FF\n\t if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n\t INCORRECT_VALUES_NAME = true;\n\t defaultIterator = function values() { return nativeIterator.call(this); };\n\t }\n\n\t // define iterator\n\t if ( IterablePrototype[ITERATOR$4] !== defaultIterator) {\n\t createNonEnumerableProperty(IterablePrototype, ITERATOR$4, defaultIterator);\n\t }\n\t iterators[NAME] = defaultIterator;\n\n\t // export additional methods\n\t if (DEFAULT) {\n\t methods = {\n\t values: getIterationMethod(VALUES),\n\t keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n\t entries: getIterationMethod(ENTRIES)\n\t };\n\t if (FORCED) for (KEY in methods) {\n\t if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n\t redefine(IterablePrototype, KEY, methods[KEY]);\n\t }\n\t } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods);\n\t }\n\n\t return methods;\n\t};\n\n\tvar charAt = stringMultibyte.charAt;\n\n\n\n\tvar STRING_ITERATOR = 'String Iterator';\n\tvar setInternalState$1 = internalState.set;\n\tvar getInternalState = internalState.getterFor(STRING_ITERATOR);\n\n\t// `String.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\n\tdefineIterator(String, 'String', function (iterated) {\n\t setInternalState$1(this, {\n\t type: STRING_ITERATOR,\n\t string: String(iterated),\n\t index: 0\n\t });\n\t// `%StringIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n\t}, function next() {\n\t var state = getInternalState(this);\n\t var string = state.string;\n\t var index = state.index;\n\t var point;\n\t if (index >= string.length) return { value: undefined, done: true };\n\t point = charAt(string, index);\n\t state.index += point.length;\n\t return { value: point, done: false };\n\t});\n\n\t// iterable DOM collections\n\t// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\n\tvar domIterables = {\n\t CSSRuleList: 0,\n\t CSSStyleDeclaration: 0,\n\t CSSValueList: 0,\n\t ClientRectList: 0,\n\t DOMRectList: 0,\n\t DOMStringList: 0,\n\t DOMTokenList: 1,\n\t DataTransferItemList: 0,\n\t FileList: 0,\n\t HTMLAllCollection: 0,\n\t HTMLCollection: 0,\n\t HTMLFormElement: 0,\n\t HTMLSelectElement: 0,\n\t MediaList: 0,\n\t MimeTypeArray: 0,\n\t NamedNodeMap: 0,\n\t NodeList: 1,\n\t PaintRequestList: 0,\n\t Plugin: 0,\n\t PluginArray: 0,\n\t SVGLengthList: 0,\n\t SVGNumberList: 0,\n\t SVGPathSegList: 0,\n\t SVGPointList: 0,\n\t SVGStringList: 0,\n\t SVGTransformList: 0,\n\t SourceBufferList: 0,\n\t StyleSheetList: 0,\n\t TextTrackCueList: 0,\n\t TextTrackList: 0,\n\t TouchList: 0\n\t};\n\n\tfor (var COLLECTION_NAME in domIterables) {\n\t var Collection = global_1[COLLECTION_NAME];\n\t var CollectionPrototype = Collection && Collection.prototype;\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {\n\t createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach);\n\t } catch (error) {\n\t CollectionPrototype.forEach = arrayForEach;\n\t }\n\t}\n\n\t// Setup tab focus\n\tvar container = document.getElementById('container');\n\tvar tabClassName = 'tab-focus'; // Remove class on blur\n\n\tdocument.addEventListener('focusout', function (event) {\n\t if (!event.target.classList || container.contains(event.target)) {\n\t return;\n\t }\n\n\t event.target.classList.remove(tabClassName);\n\t}); // Add classname to tabbed elements\n\n\tdocument.addEventListener('keydown', function (event) {\n\t if (event.keyCode !== 9) {\n\t return;\n\t } // Delay the adding of classname until the focus has changed\n\t // This event fires before the focusin event\n\n\n\t setTimeout(function () {\n\t var focused = document.activeElement;\n\n\t if (!focused || !focused.classList || container.contains(focused)) {\n\t return;\n\t }\n\n\t focused.classList.add(tabClassName);\n\t }, 10);\n\t});\n\n\t// Polyfill for creating CustomEvents on IE9/10/11\n\t// code pulled from:\n\t// https://github.com/d4tocchini/customevent-polyfill\n\t// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\t(function () {\n\t if (typeof window === 'undefined') {\n\t return;\n\t }\n\n\t try {\n\t var ce = new window.CustomEvent('test', {\n\t cancelable: true\n\t });\n\t ce.preventDefault();\n\n\t if (ce.defaultPrevented !== true) {\n\t // IE has problems with .preventDefault() on custom events\n\t // http://stackoverflow.com/questions/23349191\n\t throw new Error('Could not prevent default');\n\t }\n\t } catch (e) {\n\t var CustomEvent = function CustomEvent(event, params) {\n\t var evt, origPrevent;\n\t params = params || {};\n\t params.bubbles = !!params.bubbles;\n\t params.cancelable = !!params.cancelable;\n\t evt = document.createEvent('CustomEvent');\n\t evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n\t origPrevent = evt.preventDefault;\n\n\t evt.preventDefault = function () {\n\t origPrevent.call(this);\n\n\t try {\n\t Object.defineProperty(this, 'defaultPrevented', {\n\t get: function get() {\n\t return true;\n\t }\n\t });\n\t } catch (e) {\n\t this.defaultPrevented = true;\n\t }\n\t };\n\n\t return evt;\n\t };\n\n\t CustomEvent.prototype = window.Event.prototype;\n\t window.CustomEvent = CustomEvent; // expose definition to window\n\t }\n\t})();\n\n\tvar nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n\tvar toString$1 = {}.toString;\n\n\tvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n\t ? Object.getOwnPropertyNames(window) : [];\n\n\tvar getWindowNames = function (it) {\n\t try {\n\t return nativeGetOwnPropertyNames(it);\n\t } catch (error) {\n\t return windowNames.slice();\n\t }\n\t};\n\n\t// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\tvar f$5 = function getOwnPropertyNames(it) {\n\t return windowNames && toString$1.call(it) == '[object Window]'\n\t ? getWindowNames(it)\n\t : nativeGetOwnPropertyNames(toIndexedObject(it));\n\t};\n\n\tvar objectGetOwnPropertyNamesExternal = {\n\t\tf: f$5\n\t};\n\n\tvar f$6 = wellKnownSymbol;\n\n\tvar wellKnownSymbolWrapped = {\n\t\tf: f$6\n\t};\n\n\tvar defineProperty$3 = objectDefineProperty.f;\n\n\tvar defineWellKnownSymbol = function (NAME) {\n\t var Symbol = path.Symbol || (path.Symbol = {});\n\t if (!has(Symbol, NAME)) defineProperty$3(Symbol, NAME, {\n\t value: wellKnownSymbolWrapped.f(NAME)\n\t });\n\t};\n\n\tvar $forEach$1 = arrayIteration.forEach;\n\n\tvar HIDDEN = sharedKey('hidden');\n\tvar SYMBOL = 'Symbol';\n\tvar PROTOTYPE$1 = 'prototype';\n\tvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\tvar setInternalState$2 = internalState.set;\n\tvar getInternalState$1 = internalState.getterFor(SYMBOL);\n\tvar ObjectPrototype$1 = Object[PROTOTYPE$1];\n\tvar $Symbol = global_1.Symbol;\n\tvar $stringify = getBuiltIn('JSON', 'stringify');\n\tvar nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\tvar nativeDefineProperty$1 = objectDefineProperty.f;\n\tvar nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;\n\tvar nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;\n\tvar AllSymbols = shared('symbols');\n\tvar ObjectPrototypeSymbols = shared('op-symbols');\n\tvar StringToSymbolRegistry = shared('string-to-symbol-registry');\n\tvar SymbolToStringRegistry = shared('symbol-to-string-registry');\n\tvar WellKnownSymbolsStore$1 = shared('wks');\n\tvar QObject = global_1.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;\n\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDescriptor = descriptors && fails(function () {\n\t return objectCreate(nativeDefineProperty$1({}, 'a', {\n\t get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }\n\t })).a != 7;\n\t}) ? function (O, P, Attributes) {\n\t var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype$1, P);\n\t if (ObjectPrototypeDescriptor) delete ObjectPrototype$1[P];\n\t nativeDefineProperty$1(O, P, Attributes);\n\t if (ObjectPrototypeDescriptor && O !== ObjectPrototype$1) {\n\t nativeDefineProperty$1(ObjectPrototype$1, P, ObjectPrototypeDescriptor);\n\t }\n\t} : nativeDefineProperty$1;\n\n\tvar wrap = function (tag, description) {\n\t var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);\n\t setInternalState$2(symbol, {\n\t type: SYMBOL,\n\t tag: tag,\n\t description: description\n\t });\n\t if (!descriptors) symbol.description = description;\n\t return symbol;\n\t};\n\n\tvar isSymbol = useSymbolAsUid ? function (it) {\n\t return typeof it == 'symbol';\n\t} : function (it) {\n\t return Object(it) instanceof $Symbol;\n\t};\n\n\tvar $defineProperty = function defineProperty(O, P, Attributes) {\n\t if (O === ObjectPrototype$1) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n\t anObject(O);\n\t var key = toPrimitive(P, true);\n\t anObject(Attributes);\n\t if (has(AllSymbols, key)) {\n\t if (!Attributes.enumerable) {\n\t if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));\n\t O[HIDDEN][key] = true;\n\t } else {\n\t if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n\t Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n\t } return setSymbolDescriptor(O, key, Attributes);\n\t } return nativeDefineProperty$1(O, key, Attributes);\n\t};\n\n\tvar $defineProperties = function defineProperties(O, Properties) {\n\t anObject(O);\n\t var properties = toIndexedObject(Properties);\n\t var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n\t $forEach$1(keys, function (key) {\n\t if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n\t });\n\t return O;\n\t};\n\n\tvar $create = function create(O, Properties) {\n\t return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);\n\t};\n\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n\t var P = toPrimitive(V, true);\n\t var enumerable = nativePropertyIsEnumerable$1.call(this, P);\n\t if (this === ObjectPrototype$1 && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n\t return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n\t};\n\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n\t var it = toIndexedObject(O);\n\t var key = toPrimitive(P, true);\n\t if (it === ObjectPrototype$1 && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n\t var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);\n\t if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n\t descriptor.enumerable = true;\n\t }\n\t return descriptor;\n\t};\n\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n\t var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));\n\t var result = [];\n\t $forEach$1(names, function (key) {\n\t if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n\t });\n\t return result;\n\t};\n\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n\t var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$1;\n\t var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n\t var result = [];\n\t $forEach$1(names, function (key) {\n\t if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype$1, key))) {\n\t result.push(AllSymbols[key]);\n\t }\n\t });\n\t return result;\n\t};\n\n\t// `Symbol` constructor\n\t// https://tc39.github.io/ecma262/#sec-symbol-constructor\n\tif (!nativeSymbol) {\n\t $Symbol = function Symbol() {\n\t if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n\t var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t var tag = uid(description);\n\t var setter = function (value) {\n\t if (this === ObjectPrototype$1) setter.call(ObjectPrototypeSymbols, value);\n\t if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n\t setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n\t };\n\t if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype$1, tag, { configurable: true, set: setter });\n\t return wrap(tag, description);\n\t };\n\n\t redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {\n\t return getInternalState$1(this).tag;\n\t });\n\n\t redefine($Symbol, 'withoutSetter', function (description) {\n\t return wrap(uid(description), description);\n\t });\n\n\t objectPropertyIsEnumerable.f = $propertyIsEnumerable;\n\t objectDefineProperty.f = $defineProperty;\n\t objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;\n\t objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n\t objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;\n\n\t wellKnownSymbolWrapped.f = function (name) {\n\t return wrap(wellKnownSymbol(name), name);\n\t };\n\n\t if (descriptors) {\n\t // https://github.com/tc39/proposal-Symbol-description\n\t nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {\n\t configurable: true,\n\t get: function description() {\n\t return getInternalState$1(this).description;\n\t }\n\t });\n\t {\n\t redefine(ObjectPrototype$1, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n\t }\n\t }\n\t}\n\n\t_export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, {\n\t Symbol: $Symbol\n\t});\n\n\t$forEach$1(objectKeys(WellKnownSymbolsStore$1), function (name) {\n\t defineWellKnownSymbol(name);\n\t});\n\n\t_export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, {\n\t // `Symbol.for` method\n\t // https://tc39.github.io/ecma262/#sec-symbol.for\n\t 'for': function (key) {\n\t var string = String(key);\n\t if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n\t var symbol = $Symbol(string);\n\t StringToSymbolRegistry[string] = symbol;\n\t SymbolToStringRegistry[symbol] = string;\n\t return symbol;\n\t },\n\t // `Symbol.keyFor` method\n\t // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n\t keyFor: function keyFor(sym) {\n\t if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n\t if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n\t },\n\t useSetter: function () { USE_SETTER = true; },\n\t useSimple: function () { USE_SETTER = false; }\n\t});\n\n\t_export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, {\n\t // `Object.create` method\n\t // https://tc39.github.io/ecma262/#sec-object.create\n\t create: $create,\n\t // `Object.defineProperty` method\n\t // https://tc39.github.io/ecma262/#sec-object.defineproperty\n\t defineProperty: $defineProperty,\n\t // `Object.defineProperties` method\n\t // https://tc39.github.io/ecma262/#sec-object.defineproperties\n\t defineProperties: $defineProperties,\n\t // `Object.getOwnPropertyDescriptor` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n\t});\n\n\t_export({ target: 'Object', stat: true, forced: !nativeSymbol }, {\n\t // `Object.getOwnPropertyNames` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\t getOwnPropertyNames: $getOwnPropertyNames,\n\t // `Object.getOwnPropertySymbols` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n\t getOwnPropertySymbols: $getOwnPropertySymbols\n\t});\n\n\t// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n\t// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n\t_export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {\n\t getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n\t return objectGetOwnPropertySymbols.f(toObject(it));\n\t }\n\t});\n\n\t// `JSON.stringify` method behavior with symbols\n\t// https://tc39.github.io/ecma262/#sec-json.stringify\n\tif ($stringify) {\n\t var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () {\n\t var symbol = $Symbol();\n\t // MS Edge converts symbol values to JSON as {}\n\t return $stringify([symbol]) != '[null]'\n\t // WebKit converts symbol values to JSON as null\n\t || $stringify({ a: symbol }) != '{}'\n\t // V8 throws on boxed symbols\n\t || $stringify(Object(symbol)) != '{}';\n\t });\n\n\t _export({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n\t // eslint-disable-next-line no-unused-vars\n\t stringify: function stringify(it, replacer, space) {\n\t var args = [it];\n\t var index = 1;\n\t var $replacer;\n\t while (arguments.length > index) args.push(arguments[index++]);\n\t $replacer = replacer;\n\t if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n\t if (!isArray(replacer)) replacer = function (key, value) {\n\t if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n\t if (!isSymbol(value)) return value;\n\t };\n\t args[1] = replacer;\n\t return $stringify.apply(null, args);\n\t }\n\t });\n\t}\n\n\t// `Symbol.prototype[@@toPrimitive]` method\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\n\tif (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) {\n\t createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);\n\t}\n\t// `Symbol.prototype[@@toStringTag]` property\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\n\tsetToStringTag($Symbol, SYMBOL);\n\n\thiddenKeys[HIDDEN] = true;\n\n\tvar defineProperty$4 = objectDefineProperty.f;\n\n\n\tvar NativeSymbol = global_1.Symbol;\n\n\tif (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n\t // Safari 12 bug\n\t NativeSymbol().description !== undefined\n\t)) {\n\t var EmptyStringDescriptionStore = {};\n\t // wrap Symbol constructor for correct work with undefined description\n\t var SymbolWrapper = function Symbol() {\n\t var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t var result = this instanceof SymbolWrapper\n\t ? new NativeSymbol(description)\n\t // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n\t : description === undefined ? NativeSymbol() : NativeSymbol(description);\n\t if (description === '') EmptyStringDescriptionStore[result] = true;\n\t return result;\n\t };\n\t copyConstructorProperties(SymbolWrapper, NativeSymbol);\n\t var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n\t symbolPrototype.constructor = SymbolWrapper;\n\n\t var symbolToString = symbolPrototype.toString;\n\t var native = String(NativeSymbol('test')) == 'Symbol(test)';\n\t var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n\t defineProperty$4(symbolPrototype, 'description', {\n\t configurable: true,\n\t get: function description() {\n\t var symbol = isObject(this) ? this.valueOf() : this;\n\t var string = symbolToString.call(symbol);\n\t if (has(EmptyStringDescriptionStore, symbol)) return '';\n\t var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n\t return desc === '' ? undefined : desc;\n\t }\n\t });\n\n\t _export({ global: true, forced: true }, {\n\t Symbol: SymbolWrapper\n\t });\n\t}\n\n\t// `Symbol.iterator` well-known symbol\n\t// https://tc39.github.io/ecma262/#sec-symbol.iterator\n\tdefineWellKnownSymbol('iterator');\n\n\tvar $indexOf = arrayIncludes.indexOf;\n\n\n\n\tvar nativeIndexOf = [].indexOf;\n\n\tvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\n\tvar STRICT_METHOD$1 = arrayMethodIsStrict('indexOf');\n\tvar USES_TO_LENGTH$3 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n\t// `Array.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t_export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD$1 || !USES_TO_LENGTH$3 }, {\n\t indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n\t return NEGATIVE_ZERO\n\t // convert -0 to +0\n\t ? nativeIndexOf.apply(this, arguments) || 0\n\t : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tvar ARRAY_ITERATOR = 'Array Iterator';\n\tvar setInternalState$3 = internalState.set;\n\tvar getInternalState$2 = internalState.getterFor(ARRAY_ITERATOR);\n\n\t// `Array.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n\t// `Array.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n\t// `Array.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.values\n\t// `Array.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n\t// `CreateArrayIterator` internal method\n\t// https://tc39.github.io/ecma262/#sec-createarrayiterator\n\tvar es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {\n\t setInternalState$3(this, {\n\t type: ARRAY_ITERATOR,\n\t target: toIndexedObject(iterated), // target\n\t index: 0, // next index\n\t kind: kind // kind\n\t });\n\t// `%ArrayIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n\t}, function () {\n\t var state = getInternalState$2(this);\n\t var target = state.target;\n\t var kind = state.kind;\n\t var index = state.index++;\n\t if (!target || index >= target.length) {\n\t state.target = undefined;\n\t return { value: undefined, done: true };\n\t }\n\t if (kind == 'keys') return { value: index, done: false };\n\t if (kind == 'values') return { value: target[index], done: false };\n\t return { value: [index, target[index]], done: false };\n\t}, 'values');\n\n\t// argumentsList[@@iterator] is %ArrayProto_values%\n\t// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n\t// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\n\titerators.Arguments = iterators.Array;\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables('keys');\n\taddToUnscopables('values');\n\taddToUnscopables('entries');\n\n\tvar nativeJoin = [].join;\n\n\tvar ES3_STRINGS = indexedObject != Object;\n\tvar STRICT_METHOD$2 = arrayMethodIsStrict('join', ',');\n\n\t// `Array.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.join\n\t_export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$2 }, {\n\t join: function join(separator) {\n\t return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n\t }\n\t});\n\n\tvar HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('slice');\n\tvar USES_TO_LENGTH$4 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n\tvar SPECIES$3 = wellKnownSymbol('species');\n\tvar nativeSlice = [].slice;\n\tvar max$1 = Math.max;\n\n\t// `Array.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n\t// fallback for not array-like ES3 strings and DOM objects\n\t_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$4 }, {\n\t slice: function slice(start, end) {\n\t var O = toIndexedObject(this);\n\t var length = toLength(O.length);\n\t var k = toAbsoluteIndex(start, length);\n\t var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n\t // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n\t var Constructor, result, n;\n\t if (isArray(O)) {\n\t Constructor = O.constructor;\n\t // cross-realm fallback\n\t if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n\t Constructor = undefined;\n\t } else if (isObject(Constructor)) {\n\t Constructor = Constructor[SPECIES$3];\n\t if (Constructor === null) Constructor = undefined;\n\t }\n\t if (Constructor === Array || Constructor === undefined) {\n\t return nativeSlice.call(O, k, fin);\n\t }\n\t }\n\t result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\n\t for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n\t result.length = n;\n\t return result;\n\t }\n\t});\n\n\t// `Object.prototype.toString` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tvar objectToString = toStringTagSupport ? {}.toString : function toString() {\n\t return '[object ' + classof(this) + ']';\n\t};\n\n\t// `Object.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tif (!toStringTagSupport) {\n\t redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\n\t}\n\n\t// TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\n\n\n\n\n\tvar SPECIES$4 = wellKnownSymbol('species');\n\n\tvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n\t // #replace needs built-in support for named groups.\n\t // #match works fine because it just return the exec results, even if it has\n\t // a \"grops\" property.\n\t var re = /./;\n\t re.exec = function () {\n\t var result = [];\n\t result.groups = { a: '7' };\n\t return result;\n\t };\n\t return ''.replace(re, '$<a>') !== '7';\n\t});\n\n\t// IE <= 11 replaces $0 with the whole match, as if it was $&\n\t// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\n\tvar REPLACE_KEEPS_$0 = (function () {\n\t return 'a'.replace(/./, '$0') === '$0';\n\t})();\n\n\tvar REPLACE = wellKnownSymbol('replace');\n\t// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\n\tvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n\t if (/./[REPLACE]) {\n\t return /./[REPLACE]('a', '$0') === '';\n\t }\n\t return false;\n\t})();\n\n\t// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n\t// Weex JS has frozen built-in prototypes, so use try / catch wrapper\n\tvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n\t var re = /(?:)/;\n\t var originalExec = re.exec;\n\t re.exec = function () { return originalExec.apply(this, arguments); };\n\t var result = 'ab'.split(re);\n\t return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n\t});\n\n\tvar fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {\n\t var SYMBOL = wellKnownSymbol(KEY);\n\n\t var DELEGATES_TO_SYMBOL = !fails(function () {\n\t // String methods call symbol-named RegEp methods\n\t var O = {};\n\t O[SYMBOL] = function () { return 7; };\n\t return ''[KEY](O) != 7;\n\t });\n\n\t var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n\t // Symbol-named RegExp methods call .exec\n\t var execCalled = false;\n\t var re = /a/;\n\n\t if (KEY === 'split') {\n\t // We can't use real regex here since it causes deoptimization\n\t // and serious performance degradation in V8\n\t // https://github.com/zloirock/core-js/issues/306\n\t re = {};\n\t // RegExp[@@split] doesn't call the regex's exec method, but first creates\n\t // a new one. We need to return the patched regex when creating the new one.\n\t re.constructor = {};\n\t re.constructor[SPECIES$4] = function () { return re; };\n\t re.flags = '';\n\t re[SYMBOL] = /./[SYMBOL];\n\t }\n\n\t re.exec = function () { execCalled = true; return null; };\n\n\t re[SYMBOL]('');\n\t return !execCalled;\n\t });\n\n\t if (\n\t !DELEGATES_TO_SYMBOL ||\n\t !DELEGATES_TO_EXEC ||\n\t (KEY === 'replace' && !(\n\t REPLACE_SUPPORTS_NAMED_GROUPS &&\n\t REPLACE_KEEPS_$0 &&\n\t !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n\t )) ||\n\t (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n\t ) {\n\t var nativeRegExpMethod = /./[SYMBOL];\n\t var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n\t if (regexp.exec === regexpExec) {\n\t if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n\t // The native String method already delegates to @@method (this\n\t // polyfilled function), leasing to infinite recursion.\n\t // We avoid it by directly calling the native @@method method.\n\t return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n\t }\n\t return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n\t }\n\t return { done: false };\n\t }, {\n\t REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n\t REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n\t });\n\t var stringMethod = methods[0];\n\t var regexMethod = methods[1];\n\n\t redefine(String.prototype, KEY, stringMethod);\n\t redefine(RegExp.prototype, SYMBOL, length == 2\n\t // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n\t // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n\t ? function (string, arg) { return regexMethod.call(string, this, arg); }\n\t // 21.2.5.6 RegExp.prototype[@@match](string)\n\t // 21.2.5.9 RegExp.prototype[@@search](string)\n\t : function (string) { return regexMethod.call(string, this); }\n\t );\n\t }\n\n\t if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n\t};\n\n\tvar charAt$1 = stringMultibyte.charAt;\n\n\t// `AdvanceStringIndex` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-advancestringindex\n\tvar advanceStringIndex = function (S, index, unicode) {\n\t return index + (unicode ? charAt$1(S, index).length : 1);\n\t};\n\n\t// `RegExpExec` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-regexpexec\n\tvar regexpExecAbstract = function (R, S) {\n\t var exec = R.exec;\n\t if (typeof exec === 'function') {\n\t var result = exec.call(R, S);\n\t if (typeof result !== 'object') {\n\t throw TypeError('RegExp exec method returned something other than an Object or null');\n\t }\n\t return result;\n\t }\n\n\t if (classofRaw(R) !== 'RegExp') {\n\t throw TypeError('RegExp#exec called on incompatible receiver');\n\t }\n\n\t return regexpExec.call(R, S);\n\t};\n\n\tvar max$2 = Math.max;\n\tvar min$2 = Math.min;\n\tvar floor$1 = Math.floor;\n\tvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\n\tvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n\tvar maybeToString = function (it) {\n\t return it === undefined ? it : String(it);\n\t};\n\n\t// @@replace logic\n\tfixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n\t var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n\t var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n\t var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n\t return [\n\t // `String.prototype.replace` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n\t function replace(searchValue, replaceValue) {\n\t var O = requireObjectCoercible(this);\n\t var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n\t return replacer !== undefined\n\t ? replacer.call(searchValue, O, replaceValue)\n\t : nativeReplace.call(String(O), searchValue, replaceValue);\n\t },\n\t // `RegExp.prototype[@@replace]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n\t function (regexp, replaceValue) {\n\t if (\n\t (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n\t (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n\t ) {\n\t var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n\t if (res.done) return res.value;\n\t }\n\n\t var rx = anObject(regexp);\n\t var S = String(this);\n\n\t var functionalReplace = typeof replaceValue === 'function';\n\t if (!functionalReplace) replaceValue = String(replaceValue);\n\n\t var global = rx.global;\n\t if (global) {\n\t var fullUnicode = rx.unicode;\n\t rx.lastIndex = 0;\n\t }\n\t var results = [];\n\t while (true) {\n\t var result = regexpExecAbstract(rx, S);\n\t if (result === null) break;\n\n\t results.push(result);\n\t if (!global) break;\n\n\t var matchStr = String(result[0]);\n\t if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n\t }\n\n\t var accumulatedResult = '';\n\t var nextSourcePosition = 0;\n\t for (var i = 0; i < results.length; i++) {\n\t result = results[i];\n\n\t var matched = String(result[0]);\n\t var position = max$2(min$2(toInteger(result.index), S.length), 0);\n\t var captures = [];\n\t // NOTE: This is equivalent to\n\t // captures = result.slice(1).map(maybeToString)\n\t // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n\t // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n\t // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n\t for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n\t var namedCaptures = result.groups;\n\t if (functionalReplace) {\n\t var replacerArgs = [matched].concat(captures, position, S);\n\t if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n\t var replacement = String(replaceValue.apply(undefined, replacerArgs));\n\t } else {\n\t replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n\t }\n\t if (position >= nextSourcePosition) {\n\t accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n\t nextSourcePosition = position + matched.length;\n\t }\n\t }\n\t return accumulatedResult + S.slice(nextSourcePosition);\n\t }\n\t ];\n\n\t // https://tc39.github.io/ecma262/#sec-getsubstitution\n\t function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n\t var tailPos = position + matched.length;\n\t var m = captures.length;\n\t var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n\t if (namedCaptures !== undefined) {\n\t namedCaptures = toObject(namedCaptures);\n\t symbols = SUBSTITUTION_SYMBOLS;\n\t }\n\t return nativeReplace.call(replacement, symbols, function (match, ch) {\n\t var capture;\n\t switch (ch.charAt(0)) {\n\t case '$': return '$';\n\t case '&': return matched;\n\t case '`': return str.slice(0, position);\n\t case \"'\": return str.slice(tailPos);\n\t case '<':\n\t capture = namedCaptures[ch.slice(1, -1)];\n\t break;\n\t default: // \\d\\d?\n\t var n = +ch;\n\t if (n === 0) return match;\n\t if (n > m) {\n\t var f = floor$1(n / 10);\n\t if (f === 0) return match;\n\t if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n\t return match;\n\t }\n\t capture = captures[n - 1];\n\t }\n\t return capture === undefined ? '' : capture;\n\t });\n\t }\n\t});\n\n\t// `SameValue` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-samevalue\n\tvar sameValue = Object.is || function is(x, y) {\n\t // eslint-disable-next-line no-self-compare\n\t return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n\t};\n\n\t// @@search logic\n\tfixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n\t return [\n\t // `String.prototype.search` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.search\n\t function search(regexp) {\n\t var O = requireObjectCoercible(this);\n\t var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n\t return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n\t },\n\t // `RegExp.prototype[@@search]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n\t function (regexp) {\n\t var res = maybeCallNative(nativeSearch, regexp, this);\n\t if (res.done) return res.value;\n\n\t var rx = anObject(regexp);\n\t var S = String(this);\n\n\t var previousLastIndex = rx.lastIndex;\n\t if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n\t var result = regexpExecAbstract(rx, S);\n\t if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n\t return result === null ? -1 : result.index;\n\t }\n\t ];\n\t});\n\n\tvar SPECIES$5 = wellKnownSymbol('species');\n\n\t// `SpeciesConstructor` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-speciesconstructor\n\tvar speciesConstructor = function (O, defaultConstructor) {\n\t var C = anObject(O).constructor;\n\t var S;\n\t return C === undefined || (S = anObject(C)[SPECIES$5]) == undefined ? defaultConstructor : aFunction$1(S);\n\t};\n\n\tvar arrayPush = [].push;\n\tvar min$3 = Math.min;\n\tvar MAX_UINT32 = 0xFFFFFFFF;\n\n\t// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n\tvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n\t// @@split logic\n\tfixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n\t var internalSplit;\n\t if (\n\t 'abbc'.split(/(b)*/)[1] == 'c' ||\n\t 'test'.split(/(?:)/, -1).length != 4 ||\n\t 'ab'.split(/(?:ab)*/).length != 2 ||\n\t '.'.split(/(.?)(.?)/).length != 4 ||\n\t '.'.split(/()()/).length > 1 ||\n\t ''.split(/.?/).length\n\t ) {\n\t // based on es5-shim implementation, need to rework it\n\t internalSplit = function (separator, limit) {\n\t var string = String(requireObjectCoercible(this));\n\t var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n\t if (lim === 0) return [];\n\t if (separator === undefined) return [string];\n\t // If `separator` is not a regex, use native split\n\t if (!isRegexp(separator)) {\n\t return nativeSplit.call(string, separator, lim);\n\t }\n\t var output = [];\n\t var flags = (separator.ignoreCase ? 'i' : '') +\n\t (separator.multiline ? 'm' : '') +\n\t (separator.unicode ? 'u' : '') +\n\t (separator.sticky ? 'y' : '');\n\t var lastLastIndex = 0;\n\t // Make `global` and avoid `lastIndex` issues by working with a copy\n\t var separatorCopy = new RegExp(separator.source, flags + 'g');\n\t var match, lastIndex, lastLength;\n\t while (match = regexpExec.call(separatorCopy, string)) {\n\t lastIndex = separatorCopy.lastIndex;\n\t if (lastIndex > lastLastIndex) {\n\t output.push(string.slice(lastLastIndex, match.index));\n\t if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n\t lastLength = match[0].length;\n\t lastLastIndex = lastIndex;\n\t if (output.length >= lim) break;\n\t }\n\t if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n\t }\n\t if (lastLastIndex === string.length) {\n\t if (lastLength || !separatorCopy.test('')) output.push('');\n\t } else output.push(string.slice(lastLastIndex));\n\t return output.length > lim ? output.slice(0, lim) : output;\n\t };\n\t // Chakra, V8\n\t } else if ('0'.split(undefined, 0).length) {\n\t internalSplit = function (separator, limit) {\n\t return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n\t };\n\t } else internalSplit = nativeSplit;\n\n\t return [\n\t // `String.prototype.split` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.split\n\t function split(separator, limit) {\n\t var O = requireObjectCoercible(this);\n\t var splitter = separator == undefined ? undefined : separator[SPLIT];\n\t return splitter !== undefined\n\t ? splitter.call(separator, O, limit)\n\t : internalSplit.call(String(O), separator, limit);\n\t },\n\t // `RegExp.prototype[@@split]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n\t //\n\t // NOTE: This cannot be properly polyfilled in engines that don't support\n\t // the 'y' flag.\n\t function (regexp, limit) {\n\t var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n\t if (res.done) return res.value;\n\n\t var rx = anObject(regexp);\n\t var S = String(this);\n\t var C = speciesConstructor(rx, RegExp);\n\n\t var unicodeMatching = rx.unicode;\n\t var flags = (rx.ignoreCase ? 'i' : '') +\n\t (rx.multiline ? 'm' : '') +\n\t (rx.unicode ? 'u' : '') +\n\t (SUPPORTS_Y ? 'y' : 'g');\n\n\t // ^(? + rx + ) is needed, in combination with some S slicing, to\n\t // simulate the 'y' flag.\n\t var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n\t var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n\t if (lim === 0) return [];\n\t if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\n\t var p = 0;\n\t var q = 0;\n\t var A = [];\n\t while (q < S.length) {\n\t splitter.lastIndex = SUPPORTS_Y ? q : 0;\n\t var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n\t var e;\n\t if (\n\t z === null ||\n\t (e = min$3(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n\t ) {\n\t q = advanceStringIndex(S, q, unicodeMatching);\n\t } else {\n\t A.push(S.slice(p, q));\n\t if (A.length === lim) return A;\n\t for (var i = 1; i <= z.length - 1; i++) {\n\t A.push(z[i]);\n\t if (A.length === lim) return A;\n\t }\n\t q = p = e;\n\t }\n\t }\n\t A.push(S.slice(p));\n\t return A;\n\t }\n\t ];\n\t}, !SUPPORTS_Y);\n\n\tvar ITERATOR$5 = wellKnownSymbol('iterator');\n\tvar TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');\n\tvar ArrayValues = es_array_iterator.values;\n\n\tfor (var COLLECTION_NAME$1 in domIterables) {\n\t var Collection$1 = global_1[COLLECTION_NAME$1];\n\t var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;\n\t if (CollectionPrototype$1) {\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$1[ITERATOR$5] !== ArrayValues) try {\n\t createNonEnumerableProperty(CollectionPrototype$1, ITERATOR$5, ArrayValues);\n\t } catch (error) {\n\t CollectionPrototype$1[ITERATOR$5] = ArrayValues;\n\t }\n\t if (!CollectionPrototype$1[TO_STRING_TAG$3]) {\n\t createNonEnumerableProperty(CollectionPrototype$1, TO_STRING_TAG$3, COLLECTION_NAME$1);\n\t }\n\t if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) {\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {\n\t createNonEnumerableProperty(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]);\n\t } catch (error) {\n\t CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME];\n\t }\n\t }\n\t }\n\t}\n\n\tvar ITERATOR$6 = wellKnownSymbol('iterator');\n\n\tvar nativeUrl = !fails(function () {\n\t var url = new URL('b?a=1&b=2&c=3', 'http://a');\n\t var searchParams = url.searchParams;\n\t var result = '';\n\t url.pathname = 'c%20d';\n\t searchParams.forEach(function (value, key) {\n\t searchParams['delete']('b');\n\t result += key + value;\n\t });\n\t return (isPure && !url.toJSON)\n\t || !searchParams.sort\n\t || url.href !== 'http://a/c%20d?a=1&c=3'\n\t || searchParams.get('c') !== '3'\n\t || String(new URLSearchParams('?a=1')) !== 'a=1'\n\t || !searchParams[ITERATOR$6]\n\t // throws in Edge\n\t || new URL('https://a@b').username !== 'a'\n\t || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n\t // not punycoded in Edge\n\t || new URL('http://тест').host !== 'xn--e1aybc'\n\t // not escaped in Chrome 62-\n\t || new URL('http://a#б').hash !== '#%D0%B1'\n\t // fails in Chrome 66-\n\t || result !== 'a1c3'\n\t // throws in Safari\n\t || new URL('http://x', undefined).host !== 'x';\n\t});\n\n\tvar anInstance = function (it, Constructor, name) {\n\t if (!(it instanceof Constructor)) {\n\t throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n\t } return it;\n\t};\n\n\tvar nativeAssign = Object.assign;\n\tvar defineProperty$5 = Object.defineProperty;\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\tvar objectAssign = !nativeAssign || fails(function () {\n\t // should have correct order of operations (Edge bug)\n\t if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$5({}, 'a', {\n\t enumerable: true,\n\t get: function () {\n\t defineProperty$5(this, 'b', {\n\t value: 3,\n\t enumerable: false\n\t });\n\t }\n\t }), { b: 2 })).b !== 1) return true;\n\t // should work with symbols and should have deterministic property order (V8 bug)\n\t var A = {};\n\t var B = {};\n\t // eslint-disable-next-line no-undef\n\t var symbol = Symbol();\n\t var alphabet = 'abcdefghijklmnopqrst';\n\t A[symbol] = 7;\n\t alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n\t return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n\t}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n\t var T = toObject(target);\n\t var argumentsLength = arguments.length;\n\t var index = 1;\n\t var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\t while (argumentsLength > index) {\n\t var S = indexedObject(arguments[index++]);\n\t var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n\t var length = keys.length;\n\t var j = 0;\n\t var key;\n\t while (length > j) {\n\t key = keys[j++];\n\t if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n\t }\n\t } return T;\n\t} : nativeAssign;\n\n\t// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\n\tvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\tvar base = 36;\n\tvar tMin = 1;\n\tvar tMax = 26;\n\tvar skew = 38;\n\tvar damp = 700;\n\tvar initialBias = 72;\n\tvar initialN = 128; // 0x80\n\tvar delimiter = '-'; // '\\x2D'\n\tvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\n\tvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\tvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\n\tvar baseMinusTMin = base - tMin;\n\tvar floor$2 = Math.floor;\n\tvar stringFromCharCode = String.fromCharCode;\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t */\n\tvar ucs2decode = function (string) {\n\t var output = [];\n\t var counter = 0;\n\t var length = string.length;\n\t while (counter < length) {\n\t var value = string.charCodeAt(counter++);\n\t if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t // It's a high surrogate, and there is a next character.\n\t var extra = string.charCodeAt(counter++);\n\t if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t } else {\n\t // It's an unmatched surrogate; only append this code unit, in case the\n\t // next code unit is the high surrogate of a surrogate pair.\n\t output.push(value);\n\t counter--;\n\t }\n\t } else {\n\t output.push(value);\n\t }\n\t }\n\t return output;\n\t};\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t */\n\tvar digitToBasic = function (digit) {\n\t // 0..25 map to ASCII a..z or A..Z\n\t // 26..35 map to ASCII 0..9\n\t return digit + 22 + 75 * (digit < 26);\n\t};\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t */\n\tvar adapt = function (delta, numPoints, firstTime) {\n\t var k = 0;\n\t delta = firstTime ? floor$2(delta / damp) : delta >> 1;\n\t delta += floor$2(delta / numPoints);\n\t for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t delta = floor$2(delta / baseMinusTMin);\n\t }\n\t return floor$2(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t};\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t */\n\t// eslint-disable-next-line max-statements\n\tvar encode = function (input) {\n\t var output = [];\n\n\t // Convert the input in UCS-2 to an array of Unicode code points.\n\t input = ucs2decode(input);\n\n\t // Cache the length.\n\t var inputLength = input.length;\n\n\t // Initialize the state.\n\t var n = initialN;\n\t var delta = 0;\n\t var bias = initialBias;\n\t var i, currentValue;\n\n\t // Handle the basic code points.\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue < 0x80) {\n\t output.push(stringFromCharCode(currentValue));\n\t }\n\t }\n\n\t var basicLength = output.length; // number of basic code points.\n\t var handledCPCount = basicLength; // number of code points that have been handled;\n\n\t // Finish the basic string with a delimiter unless it's empty.\n\t if (basicLength) {\n\t output.push(delimiter);\n\t }\n\n\t // Main encoding loop:\n\t while (handledCPCount < inputLength) {\n\t // All non-basic code points < n have been handled already. Find the next larger one:\n\t var m = maxInt;\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue >= n && currentValue < m) {\n\t m = currentValue;\n\t }\n\t }\n\n\t // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n\t var handledCPCountPlusOne = handledCPCount + 1;\n\t if (m - n > floor$2((maxInt - delta) / handledCPCountPlusOne)) {\n\t throw RangeError(OVERFLOW_ERROR);\n\t }\n\n\t delta += (m - n) * handledCPCountPlusOne;\n\t n = m;\n\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue < n && ++delta > maxInt) {\n\t throw RangeError(OVERFLOW_ERROR);\n\t }\n\t if (currentValue == n) {\n\t // Represent delta as a generalized variable-length integer.\n\t var q = delta;\n\t for (var k = base; /* no condition */; k += base) {\n\t var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t if (q < t) break;\n\t var qMinusT = q - t;\n\t var baseMinusT = base - t;\n\t output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n\t q = floor$2(qMinusT / baseMinusT);\n\t }\n\n\t output.push(stringFromCharCode(digitToBasic(q)));\n\t bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t delta = 0;\n\t ++handledCPCount;\n\t }\n\t }\n\n\t ++delta;\n\t ++n;\n\t }\n\t return output.join('');\n\t};\n\n\tvar stringPunycodeToAscii = function (input) {\n\t var encoded = [];\n\t var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n\t var i, label;\n\t for (i = 0; i < labels.length; i++) {\n\t label = labels[i];\n\t encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n\t }\n\t return encoded.join('.');\n\t};\n\n\tvar redefineAll = function (target, src, options) {\n\t for (var key in src) redefine(target, key, src[key], options);\n\t return target;\n\t};\n\n\tvar getIterator = function (it) {\n\t var iteratorMethod = getIteratorMethod(it);\n\t if (typeof iteratorMethod != 'function') {\n\t throw TypeError(String(it) + ' is not iterable');\n\t } return anObject(iteratorMethod.call(it));\n\t};\n\n\t// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\tvar $fetch = getBuiltIn('fetch');\n\tvar Headers$1 = getBuiltIn('Headers');\n\tvar ITERATOR$7 = wellKnownSymbol('iterator');\n\tvar URL_SEARCH_PARAMS = 'URLSearchParams';\n\tvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\n\tvar setInternalState$4 = internalState.set;\n\tvar getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS);\n\tvar getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\n\tvar plus = /\\+/g;\n\tvar sequences = Array(4);\n\n\tvar percentSequence = function (bytes) {\n\t return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n\t};\n\n\tvar percentDecode = function (sequence) {\n\t try {\n\t return decodeURIComponent(sequence);\n\t } catch (error) {\n\t return sequence;\n\t }\n\t};\n\n\tvar deserialize = function (it) {\n\t var result = it.replace(plus, ' ');\n\t var bytes = 4;\n\t try {\n\t return decodeURIComponent(result);\n\t } catch (error) {\n\t while (bytes) {\n\t result = result.replace(percentSequence(bytes--), percentDecode);\n\t }\n\t return result;\n\t }\n\t};\n\n\tvar find = /[!'()~]|%20/g;\n\n\tvar replace = {\n\t '!': '%21',\n\t \"'\": '%27',\n\t '(': '%28',\n\t ')': '%29',\n\t '~': '%7E',\n\t '%20': '+'\n\t};\n\n\tvar replacer = function (match) {\n\t return replace[match];\n\t};\n\n\tvar serialize = function (it) {\n\t return encodeURIComponent(it).replace(find, replacer);\n\t};\n\n\tvar parseSearchParams = function (result, query) {\n\t if (query) {\n\t var attributes = query.split('&');\n\t var index = 0;\n\t var attribute, entry;\n\t while (index < attributes.length) {\n\t attribute = attributes[index++];\n\t if (attribute.length) {\n\t entry = attribute.split('=');\n\t result.push({\n\t key: deserialize(entry.shift()),\n\t value: deserialize(entry.join('='))\n\t });\n\t }\n\t }\n\t }\n\t};\n\n\tvar updateSearchParams = function (query) {\n\t this.entries.length = 0;\n\t parseSearchParams(this.entries, query);\n\t};\n\n\tvar validateArgumentsLength = function (passed, required) {\n\t if (passed < required) throw TypeError('Not enough arguments');\n\t};\n\n\tvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n\t setInternalState$4(this, {\n\t type: URL_SEARCH_PARAMS_ITERATOR,\n\t iterator: getIterator(getInternalParamsState(params).entries),\n\t kind: kind\n\t });\n\t}, 'Iterator', function next() {\n\t var state = getInternalIteratorState(this);\n\t var kind = state.kind;\n\t var step = state.iterator.next();\n\t var entry = step.value;\n\t if (!step.done) {\n\t step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n\t } return step;\n\t});\n\n\t// `URLSearchParams` constructor\n\t// https://url.spec.whatwg.org/#interface-urlsearchparams\n\tvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n\t anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\t var init = arguments.length > 0 ? arguments[0] : undefined;\n\t var that = this;\n\t var entries = [];\n\t var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n\t setInternalState$4(that, {\n\t type: URL_SEARCH_PARAMS,\n\t entries: entries,\n\t updateURL: function () { /* empty */ },\n\t updateSearchParams: updateSearchParams\n\t });\n\n\t if (init !== undefined) {\n\t if (isObject(init)) {\n\t iteratorMethod = getIteratorMethod(init);\n\t if (typeof iteratorMethod === 'function') {\n\t iterator = iteratorMethod.call(init);\n\t next = iterator.next;\n\t while (!(step = next.call(iterator)).done) {\n\t entryIterator = getIterator(anObject(step.value));\n\t entryNext = entryIterator.next;\n\t if (\n\t (first = entryNext.call(entryIterator)).done ||\n\t (second = entryNext.call(entryIterator)).done ||\n\t !entryNext.call(entryIterator).done\n\t ) throw TypeError('Expected sequence with length 2');\n\t entries.push({ key: first.value + '', value: second.value + '' });\n\t }\n\t } else for (key in init) if (has(init, key)) entries.push({ key: key, value: init[key] + '' });\n\t } else {\n\t parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n\t }\n\t }\n\t};\n\n\tvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\n\tredefineAll(URLSearchParamsPrototype, {\n\t // `URLSearchParams.prototype.appent` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n\t append: function append(name, value) {\n\t validateArgumentsLength(arguments.length, 2);\n\t var state = getInternalParamsState(this);\n\t state.entries.push({ key: name + '', value: value + '' });\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.delete` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n\t 'delete': function (name) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var state = getInternalParamsState(this);\n\t var entries = state.entries;\n\t var key = name + '';\n\t var index = 0;\n\t while (index < entries.length) {\n\t if (entries[index].key === key) entries.splice(index, 1);\n\t else index++;\n\t }\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.get` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n\t get: function get(name) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var entries = getInternalParamsState(this).entries;\n\t var key = name + '';\n\t var index = 0;\n\t for (; index < entries.length; index++) {\n\t if (entries[index].key === key) return entries[index].value;\n\t }\n\t return null;\n\t },\n\t // `URLSearchParams.prototype.getAll` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n\t getAll: function getAll(name) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var entries = getInternalParamsState(this).entries;\n\t var key = name + '';\n\t var result = [];\n\t var index = 0;\n\t for (; index < entries.length; index++) {\n\t if (entries[index].key === key) result.push(entries[index].value);\n\t }\n\t return result;\n\t },\n\t // `URLSearchParams.prototype.has` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n\t has: function has(name) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var entries = getInternalParamsState(this).entries;\n\t var key = name + '';\n\t var index = 0;\n\t while (index < entries.length) {\n\t if (entries[index++].key === key) return true;\n\t }\n\t return false;\n\t },\n\t // `URLSearchParams.prototype.set` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n\t set: function set(name, value) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var state = getInternalParamsState(this);\n\t var entries = state.entries;\n\t var found = false;\n\t var key = name + '';\n\t var val = value + '';\n\t var index = 0;\n\t var entry;\n\t for (; index < entries.length; index++) {\n\t entry = entries[index];\n\t if (entry.key === key) {\n\t if (found) entries.splice(index--, 1);\n\t else {\n\t found = true;\n\t entry.value = val;\n\t }\n\t }\n\t }\n\t if (!found) entries.push({ key: key, value: val });\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.sort` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n\t sort: function sort() {\n\t var state = getInternalParamsState(this);\n\t var entries = state.entries;\n\t // Array#sort is not stable in some engines\n\t var slice = entries.slice();\n\t var entry, entriesIndex, sliceIndex;\n\t entries.length = 0;\n\t for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n\t entry = slice[sliceIndex];\n\t for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n\t if (entries[entriesIndex].key > entry.key) {\n\t entries.splice(entriesIndex, 0, entry);\n\t break;\n\t }\n\t }\n\t if (entriesIndex === sliceIndex) entries.push(entry);\n\t }\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.forEach` method\n\t forEach: function forEach(callback /* , thisArg */) {\n\t var entries = getInternalParamsState(this).entries;\n\t var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n\t var index = 0;\n\t var entry;\n\t while (index < entries.length) {\n\t entry = entries[index++];\n\t boundFunction(entry.value, entry.key, this);\n\t }\n\t },\n\t // `URLSearchParams.prototype.keys` method\n\t keys: function keys() {\n\t return new URLSearchParamsIterator(this, 'keys');\n\t },\n\t // `URLSearchParams.prototype.values` method\n\t values: function values() {\n\t return new URLSearchParamsIterator(this, 'values');\n\t },\n\t // `URLSearchParams.prototype.entries` method\n\t entries: function entries() {\n\t return new URLSearchParamsIterator(this, 'entries');\n\t }\n\t}, { enumerable: true });\n\n\t// `URLSearchParams.prototype[@@iterator]` method\n\tredefine(URLSearchParamsPrototype, ITERATOR$7, URLSearchParamsPrototype.entries);\n\n\t// `URLSearchParams.prototype.toString` method\n\t// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\n\tredefine(URLSearchParamsPrototype, 'toString', function toString() {\n\t var entries = getInternalParamsState(this).entries;\n\t var result = [];\n\t var index = 0;\n\t var entry;\n\t while (index < entries.length) {\n\t entry = entries[index++];\n\t result.push(serialize(entry.key) + '=' + serialize(entry.value));\n\t } return result.join('&');\n\t}, { enumerable: true });\n\n\tsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n\t_export({ global: true, forced: !nativeUrl }, {\n\t URLSearchParams: URLSearchParamsConstructor\n\t});\n\n\t// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n\t// https://github.com/zloirock/core-js/issues/674\n\tif (!nativeUrl && typeof $fetch == 'function' && typeof Headers$1 == 'function') {\n\t _export({ global: true, enumerable: true, forced: true }, {\n\t fetch: function fetch(input /* , init */) {\n\t var args = [input];\n\t var init, body, headers;\n\t if (arguments.length > 1) {\n\t init = arguments[1];\n\t if (isObject(init)) {\n\t body = init.body;\n\t if (classof(body) === URL_SEARCH_PARAMS) {\n\t headers = init.headers ? new Headers$1(init.headers) : new Headers$1();\n\t if (!headers.has('content-type')) {\n\t headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n\t }\n\t init = objectCreate(init, {\n\t body: createPropertyDescriptor(0, String(body)),\n\t headers: createPropertyDescriptor(0, headers)\n\t });\n\t }\n\t }\n\t args.push(init);\n\t } return $fetch.apply(this, args);\n\t }\n\t });\n\t}\n\n\tvar web_urlSearchParams = {\n\t URLSearchParams: URLSearchParamsConstructor,\n\t getState: getInternalParamsState\n\t};\n\n\t// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\tvar codeAt = stringMultibyte.codeAt;\n\n\n\n\n\n\tvar NativeURL = global_1.URL;\n\tvar URLSearchParams$1 = web_urlSearchParams.URLSearchParams;\n\tvar getInternalSearchParamsState = web_urlSearchParams.getState;\n\tvar setInternalState$5 = internalState.set;\n\tvar getInternalURLState = internalState.getterFor('URL');\n\tvar floor$3 = Math.floor;\n\tvar pow = Math.pow;\n\n\tvar INVALID_AUTHORITY = 'Invalid authority';\n\tvar INVALID_SCHEME = 'Invalid scheme';\n\tvar INVALID_HOST = 'Invalid host';\n\tvar INVALID_PORT = 'Invalid port';\n\n\tvar ALPHA = /[A-Za-z]/;\n\tvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\n\tvar DIGIT = /\\d/;\n\tvar HEX_START = /^(0x|0X)/;\n\tvar OCT = /^[0-7]+$/;\n\tvar DEC = /^\\d+$/;\n\tvar HEX = /^[\\dA-Fa-f]+$/;\n\t// eslint-disable-next-line no-control-regex\n\tvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n\t// eslint-disable-next-line no-control-regex\n\tvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n\t// eslint-disable-next-line no-control-regex\n\tvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n\t// eslint-disable-next-line no-control-regex\n\tvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\n\tvar EOF;\n\n\tvar parseHost = function (url, input) {\n\t var result, codePoints, index;\n\t if (input.charAt(0) == '[') {\n\t if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n\t result = parseIPv6(input.slice(1, -1));\n\t if (!result) return INVALID_HOST;\n\t url.host = result;\n\t // opaque host\n\t } else if (!isSpecial(url)) {\n\t if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n\t result = '';\n\t codePoints = arrayFrom(input);\n\t for (index = 0; index < codePoints.length; index++) {\n\t result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n\t }\n\t url.host = result;\n\t } else {\n\t input = stringPunycodeToAscii(input);\n\t if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n\t result = parseIPv4(input);\n\t if (result === null) return INVALID_HOST;\n\t url.host = result;\n\t }\n\t};\n\n\tvar parseIPv4 = function (input) {\n\t var parts = input.split('.');\n\t var partsLength, numbers, index, part, radix, number, ipv4;\n\t if (parts.length && parts[parts.length - 1] == '') {\n\t parts.pop();\n\t }\n\t partsLength = parts.length;\n\t if (partsLength > 4) return input;\n\t numbers = [];\n\t for (index = 0; index < partsLength; index++) {\n\t part = parts[index];\n\t if (part == '') return input;\n\t radix = 10;\n\t if (part.length > 1 && part.charAt(0) == '0') {\n\t radix = HEX_START.test(part) ? 16 : 8;\n\t part = part.slice(radix == 8 ? 1 : 2);\n\t }\n\t if (part === '') {\n\t number = 0;\n\t } else {\n\t if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n\t number = parseInt(part, radix);\n\t }\n\t numbers.push(number);\n\t }\n\t for (index = 0; index < partsLength; index++) {\n\t number = numbers[index];\n\t if (index == partsLength - 1) {\n\t if (number >= pow(256, 5 - partsLength)) return null;\n\t } else if (number > 255) return null;\n\t }\n\t ipv4 = numbers.pop();\n\t for (index = 0; index < numbers.length; index++) {\n\t ipv4 += numbers[index] * pow(256, 3 - index);\n\t }\n\t return ipv4;\n\t};\n\n\t// eslint-disable-next-line max-statements\n\tvar parseIPv6 = function (input) {\n\t var address = [0, 0, 0, 0, 0, 0, 0, 0];\n\t var pieceIndex = 0;\n\t var compress = null;\n\t var pointer = 0;\n\t var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n\t var char = function () {\n\t return input.charAt(pointer);\n\t };\n\n\t if (char() == ':') {\n\t if (input.charAt(1) != ':') return;\n\t pointer += 2;\n\t pieceIndex++;\n\t compress = pieceIndex;\n\t }\n\t while (char()) {\n\t if (pieceIndex == 8) return;\n\t if (char() == ':') {\n\t if (compress !== null) return;\n\t pointer++;\n\t pieceIndex++;\n\t compress = pieceIndex;\n\t continue;\n\t }\n\t value = length = 0;\n\t while (length < 4 && HEX.test(char())) {\n\t value = value * 16 + parseInt(char(), 16);\n\t pointer++;\n\t length++;\n\t }\n\t if (char() == '.') {\n\t if (length == 0) return;\n\t pointer -= length;\n\t if (pieceIndex > 6) return;\n\t numbersSeen = 0;\n\t while (char()) {\n\t ipv4Piece = null;\n\t if (numbersSeen > 0) {\n\t if (char() == '.' && numbersSeen < 4) pointer++;\n\t else return;\n\t }\n\t if (!DIGIT.test(char())) return;\n\t while (DIGIT.test(char())) {\n\t number = parseInt(char(), 10);\n\t if (ipv4Piece === null) ipv4Piece = number;\n\t else if (ipv4Piece == 0) return;\n\t else ipv4Piece = ipv4Piece * 10 + number;\n\t if (ipv4Piece > 255) return;\n\t pointer++;\n\t }\n\t address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n\t numbersSeen++;\n\t if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n\t }\n\t if (numbersSeen != 4) return;\n\t break;\n\t } else if (char() == ':') {\n\t pointer++;\n\t if (!char()) return;\n\t } else if (char()) return;\n\t address[pieceIndex++] = value;\n\t }\n\t if (compress !== null) {\n\t swaps = pieceIndex - compress;\n\t pieceIndex = 7;\n\t while (pieceIndex != 0 && swaps > 0) {\n\t swap = address[pieceIndex];\n\t address[pieceIndex--] = address[compress + swaps - 1];\n\t address[compress + --swaps] = swap;\n\t }\n\t } else if (pieceIndex != 8) return;\n\t return address;\n\t};\n\n\tvar findLongestZeroSequence = function (ipv6) {\n\t var maxIndex = null;\n\t var maxLength = 1;\n\t var currStart = null;\n\t var currLength = 0;\n\t var index = 0;\n\t for (; index < 8; index++) {\n\t if (ipv6[index] !== 0) {\n\t if (currLength > maxLength) {\n\t maxIndex = currStart;\n\t maxLength = currLength;\n\t }\n\t currStart = null;\n\t currLength = 0;\n\t } else {\n\t if (currStart === null) currStart = index;\n\t ++currLength;\n\t }\n\t }\n\t if (currLength > maxLength) {\n\t maxIndex = currStart;\n\t maxLength = currLength;\n\t }\n\t return maxIndex;\n\t};\n\n\tvar serializeHost = function (host) {\n\t var result, index, compress, ignore0;\n\t // ipv4\n\t if (typeof host == 'number') {\n\t result = [];\n\t for (index = 0; index < 4; index++) {\n\t result.unshift(host % 256);\n\t host = floor$3(host / 256);\n\t } return result.join('.');\n\t // ipv6\n\t } else if (typeof host == 'object') {\n\t result = '';\n\t compress = findLongestZeroSequence(host);\n\t for (index = 0; index < 8; index++) {\n\t if (ignore0 && host[index] === 0) continue;\n\t if (ignore0) ignore0 = false;\n\t if (compress === index) {\n\t result += index ? ':' : '::';\n\t ignore0 = true;\n\t } else {\n\t result += host[index].toString(16);\n\t if (index < 7) result += ':';\n\t }\n\t }\n\t return '[' + result + ']';\n\t } return host;\n\t};\n\n\tvar C0ControlPercentEncodeSet = {};\n\tvar fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, {\n\t ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n\t});\n\tvar pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, {\n\t '#': 1, '?': 1, '{': 1, '}': 1\n\t});\n\tvar userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, {\n\t '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n\t});\n\n\tvar percentEncode = function (char, set) {\n\t var code = codeAt(char, 0);\n\t return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n\t};\n\n\tvar specialSchemes = {\n\t ftp: 21,\n\t file: null,\n\t http: 80,\n\t https: 443,\n\t ws: 80,\n\t wss: 443\n\t};\n\n\tvar isSpecial = function (url) {\n\t return has(specialSchemes, url.scheme);\n\t};\n\n\tvar includesCredentials = function (url) {\n\t return url.username != '' || url.password != '';\n\t};\n\n\tvar cannotHaveUsernamePasswordPort = function (url) {\n\t return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n\t};\n\n\tvar isWindowsDriveLetter = function (string, normalized) {\n\t var second;\n\t return string.length == 2 && ALPHA.test(string.charAt(0))\n\t && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n\t};\n\n\tvar startsWithWindowsDriveLetter = function (string) {\n\t var third;\n\t return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n\t string.length == 2 ||\n\t ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n\t );\n\t};\n\n\tvar shortenURLsPath = function (url) {\n\t var path = url.path;\n\t var pathSize = path.length;\n\t if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n\t path.pop();\n\t }\n\t};\n\n\tvar isSingleDot = function (segment) {\n\t return segment === '.' || segment.toLowerCase() === '%2e';\n\t};\n\n\tvar isDoubleDot = function (segment) {\n\t segment = segment.toLowerCase();\n\t return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n\t};\n\n\t// States:\n\tvar SCHEME_START = {};\n\tvar SCHEME = {};\n\tvar NO_SCHEME = {};\n\tvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\n\tvar PATH_OR_AUTHORITY = {};\n\tvar RELATIVE = {};\n\tvar RELATIVE_SLASH = {};\n\tvar SPECIAL_AUTHORITY_SLASHES = {};\n\tvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\n\tvar AUTHORITY = {};\n\tvar HOST = {};\n\tvar HOSTNAME = {};\n\tvar PORT = {};\n\tvar FILE = {};\n\tvar FILE_SLASH = {};\n\tvar FILE_HOST = {};\n\tvar PATH_START = {};\n\tvar PATH = {};\n\tvar CANNOT_BE_A_BASE_URL_PATH = {};\n\tvar QUERY = {};\n\tvar FRAGMENT = {};\n\n\t// eslint-disable-next-line max-statements\n\tvar parseURL = function (url, input, stateOverride, base) {\n\t var state = stateOverride || SCHEME_START;\n\t var pointer = 0;\n\t var buffer = '';\n\t var seenAt = false;\n\t var seenBracket = false;\n\t var seenPasswordToken = false;\n\t var codePoints, char, bufferCodePoints, failure;\n\n\t if (!stateOverride) {\n\t url.scheme = '';\n\t url.username = '';\n\t url.password = '';\n\t url.host = null;\n\t url.port = null;\n\t url.path = [];\n\t url.query = null;\n\t url.fragment = null;\n\t url.cannotBeABaseURL = false;\n\t input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n\t }\n\n\t input = input.replace(TAB_AND_NEW_LINE, '');\n\n\t codePoints = arrayFrom(input);\n\n\t while (pointer <= codePoints.length) {\n\t char = codePoints[pointer];\n\t switch (state) {\n\t case SCHEME_START:\n\t if (char && ALPHA.test(char)) {\n\t buffer += char.toLowerCase();\n\t state = SCHEME;\n\t } else if (!stateOverride) {\n\t state = NO_SCHEME;\n\t continue;\n\t } else return INVALID_SCHEME;\n\t break;\n\n\t case SCHEME:\n\t if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n\t buffer += char.toLowerCase();\n\t } else if (char == ':') {\n\t if (stateOverride && (\n\t (isSpecial(url) != has(specialSchemes, buffer)) ||\n\t (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n\t (url.scheme == 'file' && !url.host)\n\t )) return;\n\t url.scheme = buffer;\n\t if (stateOverride) {\n\t if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n\t return;\n\t }\n\t buffer = '';\n\t if (url.scheme == 'file') {\n\t state = FILE;\n\t } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n\t state = SPECIAL_RELATIVE_OR_AUTHORITY;\n\t } else if (isSpecial(url)) {\n\t state = SPECIAL_AUTHORITY_SLASHES;\n\t } else if (codePoints[pointer + 1] == '/') {\n\t state = PATH_OR_AUTHORITY;\n\t pointer++;\n\t } else {\n\t url.cannotBeABaseURL = true;\n\t url.path.push('');\n\t state = CANNOT_BE_A_BASE_URL_PATH;\n\t }\n\t } else if (!stateOverride) {\n\t buffer = '';\n\t state = NO_SCHEME;\n\t pointer = 0;\n\t continue;\n\t } else return INVALID_SCHEME;\n\t break;\n\n\t case NO_SCHEME:\n\t if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n\t if (base.cannotBeABaseURL && char == '#') {\n\t url.scheme = base.scheme;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t url.cannotBeABaseURL = true;\n\t state = FRAGMENT;\n\t break;\n\t }\n\t state = base.scheme == 'file' ? FILE : RELATIVE;\n\t continue;\n\n\t case SPECIAL_RELATIVE_OR_AUTHORITY:\n\t if (char == '/' && codePoints[pointer + 1] == '/') {\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t pointer++;\n\t } else {\n\t state = RELATIVE;\n\t continue;\n\t } break;\n\n\t case PATH_OR_AUTHORITY:\n\t if (char == '/') {\n\t state = AUTHORITY;\n\t break;\n\t } else {\n\t state = PATH;\n\t continue;\n\t }\n\n\t case RELATIVE:\n\t url.scheme = base.scheme;\n\t if (char == EOF) {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n\t state = RELATIVE_SLASH;\n\t } else if (char == '?') {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = '';\n\t state = QUERY;\n\t } else if (char == '#') {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.path.pop();\n\t state = PATH;\n\t continue;\n\t } break;\n\n\t case RELATIVE_SLASH:\n\t if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t } else if (char == '/') {\n\t state = AUTHORITY;\n\t } else {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t state = PATH;\n\t continue;\n\t } break;\n\n\t case SPECIAL_AUTHORITY_SLASHES:\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n\t pointer++;\n\t break;\n\n\t case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n\t if (char != '/' && char != '\\\\') {\n\t state = AUTHORITY;\n\t continue;\n\t } break;\n\n\t case AUTHORITY:\n\t if (char == '@') {\n\t if (seenAt) buffer = '%40' + buffer;\n\t seenAt = true;\n\t bufferCodePoints = arrayFrom(buffer);\n\t for (var i = 0; i < bufferCodePoints.length; i++) {\n\t var codePoint = bufferCodePoints[i];\n\t if (codePoint == ':' && !seenPasswordToken) {\n\t seenPasswordToken = true;\n\t continue;\n\t }\n\t var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n\t if (seenPasswordToken) url.password += encodedCodePoints;\n\t else url.username += encodedCodePoints;\n\t }\n\t buffer = '';\n\t } else if (\n\t char == EOF || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial(url))\n\t ) {\n\t if (seenAt && buffer == '') return INVALID_AUTHORITY;\n\t pointer -= arrayFrom(buffer).length + 1;\n\t buffer = '';\n\t state = HOST;\n\t } else buffer += char;\n\t break;\n\n\t case HOST:\n\t case HOSTNAME:\n\t if (stateOverride && url.scheme == 'file') {\n\t state = FILE_HOST;\n\t continue;\n\t } else if (char == ':' && !seenBracket) {\n\t if (buffer == '') return INVALID_HOST;\n\t failure = parseHost(url, buffer);\n\t if (failure) return failure;\n\t buffer = '';\n\t state = PORT;\n\t if (stateOverride == HOSTNAME) return;\n\t } else if (\n\t char == EOF || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial(url))\n\t ) {\n\t if (isSpecial(url) && buffer == '') return INVALID_HOST;\n\t if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n\t failure = parseHost(url, buffer);\n\t if (failure) return failure;\n\t buffer = '';\n\t state = PATH_START;\n\t if (stateOverride) return;\n\t continue;\n\t } else {\n\t if (char == '[') seenBracket = true;\n\t else if (char == ']') seenBracket = false;\n\t buffer += char;\n\t } break;\n\n\t case PORT:\n\t if (DIGIT.test(char)) {\n\t buffer += char;\n\t } else if (\n\t char == EOF || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial(url)) ||\n\t stateOverride\n\t ) {\n\t if (buffer != '') {\n\t var port = parseInt(buffer, 10);\n\t if (port > 0xFFFF) return INVALID_PORT;\n\t url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n\t buffer = '';\n\t }\n\t if (stateOverride) return;\n\t state = PATH_START;\n\t continue;\n\t } else return INVALID_PORT;\n\t break;\n\n\t case FILE:\n\t url.scheme = 'file';\n\t if (char == '/' || char == '\\\\') state = FILE_SLASH;\n\t else if (base && base.scheme == 'file') {\n\t if (char == EOF) {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t } else if (char == '?') {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = '';\n\t state = QUERY;\n\t } else if (char == '#') {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else {\n\t if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t shortenURLsPath(url);\n\t }\n\t state = PATH;\n\t continue;\n\t }\n\t } else {\n\t state = PATH;\n\t continue;\n\t } break;\n\n\t case FILE_SLASH:\n\t if (char == '/' || char == '\\\\') {\n\t state = FILE_HOST;\n\t break;\n\t }\n\t if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n\t if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n\t else url.host = base.host;\n\t }\n\t state = PATH;\n\t continue;\n\n\t case FILE_HOST:\n\t if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n\t if (!stateOverride && isWindowsDriveLetter(buffer)) {\n\t state = PATH;\n\t } else if (buffer == '') {\n\t url.host = '';\n\t if (stateOverride) return;\n\t state = PATH_START;\n\t } else {\n\t failure = parseHost(url, buffer);\n\t if (failure) return failure;\n\t if (url.host == 'localhost') url.host = '';\n\t if (stateOverride) return;\n\t buffer = '';\n\t state = PATH_START;\n\t } continue;\n\t } else buffer += char;\n\t break;\n\n\t case PATH_START:\n\t if (isSpecial(url)) {\n\t state = PATH;\n\t if (char != '/' && char != '\\\\') continue;\n\t } else if (!stateOverride && char == '?') {\n\t url.query = '';\n\t state = QUERY;\n\t } else if (!stateOverride && char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else if (char != EOF) {\n\t state = PATH;\n\t if (char != '/') continue;\n\t } break;\n\n\t case PATH:\n\t if (\n\t char == EOF || char == '/' ||\n\t (char == '\\\\' && isSpecial(url)) ||\n\t (!stateOverride && (char == '?' || char == '#'))\n\t ) {\n\t if (isDoubleDot(buffer)) {\n\t shortenURLsPath(url);\n\t if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n\t url.path.push('');\n\t }\n\t } else if (isSingleDot(buffer)) {\n\t if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n\t url.path.push('');\n\t }\n\t } else {\n\t if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n\t if (url.host) url.host = '';\n\t buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n\t }\n\t url.path.push(buffer);\n\t }\n\t buffer = '';\n\t if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n\t while (url.path.length > 1 && url.path[0] === '') {\n\t url.path.shift();\n\t }\n\t }\n\t if (char == '?') {\n\t url.query = '';\n\t state = QUERY;\n\t } else if (char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t }\n\t } else {\n\t buffer += percentEncode(char, pathPercentEncodeSet);\n\t } break;\n\n\t case CANNOT_BE_A_BASE_URL_PATH:\n\t if (char == '?') {\n\t url.query = '';\n\t state = QUERY;\n\t } else if (char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else if (char != EOF) {\n\t url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n\t } break;\n\n\t case QUERY:\n\t if (!stateOverride && char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else if (char != EOF) {\n\t if (char == \"'\" && isSpecial(url)) url.query += '%27';\n\t else if (char == '#') url.query += '%23';\n\t else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n\t } break;\n\n\t case FRAGMENT:\n\t if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n\t break;\n\t }\n\n\t pointer++;\n\t }\n\t};\n\n\t// `URL` constructor\n\t// https://url.spec.whatwg.org/#url-class\n\tvar URLConstructor = function URL(url /* , base */) {\n\t var that = anInstance(this, URLConstructor, 'URL');\n\t var base = arguments.length > 1 ? arguments[1] : undefined;\n\t var urlString = String(url);\n\t var state = setInternalState$5(that, { type: 'URL' });\n\t var baseState, failure;\n\t if (base !== undefined) {\n\t if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n\t else {\n\t failure = parseURL(baseState = {}, String(base));\n\t if (failure) throw TypeError(failure);\n\t }\n\t }\n\t failure = parseURL(state, urlString, null, baseState);\n\t if (failure) throw TypeError(failure);\n\t var searchParams = state.searchParams = new URLSearchParams$1();\n\t var searchParamsState = getInternalSearchParamsState(searchParams);\n\t searchParamsState.updateSearchParams(state.query);\n\t searchParamsState.updateURL = function () {\n\t state.query = String(searchParams) || null;\n\t };\n\t if (!descriptors) {\n\t that.href = serializeURL.call(that);\n\t that.origin = getOrigin.call(that);\n\t that.protocol = getProtocol.call(that);\n\t that.username = getUsername.call(that);\n\t that.password = getPassword.call(that);\n\t that.host = getHost.call(that);\n\t that.hostname = getHostname.call(that);\n\t that.port = getPort.call(that);\n\t that.pathname = getPathname.call(that);\n\t that.search = getSearch.call(that);\n\t that.searchParams = getSearchParams.call(that);\n\t that.hash = getHash.call(that);\n\t }\n\t};\n\n\tvar URLPrototype = URLConstructor.prototype;\n\n\tvar serializeURL = function () {\n\t var url = getInternalURLState(this);\n\t var scheme = url.scheme;\n\t var username = url.username;\n\t var password = url.password;\n\t var host = url.host;\n\t var port = url.port;\n\t var path = url.path;\n\t var query = url.query;\n\t var fragment = url.fragment;\n\t var output = scheme + ':';\n\t if (host !== null) {\n\t output += '//';\n\t if (includesCredentials(url)) {\n\t output += username + (password ? ':' + password : '') + '@';\n\t }\n\t output += serializeHost(host);\n\t if (port !== null) output += ':' + port;\n\t } else if (scheme == 'file') output += '//';\n\t output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t if (query !== null) output += '?' + query;\n\t if (fragment !== null) output += '#' + fragment;\n\t return output;\n\t};\n\n\tvar getOrigin = function () {\n\t var url = getInternalURLState(this);\n\t var scheme = url.scheme;\n\t var port = url.port;\n\t if (scheme == 'blob') try {\n\t return new URL(scheme.path[0]).origin;\n\t } catch (error) {\n\t return 'null';\n\t }\n\t if (scheme == 'file' || !isSpecial(url)) return 'null';\n\t return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n\t};\n\n\tvar getProtocol = function () {\n\t return getInternalURLState(this).scheme + ':';\n\t};\n\n\tvar getUsername = function () {\n\t return getInternalURLState(this).username;\n\t};\n\n\tvar getPassword = function () {\n\t return getInternalURLState(this).password;\n\t};\n\n\tvar getHost = function () {\n\t var url = getInternalURLState(this);\n\t var host = url.host;\n\t var port = url.port;\n\t return host === null ? ''\n\t : port === null ? serializeHost(host)\n\t : serializeHost(host) + ':' + port;\n\t};\n\n\tvar getHostname = function () {\n\t var host = getInternalURLState(this).host;\n\t return host === null ? '' : serializeHost(host);\n\t};\n\n\tvar getPort = function () {\n\t var port = getInternalURLState(this).port;\n\t return port === null ? '' : String(port);\n\t};\n\n\tvar getPathname = function () {\n\t var url = getInternalURLState(this);\n\t var path = url.path;\n\t return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t};\n\n\tvar getSearch = function () {\n\t var query = getInternalURLState(this).query;\n\t return query ? '?' + query : '';\n\t};\n\n\tvar getSearchParams = function () {\n\t return getInternalURLState(this).searchParams;\n\t};\n\n\tvar getHash = function () {\n\t var fragment = getInternalURLState(this).fragment;\n\t return fragment ? '#' + fragment : '';\n\t};\n\n\tvar accessorDescriptor = function (getter, setter) {\n\t return { get: getter, set: setter, configurable: true, enumerable: true };\n\t};\n\n\tif (descriptors) {\n\t objectDefineProperties(URLPrototype, {\n\t // `URL.prototype.href` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-href\n\t href: accessorDescriptor(serializeURL, function (href) {\n\t var url = getInternalURLState(this);\n\t var urlString = String(href);\n\t var failure = parseURL(url, urlString);\n\t if (failure) throw TypeError(failure);\n\t getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n\t }),\n\t // `URL.prototype.origin` getter\n\t // https://url.spec.whatwg.org/#dom-url-origin\n\t origin: accessorDescriptor(getOrigin),\n\t // `URL.prototype.protocol` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-protocol\n\t protocol: accessorDescriptor(getProtocol, function (protocol) {\n\t var url = getInternalURLState(this);\n\t parseURL(url, String(protocol) + ':', SCHEME_START);\n\t }),\n\t // `URL.prototype.username` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-username\n\t username: accessorDescriptor(getUsername, function (username) {\n\t var url = getInternalURLState(this);\n\t var codePoints = arrayFrom(String(username));\n\t if (cannotHaveUsernamePasswordPort(url)) return;\n\t url.username = '';\n\t for (var i = 0; i < codePoints.length; i++) {\n\t url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n\t }\n\t }),\n\t // `URL.prototype.password` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-password\n\t password: accessorDescriptor(getPassword, function (password) {\n\t var url = getInternalURLState(this);\n\t var codePoints = arrayFrom(String(password));\n\t if (cannotHaveUsernamePasswordPort(url)) return;\n\t url.password = '';\n\t for (var i = 0; i < codePoints.length; i++) {\n\t url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n\t }\n\t }),\n\t // `URL.prototype.host` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-host\n\t host: accessorDescriptor(getHost, function (host) {\n\t var url = getInternalURLState(this);\n\t if (url.cannotBeABaseURL) return;\n\t parseURL(url, String(host), HOST);\n\t }),\n\t // `URL.prototype.hostname` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-hostname\n\t hostname: accessorDescriptor(getHostname, function (hostname) {\n\t var url = getInternalURLState(this);\n\t if (url.cannotBeABaseURL) return;\n\t parseURL(url, String(hostname), HOSTNAME);\n\t }),\n\t // `URL.prototype.port` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-port\n\t port: accessorDescriptor(getPort, function (port) {\n\t var url = getInternalURLState(this);\n\t if (cannotHaveUsernamePasswordPort(url)) return;\n\t port = String(port);\n\t if (port == '') url.port = null;\n\t else parseURL(url, port, PORT);\n\t }),\n\t // `URL.prototype.pathname` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-pathname\n\t pathname: accessorDescriptor(getPathname, function (pathname) {\n\t var url = getInternalURLState(this);\n\t if (url.cannotBeABaseURL) return;\n\t url.path = [];\n\t parseURL(url, pathname + '', PATH_START);\n\t }),\n\t // `URL.prototype.search` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-search\n\t search: accessorDescriptor(getSearch, function (search) {\n\t var url = getInternalURLState(this);\n\t search = String(search);\n\t if (search == '') {\n\t url.query = null;\n\t } else {\n\t if ('?' == search.charAt(0)) search = search.slice(1);\n\t url.query = '';\n\t parseURL(url, search, QUERY);\n\t }\n\t getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n\t }),\n\t // `URL.prototype.searchParams` getter\n\t // https://url.spec.whatwg.org/#dom-url-searchparams\n\t searchParams: accessorDescriptor(getSearchParams),\n\t // `URL.prototype.hash` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-hash\n\t hash: accessorDescriptor(getHash, function (hash) {\n\t var url = getInternalURLState(this);\n\t hash = String(hash);\n\t if (hash == '') {\n\t url.fragment = null;\n\t return;\n\t }\n\t if ('#' == hash.charAt(0)) hash = hash.slice(1);\n\t url.fragment = '';\n\t parseURL(url, hash, FRAGMENT);\n\t })\n\t });\n\t}\n\n\t// `URL.prototype.toJSON` method\n\t// https://url.spec.whatwg.org/#dom-url-tojson\n\tredefine(URLPrototype, 'toJSON', function toJSON() {\n\t return serializeURL.call(this);\n\t}, { enumerable: true });\n\n\t// `URL.prototype.toString` method\n\t// https://url.spec.whatwg.org/#URL-stringification-behavior\n\tredefine(URLPrototype, 'toString', function toString() {\n\t return serializeURL.call(this);\n\t}, { enumerable: true });\n\n\tif (NativeURL) {\n\t var nativeCreateObjectURL = NativeURL.createObjectURL;\n\t var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n\t // `URL.createObjectURL` method\n\t // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n\t // eslint-disable-next-line no-unused-vars\n\t if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n\t return nativeCreateObjectURL.apply(NativeURL, arguments);\n\t });\n\t // `URL.revokeObjectURL` method\n\t // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n\t // eslint-disable-next-line no-unused-vars\n\t if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n\t return nativeRevokeObjectURL.apply(NativeURL, arguments);\n\t });\n\t}\n\n\tsetToStringTag(URLConstructor, 'URL');\n\n\t_export({ global: true, forced: !nativeUrl, sham: !descriptors }, {\n\t URL: URLConstructor\n\t});\n\n\tfunction _typeof(obj) {\n\t \"@babel/helpers - typeof\";\n\n\t if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n\t _typeof = function (obj) {\n\t return typeof obj;\n\t };\n\t } else {\n\t _typeof = function (obj) {\n\t return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n\t };\n\t }\n\n\t return _typeof(obj);\n\t}\n\n\tfunction _classCallCheck(instance, Constructor) {\n\t if (!(instance instanceof Constructor)) {\n\t throw new TypeError(\"Cannot call a class as a function\");\n\t }\n\t}\n\n\tfunction _defineProperties(target, props) {\n\t for (var i = 0; i < props.length; i++) {\n\t var descriptor = props[i];\n\t descriptor.enumerable = descriptor.enumerable || false;\n\t descriptor.configurable = true;\n\t if (\"value\" in descriptor) descriptor.writable = true;\n\t Object.defineProperty(target, descriptor.key, descriptor);\n\t }\n\t}\n\n\tfunction _createClass(Constructor, protoProps, staticProps) {\n\t if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n\t if (staticProps) _defineProperties(Constructor, staticProps);\n\t return Constructor;\n\t}\n\n\tfunction _defineProperty(obj, key, value) {\n\t if (key in obj) {\n\t Object.defineProperty(obj, key, {\n\t value: value,\n\t enumerable: true,\n\t configurable: true,\n\t writable: true\n\t });\n\t } else {\n\t obj[key] = value;\n\t }\n\n\t return obj;\n\t}\n\n\tfunction ownKeys$1(object, enumerableOnly) {\n\t var keys = Object.keys(object);\n\n\t if (Object.getOwnPropertySymbols) {\n\t var symbols = Object.getOwnPropertySymbols(object);\n\t if (enumerableOnly) symbols = symbols.filter(function (sym) {\n\t return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n\t });\n\t keys.push.apply(keys, symbols);\n\t }\n\n\t return keys;\n\t}\n\n\tfunction _objectSpread2(target) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t var source = arguments[i] != null ? arguments[i] : {};\n\n\t if (i % 2) {\n\t ownKeys$1(Object(source), true).forEach(function (key) {\n\t _defineProperty(target, key, source[key]);\n\t });\n\t } else if (Object.getOwnPropertyDescriptors) {\n\t Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n\t } else {\n\t ownKeys$1(Object(source)).forEach(function (key) {\n\t Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n\t });\n\t }\n\t }\n\n\t return target;\n\t}\n\n\tfunction _objectWithoutPropertiesLoose(source, excluded) {\n\t if (source == null) return {};\n\t var target = {};\n\t var sourceKeys = Object.keys(source);\n\t var key, i;\n\n\t for (i = 0; i < sourceKeys.length; i++) {\n\t key = sourceKeys[i];\n\t if (excluded.indexOf(key) >= 0) continue;\n\t target[key] = source[key];\n\t }\n\n\t return target;\n\t}\n\n\tfunction _objectWithoutProperties(source, excluded) {\n\t if (source == null) return {};\n\n\t var target = _objectWithoutPropertiesLoose(source, excluded);\n\n\t var key, i;\n\n\t if (Object.getOwnPropertySymbols) {\n\t var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n\t for (i = 0; i < sourceSymbolKeys.length; i++) {\n\t key = sourceSymbolKeys[i];\n\t if (excluded.indexOf(key) >= 0) continue;\n\t if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n\t target[key] = source[key];\n\t }\n\t }\n\n\t return target;\n\t}\n\n\tfunction _slicedToArray(arr, i) {\n\t return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n\t}\n\n\tfunction _toConsumableArray(arr) {\n\t return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n\t}\n\n\tfunction _arrayWithoutHoles(arr) {\n\t if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n\t}\n\n\tfunction _arrayWithHoles(arr) {\n\t if (Array.isArray(arr)) return arr;\n\t}\n\n\tfunction _iterableToArray(iter) {\n\t if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n\t}\n\n\tfunction _iterableToArrayLimit(arr, i) {\n\t if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n\t var _arr = [];\n\t var _n = true;\n\t var _d = false;\n\t var _e = undefined;\n\n\t try {\n\t for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n\t _arr.push(_s.value);\n\n\t if (i && _arr.length === i) break;\n\t }\n\t } catch (err) {\n\t _d = true;\n\t _e = err;\n\t } finally {\n\t try {\n\t if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n\t } finally {\n\t if (_d) throw _e;\n\t }\n\t }\n\n\t return _arr;\n\t}\n\n\tfunction _unsupportedIterableToArray(o, minLen) {\n\t if (!o) return;\n\t if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n\t var n = Object.prototype.toString.call(o).slice(8, -1);\n\t if (n === \"Object\" && o.constructor) n = o.constructor.name;\n\t if (n === \"Map\" || n === \"Set\") return Array.from(o);\n\t if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n\t}\n\n\tfunction _arrayLikeToArray(arr, len) {\n\t if (len == null || len > arr.length) len = arr.length;\n\n\t for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n\t return arr2;\n\t}\n\n\tfunction _nonIterableSpread() {\n\t throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t}\n\n\tfunction _nonIterableRest() {\n\t throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t}\n\n\t(function (global) {\n\t /**\r\n\t * Polyfill URLSearchParams\r\n\t *\r\n\t * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n\t */\n\t var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() {\n\t try {\n\t return !!Symbol.iterator;\n\t } catch (error) {\n\t return false;\n\t }\n\t };\n\n\t var iteratorSupported = checkIfIteratorIsSupported();\n\n\t var createIterator = function createIterator(items) {\n\t var iterator = {\n\t next: function next() {\n\t var value = items.shift();\n\t return {\n\t done: value === void 0,\n\t value: value\n\t };\n\t }\n\t };\n\n\t if (iteratorSupported) {\n\t iterator[Symbol.iterator] = function () {\n\t return iterator;\n\t };\n\t }\n\n\t return iterator;\n\t };\n\t /**\r\n\t * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n\t * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n\t */\n\n\n\t var serializeParam = function serializeParam(value) {\n\t return encodeURIComponent(value).replace(/%20/g, '+');\n\t };\n\n\t var deserializeParam = function deserializeParam(value) {\n\t return decodeURIComponent(String(value).replace(/\\+/g, ' '));\n\t };\n\n\t var polyfillURLSearchParams = function polyfillURLSearchParams() {\n\t var URLSearchParams = function URLSearchParams(searchString) {\n\t Object.defineProperty(this, '_entries', {\n\t writable: true,\n\t value: {}\n\t });\n\n\t var typeofSearchString = _typeof(searchString);\n\n\t if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n\t if (searchString !== '') {\n\t this._fromString(searchString);\n\t }\n\t } else if (searchString instanceof URLSearchParams) {\n\t var _this = this;\n\n\t searchString.forEach(function (value, name) {\n\t _this.append(name, value);\n\t });\n\t } else if (searchString !== null && typeofSearchString === 'object') {\n\t if (Object.prototype.toString.call(searchString) === '[object Array]') {\n\t for (var i = 0; i < searchString.length; i++) {\n\t var entry = searchString[i];\n\n\t if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n\t this.append(entry[0], entry[1]);\n\t } else {\n\t throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n\t }\n\t }\n\t } else {\n\t for (var key in searchString) {\n\t if (searchString.hasOwnProperty(key)) {\n\t this.append(key, searchString[key]);\n\t }\n\t }\n\t }\n\t } else {\n\t throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n\t }\n\t };\n\n\t var proto = URLSearchParams.prototype;\n\n\t proto.append = function (name, value) {\n\t if (name in this._entries) {\n\t this._entries[name].push(String(value));\n\t } else {\n\t this._entries[name] = [String(value)];\n\t }\n\t };\n\n\t proto.delete = function (name) {\n\t delete this._entries[name];\n\t };\n\n\t proto.get = function (name) {\n\t return name in this._entries ? this._entries[name][0] : null;\n\t };\n\n\t proto.getAll = function (name) {\n\t return name in this._entries ? this._entries[name].slice(0) : [];\n\t };\n\n\t proto.has = function (name) {\n\t return name in this._entries;\n\t };\n\n\t proto.set = function (name, value) {\n\t this._entries[name] = [String(value)];\n\t };\n\n\t proto.forEach = function (callback, thisArg) {\n\t var entries;\n\n\t for (var name in this._entries) {\n\t if (this._entries.hasOwnProperty(name)) {\n\t entries = this._entries[name];\n\n\t for (var i = 0; i < entries.length; i++) {\n\t callback.call(thisArg, entries[i], name, this);\n\t }\n\t }\n\t }\n\t };\n\n\t proto.keys = function () {\n\t var items = [];\n\t this.forEach(function (value, name) {\n\t items.push(name);\n\t });\n\t return createIterator(items);\n\t };\n\n\t proto.values = function () {\n\t var items = [];\n\t this.forEach(function (value) {\n\t items.push(value);\n\t });\n\t return createIterator(items);\n\t };\n\n\t proto.entries = function () {\n\t var items = [];\n\t this.forEach(function (value, name) {\n\t items.push([name, value]);\n\t });\n\t return createIterator(items);\n\t };\n\n\t if (iteratorSupported) {\n\t proto[Symbol.iterator] = proto.entries;\n\t }\n\n\t proto.toString = function () {\n\t var searchArray = [];\n\t this.forEach(function (value, name) {\n\t searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n\t });\n\t return searchArray.join('&');\n\t };\n\n\t global.URLSearchParams = URLSearchParams;\n\t };\n\n\t var checkIfURLSearchParamsSupported = function checkIfURLSearchParamsSupported() {\n\t try {\n\t var URLSearchParams = global.URLSearchParams;\n\t return new URLSearchParams('?a=1').toString() === 'a=1' && typeof URLSearchParams.prototype.set === 'function';\n\t } catch (e) {\n\t return false;\n\t }\n\t };\n\n\t if (!checkIfURLSearchParamsSupported()) {\n\t polyfillURLSearchParams();\n\t }\n\n\t var proto = global.URLSearchParams.prototype;\n\n\t if (typeof proto.sort !== 'function') {\n\t proto.sort = function () {\n\t var _this = this;\n\n\t var items = [];\n\t this.forEach(function (value, name) {\n\t items.push([name, value]);\n\n\t if (!_this._entries) {\n\t _this.delete(name);\n\t }\n\t });\n\t items.sort(function (a, b) {\n\t if (a[0] < b[0]) {\n\t return -1;\n\t } else if (a[0] > b[0]) {\n\t return +1;\n\t } else {\n\t return 0;\n\t }\n\t });\n\n\t if (_this._entries) {\n\t // force reset because IE keeps keys index\n\t _this._entries = {};\n\t }\n\n\t for (var i = 0; i < items.length; i++) {\n\t this.append(items[i][0], items[i][1]);\n\t }\n\t };\n\t }\n\n\t if (typeof proto._fromString !== 'function') {\n\t Object.defineProperty(proto, '_fromString', {\n\t enumerable: false,\n\t configurable: false,\n\t writable: false,\n\t value: function value(searchString) {\n\t if (this._entries) {\n\t this._entries = {};\n\t } else {\n\t var keys = [];\n\t this.forEach(function (value, name) {\n\t keys.push(name);\n\t });\n\n\t for (var i = 0; i < keys.length; i++) {\n\t this.delete(keys[i]);\n\t }\n\t }\n\n\t searchString = searchString.replace(/^\\?/, '');\n\t var attributes = searchString.split('&');\n\t var attribute;\n\n\t for (var i = 0; i < attributes.length; i++) {\n\t attribute = attributes[i].split('=');\n\t this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n\t }\n\t }\n\t });\n\t } // HTMLAnchorElement\n\n\t})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n\t(function (global) {\n\t /**\r\n\t * Polyfill URL\r\n\t *\r\n\t * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n\t */\n\t var checkIfURLIsSupported = function checkIfURLIsSupported() {\n\t try {\n\t var u = new global.URL('b', 'http://a');\n\t u.pathname = 'c d';\n\t return u.href === 'http://a/c%20d' && u.searchParams;\n\t } catch (e) {\n\t return false;\n\t }\n\t };\n\n\t var polyfillURL = function polyfillURL() {\n\t var _URL = global.URL;\n\n\t var URL = function URL(url, base) {\n\t if (typeof url !== 'string') url = String(url); // Only create another document if the base is different from current location.\n\n\t var doc = document,\n\t baseElement;\n\n\t if (base && (global.location === void 0 || base !== global.location.href)) {\n\t doc = document.implementation.createHTMLDocument('');\n\t baseElement = doc.createElement('base');\n\t baseElement.href = base;\n\t doc.head.appendChild(baseElement);\n\n\t try {\n\t if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n\t } catch (err) {\n\t throw new Error('URL unable to set base ' + base + ' due to ' + err);\n\t }\n\t }\n\n\t var anchorElement = doc.createElement('a');\n\t anchorElement.href = url;\n\n\t if (baseElement) {\n\t doc.body.appendChild(anchorElement);\n\t anchorElement.href = anchorElement.href; // force href to refresh\n\t }\n\n\t if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href)) {\n\t throw new TypeError('Invalid URL');\n\t }\n\n\t Object.defineProperty(this, '_anchorElement', {\n\t value: anchorElement\n\t }); // create a linked searchParams which reflect its changes on URL\n\n\t var searchParams = new global.URLSearchParams(this.search);\n\t var enableSearchUpdate = true;\n\t var enableSearchParamsUpdate = true;\n\n\t var _this = this;\n\n\t ['append', 'delete', 'set'].forEach(function (methodName) {\n\t var method = searchParams[methodName];\n\n\t searchParams[methodName] = function () {\n\t method.apply(searchParams, arguments);\n\n\t if (enableSearchUpdate) {\n\t enableSearchParamsUpdate = false;\n\t _this.search = searchParams.toString();\n\t enableSearchParamsUpdate = true;\n\t }\n\t };\n\t });\n\t Object.defineProperty(this, 'searchParams', {\n\t value: searchParams,\n\t enumerable: true\n\t });\n\t var search = void 0;\n\t Object.defineProperty(this, '_updateSearchParams', {\n\t enumerable: false,\n\t configurable: false,\n\t writable: false,\n\t value: function value() {\n\t if (this.search !== search) {\n\t search = this.search;\n\n\t if (enableSearchParamsUpdate) {\n\t enableSearchUpdate = false;\n\n\t this.searchParams._fromString(this.search);\n\n\t enableSearchUpdate = true;\n\t }\n\t }\n\t }\n\t });\n\t };\n\n\t var proto = URL.prototype;\n\n\t var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) {\n\t Object.defineProperty(proto, attributeName, {\n\t get: function get() {\n\t return this._anchorElement[attributeName];\n\t },\n\t set: function set(value) {\n\t this._anchorElement[attributeName] = value;\n\t },\n\t enumerable: true\n\t });\n\t };\n\n\t ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n\t linkURLWithAnchorAttribute(attributeName);\n\t });\n\t Object.defineProperty(proto, 'search', {\n\t get: function get() {\n\t return this._anchorElement['search'];\n\t },\n\t set: function set(value) {\n\t this._anchorElement['search'] = value;\n\n\t this._updateSearchParams();\n\t },\n\t enumerable: true\n\t });\n\t Object.defineProperties(proto, {\n\t 'toString': {\n\t get: function get() {\n\t var _this = this;\n\n\t return function () {\n\t return _this.href;\n\t };\n\t }\n\t },\n\t 'href': {\n\t get: function get() {\n\t return this._anchorElement.href.replace(/\\?$/, '');\n\t },\n\t set: function set(value) {\n\t this._anchorElement.href = value;\n\n\t this._updateSearchParams();\n\t },\n\t enumerable: true\n\t },\n\t 'pathname': {\n\t get: function get() {\n\t return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n\t },\n\t set: function set(value) {\n\t this._anchorElement.pathname = value;\n\t },\n\t enumerable: true\n\t },\n\t 'origin': {\n\t get: function get() {\n\t // get expected port from protocol\n\t var expectedPort = {\n\t 'http:': 80,\n\t 'https:': 443,\n\t 'ftp:': 21\n\t }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port\n\t // and it is not empty f.e http://foo:8080\n\t // 8080 != 80 && 8080 != ''\n\n\t var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n\t return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n\t },\n\t enumerable: true\n\t },\n\t 'password': {\n\t // TODO\n\t get: function get() {\n\t return '';\n\t },\n\t set: function set(value) {},\n\t enumerable: true\n\t },\n\t 'username': {\n\t // TODO\n\t get: function get() {\n\t return '';\n\t },\n\t set: function set(value) {},\n\t enumerable: true\n\t }\n\t });\n\n\t URL.createObjectURL = function (blob) {\n\t return _URL.createObjectURL.apply(_URL, arguments);\n\t };\n\n\t URL.revokeObjectURL = function (url) {\n\t return _URL.revokeObjectURL.apply(_URL, arguments);\n\t };\n\n\t global.URL = URL;\n\t };\n\n\t if (!checkIfURLIsSupported()) {\n\t polyfillURL();\n\t }\n\n\t if (global.location !== void 0 && !('origin' in global.location)) {\n\t var getOrigin = function getOrigin() {\n\t return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n\t };\n\n\t try {\n\t Object.defineProperty(global.location, 'origin', {\n\t get: getOrigin,\n\t enumerable: true\n\t });\n\t } catch (e) {\n\t setInterval(function () {\n\t global.location.origin = getOrigin();\n\t }, 100);\n\t }\n\t }\n\t})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n\t// `Symbol.asyncIterator` well-known symbol\n\t// https://tc39.github.io/ecma262/#sec-symbol.asynciterator\n\tdefineWellKnownSymbol('asyncIterator');\n\n\tvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n\tvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n\t// We can't use this feature detection in V8 since it causes\n\t// deoptimization and serious performance degradation\n\t// https://github.com/zloirock/core-js/issues/679\n\tvar IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\n\t var array = [];\n\t array[IS_CONCAT_SPREADABLE] = false;\n\t return array.concat()[0] !== array;\n\t});\n\n\tvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\n\tvar isConcatSpreadable = function (O) {\n\t if (!isObject(O)) return false;\n\t var spreadable = O[IS_CONCAT_SPREADABLE];\n\t return spreadable !== undefined ? !!spreadable : isArray(O);\n\t};\n\n\tvar FORCED$1 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n\t// `Array.prototype.concat` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n\t// with adding support of @@isConcatSpreadable and @@species\n\t_export({ target: 'Array', proto: true, forced: FORCED$1 }, {\n\t concat: function concat(arg) { // eslint-disable-line no-unused-vars\n\t var O = toObject(this);\n\t var A = arraySpeciesCreate(O, 0);\n\t var n = 0;\n\t var i, k, length, len, E;\n\t for (i = -1, length = arguments.length; i < length; i++) {\n\t E = i === -1 ? O : arguments[i];\n\t if (isConcatSpreadable(E)) {\n\t len = toLength(E.length);\n\t if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n\t } else {\n\t if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t createProperty(A, n++, E);\n\t }\n\t }\n\t A.length = n;\n\t return A;\n\t }\n\t});\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\t_export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\n\t assign: objectAssign\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\n\n\tvar FAILS_ON_PRIMITIVES$1 = fails(function () { nativeGetOwnPropertyDescriptor$2(1); });\n\tvar FORCED$2 = !descriptors || FAILS_ON_PRIMITIVES$1;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\t_export({ target: 'Object', stat: true, forced: FORCED$2, sham: !descriptors }, {\n\t getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n\t return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key);\n\t }\n\t});\n\n\tvar nativePromiseConstructor = global_1.Promise;\n\n\tvar iterate_1 = createCommonjsModule(function (module) {\n\tvar Result = function (stopped, result) {\n\t this.stopped = stopped;\n\t this.result = result;\n\t};\n\n\tvar iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) {\n\t var boundFunction = functionBindContext(fn, that, AS_ENTRIES ? 2 : 1);\n\t var iterator, iterFn, index, length, result, next, step;\n\n\t if (IS_ITERATOR) {\n\t iterator = iterable;\n\t } else {\n\t iterFn = getIteratorMethod(iterable);\n\t if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n\t // optimisation for array iterators\n\t if (isArrayIteratorMethod(iterFn)) {\n\t for (index = 0, length = toLength(iterable.length); length > index; index++) {\n\t result = AS_ENTRIES\n\t ? boundFunction(anObject(step = iterable[index])[0], step[1])\n\t : boundFunction(iterable[index]);\n\t if (result && result instanceof Result) return result;\n\t } return new Result(false);\n\t }\n\t iterator = iterFn.call(iterable);\n\t }\n\n\t next = iterator.next;\n\t while (!(step = next.call(iterator)).done) {\n\t result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES);\n\t if (typeof result == 'object' && result && result instanceof Result) return result;\n\t } return new Result(false);\n\t};\n\n\titerate.stop = function (result) {\n\t return new Result(true, result);\n\t};\n\t});\n\n\tvar engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent);\n\n\tvar location = global_1.location;\n\tvar set$1 = global_1.setImmediate;\n\tvar clear = global_1.clearImmediate;\n\tvar process$2 = global_1.process;\n\tvar MessageChannel = global_1.MessageChannel;\n\tvar Dispatch = global_1.Dispatch;\n\tvar counter = 0;\n\tvar queue = {};\n\tvar ONREADYSTATECHANGE = 'onreadystatechange';\n\tvar defer, channel, port;\n\n\tvar run = function (id) {\n\t // eslint-disable-next-line no-prototype-builtins\n\t if (queue.hasOwnProperty(id)) {\n\t var fn = queue[id];\n\t delete queue[id];\n\t fn();\n\t }\n\t};\n\n\tvar runner = function (id) {\n\t return function () {\n\t run(id);\n\t };\n\t};\n\n\tvar listener = function (event) {\n\t run(event.data);\n\t};\n\n\tvar post = function (id) {\n\t // old engines have not location.origin\n\t global_1.postMessage(id + '', location.protocol + '//' + location.host);\n\t};\n\n\t// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n\tif (!set$1 || !clear) {\n\t set$1 = function setImmediate(fn) {\n\t var args = [];\n\t var i = 1;\n\t while (arguments.length > i) args.push(arguments[i++]);\n\t queue[++counter] = function () {\n\t // eslint-disable-next-line no-new-func\n\t (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n\t };\n\t defer(counter);\n\t return counter;\n\t };\n\t clear = function clearImmediate(id) {\n\t delete queue[id];\n\t };\n\t // Node.js 0.8-\n\t if (classofRaw(process$2) == 'process') {\n\t defer = function (id) {\n\t process$2.nextTick(runner(id));\n\t };\n\t // Sphere (JS game engine) Dispatch API\n\t } else if (Dispatch && Dispatch.now) {\n\t defer = function (id) {\n\t Dispatch.now(runner(id));\n\t };\n\t // Browsers with MessageChannel, includes WebWorkers\n\t // except iOS - https://github.com/zloirock/core-js/issues/624\n\t } else if (MessageChannel && !engineIsIos) {\n\t channel = new MessageChannel();\n\t port = channel.port2;\n\t channel.port1.onmessage = listener;\n\t defer = functionBindContext(port.postMessage, port, 1);\n\t // Browsers with postMessage, skip WebWorkers\n\t // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n\t } else if (\n\t global_1.addEventListener &&\n\t typeof postMessage == 'function' &&\n\t !global_1.importScripts &&\n\t !fails(post) &&\n\t location.protocol !== 'file:'\n\t ) {\n\t defer = post;\n\t global_1.addEventListener('message', listener, false);\n\t // IE8-\n\t } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {\n\t defer = function (id) {\n\t html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {\n\t html.removeChild(this);\n\t run(id);\n\t };\n\t };\n\t // Rest old browsers\n\t } else {\n\t defer = function (id) {\n\t setTimeout(runner(id), 0);\n\t };\n\t }\n\t}\n\n\tvar task = {\n\t set: set$1,\n\t clear: clear\n\t};\n\n\tvar getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\n\tvar macrotask = task.set;\n\n\n\tvar MutationObserver$1 = global_1.MutationObserver || global_1.WebKitMutationObserver;\n\tvar process$3 = global_1.process;\n\tvar Promise$1 = global_1.Promise;\n\tvar IS_NODE = classofRaw(process$3) == 'process';\n\t// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\n\tvar queueMicrotaskDescriptor = getOwnPropertyDescriptor$2(global_1, 'queueMicrotask');\n\tvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\n\tvar flush, head, last, notify, toggle, node, promise, then;\n\n\t// modern engines have queueMicrotask method\n\tif (!queueMicrotask) {\n\t flush = function () {\n\t var parent, fn;\n\t if (IS_NODE && (parent = process$3.domain)) parent.exit();\n\t while (head) {\n\t fn = head.fn;\n\t head = head.next;\n\t try {\n\t fn();\n\t } catch (error) {\n\t if (head) notify();\n\t else last = undefined;\n\t throw error;\n\t }\n\t } last = undefined;\n\t if (parent) parent.enter();\n\t };\n\n\t // Node.js\n\t if (IS_NODE) {\n\t notify = function () {\n\t process$3.nextTick(flush);\n\t };\n\t // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n\t } else if (MutationObserver$1 && !engineIsIos) {\n\t toggle = true;\n\t node = document.createTextNode('');\n\t new MutationObserver$1(flush).observe(node, { characterData: true });\n\t notify = function () {\n\t node.data = toggle = !toggle;\n\t };\n\t // environments with maybe non-completely correct, but existent Promise\n\t } else if (Promise$1 && Promise$1.resolve) {\n\t // Promise.resolve without an argument throws an error in LG WebOS 2\n\t promise = Promise$1.resolve(undefined);\n\t then = promise.then;\n\t notify = function () {\n\t then.call(promise, flush);\n\t };\n\t // for other environments - macrotask based on:\n\t // - setImmediate\n\t // - MessageChannel\n\t // - window.postMessag\n\t // - onreadystatechange\n\t // - setTimeout\n\t } else {\n\t notify = function () {\n\t // strange IE + webpack dev server bug - use .call(global)\n\t macrotask.call(global_1, flush);\n\t };\n\t }\n\t}\n\n\tvar microtask = queueMicrotask || function (fn) {\n\t var task = { fn: fn, next: undefined };\n\t if (last) last.next = task;\n\t if (!head) {\n\t head = task;\n\t notify();\n\t } last = task;\n\t};\n\n\tvar PromiseCapability = function (C) {\n\t var resolve, reject;\n\t this.promise = new C(function ($$resolve, $$reject) {\n\t if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n\t resolve = $$resolve;\n\t reject = $$reject;\n\t });\n\t this.resolve = aFunction$1(resolve);\n\t this.reject = aFunction$1(reject);\n\t};\n\n\t// 25.4.1.5 NewPromiseCapability(C)\n\tvar f$7 = function (C) {\n\t return new PromiseCapability(C);\n\t};\n\n\tvar newPromiseCapability = {\n\t\tf: f$7\n\t};\n\n\tvar promiseResolve = function (C, x) {\n\t anObject(C);\n\t if (isObject(x) && x.constructor === C) return x;\n\t var promiseCapability = newPromiseCapability.f(C);\n\t var resolve = promiseCapability.resolve;\n\t resolve(x);\n\t return promiseCapability.promise;\n\t};\n\n\tvar hostReportErrors = function (a, b) {\n\t var console = global_1.console;\n\t if (console && console.error) {\n\t arguments.length === 1 ? console.error(a) : console.error(a, b);\n\t }\n\t};\n\n\tvar perform = function (exec) {\n\t try {\n\t return { error: false, value: exec() };\n\t } catch (error) {\n\t return { error: true, value: error };\n\t }\n\t};\n\n\tvar task$1 = task.set;\n\n\n\n\n\n\n\n\n\n\n\tvar SPECIES$6 = wellKnownSymbol('species');\n\tvar PROMISE = 'Promise';\n\tvar getInternalState$3 = internalState.get;\n\tvar setInternalState$6 = internalState.set;\n\tvar getInternalPromiseState = internalState.getterFor(PROMISE);\n\tvar PromiseConstructor = nativePromiseConstructor;\n\tvar TypeError$1 = global_1.TypeError;\n\tvar document$2 = global_1.document;\n\tvar process$4 = global_1.process;\n\tvar $fetch$1 = getBuiltIn('fetch');\n\tvar newPromiseCapability$1 = newPromiseCapability.f;\n\tvar newGenericPromiseCapability = newPromiseCapability$1;\n\tvar IS_NODE$1 = classofRaw(process$4) == 'process';\n\tvar DISPATCH_EVENT = !!(document$2 && document$2.createEvent && global_1.dispatchEvent);\n\tvar UNHANDLED_REJECTION = 'unhandledrejection';\n\tvar REJECTION_HANDLED = 'rejectionhandled';\n\tvar PENDING = 0;\n\tvar FULFILLED = 1;\n\tvar REJECTED = 2;\n\tvar HANDLED = 1;\n\tvar UNHANDLED = 2;\n\tvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n\tvar FORCED$3 = isForced_1(PROMISE, function () {\n\t var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n\t if (!GLOBAL_CORE_JS_PROMISE) {\n\t // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n\t // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n\t // We can't detect it synchronously, so just check versions\n\t if (engineV8Version === 66) return true;\n\t // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n\t if (!IS_NODE$1 && typeof PromiseRejectionEvent != 'function') return true;\n\t }\n\t // We can't use @@species feature detection in V8 since it causes\n\t // deoptimization and performance degradation\n\t // https://github.com/zloirock/core-js/issues/679\n\t if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false;\n\t // Detect correctness of subclassing with @@species support\n\t var promise = PromiseConstructor.resolve(1);\n\t var FakePromise = function (exec) {\n\t exec(function () { /* empty */ }, function () { /* empty */ });\n\t };\n\t var constructor = promise.constructor = {};\n\t constructor[SPECIES$6] = FakePromise;\n\t return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n\t});\n\n\tvar INCORRECT_ITERATION$1 = FORCED$3 || !checkCorrectnessOfIteration(function (iterable) {\n\t PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n\t});\n\n\t// helpers\n\tvar isThenable = function (it) {\n\t var then;\n\t return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n\t};\n\n\tvar notify$1 = function (promise, state, isReject) {\n\t if (state.notified) return;\n\t state.notified = true;\n\t var chain = state.reactions;\n\t microtask(function () {\n\t var value = state.value;\n\t var ok = state.state == FULFILLED;\n\t var index = 0;\n\t // variable length - can't use forEach\n\t while (chain.length > index) {\n\t var reaction = chain[index++];\n\t var handler = ok ? reaction.ok : reaction.fail;\n\t var resolve = reaction.resolve;\n\t var reject = reaction.reject;\n\t var domain = reaction.domain;\n\t var result, then, exited;\n\t try {\n\t if (handler) {\n\t if (!ok) {\n\t if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n\t state.rejection = HANDLED;\n\t }\n\t if (handler === true) result = value;\n\t else {\n\t if (domain) domain.enter();\n\t result = handler(value); // can throw\n\t if (domain) {\n\t domain.exit();\n\t exited = true;\n\t }\n\t }\n\t if (result === reaction.promise) {\n\t reject(TypeError$1('Promise-chain cycle'));\n\t } else if (then = isThenable(result)) {\n\t then.call(result, resolve, reject);\n\t } else resolve(result);\n\t } else reject(value);\n\t } catch (error) {\n\t if (domain && !exited) domain.exit();\n\t reject(error);\n\t }\n\t }\n\t state.reactions = [];\n\t state.notified = false;\n\t if (isReject && !state.rejection) onUnhandled(promise, state);\n\t });\n\t};\n\n\tvar dispatchEvent = function (name, promise, reason) {\n\t var event, handler;\n\t if (DISPATCH_EVENT) {\n\t event = document$2.createEvent('Event');\n\t event.promise = promise;\n\t event.reason = reason;\n\t event.initEvent(name, false, true);\n\t global_1.dispatchEvent(event);\n\t } else event = { promise: promise, reason: reason };\n\t if (handler = global_1['on' + name]) handler(event);\n\t else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n\t};\n\n\tvar onUnhandled = function (promise, state) {\n\t task$1.call(global_1, function () {\n\t var value = state.value;\n\t var IS_UNHANDLED = isUnhandled(state);\n\t var result;\n\t if (IS_UNHANDLED) {\n\t result = perform(function () {\n\t if (IS_NODE$1) {\n\t process$4.emit('unhandledRejection', value, promise);\n\t } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n\t });\n\t // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n\t state.rejection = IS_NODE$1 || isUnhandled(state) ? UNHANDLED : HANDLED;\n\t if (result.error) throw result.value;\n\t }\n\t });\n\t};\n\n\tvar isUnhandled = function (state) {\n\t return state.rejection !== HANDLED && !state.parent;\n\t};\n\n\tvar onHandleUnhandled = function (promise, state) {\n\t task$1.call(global_1, function () {\n\t if (IS_NODE$1) {\n\t process$4.emit('rejectionHandled', promise);\n\t } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n\t });\n\t};\n\n\tvar bind = function (fn, promise, state, unwrap) {\n\t return function (value) {\n\t fn(promise, state, value, unwrap);\n\t };\n\t};\n\n\tvar internalReject = function (promise, state, value, unwrap) {\n\t if (state.done) return;\n\t state.done = true;\n\t if (unwrap) state = unwrap;\n\t state.value = value;\n\t state.state = REJECTED;\n\t notify$1(promise, state, true);\n\t};\n\n\tvar internalResolve = function (promise, state, value, unwrap) {\n\t if (state.done) return;\n\t state.done = true;\n\t if (unwrap) state = unwrap;\n\t try {\n\t if (promise === value) throw TypeError$1(\"Promise can't be resolved itself\");\n\t var then = isThenable(value);\n\t if (then) {\n\t microtask(function () {\n\t var wrapper = { done: false };\n\t try {\n\t then.call(value,\n\t bind(internalResolve, promise, wrapper, state),\n\t bind(internalReject, promise, wrapper, state)\n\t );\n\t } catch (error) {\n\t internalReject(promise, wrapper, error, state);\n\t }\n\t });\n\t } else {\n\t state.value = value;\n\t state.state = FULFILLED;\n\t notify$1(promise, state, false);\n\t }\n\t } catch (error) {\n\t internalReject(promise, { done: false }, error, state);\n\t }\n\t};\n\n\t// constructor polyfill\n\tif (FORCED$3) {\n\t // 25.4.3.1 Promise(executor)\n\t PromiseConstructor = function Promise(executor) {\n\t anInstance(this, PromiseConstructor, PROMISE);\n\t aFunction$1(executor);\n\t Internal.call(this);\n\t var state = getInternalState$3(this);\n\t try {\n\t executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n\t } catch (error) {\n\t internalReject(this, state, error);\n\t }\n\t };\n\t // eslint-disable-next-line no-unused-vars\n\t Internal = function Promise(executor) {\n\t setInternalState$6(this, {\n\t type: PROMISE,\n\t done: false,\n\t notified: false,\n\t parent: false,\n\t reactions: [],\n\t rejection: false,\n\t state: PENDING,\n\t value: undefined\n\t });\n\t };\n\t Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n\t // `Promise.prototype.then` method\n\t // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n\t then: function then(onFulfilled, onRejected) {\n\t var state = getInternalPromiseState(this);\n\t var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor));\n\t reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n\t reaction.fail = typeof onRejected == 'function' && onRejected;\n\t reaction.domain = IS_NODE$1 ? process$4.domain : undefined;\n\t state.parent = true;\n\t state.reactions.push(reaction);\n\t if (state.state != PENDING) notify$1(this, state, false);\n\t return reaction.promise;\n\t },\n\t // `Promise.prototype.catch` method\n\t // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n\t 'catch': function (onRejected) {\n\t return this.then(undefined, onRejected);\n\t }\n\t });\n\t OwnPromiseCapability = function () {\n\t var promise = new Internal();\n\t var state = getInternalState$3(promise);\n\t this.promise = promise;\n\t this.resolve = bind(internalResolve, promise, state);\n\t this.reject = bind(internalReject, promise, state);\n\t };\n\t newPromiseCapability.f = newPromiseCapability$1 = function (C) {\n\t return C === PromiseConstructor || C === PromiseWrapper\n\t ? new OwnPromiseCapability(C)\n\t : newGenericPromiseCapability(C);\n\t };\n\n\t if ( typeof nativePromiseConstructor == 'function') {\n\t nativeThen = nativePromiseConstructor.prototype.then;\n\n\t // wrap native Promise#then for native async functions\n\t redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) {\n\t var that = this;\n\t return new PromiseConstructor(function (resolve, reject) {\n\t nativeThen.call(that, resolve, reject);\n\t }).then(onFulfilled, onRejected);\n\t // https://github.com/zloirock/core-js/issues/640\n\t }, { unsafe: true });\n\n\t // wrap fetch result\n\t if (typeof $fetch$1 == 'function') _export({ global: true, enumerable: true, forced: true }, {\n\t // eslint-disable-next-line no-unused-vars\n\t fetch: function fetch(input /* , init */) {\n\t return promiseResolve(PromiseConstructor, $fetch$1.apply(global_1, arguments));\n\t }\n\t });\n\t }\n\t}\n\n\t_export({ global: true, wrap: true, forced: FORCED$3 }, {\n\t Promise: PromiseConstructor\n\t});\n\n\tsetToStringTag(PromiseConstructor, PROMISE, false);\n\tsetSpecies(PROMISE);\n\n\tPromiseWrapper = getBuiltIn(PROMISE);\n\n\t// statics\n\t_export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n\t // `Promise.reject` method\n\t // https://tc39.github.io/ecma262/#sec-promise.reject\n\t reject: function reject(r) {\n\t var capability = newPromiseCapability$1(this);\n\t capability.reject.call(undefined, r);\n\t return capability.promise;\n\t }\n\t});\n\n\t_export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n\t // `Promise.resolve` method\n\t // https://tc39.github.io/ecma262/#sec-promise.resolve\n\t resolve: function resolve(x) {\n\t return promiseResolve( this, x);\n\t }\n\t});\n\n\t_export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {\n\t // `Promise.all` method\n\t // https://tc39.github.io/ecma262/#sec-promise.all\n\t all: function all(iterable) {\n\t var C = this;\n\t var capability = newPromiseCapability$1(C);\n\t var resolve = capability.resolve;\n\t var reject = capability.reject;\n\t var result = perform(function () {\n\t var $promiseResolve = aFunction$1(C.resolve);\n\t var values = [];\n\t var counter = 0;\n\t var remaining = 1;\n\t iterate_1(iterable, function (promise) {\n\t var index = counter++;\n\t var alreadyCalled = false;\n\t values.push(undefined);\n\t remaining++;\n\t $promiseResolve.call(C, promise).then(function (value) {\n\t if (alreadyCalled) return;\n\t alreadyCalled = true;\n\t values[index] = value;\n\t --remaining || resolve(values);\n\t }, reject);\n\t });\n\t --remaining || resolve(values);\n\t });\n\t if (result.error) reject(result.value);\n\t return capability.promise;\n\t },\n\t // `Promise.race` method\n\t // https://tc39.github.io/ecma262/#sec-promise.race\n\t race: function race(iterable) {\n\t var C = this;\n\t var capability = newPromiseCapability$1(C);\n\t var reject = capability.reject;\n\t var result = perform(function () {\n\t var $promiseResolve = aFunction$1(C.resolve);\n\t iterate_1(iterable, function (promise) {\n\t $promiseResolve.call(C, promise).then(capability.resolve, reject);\n\t });\n\t });\n\t if (result.error) reject(result.value);\n\t return capability.promise;\n\t }\n\t});\n\n\t/*! *****************************************************************************\r\n\tCopyright (c) Microsoft Corporation. All rights reserved.\r\n\tLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\n\tthis file except in compliance with the License. You may obtain a copy of the\r\n\tLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n\tTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n\tKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n\tWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n\tMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\n\tSee the Apache Version 2.0 License for specific language governing permissions\r\n\tand limitations under the License.\r\n\t***************************************************************************** */\n\n\t/* global Reflect, Promise */\n\tvar _extendStatics = function extendStatics(d, b) {\n\t _extendStatics = Object.setPrototypeOf || {\n\t __proto__: []\n\t } instanceof Array && function (d, b) {\n\t d.__proto__ = b;\n\t } || function (d, b) {\n\t for (var p in b) {\n\t if (b.hasOwnProperty(p)) d[p] = b[p];\n\t }\n\t };\n\n\t return _extendStatics(d, b);\n\t};\n\n\tfunction __extends(d, b) {\n\t _extendStatics(d, b);\n\n\t function __() {\n\t this.constructor = d;\n\t }\n\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t}\n\n\tvar _assign = function __assign() {\n\t _assign = Object.assign || function __assign(t) {\n\t for (var s, i = 1, n = arguments.length; i < n; i++) {\n\t s = arguments[i];\n\n\t for (var p in s) {\n\t if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n\t }\n\t }\n\n\t return t;\n\t };\n\n\t return _assign.apply(this, arguments);\n\t};\n\tfunction __values(o) {\n\t var s = typeof Symbol === \"function\" && Symbol.iterator,\n\t m = s && o[s],\n\t i = 0;\n\t if (m) return m.call(o);\n\t if (o && typeof o.length === \"number\") return {\n\t next: function next() {\n\t if (o && i >= o.length) o = void 0;\n\t return {\n\t value: o && o[i++],\n\t done: !o\n\t };\n\t }\n\t };\n\t throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n\t}\n\tfunction __read(o, n) {\n\t var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n\t if (!m) return o;\n\t var i = m.call(o),\n\t r,\n\t ar = [],\n\t e;\n\n\t try {\n\t while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n\t ar.push(r.value);\n\t }\n\t } catch (error) {\n\t e = {\n\t error: error\n\t };\n\t } finally {\n\t try {\n\t if (r && !r.done && (m = i[\"return\"])) m.call(i);\n\t } finally {\n\t if (e) throw e.error;\n\t }\n\t }\n\n\t return ar;\n\t}\n\tfunction __spread() {\n\t for (var ar = [], i = 0; i < arguments.length; i++) {\n\t ar = ar.concat(__read(arguments[i]));\n\t }\n\n\t return ar;\n\t}\n\n\t/** JSDoc */\n\tvar Severity;\n\n\t(function (Severity) {\n\t /** JSDoc */\n\t Severity[\"Fatal\"] = \"fatal\";\n\t /** JSDoc */\n\n\t Severity[\"Error\"] = \"error\";\n\t /** JSDoc */\n\n\t Severity[\"Warning\"] = \"warning\";\n\t /** JSDoc */\n\n\t Severity[\"Log\"] = \"log\";\n\t /** JSDoc */\n\n\t Severity[\"Info\"] = \"info\";\n\t /** JSDoc */\n\n\t Severity[\"Debug\"] = \"debug\";\n\t /** JSDoc */\n\n\t Severity[\"Critical\"] = \"critical\";\n\t})(Severity || (Severity = {})); // tslint:disable:completed-docs\n\t// tslint:disable:no-unnecessary-qualifier no-namespace\n\n\n\t(function (Severity) {\n\t /**\n\t * Converts a string-based level into a {@link Severity}.\n\t *\n\t * @param level string representation of Severity\n\t * @returns Severity\n\t */\n\t function fromString(level) {\n\t switch (level) {\n\t case 'debug':\n\t return Severity.Debug;\n\n\t case 'info':\n\t return Severity.Info;\n\n\t case 'warn':\n\t case 'warning':\n\t return Severity.Warning;\n\n\t case 'error':\n\t return Severity.Error;\n\n\t case 'fatal':\n\t return Severity.Fatal;\n\n\t case 'critical':\n\t return Severity.Critical;\n\n\t case 'log':\n\t default:\n\t return Severity.Log;\n\t }\n\t }\n\n\t Severity.fromString = fromString;\n\t})(Severity || (Severity = {}));\n\n\t/** The status of an event. */\n\tvar Status;\n\n\t(function (Status) {\n\t /** The status could not be determined. */\n\t Status[\"Unknown\"] = \"unknown\";\n\t /** The event was skipped due to configuration or callbacks. */\n\n\t Status[\"Skipped\"] = \"skipped\";\n\t /** The event was sent to Sentry successfully. */\n\n\t Status[\"Success\"] = \"success\";\n\t /** The client is currently rate limited and will try again later. */\n\n\t Status[\"RateLimit\"] = \"rate_limit\";\n\t /** The event could not be processed. */\n\n\t Status[\"Invalid\"] = \"invalid\";\n\t /** A server-side error ocurred during submission. */\n\n\t Status[\"Failed\"] = \"failed\";\n\t})(Status || (Status = {})); // tslint:disable:completed-docs\n\t// tslint:disable:no-unnecessary-qualifier no-namespace\n\n\n\t(function (Status) {\n\t /**\n\t * Converts a HTTP status code into a {@link Status}.\n\t *\n\t * @param code The HTTP response status code.\n\t * @returns The send status or {@link Status.Unknown}.\n\t */\n\t function fromHttpCode(code) {\n\t if (code >= 200 && code < 300) {\n\t return Status.Success;\n\t }\n\n\t if (code === 429) {\n\t return Status.RateLimit;\n\t }\n\n\t if (code >= 400 && code < 500) {\n\t return Status.Invalid;\n\t }\n\n\t if (code >= 500) {\n\t return Status.Failed;\n\t }\n\n\t return Status.Unknown;\n\t }\n\n\t Status.fromHttpCode = fromHttpCode;\n\t})(Status || (Status = {}));\n\n\tvar defineProperty$6 = objectDefineProperty.f;\n\n\tvar FunctionPrototype = Function.prototype;\n\tvar FunctionPrototypeToString = FunctionPrototype.toString;\n\tvar nameRE = /^\\s*function ([^ (]*)/;\n\tvar NAME = 'name';\n\n\t// Function instances `.name` property\n\t// https://tc39.github.io/ecma262/#sec-function-instances-name\n\tif (descriptors && !(NAME in FunctionPrototype)) {\n\t defineProperty$6(FunctionPrototype, NAME, {\n\t configurable: true,\n\t get: function () {\n\t try {\n\t return FunctionPrototypeToString.call(this).match(nameRE)[1];\n\t } catch (error) {\n\t return '';\n\t }\n\t }\n\t });\n\t}\n\n\tvar setPrototypeOf = Object.setPrototypeOf || ({\n\t __proto__: []\n\t} instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method\n\n\t/**\n\t * setPrototypeOf polyfill using __proto__\n\t */\n\n\tfunction setProtoOf(obj, proto) {\n\t // @ts-ignore\n\t obj.__proto__ = proto;\n\t return obj;\n\t}\n\t/**\n\t * setPrototypeOf polyfill using mixin\n\t */\n\n\n\tfunction mixinProperties(obj, proto) {\n\t for (var prop in proto) {\n\t if (!obj.hasOwnProperty(prop)) {\n\t // @ts-ignore\n\t obj[prop] = proto[prop];\n\t }\n\t }\n\n\t return obj;\n\t}\n\n\t/** An error emitted by Sentry SDKs and related utilities. */\n\n\tvar SentryError =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(SentryError, _super);\n\n\t function SentryError(message) {\n\t var _newTarget = this.constructor;\n\n\t var _this = _super.call(this, message) || this;\n\n\t _this.message = message; // tslint:disable:no-unsafe-any\n\n\t _this.name = _newTarget.prototype.constructor.name;\n\t setPrototypeOf(_this, _newTarget.prototype);\n\t return _this;\n\t }\n\n\t return SentryError;\n\t}(Error);\n\n\t/**\n\t * Checks whether given value's type is one of a few Error or Error-like\n\t * {@link isError}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\tfunction isError(wat) {\n\t switch (Object.prototype.toString.call(wat)) {\n\t case '[object Error]':\n\t return true;\n\n\t case '[object Exception]':\n\t return true;\n\n\t case '[object DOMException]':\n\t return true;\n\n\t default:\n\t return isInstanceOf(wat, Error);\n\t }\n\t}\n\t/**\n\t * Checks whether given value's type is ErrorEvent\n\t * {@link isErrorEvent}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isErrorEvent(wat) {\n\t return Object.prototype.toString.call(wat) === '[object ErrorEvent]';\n\t}\n\t/**\n\t * Checks whether given value's type is DOMError\n\t * {@link isDOMError}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isDOMError(wat) {\n\t return Object.prototype.toString.call(wat) === '[object DOMError]';\n\t}\n\t/**\n\t * Checks whether given value's type is DOMException\n\t * {@link isDOMException}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isDOMException(wat) {\n\t return Object.prototype.toString.call(wat) === '[object DOMException]';\n\t}\n\t/**\n\t * Checks whether given value's type is a string\n\t * {@link isString}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isString(wat) {\n\t return Object.prototype.toString.call(wat) === '[object String]';\n\t}\n\t/**\n\t * Checks whether given value's is a primitive (undefined, null, number, boolean, string)\n\t * {@link isPrimitive}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isPrimitive(wat) {\n\t return wat === null || _typeof(wat) !== 'object' && typeof wat !== 'function';\n\t}\n\t/**\n\t * Checks whether given value's type is an object literal\n\t * {@link isPlainObject}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isPlainObject(wat) {\n\t return Object.prototype.toString.call(wat) === '[object Object]';\n\t}\n\t/**\n\t * Checks whether given value's type is an Event instance\n\t * {@link isEvent}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isEvent(wat) {\n\t // tslint:disable-next-line:strict-type-predicates\n\t return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n\t}\n\t/**\n\t * Checks whether given value's type is an Element instance\n\t * {@link isElement}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isElement(wat) {\n\t // tslint:disable-next-line:strict-type-predicates\n\t return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n\t}\n\t/**\n\t * Checks whether given value's type is an regexp\n\t * {@link isRegExp}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isRegExp(wat) {\n\t return Object.prototype.toString.call(wat) === '[object RegExp]';\n\t}\n\t/**\n\t * Checks whether given value has a then function.\n\t * @param wat A value to be checked.\n\t */\n\n\tfunction isThenable$1(wat) {\n\t // tslint:disable:no-unsafe-any\n\t return Boolean(wat && wat.then && typeof wat.then === 'function'); // tslint:enable:no-unsafe-any\n\t}\n\t/**\n\t * Checks whether given value's type is a SyntheticEvent\n\t * {@link isSyntheticEvent}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isSyntheticEvent(wat) {\n\t // tslint:disable-next-line:no-unsafe-any\n\t return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n\t}\n\t/**\n\t * Checks whether given value's type is an instance of provided constructor.\n\t * {@link isInstanceOf}.\n\t *\n\t * @param wat A value to be checked.\n\t * @param base A constructor to be used in a check.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isInstanceOf(wat, base) {\n\t try {\n\t // tslint:disable-next-line:no-unsafe-any\n\t return wat instanceof base;\n\t } catch (_e) {\n\t return false;\n\t }\n\t}\n\n\t// @@match logic\n\tfixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n\t return [\n\t // `String.prototype.match` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.match\n\t function match(regexp) {\n\t var O = requireObjectCoercible(this);\n\t var matcher = regexp == undefined ? undefined : regexp[MATCH];\n\t return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n\t },\n\t // `RegExp.prototype[@@match]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n\t function (regexp) {\n\t var res = maybeCallNative(nativeMatch, regexp, this);\n\t if (res.done) return res.value;\n\n\t var rx = anObject(regexp);\n\t var S = String(this);\n\n\t if (!rx.global) return regexpExecAbstract(rx, S);\n\n\t var fullUnicode = rx.unicode;\n\t rx.lastIndex = 0;\n\t var A = [];\n\t var n = 0;\n\t var result;\n\t while ((result = regexpExecAbstract(rx, S)) !== null) {\n\t var matchStr = String(result[0]);\n\t A[n] = matchStr;\n\t if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n\t n++;\n\t }\n\t return n === 0 ? null : A;\n\t }\n\t ];\n\t});\n\n\tvar arrayBufferNative = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n\n\tvar defineProperty$7 = objectDefineProperty.f;\n\n\n\n\n\n\tvar Int8Array$1 = global_1.Int8Array;\n\tvar Int8ArrayPrototype = Int8Array$1 && Int8Array$1.prototype;\n\tvar Uint8ClampedArray = global_1.Uint8ClampedArray;\n\tvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\n\tvar TypedArray = Int8Array$1 && objectGetPrototypeOf(Int8Array$1);\n\tvar TypedArrayPrototype = Int8ArrayPrototype && objectGetPrototypeOf(Int8ArrayPrototype);\n\tvar ObjectPrototype$2 = Object.prototype;\n\tvar isPrototypeOf = ObjectPrototype$2.isPrototypeOf;\n\n\tvar TO_STRING_TAG$4 = wellKnownSymbol('toStringTag');\n\tvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n\t// Fixing native typed arrays in Opera Presto crashes the browser, see #595\n\tvar NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferNative && !!objectSetPrototypeOf && classof(global_1.opera) !== 'Opera';\n\tvar TYPED_ARRAY_TAG_REQIRED = false;\n\tvar NAME$1;\n\n\tvar TypedArrayConstructorsList = {\n\t Int8Array: 1,\n\t Uint8Array: 1,\n\t Uint8ClampedArray: 1,\n\t Int16Array: 2,\n\t Uint16Array: 2,\n\t Int32Array: 4,\n\t Uint32Array: 4,\n\t Float32Array: 4,\n\t Float64Array: 8\n\t};\n\n\tvar isView = function isView(it) {\n\t var klass = classof(it);\n\t return klass === 'DataView' || has(TypedArrayConstructorsList, klass);\n\t};\n\n\tvar isTypedArray = function (it) {\n\t return isObject(it) && has(TypedArrayConstructorsList, classof(it));\n\t};\n\n\tvar aTypedArray = function (it) {\n\t if (isTypedArray(it)) return it;\n\t throw TypeError('Target is not a typed array');\n\t};\n\n\tvar aTypedArrayConstructor = function (C) {\n\t if (objectSetPrototypeOf) {\n\t if (isPrototypeOf.call(TypedArray, C)) return C;\n\t } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME$1)) {\n\t var TypedArrayConstructor = global_1[ARRAY];\n\t if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n\t return C;\n\t }\n\t } throw TypeError('Target is not a typed array constructor');\n\t};\n\n\tvar exportTypedArrayMethod = function (KEY, property, forced) {\n\t if (!descriptors) return;\n\t if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n\t var TypedArrayConstructor = global_1[ARRAY];\n\t if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n\t delete TypedArrayConstructor.prototype[KEY];\n\t }\n\t }\n\t if (!TypedArrayPrototype[KEY] || forced) {\n\t redefine(TypedArrayPrototype, KEY, forced ? property\n\t : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n\t }\n\t};\n\n\tvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n\t var ARRAY, TypedArrayConstructor;\n\t if (!descriptors) return;\n\t if (objectSetPrototypeOf) {\n\t if (forced) for (ARRAY in TypedArrayConstructorsList) {\n\t TypedArrayConstructor = global_1[ARRAY];\n\t if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n\t delete TypedArrayConstructor[KEY];\n\t }\n\t }\n\t if (!TypedArray[KEY] || forced) {\n\t // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n\t try {\n\t return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array$1[KEY] || property);\n\t } catch (error) { /* empty */ }\n\t } else return;\n\t }\n\t for (ARRAY in TypedArrayConstructorsList) {\n\t TypedArrayConstructor = global_1[ARRAY];\n\t if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n\t redefine(TypedArrayConstructor, KEY, property);\n\t }\n\t }\n\t};\n\n\tfor (NAME$1 in TypedArrayConstructorsList) {\n\t if (!global_1[NAME$1]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n\t}\n\n\t// WebKit bug - typed arrays constructors prototype is Object.prototype\n\tif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n\t // eslint-disable-next-line no-shadow\n\t TypedArray = function TypedArray() {\n\t throw TypeError('Incorrect invocation');\n\t };\n\t if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME$1 in TypedArrayConstructorsList) {\n\t if (global_1[NAME$1]) objectSetPrototypeOf(global_1[NAME$1], TypedArray);\n\t }\n\t}\n\n\tif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype$2) {\n\t TypedArrayPrototype = TypedArray.prototype;\n\t if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME$1 in TypedArrayConstructorsList) {\n\t if (global_1[NAME$1]) objectSetPrototypeOf(global_1[NAME$1].prototype, TypedArrayPrototype);\n\t }\n\t}\n\n\t// WebKit bug - one more object in Uint8ClampedArray prototype chain\n\tif (NATIVE_ARRAY_BUFFER_VIEWS && objectGetPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n\t objectSetPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n\t}\n\n\tif (descriptors && !has(TypedArrayPrototype, TO_STRING_TAG$4)) {\n\t TYPED_ARRAY_TAG_REQIRED = true;\n\t defineProperty$7(TypedArrayPrototype, TO_STRING_TAG$4, { get: function () {\n\t return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n\t } });\n\t for (NAME$1 in TypedArrayConstructorsList) if (global_1[NAME$1]) {\n\t createNonEnumerableProperty(global_1[NAME$1], TYPED_ARRAY_TAG, NAME$1);\n\t }\n\t}\n\n\tvar arrayBufferViewCore = {\n\t NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n\t TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n\t aTypedArray: aTypedArray,\n\t aTypedArrayConstructor: aTypedArrayConstructor,\n\t exportTypedArrayMethod: exportTypedArrayMethod,\n\t exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n\t isView: isView,\n\t isTypedArray: isTypedArray,\n\t TypedArray: TypedArray,\n\t TypedArrayPrototype: TypedArrayPrototype\n\t};\n\n\t/* eslint-disable no-new */\n\n\n\n\tvar NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\n\n\tvar ArrayBuffer$1 = global_1.ArrayBuffer;\n\tvar Int8Array$2 = global_1.Int8Array;\n\n\tvar typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS$1 || !fails(function () {\n\t Int8Array$2(1);\n\t}) || !fails(function () {\n\t new Int8Array$2(-1);\n\t}) || !checkCorrectnessOfIteration(function (iterable) {\n\t new Int8Array$2();\n\t new Int8Array$2(null);\n\t new Int8Array$2(1.5);\n\t new Int8Array$2(iterable);\n\t}, true) || fails(function () {\n\t // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n\t return new Int8Array$2(new ArrayBuffer$1(2), 1, undefined).length !== 1;\n\t});\n\n\t// `ToIndex` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toindex\n\tvar toIndex = function (it) {\n\t if (it === undefined) return 0;\n\t var number = toInteger(it);\n\t var length = toLength(number);\n\t if (number !== length) throw RangeError('Wrong length or index');\n\t return length;\n\t};\n\n\t// IEEE754 conversions based on https://github.com/feross/ieee754\n\t// eslint-disable-next-line no-shadow-restricted-names\n\tvar Infinity$1 = 1 / 0;\n\tvar abs = Math.abs;\n\tvar pow$1 = Math.pow;\n\tvar floor$4 = Math.floor;\n\tvar log = Math.log;\n\tvar LN2 = Math.LN2;\n\n\tvar pack = function (number, mantissaLength, bytes) {\n\t var buffer = new Array(bytes);\n\t var exponentLength = bytes * 8 - mantissaLength - 1;\n\t var eMax = (1 << exponentLength) - 1;\n\t var eBias = eMax >> 1;\n\t var rt = mantissaLength === 23 ? pow$1(2, -24) - pow$1(2, -77) : 0;\n\t var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n\t var index = 0;\n\t var exponent, mantissa, c;\n\t number = abs(number);\n\t // eslint-disable-next-line no-self-compare\n\t if (number != number || number === Infinity$1) {\n\t // eslint-disable-next-line no-self-compare\n\t mantissa = number != number ? 1 : 0;\n\t exponent = eMax;\n\t } else {\n\t exponent = floor$4(log(number) / LN2);\n\t if (number * (c = pow$1(2, -exponent)) < 1) {\n\t exponent--;\n\t c *= 2;\n\t }\n\t if (exponent + eBias >= 1) {\n\t number += rt / c;\n\t } else {\n\t number += rt * pow$1(2, 1 - eBias);\n\t }\n\t if (number * c >= 2) {\n\t exponent++;\n\t c /= 2;\n\t }\n\t if (exponent + eBias >= eMax) {\n\t mantissa = 0;\n\t exponent = eMax;\n\t } else if (exponent + eBias >= 1) {\n\t mantissa = (number * c - 1) * pow$1(2, mantissaLength);\n\t exponent = exponent + eBias;\n\t } else {\n\t mantissa = number * pow$1(2, eBias - 1) * pow$1(2, mantissaLength);\n\t exponent = 0;\n\t }\n\t }\n\t for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n\t exponent = exponent << mantissaLength | mantissa;\n\t exponentLength += mantissaLength;\n\t for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n\t buffer[--index] |= sign * 128;\n\t return buffer;\n\t};\n\n\tvar unpack = function (buffer, mantissaLength) {\n\t var bytes = buffer.length;\n\t var exponentLength = bytes * 8 - mantissaLength - 1;\n\t var eMax = (1 << exponentLength) - 1;\n\t var eBias = eMax >> 1;\n\t var nBits = exponentLength - 7;\n\t var index = bytes - 1;\n\t var sign = buffer[index--];\n\t var exponent = sign & 127;\n\t var mantissa;\n\t sign >>= 7;\n\t for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n\t mantissa = exponent & (1 << -nBits) - 1;\n\t exponent >>= -nBits;\n\t nBits += mantissaLength;\n\t for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n\t if (exponent === 0) {\n\t exponent = 1 - eBias;\n\t } else if (exponent === eMax) {\n\t return mantissa ? NaN : sign ? -Infinity$1 : Infinity$1;\n\t } else {\n\t mantissa = mantissa + pow$1(2, mantissaLength);\n\t exponent = exponent - eBias;\n\t } return (sign ? -1 : 1) * mantissa * pow$1(2, exponent - mantissaLength);\n\t};\n\n\tvar ieee754 = {\n\t pack: pack,\n\t unpack: unpack\n\t};\n\n\t// `Array.prototype.fill` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.fill\n\tvar arrayFill = function fill(value /* , start = 0, end = @length */) {\n\t var O = toObject(this);\n\t var length = toLength(O.length);\n\t var argumentsLength = arguments.length;\n\t var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n\t var end = argumentsLength > 2 ? arguments[2] : undefined;\n\t var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n\t while (endPos > index) O[index++] = value;\n\t return O;\n\t};\n\n\tvar getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;\n\tvar defineProperty$8 = objectDefineProperty.f;\n\n\n\n\n\tvar getInternalState$4 = internalState.get;\n\tvar setInternalState$7 = internalState.set;\n\tvar ARRAY_BUFFER = 'ArrayBuffer';\n\tvar DATA_VIEW = 'DataView';\n\tvar PROTOTYPE$2 = 'prototype';\n\tvar WRONG_LENGTH = 'Wrong length';\n\tvar WRONG_INDEX = 'Wrong index';\n\tvar NativeArrayBuffer = global_1[ARRAY_BUFFER];\n\tvar $ArrayBuffer = NativeArrayBuffer;\n\tvar $DataView = global_1[DATA_VIEW];\n\tvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE$2];\n\tvar ObjectPrototype$3 = Object.prototype;\n\tvar RangeError$1 = global_1.RangeError;\n\n\tvar packIEEE754 = ieee754.pack;\n\tvar unpackIEEE754 = ieee754.unpack;\n\n\tvar packInt8 = function (number) {\n\t return [number & 0xFF];\n\t};\n\n\tvar packInt16 = function (number) {\n\t return [number & 0xFF, number >> 8 & 0xFF];\n\t};\n\n\tvar packInt32 = function (number) {\n\t return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n\t};\n\n\tvar unpackInt32 = function (buffer) {\n\t return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n\t};\n\n\tvar packFloat32 = function (number) {\n\t return packIEEE754(number, 23, 4);\n\t};\n\n\tvar packFloat64 = function (number) {\n\t return packIEEE754(number, 52, 8);\n\t};\n\n\tvar addGetter = function (Constructor, key) {\n\t defineProperty$8(Constructor[PROTOTYPE$2], key, { get: function () { return getInternalState$4(this)[key]; } });\n\t};\n\n\tvar get$1 = function (view, count, index, isLittleEndian) {\n\t var intIndex = toIndex(index);\n\t var store = getInternalState$4(view);\n\t if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);\n\t var bytes = getInternalState$4(store.buffer).bytes;\n\t var start = intIndex + store.byteOffset;\n\t var pack = bytes.slice(start, start + count);\n\t return isLittleEndian ? pack : pack.reverse();\n\t};\n\n\tvar set$2 = function (view, count, index, conversion, value, isLittleEndian) {\n\t var intIndex = toIndex(index);\n\t var store = getInternalState$4(view);\n\t if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);\n\t var bytes = getInternalState$4(store.buffer).bytes;\n\t var start = intIndex + store.byteOffset;\n\t var pack = conversion(+value);\n\t for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n\t};\n\n\tif (!arrayBufferNative) {\n\t $ArrayBuffer = function ArrayBuffer(length) {\n\t anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n\t var byteLength = toIndex(length);\n\t setInternalState$7(this, {\n\t bytes: arrayFill.call(new Array(byteLength), 0),\n\t byteLength: byteLength\n\t });\n\t if (!descriptors) this.byteLength = byteLength;\n\t };\n\n\t $DataView = function DataView(buffer, byteOffset, byteLength) {\n\t anInstance(this, $DataView, DATA_VIEW);\n\t anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n\t var bufferLength = getInternalState$4(buffer).byteLength;\n\t var offset = toInteger(byteOffset);\n\t if (offset < 0 || offset > bufferLength) throw RangeError$1('Wrong offset');\n\t byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n\t if (offset + byteLength > bufferLength) throw RangeError$1(WRONG_LENGTH);\n\t setInternalState$7(this, {\n\t buffer: buffer,\n\t byteLength: byteLength,\n\t byteOffset: offset\n\t });\n\t if (!descriptors) {\n\t this.buffer = buffer;\n\t this.byteLength = byteLength;\n\t this.byteOffset = offset;\n\t }\n\t };\n\n\t if (descriptors) {\n\t addGetter($ArrayBuffer, 'byteLength');\n\t addGetter($DataView, 'buffer');\n\t addGetter($DataView, 'byteLength');\n\t addGetter($DataView, 'byteOffset');\n\t }\n\n\t redefineAll($DataView[PROTOTYPE$2], {\n\t getInt8: function getInt8(byteOffset) {\n\t return get$1(this, 1, byteOffset)[0] << 24 >> 24;\n\t },\n\t getUint8: function getUint8(byteOffset) {\n\t return get$1(this, 1, byteOffset)[0];\n\t },\n\t getInt16: function getInt16(byteOffset /* , littleEndian */) {\n\t var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n\t return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n\t },\n\t getUint16: function getUint16(byteOffset /* , littleEndian */) {\n\t var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n\t return bytes[1] << 8 | bytes[0];\n\t },\n\t getInt32: function getInt32(byteOffset /* , littleEndian */) {\n\t return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n\t },\n\t getUint32: function getUint32(byteOffset /* , littleEndian */) {\n\t return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n\t },\n\t getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n\t return unpackIEEE754(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n\t },\n\t getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n\t return unpackIEEE754(get$1(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n\t },\n\t setInt8: function setInt8(byteOffset, value) {\n\t set$2(this, 1, byteOffset, packInt8, value);\n\t },\n\t setUint8: function setUint8(byteOffset, value) {\n\t set$2(this, 1, byteOffset, packInt8, value);\n\t },\n\t setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n\t }\n\t });\n\t} else {\n\t if (!fails(function () {\n\t NativeArrayBuffer(1);\n\t }) || !fails(function () {\n\t new NativeArrayBuffer(-1); // eslint-disable-line no-new\n\t }) || fails(function () {\n\t new NativeArrayBuffer(); // eslint-disable-line no-new\n\t new NativeArrayBuffer(1.5); // eslint-disable-line no-new\n\t new NativeArrayBuffer(NaN); // eslint-disable-line no-new\n\t return NativeArrayBuffer.name != ARRAY_BUFFER;\n\t })) {\n\t $ArrayBuffer = function ArrayBuffer(length) {\n\t anInstance(this, $ArrayBuffer);\n\t return new NativeArrayBuffer(toIndex(length));\n\t };\n\t var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE$2] = NativeArrayBuffer[PROTOTYPE$2];\n\t for (var keys$2 = getOwnPropertyNames$1(NativeArrayBuffer), j = 0, key; keys$2.length > j;) {\n\t if (!((key = keys$2[j++]) in $ArrayBuffer)) {\n\t createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n\t }\n\t }\n\t ArrayBufferPrototype.constructor = $ArrayBuffer;\n\t }\n\n\t // WebKit bug - the same parent prototype for typed arrays and data view\n\t if (objectSetPrototypeOf && objectGetPrototypeOf($DataViewPrototype) !== ObjectPrototype$3) {\n\t objectSetPrototypeOf($DataViewPrototype, ObjectPrototype$3);\n\t }\n\n\t // iOS Safari 7.x bug\n\t var testView = new $DataView(new $ArrayBuffer(2));\n\t var nativeSetInt8 = $DataViewPrototype.setInt8;\n\t testView.setInt8(0, 2147483648);\n\t testView.setInt8(1, 2147483649);\n\t if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n\t setInt8: function setInt8(byteOffset, value) {\n\t nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n\t },\n\t setUint8: function setUint8(byteOffset, value) {\n\t nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n\t }\n\t }, { unsafe: true });\n\t}\n\n\tsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\n\tsetToStringTag($DataView, DATA_VIEW);\n\n\tvar arrayBuffer = {\n\t ArrayBuffer: $ArrayBuffer,\n\t DataView: $DataView\n\t};\n\n\tvar toPositiveInteger = function (it) {\n\t var result = toInteger(it);\n\t if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n\t return result;\n\t};\n\n\tvar toOffset = function (it, BYTES) {\n\t var offset = toPositiveInteger(it);\n\t if (offset % BYTES) throw RangeError('Wrong offset');\n\t return offset;\n\t};\n\n\tvar aTypedArrayConstructor$1 = arrayBufferViewCore.aTypedArrayConstructor;\n\n\tvar typedArrayFrom = function from(source /* , mapfn, thisArg */) {\n\t var O = toObject(source);\n\t var argumentsLength = arguments.length;\n\t var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n\t var mapping = mapfn !== undefined;\n\t var iteratorMethod = getIteratorMethod(O);\n\t var i, length, result, step, iterator, next;\n\t if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n\t iterator = iteratorMethod.call(O);\n\t next = iterator.next;\n\t O = [];\n\t while (!(step = next.call(iterator)).done) {\n\t O.push(step.value);\n\t }\n\t }\n\t if (mapping && argumentsLength > 2) {\n\t mapfn = functionBindContext(mapfn, arguments[2], 2);\n\t }\n\t length = toLength(O.length);\n\t result = new (aTypedArrayConstructor$1(this))(length);\n\t for (i = 0; length > i; i++) {\n\t result[i] = mapping ? mapfn(O[i], i) : O[i];\n\t }\n\t return result;\n\t};\n\n\tvar typedArrayConstructor = createCommonjsModule(function (module) {\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\tvar getOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n\tvar forEach = arrayIteration.forEach;\n\n\n\n\n\n\n\tvar getInternalState = internalState.get;\n\tvar setInternalState = internalState.set;\n\tvar nativeDefineProperty = objectDefineProperty.f;\n\tvar nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\tvar round = Math.round;\n\tvar RangeError = global_1.RangeError;\n\tvar ArrayBuffer = arrayBuffer.ArrayBuffer;\n\tvar DataView = arrayBuffer.DataView;\n\tvar NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\n\tvar TYPED_ARRAY_TAG = arrayBufferViewCore.TYPED_ARRAY_TAG;\n\tvar TypedArray = arrayBufferViewCore.TypedArray;\n\tvar TypedArrayPrototype = arrayBufferViewCore.TypedArrayPrototype;\n\tvar aTypedArrayConstructor = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar isTypedArray = arrayBufferViewCore.isTypedArray;\n\tvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n\tvar WRONG_LENGTH = 'Wrong length';\n\n\tvar fromList = function (C, list) {\n\t var index = 0;\n\t var length = list.length;\n\t var result = new (aTypedArrayConstructor(C))(length);\n\t while (length > index) result[index] = list[index++];\n\t return result;\n\t};\n\n\tvar addGetter = function (it, key) {\n\t nativeDefineProperty(it, key, { get: function () {\n\t return getInternalState(this)[key];\n\t } });\n\t};\n\n\tvar isArrayBuffer = function (it) {\n\t var klass;\n\t return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n\t};\n\n\tvar isTypedArrayIndex = function (target, key) {\n\t return isTypedArray(target)\n\t && typeof key != 'symbol'\n\t && key in target\n\t && String(+key) == String(key);\n\t};\n\n\tvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n\t return isTypedArrayIndex(target, key = toPrimitive(key, true))\n\t ? createPropertyDescriptor(2, target[key])\n\t : nativeGetOwnPropertyDescriptor(target, key);\n\t};\n\n\tvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n\t if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n\t && isObject(descriptor)\n\t && has(descriptor, 'value')\n\t && !has(descriptor, 'get')\n\t && !has(descriptor, 'set')\n\t // TODO: add validation descriptor w/o calling accessors\n\t && !descriptor.configurable\n\t && (!has(descriptor, 'writable') || descriptor.writable)\n\t && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n\t ) {\n\t target[key] = descriptor.value;\n\t return target;\n\t } return nativeDefineProperty(target, key, descriptor);\n\t};\n\n\tif (descriptors) {\n\t if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n\t objectGetOwnPropertyDescriptor.f = wrappedGetOwnPropertyDescriptor;\n\t objectDefineProperty.f = wrappedDefineProperty;\n\t addGetter(TypedArrayPrototype, 'buffer');\n\t addGetter(TypedArrayPrototype, 'byteOffset');\n\t addGetter(TypedArrayPrototype, 'byteLength');\n\t addGetter(TypedArrayPrototype, 'length');\n\t }\n\n\t _export({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n\t getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n\t defineProperty: wrappedDefineProperty\n\t });\n\n\t module.exports = function (TYPE, wrapper, CLAMPED) {\n\t var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n\t var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n\t var GETTER = 'get' + TYPE;\n\t var SETTER = 'set' + TYPE;\n\t var NativeTypedArrayConstructor = global_1[CONSTRUCTOR_NAME];\n\t var TypedArrayConstructor = NativeTypedArrayConstructor;\n\t var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n\t var exported = {};\n\n\t var getter = function (that, index) {\n\t var data = getInternalState(that);\n\t return data.view[GETTER](index * BYTES + data.byteOffset, true);\n\t };\n\n\t var setter = function (that, index, value) {\n\t var data = getInternalState(that);\n\t if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n\t data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n\t };\n\n\t var addElement = function (that, index) {\n\t nativeDefineProperty(that, index, {\n\t get: function () {\n\t return getter(this, index);\n\t },\n\t set: function (value) {\n\t return setter(this, index, value);\n\t },\n\t enumerable: true\n\t });\n\t };\n\n\t if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n\t TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n\t anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n\t var index = 0;\n\t var byteOffset = 0;\n\t var buffer, byteLength, length;\n\t if (!isObject(data)) {\n\t length = toIndex(data);\n\t byteLength = length * BYTES;\n\t buffer = new ArrayBuffer(byteLength);\n\t } else if (isArrayBuffer(data)) {\n\t buffer = data;\n\t byteOffset = toOffset(offset, BYTES);\n\t var $len = data.byteLength;\n\t if ($length === undefined) {\n\t if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n\t byteLength = $len - byteOffset;\n\t if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n\t } else {\n\t byteLength = toLength($length) * BYTES;\n\t if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n\t }\n\t length = byteLength / BYTES;\n\t } else if (isTypedArray(data)) {\n\t return fromList(TypedArrayConstructor, data);\n\t } else {\n\t return typedArrayFrom.call(TypedArrayConstructor, data);\n\t }\n\t setInternalState(that, {\n\t buffer: buffer,\n\t byteOffset: byteOffset,\n\t byteLength: byteLength,\n\t length: length,\n\t view: new DataView(buffer)\n\t });\n\t while (index < length) addElement(that, index++);\n\t });\n\n\t if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);\n\t TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = objectCreate(TypedArrayPrototype);\n\t } else if (typedArrayConstructorsRequireWrappers) {\n\t TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n\t anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n\t return inheritIfRequired(function () {\n\t if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n\t if (isArrayBuffer(data)) return $length !== undefined\n\t ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n\t : typedArrayOffset !== undefined\n\t ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n\t : new NativeTypedArrayConstructor(data);\n\t if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n\t return typedArrayFrom.call(TypedArrayConstructor, data);\n\t }(), dummy, TypedArrayConstructor);\n\t });\n\n\t if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);\n\t forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n\t if (!(key in TypedArrayConstructor)) {\n\t createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n\t }\n\t });\n\t TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n\t }\n\n\t if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n\t createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n\t }\n\n\t if (TYPED_ARRAY_TAG) {\n\t createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n\t }\n\n\t exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n\t _export({\n\t global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n\t }, exported);\n\n\t if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n\t createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n\t }\n\n\t if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n\t createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n\t }\n\n\t setSpecies(CONSTRUCTOR_NAME);\n\t };\n\t} else module.exports = function () { /* empty */ };\n\t});\n\n\t// `Uint16Array` constructor\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\ttypedArrayConstructor('Uint16', function (init) {\n\t return function Uint16Array(data, byteOffset, length) {\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n\tvar min$4 = Math.min;\n\n\t// `Array.prototype.copyWithin` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\n\tvar arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n\t var O = toObject(this);\n\t var len = toLength(O.length);\n\t var to = toAbsoluteIndex(target, len);\n\t var from = toAbsoluteIndex(start, len);\n\t var end = arguments.length > 2 ? arguments[2] : undefined;\n\t var count = min$4((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n\t var inc = 1;\n\t if (from < to && to < from + count) {\n\t inc = -1;\n\t from += count - 1;\n\t to += count - 1;\n\t }\n\t while (count-- > 0) {\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t to += inc;\n\t from += inc;\n\t } return O;\n\t};\n\n\tvar aTypedArray$1 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$1 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.copyWithin` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.copywithin\n\texportTypedArrayMethod$1('copyWithin', function copyWithin(target, start /* , end */) {\n\t return arrayCopyWithin.call(aTypedArray$1(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n\t});\n\n\tvar $every = arrayIteration.every;\n\n\tvar aTypedArray$2 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$2 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.every` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every\n\texportTypedArrayMethod$2('every', function every(callbackfn /* , thisArg */) {\n\t return $every(aTypedArray$2(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar aTypedArray$3 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$3 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.fill` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.fill\n\t// eslint-disable-next-line no-unused-vars\n\texportTypedArrayMethod$3('fill', function fill(value /* , start, end */) {\n\t return arrayFill.apply(aTypedArray$3(this), arguments);\n\t});\n\n\tvar $filter = arrayIteration.filter;\n\n\n\tvar aTypedArray$4 = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$2 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$4 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.filter\n\texportTypedArrayMethod$4('filter', function filter(callbackfn /* , thisArg */) {\n\t var list = $filter(aTypedArray$4(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t var C = speciesConstructor(this, this.constructor);\n\t var index = 0;\n\t var length = list.length;\n\t var result = new (aTypedArrayConstructor$2(C))(length);\n\t while (length > index) result[index] = list[index++];\n\t return result;\n\t});\n\n\tvar $find = arrayIteration.find;\n\n\tvar aTypedArray$5 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$5 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find\n\texportTypedArrayMethod$5('find', function find(predicate /* , thisArg */) {\n\t return $find(aTypedArray$5(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $findIndex = arrayIteration.findIndex;\n\n\tvar aTypedArray$6 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$6 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.findIndex` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findindex\n\texportTypedArrayMethod$6('findIndex', function findIndex(predicate /* , thisArg */) {\n\t return $findIndex(aTypedArray$6(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $forEach$2 = arrayIteration.forEach;\n\n\tvar aTypedArray$7 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$7 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.forEach` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.foreach\n\texportTypedArrayMethod$7('forEach', function forEach(callbackfn /* , thisArg */) {\n\t $forEach$2(aTypedArray$7(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $includes$1 = arrayIncludes.includes;\n\n\tvar aTypedArray$8 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$8 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.includes\n\texportTypedArrayMethod$8('includes', function includes(searchElement /* , fromIndex */) {\n\t return $includes$1(aTypedArray$8(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $indexOf$1 = arrayIncludes.indexOf;\n\n\tvar aTypedArray$9 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$9 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.indexof\n\texportTypedArrayMethod$9('indexOf', function indexOf(searchElement /* , fromIndex */) {\n\t return $indexOf$1(aTypedArray$9(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar ITERATOR$8 = wellKnownSymbol('iterator');\n\tvar Uint8Array = global_1.Uint8Array;\n\tvar arrayValues = es_array_iterator.values;\n\tvar arrayKeys = es_array_iterator.keys;\n\tvar arrayEntries = es_array_iterator.entries;\n\tvar aTypedArray$a = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$a = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR$8];\n\n\tvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n\t && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\n\tvar typedArrayValues = function values() {\n\t return arrayValues.call(aTypedArray$a(this));\n\t};\n\n\t// `%TypedArray%.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.entries\n\texportTypedArrayMethod$a('entries', function entries() {\n\t return arrayEntries.call(aTypedArray$a(this));\n\t});\n\t// `%TypedArray%.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.keys\n\texportTypedArrayMethod$a('keys', function keys() {\n\t return arrayKeys.call(aTypedArray$a(this));\n\t});\n\t// `%TypedArray%.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.values\n\texportTypedArrayMethod$a('values', typedArrayValues, !CORRECT_ITER_NAME);\n\t// `%TypedArray%.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype-@@iterator\n\texportTypedArrayMethod$a(ITERATOR$8, typedArrayValues, !CORRECT_ITER_NAME);\n\n\tvar aTypedArray$b = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$b = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $join = [].join;\n\n\t// `%TypedArray%.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.join\n\t// eslint-disable-next-line no-unused-vars\n\texportTypedArrayMethod$b('join', function join(separator) {\n\t return $join.apply(aTypedArray$b(this), arguments);\n\t});\n\n\tvar min$5 = Math.min;\n\tvar nativeLastIndexOf = [].lastIndexOf;\n\tvar NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\n\tvar STRICT_METHOD$3 = arrayMethodIsStrict('lastIndexOf');\n\t// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\n\tvar USES_TO_LENGTH$5 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\tvar FORCED$4 = NEGATIVE_ZERO$1 || !STRICT_METHOD$3 || !USES_TO_LENGTH$5;\n\n\t// `Array.prototype.lastIndexOf` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n\tvar arrayLastIndexOf = FORCED$4 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n\t // convert -0 to +0\n\t if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0;\n\t var O = toIndexedObject(this);\n\t var length = toLength(O.length);\n\t var index = length - 1;\n\t if (arguments.length > 1) index = min$5(index, toInteger(arguments[1]));\n\t if (index < 0) index = length + index;\n\t for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n\t return -1;\n\t} : nativeLastIndexOf;\n\n\tvar aTypedArray$c = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$c = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.lastIndexOf` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.lastindexof\n\t// eslint-disable-next-line no-unused-vars\n\texportTypedArrayMethod$c('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n\t return arrayLastIndexOf.apply(aTypedArray$c(this), arguments);\n\t});\n\n\tvar $map$1 = arrayIteration.map;\n\n\n\tvar aTypedArray$d = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$3 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$d = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.map` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.map\n\texportTypedArrayMethod$d('map', function map(mapfn /* , thisArg */) {\n\t return $map$1(aTypedArray$d(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n\t return new (aTypedArrayConstructor$3(speciesConstructor(O, O.constructor)))(length);\n\t });\n\t});\n\n\t// `Array.prototype.{ reduce, reduceRight }` methods implementation\n\tvar createMethod$3 = function (IS_RIGHT) {\n\t return function (that, callbackfn, argumentsLength, memo) {\n\t aFunction$1(callbackfn);\n\t var O = toObject(that);\n\t var self = indexedObject(O);\n\t var length = toLength(O.length);\n\t var index = IS_RIGHT ? length - 1 : 0;\n\t var i = IS_RIGHT ? -1 : 1;\n\t if (argumentsLength < 2) while (true) {\n\t if (index in self) {\n\t memo = self[index];\n\t index += i;\n\t break;\n\t }\n\t index += i;\n\t if (IS_RIGHT ? index < 0 : length <= index) {\n\t throw TypeError('Reduce of empty array with no initial value');\n\t }\n\t }\n\t for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n\t memo = callbackfn(memo, self[index], index, O);\n\t }\n\t return memo;\n\t };\n\t};\n\n\tvar arrayReduce = {\n\t // `Array.prototype.reduce` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n\t left: createMethod$3(false),\n\t // `Array.prototype.reduceRight` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n\t right: createMethod$3(true)\n\t};\n\n\tvar $reduce = arrayReduce.left;\n\n\tvar aTypedArray$e = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$e = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.reduce` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduce\n\texportTypedArrayMethod$e('reduce', function reduce(callbackfn /* , initialValue */) {\n\t return $reduce(aTypedArray$e(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $reduceRight = arrayReduce.right;\n\n\tvar aTypedArray$f = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$f = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.reduceRicht` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright\n\texportTypedArrayMethod$f('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n\t return $reduceRight(aTypedArray$f(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar aTypedArray$g = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$g = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar floor$5 = Math.floor;\n\n\t// `%TypedArray%.prototype.reverse` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reverse\n\texportTypedArrayMethod$g('reverse', function reverse() {\n\t var that = this;\n\t var length = aTypedArray$g(that).length;\n\t var middle = floor$5(length / 2);\n\t var index = 0;\n\t var value;\n\t while (index < middle) {\n\t value = that[index];\n\t that[index++] = that[--length];\n\t that[length] = value;\n\t } return that;\n\t});\n\n\tvar aTypedArray$h = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$h = arrayBufferViewCore.exportTypedArrayMethod;\n\n\tvar FORCED$5 = fails(function () {\n\t // eslint-disable-next-line no-undef\n\t new Int8Array(1).set({});\n\t});\n\n\t// `%TypedArray%.prototype.set` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.set\n\texportTypedArrayMethod$h('set', function set(arrayLike /* , offset */) {\n\t aTypedArray$h(this);\n\t var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n\t var length = this.length;\n\t var src = toObject(arrayLike);\n\t var len = toLength(src.length);\n\t var index = 0;\n\t if (len + offset > length) throw RangeError('Wrong length');\n\t while (index < len) this[offset + index] = src[index++];\n\t}, FORCED$5);\n\n\tvar aTypedArray$i = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$4 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$i = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $slice = [].slice;\n\n\tvar FORCED$6 = fails(function () {\n\t // eslint-disable-next-line no-undef\n\t new Int8Array(1).slice();\n\t});\n\n\t// `%TypedArray%.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.slice\n\texportTypedArrayMethod$i('slice', function slice(start, end) {\n\t var list = $slice.call(aTypedArray$i(this), start, end);\n\t var C = speciesConstructor(this, this.constructor);\n\t var index = 0;\n\t var length = list.length;\n\t var result = new (aTypedArrayConstructor$4(C))(length);\n\t while (length > index) result[index] = list[index++];\n\t return result;\n\t}, FORCED$6);\n\n\tvar $some = arrayIteration.some;\n\n\tvar aTypedArray$j = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$j = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.some` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.some\n\texportTypedArrayMethod$j('some', function some(callbackfn /* , thisArg */) {\n\t return $some(aTypedArray$j(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar aTypedArray$k = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$k = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $sort = [].sort;\n\n\t// `%TypedArray%.prototype.sort` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort\n\texportTypedArrayMethod$k('sort', function sort(comparefn) {\n\t return $sort.call(aTypedArray$k(this), comparefn);\n\t});\n\n\tvar aTypedArray$l = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$l = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.subarray` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray\n\texportTypedArrayMethod$l('subarray', function subarray(begin, end) {\n\t var O = aTypedArray$l(this);\n\t var length = O.length;\n\t var beginIndex = toAbsoluteIndex(begin, length);\n\t return new (speciesConstructor(O, O.constructor))(\n\t O.buffer,\n\t O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n\t toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n\t );\n\t});\n\n\tvar Int8Array$3 = global_1.Int8Array;\n\tvar aTypedArray$m = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$m = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $toLocaleString = [].toLocaleString;\n\tvar $slice$1 = [].slice;\n\n\t// iOS Safari 6.x fails here\n\tvar TO_LOCALE_STRING_BUG = !!Int8Array$3 && fails(function () {\n\t $toLocaleString.call(new Int8Array$3(1));\n\t});\n\n\tvar FORCED$7 = fails(function () {\n\t return [1, 2].toLocaleString() != new Int8Array$3([1, 2]).toLocaleString();\n\t}) || !fails(function () {\n\t Int8Array$3.prototype.toLocaleString.call([1, 2]);\n\t});\n\n\t// `%TypedArray%.prototype.toLocaleString` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tolocalestring\n\texportTypedArrayMethod$m('toLocaleString', function toLocaleString() {\n\t return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice$1.call(aTypedArray$m(this)) : aTypedArray$m(this), arguments);\n\t}, FORCED$7);\n\n\tvar exportTypedArrayMethod$n = arrayBufferViewCore.exportTypedArrayMethod;\n\n\n\n\tvar Uint8Array$1 = global_1.Uint8Array;\n\tvar Uint8ArrayPrototype = Uint8Array$1 && Uint8Array$1.prototype || {};\n\tvar arrayToString = [].toString;\n\tvar arrayJoin = [].join;\n\n\tif (fails(function () { arrayToString.call({}); })) {\n\t arrayToString = function toString() {\n\t return arrayJoin.call(this);\n\t };\n\t}\n\n\tvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n\t// `%TypedArray%.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tostring\n\texportTypedArrayMethod$n('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n\n\t/**\n\t * Truncates given string to the maximum characters count\n\t *\n\t * @param str An object that contains serializable values\n\t * @param max Maximum number of characters in truncated string\n\t * @returns string Encoded\n\t */\n\n\tfunction truncate(str, max) {\n\t if (max === void 0) {\n\t max = 0;\n\t } // tslint:disable-next-line:strict-type-predicates\n\n\n\t if (typeof str !== 'string' || max === 0) {\n\t return str;\n\t }\n\n\t return str.length <= max ? str : str.substr(0, max) + \"...\";\n\t}\n\t/**\n\t * Join values in array\n\t * @param input array of values to be joined together\n\t * @param delimiter string to be placed in-between values\n\t * @returns Joined values\n\t */\n\n\tfunction safeJoin(input, delimiter) {\n\t if (!Array.isArray(input)) {\n\t return '';\n\t }\n\n\t var output = []; // tslint:disable-next-line:prefer-for-of\n\n\t for (var i = 0; i < input.length; i++) {\n\t var value = input[i];\n\n\t try {\n\t output.push(String(value));\n\t } catch (e) {\n\t output.push('[value cannot be serialized]');\n\t }\n\t }\n\n\t return output.join(delimiter);\n\t}\n\t/**\n\t * Checks if the value matches a regex or includes the string\n\t * @param value The string value to be checked against\n\t * @param pattern Either a regex or a string that must be contained in value\n\t */\n\n\tfunction isMatchingPattern(value, pattern) {\n\t if (!isString(value)) {\n\t return false;\n\t }\n\n\t if (isRegExp(pattern)) {\n\t return pattern.test(value);\n\t }\n\n\t if (typeof pattern === 'string') {\n\t return value.indexOf(pattern) !== -1;\n\t }\n\n\t return false;\n\t}\n\n\t/**\n\t * Requires a module which is protected against bundler minification.\n\t *\n\t * @param request The module path to resolve\n\t */\n\n\tfunction dynamicRequire(mod, request) {\n\t // tslint:disable-next-line: no-unsafe-any\n\t return mod.require(request);\n\t}\n\t/**\n\t * Checks whether we're in the Node.js or Browser environment\n\t *\n\t * @returns Answer to given question\n\t */\n\n\tfunction isNodeEnv() {\n\t // tslint:disable:strict-type-predicates\n\t return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n\t}\n\tvar fallbackGlobalObject = {};\n\t/**\n\t * Safely get global scope object\n\t *\n\t * @returns Global scope object\n\t */\n\n\tfunction getGlobalObject() {\n\t return isNodeEnv() ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : fallbackGlobalObject;\n\t}\n\t/**\n\t * UUID4 generator\n\t *\n\t * @returns string Generated UUID4.\n\t */\n\n\tfunction uuid4() {\n\t var global = getGlobalObject();\n\t var crypto = global.crypto || global.msCrypto;\n\n\t if (!(crypto === void 0) && crypto.getRandomValues) {\n\t // Use window.crypto API if available\n\t var arr = new Uint16Array(8);\n\t crypto.getRandomValues(arr); // set 4 in byte 7\n\t // tslint:disable-next-line:no-bitwise\n\n\t arr[3] = arr[3] & 0xfff | 0x4000; // set 2 most significant bits of byte 9 to '10'\n\t // tslint:disable-next-line:no-bitwise\n\n\t arr[4] = arr[4] & 0x3fff | 0x8000;\n\n\t var pad = function pad(num) {\n\t var v = num.toString(16);\n\n\t while (v.length < 4) {\n\t v = \"0\" + v;\n\t }\n\n\t return v;\n\t };\n\n\t return pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]);\n\t } // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n\n\n\t return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n\t // tslint:disable-next-line:no-bitwise\n\t var r = Math.random() * 16 | 0; // tslint:disable-next-line:no-bitwise\n\n\t var v = c === 'x' ? r : r & 0x3 | 0x8;\n\t return v.toString(16);\n\t });\n\t}\n\t/**\n\t * Parses string form of URL into an object\n\t * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n\t * // intentionally using regex and not <a/> href parsing trick because React Native and other\n\t * // environments where DOM might not be available\n\t * @returns parsed URL object\n\t */\n\n\tfunction parseUrl(url) {\n\t if (!url) {\n\t return {};\n\t }\n\n\t var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n\t if (!match) {\n\t return {};\n\t } // coerce to undefined values to empty string so we don't get 'undefined'\n\n\n\t var query = match[6] || '';\n\t var fragment = match[8] || '';\n\t return {\n\t host: match[4],\n\t path: match[5],\n\t protocol: match[2],\n\t relative: match[5] + query + fragment\n\t };\n\t}\n\t/**\n\t * Extracts either message or type+value from an event that can be used for user-facing logs\n\t * @returns event's description\n\t */\n\n\tfunction getEventDescription(event) {\n\t if (event.message) {\n\t return event.message;\n\t }\n\n\t if (event.exception && event.exception.values && event.exception.values[0]) {\n\t var exception = event.exception.values[0];\n\n\t if (exception.type && exception.value) {\n\t return exception.type + \": \" + exception.value;\n\t }\n\n\t return exception.type || exception.value || event.event_id || '<unknown>';\n\t }\n\n\t return event.event_id || '<unknown>';\n\t}\n\t/** JSDoc */\n\n\tfunction consoleSandbox(callback) {\n\t var global = getGlobalObject();\n\t var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n\n\t if (!('console' in global)) {\n\t return callback();\n\t }\n\n\t var originalConsole = global.console;\n\t var wrappedLevels = {}; // Restore all wrapped console methods\n\n\t levels.forEach(function (level) {\n\t if (level in global.console && originalConsole[level].__sentry_original__) {\n\t wrappedLevels[level] = originalConsole[level];\n\t originalConsole[level] = originalConsole[level].__sentry_original__;\n\t }\n\t }); // Perform callback manipulations\n\n\t var result = callback(); // Revert restoration to wrapped state\n\n\t Object.keys(wrappedLevels).forEach(function (level) {\n\t originalConsole[level] = wrappedLevels[level];\n\t });\n\t return result;\n\t}\n\t/**\n\t * Adds exception values, type and value to an synthetic Exception.\n\t * @param event The event to modify.\n\t * @param value Value of the exception.\n\t * @param type Type of the exception.\n\t * @hidden\n\t */\n\n\tfunction addExceptionTypeValue(event, value, type) {\n\t event.exception = event.exception || {};\n\t event.exception.values = event.exception.values || [];\n\t event.exception.values[0] = event.exception.values[0] || {};\n\t event.exception.values[0].value = event.exception.values[0].value || value || '';\n\t event.exception.values[0].type = event.exception.values[0].type || type || 'Error';\n\t}\n\t/**\n\t * Adds exception mechanism to a given event.\n\t * @param event The event to modify.\n\t * @param mechanism Mechanism of the mechanism.\n\t * @hidden\n\t */\n\n\tfunction addExceptionMechanism(event, mechanism) {\n\t if (mechanism === void 0) {\n\t mechanism = {};\n\t } // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?\n\n\n\t try {\n\t // @ts-ignore\n\t // tslint:disable:no-non-null-assertion\n\t event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};\n\t Object.keys(mechanism).forEach(function (key) {\n\t // @ts-ignore\n\t event.exception.values[0].mechanism[key] = mechanism[key];\n\t });\n\t } catch (_oO) {// no-empty\n\t }\n\t}\n\t/**\n\t * A safe form of location.href\n\t */\n\n\tfunction getLocationHref() {\n\t try {\n\t return document.location.href;\n\t } catch (oO) {\n\t return '';\n\t }\n\t}\n\t/**\n\t * Given a child DOM element, returns a query-selector statement describing that\n\t * and its ancestors\n\t * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n\t * @returns generated DOM path\n\t */\n\n\tfunction htmlTreeAsString(elem) {\n\t // try/catch both:\n\t // - accessing event.target (see getsentry/raven-js#838, #768)\n\t // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n\t // - can throw an exception in some circumstances.\n\t try {\n\t var currentElem = elem;\n\t var MAX_TRAVERSE_HEIGHT = 5;\n\t var MAX_OUTPUT_LEN = 80;\n\t var out = [];\n\t var height = 0;\n\t var len = 0;\n\t var separator = ' > ';\n\t var sepLength = separator.length;\n\t var nextStr = void 0;\n\n\t while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n\t nextStr = _htmlElementAsString(currentElem); // bail out if\n\t // - nextStr is the 'html' element\n\t // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n\t // (ignore this limit if we are on the first iteration)\n\n\t if (nextStr === 'html' || height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) {\n\t break;\n\t }\n\n\t out.push(nextStr);\n\t len += nextStr.length;\n\t currentElem = currentElem.parentNode;\n\t }\n\n\t return out.reverse().join(separator);\n\t } catch (_oO) {\n\t return '<unknown>';\n\t }\n\t}\n\t/**\n\t * Returns a simple, query-selector representation of a DOM element\n\t * e.g. [HTMLElement] => input#foo.btn[name=baz]\n\t * @returns generated DOM path\n\t */\n\n\tfunction _htmlElementAsString(el) {\n\t var elem = el;\n\t var out = [];\n\t var className;\n\t var classes;\n\t var key;\n\t var attr;\n\t var i;\n\n\t if (!elem || !elem.tagName) {\n\t return '';\n\t }\n\n\t out.push(elem.tagName.toLowerCase());\n\n\t if (elem.id) {\n\t out.push(\"#\" + elem.id);\n\t }\n\n\t className = elem.className;\n\n\t if (className && isString(className)) {\n\t classes = className.split(/\\s+/);\n\n\t for (i = 0; i < classes.length; i++) {\n\t out.push(\".\" + classes[i]);\n\t }\n\t }\n\n\t var attrWhitelist = ['type', 'name', 'title', 'alt'];\n\n\t for (i = 0; i < attrWhitelist.length; i++) {\n\t key = attrWhitelist[i];\n\t attr = elem.getAttribute(key);\n\n\t if (attr) {\n\t out.push(\"[\" + key + \"=\\\"\" + attr + \"\\\"]\");\n\t }\n\t }\n\n\t return out.join('');\n\t}\n\n\tvar INITIAL_TIME = Date.now();\n\tvar prevNow = 0;\n\tvar performanceFallback = {\n\t now: function now() {\n\t var now = Date.now() - INITIAL_TIME;\n\n\t if (now < prevNow) {\n\t now = prevNow;\n\t }\n\n\t prevNow = now;\n\t return now;\n\t },\n\t timeOrigin: INITIAL_TIME\n\t};\n\tvar crossPlatformPerformance = function () {\n\t if (isNodeEnv()) {\n\t try {\n\t var perfHooks = dynamicRequire(module, 'perf_hooks');\n\t return perfHooks.performance;\n\t } catch (_) {\n\t return performanceFallback;\n\t }\n\t }\n\n\t if (getGlobalObject().performance) {\n\t // Polyfill for performance.timeOrigin.\n\t //\n\t // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n\t // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n\t // tslint:disable-next-line:strict-type-predicates\n\t if (performance.timeOrigin === undefined) {\n\t // As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a\n\t // valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME.\n\t // @ts-ignore\n\t // tslint:disable-next-line:deprecation\n\t performance.timeOrigin = performance.timing && performance.timing.navigationStart || INITIAL_TIME;\n\t }\n\t }\n\n\t return getGlobalObject().performance || performanceFallback;\n\t}();\n\t/**\n\t * Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock.\n\t */\n\n\tfunction timestampWithMs() {\n\t return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000;\n\t} // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\n\tvar defaultRetryAfter = 60 * 1000; // 60 seconds\n\n\t/**\n\t * Extracts Retry-After value from the request header or returns default value\n\t * @param now current unix timestamp\n\t * @param header string representation of 'Retry-After' header\n\t */\n\n\tfunction parseRetryAfterHeader(now, header) {\n\t if (!header) {\n\t return defaultRetryAfter;\n\t }\n\n\t var headerDelay = parseInt(\"\" + header, 10);\n\n\t if (!isNaN(headerDelay)) {\n\t return headerDelay * 1000;\n\t }\n\n\t var headerDate = Date.parse(\"\" + header);\n\n\t if (!isNaN(headerDate)) {\n\t return headerDate - now;\n\t }\n\n\t return defaultRetryAfter;\n\t}\n\tvar defaultFunctionName = '<anonymous>';\n\t/**\n\t * Safely extract function name from itself\n\t */\n\n\tfunction getFunctionName(fn) {\n\t try {\n\t if (!fn || typeof fn !== 'function') {\n\t return defaultFunctionName;\n\t }\n\n\t return fn.name || defaultFunctionName;\n\t } catch (e) {\n\t // Just accessing custom props in some Selenium environments\n\t // can cause a \"Permission denied\" exception (see raven-js#495).\n\t return defaultFunctionName;\n\t }\n\t}\n\n\tvar global$1 = getGlobalObject();\n\t/** Prefix for logging strings */\n\n\tvar PREFIX = 'Sentry Logger ';\n\t/** JSDoc */\n\n\tvar Logger =\n\t/** @class */\n\tfunction () {\n\t /** JSDoc */\n\t function Logger() {\n\t this._enabled = false;\n\t }\n\t /** JSDoc */\n\n\n\t Logger.prototype.disable = function () {\n\t this._enabled = false;\n\t };\n\t /** JSDoc */\n\n\n\t Logger.prototype.enable = function () {\n\t this._enabled = true;\n\t };\n\t /** JSDoc */\n\n\n\t Logger.prototype.log = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t if (!this._enabled) {\n\t return;\n\t }\n\n\t consoleSandbox(function () {\n\t global$1.console.log(PREFIX + \"[Log]: \" + args.join(' ')); // tslint:disable-line:no-console\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t Logger.prototype.warn = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t if (!this._enabled) {\n\t return;\n\t }\n\n\t consoleSandbox(function () {\n\t global$1.console.warn(PREFIX + \"[Warn]: \" + args.join(' ')); // tslint:disable-line:no-console\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t Logger.prototype.error = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t if (!this._enabled) {\n\t return;\n\t }\n\n\t consoleSandbox(function () {\n\t global$1.console.error(PREFIX + \"[Error]: \" + args.join(' ')); // tslint:disable-line:no-console\n\t });\n\t };\n\n\t return Logger;\n\t}(); // Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\n\n\n\tglobal$1.__SENTRY__ = global$1.__SENTRY__ || {};\n\tvar logger = global$1.__SENTRY__.logger || (global$1.__SENTRY__.logger = new Logger());\n\n\tvar HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('splice');\n\tvar USES_TO_LENGTH$6 = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n\tvar max$3 = Math.max;\n\tvar min$6 = Math.min;\n\tvar MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n\t// `Array.prototype.splice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n\t// with adding support of @@species\n\t_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 }, {\n\t splice: function splice(start, deleteCount /* , ...items */) {\n\t var O = toObject(this);\n\t var len = toLength(O.length);\n\t var actualStart = toAbsoluteIndex(start, len);\n\t var argumentsLength = arguments.length;\n\t var insertCount, actualDeleteCount, A, k, from, to;\n\t if (argumentsLength === 0) {\n\t insertCount = actualDeleteCount = 0;\n\t } else if (argumentsLength === 1) {\n\t insertCount = 0;\n\t actualDeleteCount = len - actualStart;\n\t } else {\n\t insertCount = argumentsLength - 2;\n\t actualDeleteCount = min$6(max$3(toInteger(deleteCount), 0), len - actualStart);\n\t }\n\t if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {\n\t throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n\t }\n\t A = arraySpeciesCreate(O, actualDeleteCount);\n\t for (k = 0; k < actualDeleteCount; k++) {\n\t from = actualStart + k;\n\t if (from in O) createProperty(A, k, O[from]);\n\t }\n\t A.length = actualDeleteCount;\n\t if (insertCount < actualDeleteCount) {\n\t for (k = actualStart; k < len - actualDeleteCount; k++) {\n\t from = k + actualDeleteCount;\n\t to = k + insertCount;\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t }\n\t for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n\t } else if (insertCount > actualDeleteCount) {\n\t for (k = len - actualDeleteCount; k > actualStart; k--) {\n\t from = k + actualDeleteCount - 1;\n\t to = k + insertCount - 1;\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t }\n\t }\n\t for (k = 0; k < insertCount; k++) {\n\t O[k + actualStart] = arguments[k + 2];\n\t }\n\t O.length = len - actualDeleteCount + insertCount;\n\t return A;\n\t }\n\t});\n\n\tvar freezing = !fails(function () {\n\t return Object.isExtensible(Object.preventExtensions({}));\n\t});\n\n\tvar internalMetadata = createCommonjsModule(function (module) {\n\tvar defineProperty = objectDefineProperty.f;\n\n\n\n\tvar METADATA = uid('meta');\n\tvar id = 0;\n\n\tvar isExtensible = Object.isExtensible || function () {\n\t return true;\n\t};\n\n\tvar setMetadata = function (it) {\n\t defineProperty(it, METADATA, { value: {\n\t objectID: 'O' + ++id, // object ID\n\t weakData: {} // weak collections IDs\n\t } });\n\t};\n\n\tvar fastKey = function (it, create) {\n\t // return a primitive with prefix\n\t if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\t if (!has(it, METADATA)) {\n\t // can't set metadata to uncaught frozen object\n\t if (!isExtensible(it)) return 'F';\n\t // not necessary to add metadata\n\t if (!create) return 'E';\n\t // add missing metadata\n\t setMetadata(it);\n\t // return object ID\n\t } return it[METADATA].objectID;\n\t};\n\n\tvar getWeakData = function (it, create) {\n\t if (!has(it, METADATA)) {\n\t // can't set metadata to uncaught frozen object\n\t if (!isExtensible(it)) return true;\n\t // not necessary to add metadata\n\t if (!create) return false;\n\t // add missing metadata\n\t setMetadata(it);\n\t // return the store of weak collections IDs\n\t } return it[METADATA].weakData;\n\t};\n\n\t// add metadata on freeze-family methods calling\n\tvar onFreeze = function (it) {\n\t if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n\t return it;\n\t};\n\n\tvar meta = module.exports = {\n\t REQUIRED: false,\n\t fastKey: fastKey,\n\t getWeakData: getWeakData,\n\t onFreeze: onFreeze\n\t};\n\n\thiddenKeys[METADATA] = true;\n\t});\n\tvar internalMetadata_1 = internalMetadata.REQUIRED;\n\tvar internalMetadata_2 = internalMetadata.fastKey;\n\tvar internalMetadata_3 = internalMetadata.getWeakData;\n\tvar internalMetadata_4 = internalMetadata.onFreeze;\n\n\tvar collection = function (CONSTRUCTOR_NAME, wrapper, common) {\n\t var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n\t var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n\t var ADDER = IS_MAP ? 'set' : 'add';\n\t var NativeConstructor = global_1[CONSTRUCTOR_NAME];\n\t var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n\t var Constructor = NativeConstructor;\n\t var exported = {};\n\n\t var fixMethod = function (KEY) {\n\t var nativeMethod = NativePrototype[KEY];\n\t redefine(NativePrototype, KEY,\n\t KEY == 'add' ? function add(value) {\n\t nativeMethod.call(this, value === 0 ? 0 : value);\n\t return this;\n\t } : KEY == 'delete' ? function (key) {\n\t return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : KEY == 'get' ? function get(key) {\n\t return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : KEY == 'has' ? function has(key) {\n\t return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : function set(key, value) {\n\t nativeMethod.call(this, key === 0 ? 0 : key, value);\n\t return this;\n\t }\n\t );\n\t };\n\n\t // eslint-disable-next-line max-len\n\t if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n\t new NativeConstructor().entries().next();\n\t })))) {\n\t // create collection constructor\n\t Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n\t internalMetadata.REQUIRED = true;\n\t } else if (isForced_1(CONSTRUCTOR_NAME, true)) {\n\t var instance = new Constructor();\n\t // early implementations not supports chaining\n\t var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n\t // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n\t var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n\t // most early implementations doesn't supports iterables, most modern - not close it correctly\n\t // eslint-disable-next-line no-new\n\t var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n\t // for early implementations -0 and +0 not the same\n\t var BUGGY_ZERO = !IS_WEAK && fails(function () {\n\t // V8 ~ Chromium 42- fails only with 5+ elements\n\t var $instance = new NativeConstructor();\n\t var index = 5;\n\t while (index--) $instance[ADDER](index, index);\n\t return !$instance.has(-0);\n\t });\n\n\t if (!ACCEPT_ITERABLES) {\n\t Constructor = wrapper(function (dummy, iterable) {\n\t anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n\t var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n\t if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP);\n\t return that;\n\t });\n\t Constructor.prototype = NativePrototype;\n\t NativePrototype.constructor = Constructor;\n\t }\n\n\t if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n\t fixMethod('delete');\n\t fixMethod('has');\n\t IS_MAP && fixMethod('get');\n\t }\n\n\t if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n\t // weak collections should not contains .clear method\n\t if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n\t }\n\n\t exported[CONSTRUCTOR_NAME] = Constructor;\n\t _export({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n\t setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n\t if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n\t return Constructor;\n\t};\n\n\tvar getWeakData = internalMetadata.getWeakData;\n\n\n\n\n\n\n\n\n\tvar setInternalState$8 = internalState.set;\n\tvar internalStateGetterFor = internalState.getterFor;\n\tvar find$1 = arrayIteration.find;\n\tvar findIndex = arrayIteration.findIndex;\n\tvar id$1 = 0;\n\n\t// fallback for uncaught frozen keys\n\tvar uncaughtFrozenStore = function (store) {\n\t return store.frozen || (store.frozen = new UncaughtFrozenStore());\n\t};\n\n\tvar UncaughtFrozenStore = function () {\n\t this.entries = [];\n\t};\n\n\tvar findUncaughtFrozen = function (store, key) {\n\t return find$1(store.entries, function (it) {\n\t return it[0] === key;\n\t });\n\t};\n\n\tUncaughtFrozenStore.prototype = {\n\t get: function (key) {\n\t var entry = findUncaughtFrozen(this, key);\n\t if (entry) return entry[1];\n\t },\n\t has: function (key) {\n\t return !!findUncaughtFrozen(this, key);\n\t },\n\t set: function (key, value) {\n\t var entry = findUncaughtFrozen(this, key);\n\t if (entry) entry[1] = value;\n\t else this.entries.push([key, value]);\n\t },\n\t 'delete': function (key) {\n\t var index = findIndex(this.entries, function (it) {\n\t return it[0] === key;\n\t });\n\t if (~index) this.entries.splice(index, 1);\n\t return !!~index;\n\t }\n\t};\n\n\tvar collectionWeak = {\n\t getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n\t var C = wrapper(function (that, iterable) {\n\t anInstance(that, C, CONSTRUCTOR_NAME);\n\t setInternalState$8(that, {\n\t type: CONSTRUCTOR_NAME,\n\t id: id$1++,\n\t frozen: undefined\n\t });\n\t if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP);\n\t });\n\n\t var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n\t var define = function (that, key, value) {\n\t var state = getInternalState(that);\n\t var data = getWeakData(anObject(key), true);\n\t if (data === true) uncaughtFrozenStore(state).set(key, value);\n\t else data[state.id] = value;\n\t return that;\n\t };\n\n\t redefineAll(C.prototype, {\n\t // 23.3.3.2 WeakMap.prototype.delete(key)\n\t // 23.4.3.3 WeakSet.prototype.delete(value)\n\t 'delete': function (key) {\n\t var state = getInternalState(this);\n\t if (!isObject(key)) return false;\n\t var data = getWeakData(key);\n\t if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n\t return data && has(data, state.id) && delete data[state.id];\n\t },\n\t // 23.3.3.4 WeakMap.prototype.has(key)\n\t // 23.4.3.4 WeakSet.prototype.has(value)\n\t has: function has$1(key) {\n\t var state = getInternalState(this);\n\t if (!isObject(key)) return false;\n\t var data = getWeakData(key);\n\t if (data === true) return uncaughtFrozenStore(state).has(key);\n\t return data && has(data, state.id);\n\t }\n\t });\n\n\t redefineAll(C.prototype, IS_MAP ? {\n\t // 23.3.3.3 WeakMap.prototype.get(key)\n\t get: function get(key) {\n\t var state = getInternalState(this);\n\t if (isObject(key)) {\n\t var data = getWeakData(key);\n\t if (data === true) return uncaughtFrozenStore(state).get(key);\n\t return data ? data[state.id] : undefined;\n\t }\n\t },\n\t // 23.3.3.5 WeakMap.prototype.set(key, value)\n\t set: function set(key, value) {\n\t return define(this, key, value);\n\t }\n\t } : {\n\t // 23.4.3.1 WeakSet.prototype.add(value)\n\t add: function add(value) {\n\t return define(this, value, true);\n\t }\n\t });\n\n\t return C;\n\t }\n\t};\n\n\t// `WeakSet` constructor\n\t// https://tc39.github.io/ecma262/#sec-weakset-constructor\n\tcollection('WeakSet', function (init) {\n\t return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); };\n\t}, collectionWeak);\n\n\t// tslint:disable:no-unsafe-any\n\n\t/**\n\t * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n\t */\n\tvar Memo =\n\t/** @class */\n\tfunction () {\n\t function Memo() {\n\t // tslint:disable-next-line\n\t this._hasWeakSet = typeof WeakSet === 'function';\n\t this._inner = this._hasWeakSet ? new WeakSet() : [];\n\t }\n\t /**\n\t * Sets obj to remember.\n\t * @param obj Object to remember\n\t */\n\n\n\t Memo.prototype.memoize = function (obj) {\n\t if (this._hasWeakSet) {\n\t if (this._inner.has(obj)) {\n\t return true;\n\t }\n\n\t this._inner.add(obj);\n\n\t return false;\n\t } // tslint:disable-next-line:prefer-for-of\n\n\n\t for (var i = 0; i < this._inner.length; i++) {\n\t var value = this._inner[i];\n\n\t if (value === obj) {\n\t return true;\n\t }\n\t }\n\n\t this._inner.push(obj);\n\n\t return false;\n\t };\n\t /**\n\t * Removes object from internal storage.\n\t * @param obj Object to forget\n\t */\n\n\n\t Memo.prototype.unmemoize = function (obj) {\n\t if (this._hasWeakSet) {\n\t this._inner.delete(obj);\n\t } else {\n\t for (var i = 0; i < this._inner.length; i++) {\n\t if (this._inner[i] === obj) {\n\t this._inner.splice(i, 1);\n\n\t break;\n\t }\n\t }\n\t }\n\t };\n\n\t return Memo;\n\t}();\n\n\t// `URL.prototype.toJSON` method\n\t// https://url.spec.whatwg.org/#dom-url-tojson\n\t_export({ target: 'URL', proto: true, enumerable: true }, {\n\t toJSON: function toJSON() {\n\t return URL.prototype.toString.call(this);\n\t }\n\t});\n\n\t/**\n\t * Wrap a given object method with a higher-order function\n\t *\n\t * @param source An object that contains a method to be wrapped.\n\t * @param name A name of method to be wrapped.\n\t * @param replacement A function that should be used to wrap a given method.\n\t * @returns void\n\t */\n\n\tfunction fill(source, name, replacement) {\n\t if (!(name in source)) {\n\t return;\n\t }\n\n\t var original = source[name];\n\t var wrapped = replacement(original); // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n\t // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n\t // tslint:disable-next-line:strict-type-predicates\n\n\t if (typeof wrapped === 'function') {\n\t try {\n\t wrapped.prototype = wrapped.prototype || {};\n\t Object.defineProperties(wrapped, {\n\t __sentry_original__: {\n\t enumerable: false,\n\t value: original\n\t }\n\t });\n\t } catch (_Oo) {// This can throw if multiple fill happens on a global object like XMLHttpRequest\n\t // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n\t }\n\t }\n\n\t source[name] = wrapped;\n\t}\n\t/**\n\t * Encodes given object into url-friendly format\n\t *\n\t * @param object An object that contains serializable values\n\t * @returns string Encoded\n\t */\n\n\tfunction urlEncode(object) {\n\t return Object.keys(object).map( // tslint:disable-next-line:no-unsafe-any\n\t function (key) {\n\t return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]);\n\t }).join('&');\n\t}\n\t/**\n\t * Transforms any object into an object literal with all it's attributes\n\t * attached to it.\n\t *\n\t * @param value Initial source that we have to transform in order to be usable by the serializer\n\t */\n\n\tfunction getWalkSource(value) {\n\t if (isError(value)) {\n\t var error = value;\n\t var err = {\n\t message: error.message,\n\t name: error.name,\n\t stack: error.stack\n\t };\n\n\t for (var i in error) {\n\t if (Object.prototype.hasOwnProperty.call(error, i)) {\n\t err[i] = error[i];\n\t }\n\t }\n\n\t return err;\n\t }\n\n\t if (isEvent(value)) {\n\t var event_1 = value;\n\t var source = {};\n\t source.type = event_1.type; // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n\n\t try {\n\t source.target = isElement(event_1.target) ? htmlTreeAsString(event_1.target) : Object.prototype.toString.call(event_1.target);\n\t } catch (_oO) {\n\t source.target = '<unknown>';\n\t }\n\n\t try {\n\t source.currentTarget = isElement(event_1.currentTarget) ? htmlTreeAsString(event_1.currentTarget) : Object.prototype.toString.call(event_1.currentTarget);\n\t } catch (_oO) {\n\t source.currentTarget = '<unknown>';\n\t } // tslint:disable-next-line:strict-type-predicates\n\n\n\t if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n\t source.detail = event_1.detail;\n\t }\n\n\t for (var i in event_1) {\n\t if (Object.prototype.hasOwnProperty.call(event_1, i)) {\n\t source[i] = event_1;\n\t }\n\t }\n\n\t return source;\n\t }\n\n\t return value;\n\t}\n\t/** Calculates bytes size of input string */\n\n\n\tfunction utf8Length(value) {\n\t // tslint:disable-next-line:no-bitwise\n\t return ~-encodeURI(value).split(/%..|./).length;\n\t}\n\t/** Calculates bytes size of input object */\n\n\n\tfunction jsonSize(value) {\n\t return utf8Length(JSON.stringify(value));\n\t}\n\t/** JSDoc */\n\n\n\tfunction normalizeToSize(object, // Default Node.js REPL depth\n\tdepth, // 100kB, as 200kB is max payload size, so half sounds reasonable\n\tmaxSize) {\n\t if (depth === void 0) {\n\t depth = 3;\n\t }\n\n\t if (maxSize === void 0) {\n\t maxSize = 100 * 1024;\n\t }\n\n\t var serialized = normalize$1(object, depth);\n\n\t if (jsonSize(serialized) > maxSize) {\n\t return normalizeToSize(object, depth - 1, maxSize);\n\t }\n\n\t return serialized;\n\t}\n\t/** Transforms any input value into a string form, either primitive value or a type of the input */\n\n\tfunction serializeValue(value) {\n\t var type = Object.prototype.toString.call(value); // Node.js REPL notation\n\n\t if (typeof value === 'string') {\n\t return value;\n\t }\n\n\t if (type === '[object Object]') {\n\t return '[Object]';\n\t }\n\n\t if (type === '[object Array]') {\n\t return '[Array]';\n\t }\n\n\t var normalized = normalizeValue(value);\n\t return isPrimitive(normalized) ? normalized : type;\n\t}\n\t/**\n\t * normalizeValue()\n\t *\n\t * Takes unserializable input and make it serializable friendly\n\t *\n\t * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n\t * - serializes Error objects\n\t * - filter global objects\n\t */\n\t// tslint:disable-next-line:cyclomatic-complexity\n\n\n\tfunction normalizeValue(value, key) {\n\t if (key === 'domain' && value && _typeof(value) === 'object' && value._events) {\n\t return '[Domain]';\n\t }\n\n\t if (key === 'domainEmitter') {\n\t return '[DomainEmitter]';\n\t }\n\n\t if (typeof global !== 'undefined' && value === global) {\n\t return '[Global]';\n\t }\n\n\t if (typeof window !== 'undefined' && value === window) {\n\t return '[Window]';\n\t }\n\n\t if (typeof document !== 'undefined' && value === document) {\n\t return '[Document]';\n\t } // React's SyntheticEvent thingy\n\n\n\t if (isSyntheticEvent(value)) {\n\t return '[SyntheticEvent]';\n\t } // tslint:disable-next-line:no-tautology-expression\n\n\n\t if (typeof value === 'number' && value !== value) {\n\t return '[NaN]';\n\t }\n\n\t if (value === void 0) {\n\t return '[undefined]';\n\t }\n\n\t if (typeof value === 'function') {\n\t return \"[Function: \" + getFunctionName(value) + \"]\";\n\t }\n\n\t return value;\n\t}\n\t/**\n\t * Walks an object to perform a normalization on it\n\t *\n\t * @param key of object that's walked in current iteration\n\t * @param value object to be walked\n\t * @param depth Optional number indicating how deep should walking be performed\n\t * @param memo Optional Memo class handling decycling\n\t */\n\n\n\tfunction walk(key, value, depth, memo) {\n\t if (depth === void 0) {\n\t depth = +Infinity;\n\t }\n\n\t if (memo === void 0) {\n\t memo = new Memo();\n\t } // If we reach the maximum depth, serialize whatever has left\n\n\n\t if (depth === 0) {\n\t return serializeValue(value);\n\t } // If value implements `toJSON` method, call it and return early\n\t // tslint:disable:no-unsafe-any\n\n\n\t if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n\t return value.toJSON();\n\t } // tslint:enable:no-unsafe-any\n\t // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n\n\n\t var normalized = normalizeValue(value, key);\n\n\t if (isPrimitive(normalized)) {\n\t return normalized;\n\t } // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n\n\n\t var source = getWalkSource(value); // Create an accumulator that will act as a parent for all future itterations of that branch\n\n\t var acc = Array.isArray(value) ? [] : {}; // If we already walked that branch, bail out, as it's circular reference\n\n\t if (memo.memoize(value)) {\n\t return '[Circular ~]';\n\t } // Walk all keys of the source\n\n\n\t for (var innerKey in source) {\n\t // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n\t if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n\t continue;\n\t } // Recursively walk through all the child nodes\n\n\n\t acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n\t } // Once walked through all the branches, remove the parent from memo storage\n\n\n\t memo.unmemoize(value); // Return accumulated values\n\n\t return acc;\n\t}\n\t/**\n\t * normalize()\n\t *\n\t * - Creates a copy to prevent original input mutation\n\t * - Skip non-enumerablers\n\t * - Calls `toJSON` if implemented\n\t * - Removes circular references\n\t * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n\t * - Translates known global objects/Classes to a string representations\n\t * - Takes care of Error objects serialization\n\t * - Optionally limit depth of final output\n\t */\n\n\tfunction normalize$1(input, depth) {\n\t try {\n\t // tslint:disable-next-line:no-unsafe-any\n\t return JSON.parse(JSON.stringify(input, function (key, value) {\n\t return walk(key, value, depth);\n\t }));\n\t } catch (_oO) {\n\t return '**non-serializable**';\n\t }\n\t}\n\t/**\n\t * Given any captured exception, extract its keys and create a sorted\n\t * and truncated list that will be used inside the event message.\n\t * eg. `Non-error exception captured with keys: foo, bar, baz`\n\t */\n\n\tfunction extractExceptionKeysForMessage(exception, maxLength) {\n\t if (maxLength === void 0) {\n\t maxLength = 40;\n\t } // tslint:disable:strict-type-predicates\n\n\n\t var keys = Object.keys(getWalkSource(exception));\n\t keys.sort();\n\n\t if (!keys.length) {\n\t return '[object has no keys]';\n\t }\n\n\t if (keys[0].length >= maxLength) {\n\t return truncate(keys[0], maxLength);\n\t }\n\n\t for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n\t var serialized = keys.slice(0, includedKeys).join(', ');\n\n\t if (serialized.length > maxLength) {\n\t continue;\n\t }\n\n\t if (includedKeys === keys.length) {\n\t return serialized;\n\t }\n\n\t return truncate(serialized, maxLength);\n\t }\n\n\t return '';\n\t}\n\n\tvar $filter$1 = arrayIteration.filter;\n\n\n\n\tvar HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('filter');\n\t// Edge 14- issue\n\tvar USES_TO_LENGTH$7 = arrayMethodUsesToLength('filter');\n\n\t// `Array.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t// with adding support of @@species\n\t_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$7 }, {\n\t filter: function filter(callbackfn /* , thisArg */) {\n\t return $filter$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\n\tvar NON_GENERIC = !!nativePromiseConstructor && fails(function () {\n\t nativePromiseConstructor.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n\t});\n\n\t// `Promise.prototype.finally` method\n\t// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n\t_export({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n\t 'finally': function (onFinally) {\n\t var C = speciesConstructor(this, getBuiltIn('Promise'));\n\t var isFunction = typeof onFinally == 'function';\n\t return this.then(\n\t isFunction ? function (x) {\n\t return promiseResolve(C, onFinally()).then(function () { return x; });\n\t } : onFinally,\n\t isFunction ? function (e) {\n\t return promiseResolve(C, onFinally()).then(function () { throw e; });\n\t } : onFinally\n\t );\n\t }\n\t});\n\n\t// patch native Promise.prototype for native async functions\n\tif ( typeof nativePromiseConstructor == 'function' && !nativePromiseConstructor.prototype['finally']) {\n\t redefine(nativePromiseConstructor.prototype, 'finally', getBuiltIn('Promise').prototype['finally']);\n\t}\n\n\t/** SyncPromise internal states */\n\n\tvar States;\n\n\t(function (States) {\n\t /** Pending */\n\t States[\"PENDING\"] = \"PENDING\";\n\t /** Resolved / OK */\n\n\t States[\"RESOLVED\"] = \"RESOLVED\";\n\t /** Rejected / Error */\n\n\t States[\"REJECTED\"] = \"REJECTED\";\n\t})(States || (States = {}));\n\t/**\n\t * Thenable class that behaves like a Promise and follows it's interface\n\t * but is not async internally\n\t */\n\n\n\tvar SyncPromise =\n\t/** @class */\n\tfunction () {\n\t function SyncPromise(executor) {\n\t var _this = this;\n\n\t this._state = States.PENDING;\n\t this._handlers = [];\n\t /** JSDoc */\n\n\t this._resolve = function (value) {\n\t _this._setResult(States.RESOLVED, value);\n\t };\n\t /** JSDoc */\n\n\n\t this._reject = function (reason) {\n\t _this._setResult(States.REJECTED, reason);\n\t };\n\t /** JSDoc */\n\n\n\t this._setResult = function (state, value) {\n\t if (_this._state !== States.PENDING) {\n\t return;\n\t }\n\n\t if (isThenable$1(value)) {\n\t value.then(_this._resolve, _this._reject);\n\t return;\n\t }\n\n\t _this._state = state;\n\t _this._value = value;\n\n\t _this._executeHandlers();\n\t }; // TODO: FIXME\n\n\t /** JSDoc */\n\n\n\t this._attachHandler = function (handler) {\n\t _this._handlers = _this._handlers.concat(handler);\n\n\t _this._executeHandlers();\n\t };\n\t /** JSDoc */\n\n\n\t this._executeHandlers = function () {\n\t if (_this._state === States.PENDING) {\n\t return;\n\t }\n\n\t var cachedHandlers = _this._handlers.slice();\n\n\t _this._handlers = [];\n\t cachedHandlers.forEach(function (handler) {\n\t if (handler.done) {\n\t return;\n\t }\n\n\t if (_this._state === States.RESOLVED) {\n\t if (handler.onfulfilled) {\n\t handler.onfulfilled(_this._value);\n\t }\n\t }\n\n\t if (_this._state === States.REJECTED) {\n\t if (handler.onrejected) {\n\t handler.onrejected(_this._value);\n\t }\n\t }\n\n\t handler.done = true;\n\t });\n\t };\n\n\t try {\n\t executor(this._resolve, this._reject);\n\t } catch (e) {\n\t this._reject(e);\n\t }\n\t }\n\t /** JSDoc */\n\n\n\t SyncPromise.prototype.toString = function () {\n\t return '[object SyncPromise]';\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.resolve = function (value) {\n\t return new SyncPromise(function (resolve) {\n\t resolve(value);\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.reject = function (reason) {\n\t return new SyncPromise(function (_, reject) {\n\t reject(reason);\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.all = function (collection) {\n\t return new SyncPromise(function (resolve, reject) {\n\t if (!Array.isArray(collection)) {\n\t reject(new TypeError(\"Promise.all requires an array as input.\"));\n\t return;\n\t }\n\n\t if (collection.length === 0) {\n\t resolve([]);\n\t return;\n\t }\n\n\t var counter = collection.length;\n\t var resolvedCollection = [];\n\t collection.forEach(function (item, index) {\n\t SyncPromise.resolve(item).then(function (value) {\n\t resolvedCollection[index] = value;\n\t counter -= 1;\n\n\t if (counter !== 0) {\n\t return;\n\t }\n\n\t resolve(resolvedCollection);\n\t }).then(null, reject);\n\t });\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.prototype.then = function (_onfulfilled, _onrejected) {\n\t var _this = this;\n\n\t return new SyncPromise(function (resolve, reject) {\n\t _this._attachHandler({\n\t done: false,\n\t onfulfilled: function onfulfilled(result) {\n\t if (!_onfulfilled) {\n\t // TODO: ¯\\_(ツ)_/¯\n\t // TODO: FIXME\n\t resolve(result);\n\t return;\n\t }\n\n\t try {\n\t resolve(_onfulfilled(result));\n\t return;\n\t } catch (e) {\n\t reject(e);\n\t return;\n\t }\n\t },\n\t onrejected: function onrejected(reason) {\n\t if (!_onrejected) {\n\t reject(reason);\n\t return;\n\t }\n\n\t try {\n\t resolve(_onrejected(reason));\n\t return;\n\t } catch (e) {\n\t reject(e);\n\t return;\n\t }\n\t }\n\t });\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.prototype.catch = function (onrejected) {\n\t return this.then(function (val) {\n\t return val;\n\t }, onrejected);\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.prototype.finally = function (onfinally) {\n\t var _this = this;\n\n\t return new SyncPromise(function (resolve, reject) {\n\t var val;\n\t var isRejected;\n\t return _this.then(function (value) {\n\t isRejected = false;\n\t val = value;\n\n\t if (onfinally) {\n\t onfinally();\n\t }\n\t }, function (reason) {\n\t isRejected = true;\n\t val = reason;\n\n\t if (onfinally) {\n\t onfinally();\n\t }\n\t }).then(function () {\n\t if (isRejected) {\n\t reject(val);\n\t return;\n\t }\n\n\t resolve(val);\n\t });\n\t });\n\t };\n\n\t return SyncPromise;\n\t}();\n\n\t/** A simple queue that holds promises. */\n\n\tvar PromiseBuffer =\n\t/** @class */\n\tfunction () {\n\t function PromiseBuffer(_limit) {\n\t this._limit = _limit;\n\t /** Internal set of queued Promises */\n\n\t this._buffer = [];\n\t }\n\t /**\n\t * Says if the buffer is ready to take more requests\n\t */\n\n\n\t PromiseBuffer.prototype.isReady = function () {\n\t return this._limit === undefined || this.length() < this._limit;\n\t };\n\t /**\n\t * Add a promise to the queue.\n\t *\n\t * @param task Can be any PromiseLike<T>\n\t * @returns The original promise.\n\t */\n\n\n\t PromiseBuffer.prototype.add = function (task) {\n\t var _this = this;\n\n\t if (!this.isReady()) {\n\t return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n\t }\n\n\t if (this._buffer.indexOf(task) === -1) {\n\t this._buffer.push(task);\n\t }\n\n\t task.then(function () {\n\t return _this.remove(task);\n\t }).then(null, function () {\n\t return _this.remove(task).then(null, function () {// We have to add this catch here otherwise we have an unhandledPromiseRejection\n\t // because it's a new Promise chain.\n\t });\n\t });\n\t return task;\n\t };\n\t /**\n\t * Remove a promise to the queue.\n\t *\n\t * @param task Can be any PromiseLike<T>\n\t * @returns Removed promise.\n\t */\n\n\n\t PromiseBuffer.prototype.remove = function (task) {\n\t var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n\n\t return removedTask;\n\t };\n\t /**\n\t * This function returns the number of unresolved promises in the queue.\n\t */\n\n\n\t PromiseBuffer.prototype.length = function () {\n\t return this._buffer.length;\n\t };\n\t /**\n\t * This will drain the whole queue, returns true if queue is empty or drained.\n\t * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.\n\t *\n\t * @param timeout Number in ms to wait until it resolves with false.\n\t */\n\n\n\t PromiseBuffer.prototype.drain = function (timeout) {\n\t var _this = this;\n\n\t return new SyncPromise(function (resolve) {\n\t var capturedSetTimeout = setTimeout(function () {\n\t if (timeout && timeout > 0) {\n\t resolve(false);\n\t }\n\t }, timeout);\n\t SyncPromise.all(_this._buffer).then(function () {\n\t clearTimeout(capturedSetTimeout);\n\t resolve(true);\n\t }).then(null, function () {\n\t resolve(true);\n\t });\n\t });\n\t };\n\n\t return PromiseBuffer;\n\t}();\n\n\t/**\n\t * Tells whether current environment supports Fetch API\n\t * {@link supportsFetch}.\n\t *\n\t * @returns Answer to the given question.\n\t */\n\n\tfunction supportsFetch() {\n\t if (!('fetch' in getGlobalObject())) {\n\t return false;\n\t }\n\n\t try {\n\t // tslint:disable-next-line:no-unused-expression\n\t new Headers(); // tslint:disable-next-line:no-unused-expression\n\n\t new Request(''); // tslint:disable-next-line:no-unused-expression\n\n\t new Response();\n\t return true;\n\t } catch (e) {\n\t return false;\n\t }\n\t}\n\t/**\n\t * isNativeFetch checks if the given function is a native implementation of fetch()\n\t */\n\n\tfunction isNativeFetch(func) {\n\t return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n\t}\n\t/**\n\t * Tells whether current environment supports Fetch API natively\n\t * {@link supportsNativeFetch}.\n\t *\n\t * @returns true if `window.fetch` is natively implemented, false otherwise\n\t */\n\n\n\tfunction supportsNativeFetch() {\n\t if (!supportsFetch()) {\n\t return false;\n\t }\n\n\t var global = getGlobalObject(); // Fast path to avoid DOM I/O\n\t // tslint:disable-next-line:no-unbound-method\n\n\t if (isNativeFetch(global.fetch)) {\n\t return true;\n\t } // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n\t // so create a \"pure\" iframe to see if that has native fetch\n\n\n\t var result = false;\n\t var doc = global.document; // tslint:disable-next-line:no-unbound-method deprecation\n\n\t if (doc && typeof doc.createElement === \"function\") {\n\t try {\n\t var sandbox = doc.createElement('iframe');\n\t sandbox.hidden = true;\n\t doc.head.appendChild(sandbox);\n\n\t if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n\t // tslint:disable-next-line:no-unbound-method\n\t result = isNativeFetch(sandbox.contentWindow.fetch);\n\t }\n\n\t doc.head.removeChild(sandbox);\n\t } catch (err) {\n\t logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n\t }\n\t }\n\n\t return result;\n\t}\n\t/**\n\t * Tells whether current environment supports Referrer Policy API\n\t * {@link supportsReferrerPolicy}.\n\t *\n\t * @returns Answer to the given question.\n\t */\n\n\tfunction supportsReferrerPolicy() {\n\t // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n\t // https://caniuse.com/#feat=referrer-policy\n\t // It doesn't. And it throw exception instead of ignoring this parameter...\n\t // REF: https://github.com/getsentry/raven-js/issues/1233\n\t if (!supportsFetch()) {\n\t return false;\n\t }\n\n\t try {\n\t // tslint:disable:no-unused-expression\n\t new Request('_', {\n\t referrerPolicy: 'origin'\n\t });\n\t return true;\n\t } catch (e) {\n\t return false;\n\t }\n\t}\n\t/**\n\t * Tells whether current environment supports History API\n\t * {@link supportsHistory}.\n\t *\n\t * @returns Answer to the given question.\n\t */\n\n\tfunction supportsHistory() {\n\t // NOTE: in Chrome App environment, touching history.pushState, *even inside\n\t // a try/catch block*, will cause Chrome to output an error to console.error\n\t // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n\t var global = getGlobalObject();\n\t var chrome = global.chrome; // tslint:disable-next-line:no-unsafe-any\n\n\t var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n\t var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n\t return !isChromePackagedApp && hasHistoryApi;\n\t}\n\n\tvar global$2 = getGlobalObject();\n\t/**\n\t * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n\t * - Console API\n\t * - Fetch API\n\t * - XHR API\n\t * - History API\n\t * - DOM API (click/typing)\n\t * - Error API\n\t * - UnhandledRejection API\n\t */\n\n\tvar handlers = {};\n\tvar instrumented = {};\n\t/** Instruments given API */\n\n\tfunction instrument(type) {\n\t if (instrumented[type]) {\n\t return;\n\t }\n\n\t instrumented[type] = true;\n\n\t switch (type) {\n\t case 'console':\n\t instrumentConsole();\n\t break;\n\n\t case 'dom':\n\t instrumentDOM();\n\t break;\n\n\t case 'xhr':\n\t instrumentXHR();\n\t break;\n\n\t case 'fetch':\n\t instrumentFetch();\n\t break;\n\n\t case 'history':\n\t instrumentHistory();\n\t break;\n\n\t case 'error':\n\t instrumentError();\n\t break;\n\n\t case 'unhandledrejection':\n\t instrumentUnhandledRejection();\n\t break;\n\n\t default:\n\t logger.warn('unknown instrumentation type:', type);\n\t }\n\t}\n\t/**\n\t * Add handler that will be called when given type of instrumentation triggers.\n\t * Use at your own risk, this might break without changelog notice, only used internally.\n\t * @hidden\n\t */\n\n\n\tfunction addInstrumentationHandler(handler) {\n\t // tslint:disable-next-line:strict-type-predicates\n\t if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {\n\t return;\n\t }\n\n\t handlers[handler.type] = handlers[handler.type] || [];\n\t handlers[handler.type].push(handler.callback);\n\t instrument(handler.type);\n\t}\n\t/** JSDoc */\n\n\tfunction triggerHandlers(type, data) {\n\t var e_1, _a;\n\n\t if (!type || !handlers[type]) {\n\t return;\n\t }\n\n\t try {\n\t for (var _b = __values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n\t var handler = _c.value;\n\n\t try {\n\t handler(data);\n\t } catch (e) {\n\t logger.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + getFunctionName(handler) + \"\\nError: \" + e);\n\t }\n\t }\n\t } catch (e_1_1) {\n\t e_1 = {\n\t error: e_1_1\n\t };\n\t } finally {\n\t try {\n\t if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n\t } finally {\n\t if (e_1) throw e_1.error;\n\t }\n\t }\n\t}\n\t/** JSDoc */\n\n\n\tfunction instrumentConsole() {\n\t if (!('console' in global$2)) {\n\t return;\n\t }\n\n\t ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {\n\t if (!(level in global$2.console)) {\n\t return;\n\t }\n\n\t fill(global$2.console, level, function (originalConsoleLevel) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t triggerHandlers('console', {\n\t args: args,\n\t level: level\n\t }); // this fails for some browsers. :(\n\n\t if (originalConsoleLevel) {\n\t Function.prototype.apply.call(originalConsoleLevel, global$2.console, args);\n\t }\n\t };\n\t });\n\t });\n\t}\n\t/** JSDoc */\n\n\n\tfunction instrumentFetch() {\n\t if (!supportsNativeFetch()) {\n\t return;\n\t }\n\n\t fill(global$2, 'fetch', function (originalFetch) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var commonHandlerData = {\n\t args: args,\n\t fetchData: {\n\t method: getFetchMethod(args),\n\t url: getFetchUrl(args)\n\t },\n\t startTimestamp: Date.now()\n\t };\n\t triggerHandlers('fetch', _assign({}, commonHandlerData));\n\t return originalFetch.apply(global$2, args).then(function (response) {\n\t triggerHandlers('fetch', _assign({}, commonHandlerData, {\n\t endTimestamp: Date.now(),\n\t response: response\n\t }));\n\t return response;\n\t }, function (error) {\n\t triggerHandlers('fetch', _assign({}, commonHandlerData, {\n\t endTimestamp: Date.now(),\n\t error: error\n\t }));\n\t throw error;\n\t });\n\t };\n\t });\n\t}\n\t/** Extract `method` from fetch call arguments */\n\n\n\tfunction getFetchMethod(fetchArgs) {\n\t if (fetchArgs === void 0) {\n\t fetchArgs = [];\n\t }\n\n\t if ('Request' in global$2 && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n\t return String(fetchArgs[0].method).toUpperCase();\n\t }\n\n\t if (fetchArgs[1] && fetchArgs[1].method) {\n\t return String(fetchArgs[1].method).toUpperCase();\n\t }\n\n\t return 'GET';\n\t}\n\t/** Extract `url` from fetch call arguments */\n\n\n\tfunction getFetchUrl(fetchArgs) {\n\t if (fetchArgs === void 0) {\n\t fetchArgs = [];\n\t }\n\n\t if (typeof fetchArgs[0] === 'string') {\n\t return fetchArgs[0];\n\t }\n\n\t if ('Request' in global$2 && isInstanceOf(fetchArgs[0], Request)) {\n\t return fetchArgs[0].url;\n\t }\n\n\t return String(fetchArgs[0]);\n\t}\n\t/** JSDoc */\n\n\n\tfunction instrumentXHR() {\n\t if (!('XMLHttpRequest' in global$2)) {\n\t return;\n\t }\n\n\t var xhrproto = XMLHttpRequest.prototype;\n\t fill(xhrproto, 'open', function (originalOpen) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var url = args[1];\n\t this.__sentry_xhr__ = {\n\t method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n\t url: args[1]\n\t }; // if Sentry key appears in URL, don't capture it as a request\n\n\t if (isString(url) && this.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {\n\t this.__sentry_own_request__ = true;\n\t }\n\n\t return originalOpen.apply(this, args);\n\t };\n\t });\n\t fill(xhrproto, 'send', function (originalSend) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var xhr = this; // tslint:disable-line:no-this-assignment\n\n\t var commonHandlerData = {\n\t args: args,\n\t startTimestamp: Date.now(),\n\t xhr: xhr\n\t };\n\t triggerHandlers('xhr', _assign({}, commonHandlerData));\n\t xhr.addEventListener('readystatechange', function () {\n\t if (xhr.readyState === 4) {\n\t try {\n\t // touching statusCode in some platforms throws\n\t // an exception\n\t if (xhr.__sentry_xhr__) {\n\t xhr.__sentry_xhr__.status_code = xhr.status;\n\t }\n\t } catch (e) {\n\t /* do nothing */\n\t }\n\n\t triggerHandlers('xhr', _assign({}, commonHandlerData, {\n\t endTimestamp: Date.now()\n\t }));\n\t }\n\t });\n\t return originalSend.apply(this, args);\n\t };\n\t });\n\t}\n\n\tvar lastHref;\n\t/** JSDoc */\n\n\tfunction instrumentHistory() {\n\t if (!supportsHistory()) {\n\t return;\n\t }\n\n\t var oldOnPopState = global$2.onpopstate;\n\n\t global$2.onpopstate = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var to = global$2.location.href; // keep track of the current URL state, as we always receive only the updated state\n\n\t var from = lastHref;\n\t lastHref = to;\n\t triggerHandlers('history', {\n\t from: from,\n\t to: to\n\t });\n\n\t if (oldOnPopState) {\n\t return oldOnPopState.apply(this, args);\n\t }\n\t };\n\t /** @hidden */\n\n\n\t function historyReplacementFunction(originalHistoryFunction) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var url = args.length > 2 ? args[2] : undefined;\n\n\t if (url) {\n\t // coerce to string (this is what pushState does)\n\t var from = lastHref;\n\t var to = String(url); // keep track of the current URL state, as we always receive only the updated state\n\n\t lastHref = to;\n\t triggerHandlers('history', {\n\t from: from,\n\t to: to\n\t });\n\t }\n\n\t return originalHistoryFunction.apply(this, args);\n\t };\n\t }\n\n\t fill(global$2.history, 'pushState', historyReplacementFunction);\n\t fill(global$2.history, 'replaceState', historyReplacementFunction);\n\t}\n\t/** JSDoc */\n\n\n\tfunction instrumentDOM() {\n\t if (!('document' in global$2)) {\n\t return;\n\t } // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n\t // to the document. Do this before we instrument addEventListener.\n\n\n\t global$2.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);\n\t global$2.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false); // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.\n\n\t ['EventTarget', 'Node'].forEach(function (target) {\n\t var proto = global$2[target] && global$2[target].prototype;\n\n\t if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n\t return;\n\t }\n\n\t fill(proto, 'addEventListener', function (original) {\n\t return function (eventName, fn, options) {\n\t if (fn && fn.handleEvent) {\n\t if (eventName === 'click') {\n\t fill(fn, 'handleEvent', function (innerOriginal) {\n\t return function (event) {\n\t domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);\n\t return innerOriginal.call(this, event);\n\t };\n\t });\n\t }\n\n\t if (eventName === 'keypress') {\n\t fill(fn, 'handleEvent', function (innerOriginal) {\n\t return function (event) {\n\t keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);\n\t return innerOriginal.call(this, event);\n\t };\n\t });\n\t }\n\t } else {\n\t if (eventName === 'click') {\n\t domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);\n\t }\n\n\t if (eventName === 'keypress') {\n\t keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);\n\t }\n\t }\n\n\t return original.call(this, eventName, fn, options);\n\t };\n\t });\n\t fill(proto, 'removeEventListener', function (original) {\n\t return function (eventName, fn, options) {\n\t var callback = fn;\n\n\t try {\n\t callback = callback && (callback.__sentry_wrapped__ || callback);\n\t } catch (e) {// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n\t }\n\n\t return original.call(this, eventName, callback, options);\n\t };\n\t });\n\t });\n\t}\n\n\tvar debounceDuration = 1000;\n\tvar debounceTimer = 0;\n\tvar keypressTimeout;\n\tvar lastCapturedEvent;\n\t/**\n\t * Wraps addEventListener to capture UI breadcrumbs\n\t * @param name the event name (e.g. \"click\")\n\t * @param handler function that will be triggered\n\t * @param debounce decides whether it should wait till another event loop\n\t * @returns wrapped breadcrumb events handler\n\t * @hidden\n\t */\n\n\tfunction domEventHandler(name, handler, debounce) {\n\t if (debounce === void 0) {\n\t debounce = false;\n\t }\n\n\t return function (event) {\n\t // reset keypress timeout; e.g. triggering a 'click' after\n\t // a 'keypress' will reset the keypress debounce so that a new\n\t // set of keypresses can be recorded\n\t keypressTimeout = undefined; // It's possible this handler might trigger multiple times for the same\n\t // event (e.g. event propagation through node ancestors). Ignore if we've\n\t // already captured the event.\n\n\t if (!event || lastCapturedEvent === event) {\n\t return;\n\t }\n\n\t lastCapturedEvent = event;\n\n\t if (debounceTimer) {\n\t clearTimeout(debounceTimer);\n\t }\n\n\t if (debounce) {\n\t debounceTimer = setTimeout(function () {\n\t handler({\n\t event: event,\n\t name: name\n\t });\n\t });\n\t } else {\n\t handler({\n\t event: event,\n\t name: name\n\t });\n\t }\n\t };\n\t}\n\t/**\n\t * Wraps addEventListener to capture keypress UI events\n\t * @param handler function that will be triggered\n\t * @returns wrapped keypress events handler\n\t * @hidden\n\t */\n\n\n\tfunction keypressEventHandler(handler) {\n\t // TODO: if somehow user switches keypress target before\n\t // debounce timeout is triggered, we will only capture\n\t // a single breadcrumb from the FIRST target (acceptable?)\n\t return function (event) {\n\t var target;\n\n\t try {\n\t target = event.target;\n\t } catch (e) {\n\t // just accessing event properties can throw an exception in some rare circumstances\n\t // see: https://github.com/getsentry/raven-js/issues/838\n\t return;\n\t }\n\n\t var tagName = target && target.tagName; // only consider keypress events on actual input elements\n\t // this will disregard keypresses targeting body (e.g. tabbing\n\t // through elements, hotkeys, etc)\n\n\t if (!tagName || tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) {\n\t return;\n\t } // record first keypress in a series, but ignore subsequent\n\t // keypresses until debounce clears\n\n\n\t if (!keypressTimeout) {\n\t domEventHandler('input', handler)(event);\n\t }\n\n\t clearTimeout(keypressTimeout);\n\t keypressTimeout = setTimeout(function () {\n\t keypressTimeout = undefined;\n\t }, debounceDuration);\n\t };\n\t}\n\n\tvar _oldOnErrorHandler = null;\n\t/** JSDoc */\n\n\tfunction instrumentError() {\n\t _oldOnErrorHandler = global$2.onerror;\n\n\t global$2.onerror = function (msg, url, line, column, error) {\n\t triggerHandlers('error', {\n\t column: column,\n\t error: error,\n\t line: line,\n\t msg: msg,\n\t url: url\n\t });\n\n\t if (_oldOnErrorHandler) {\n\t return _oldOnErrorHandler.apply(this, arguments);\n\t }\n\n\t return false;\n\t };\n\t}\n\n\tvar _oldOnUnhandledRejectionHandler = null;\n\t/** JSDoc */\n\n\tfunction instrumentUnhandledRejection() {\n\t _oldOnUnhandledRejectionHandler = global$2.onunhandledrejection;\n\n\t global$2.onunhandledrejection = function (e) {\n\t triggerHandlers('unhandledrejection', e);\n\n\t if (_oldOnUnhandledRejectionHandler) {\n\t return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n\t }\n\n\t return true;\n\t };\n\t}\n\n\t/** Regular expression used to parse a Dsn. */\n\n\tvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w\\.-]+)(?::(\\d+))?\\/(.+)/;\n\t/** Error message */\n\n\tvar ERROR_MESSAGE = 'Invalid Dsn';\n\t/** The Sentry Dsn, identifying a Sentry instance and project. */\n\n\tvar Dsn =\n\t/** @class */\n\tfunction () {\n\t /** Creates a new Dsn component */\n\t function Dsn(from) {\n\t if (typeof from === 'string') {\n\t this._fromString(from);\n\t } else {\n\t this._fromComponents(from);\n\t }\n\n\t this._validate();\n\t }\n\t /**\n\t * Renders the string representation of this Dsn.\n\t *\n\t * By default, this will render the public representation without the password\n\t * component. To get the deprecated private representation, set `withPassword`\n\t * to true.\n\t *\n\t * @param withPassword When set to true, the password will be included.\n\t */\n\n\n\t Dsn.prototype.toString = function (withPassword) {\n\t if (withPassword === void 0) {\n\t withPassword = false;\n\t } // tslint:disable-next-line:no-this-assignment\n\n\n\t var _a = this,\n\t host = _a.host,\n\t path = _a.path,\n\t pass = _a.pass,\n\t port = _a.port,\n\t projectId = _a.projectId,\n\t protocol = _a.protocol,\n\t user = _a.user;\n\n\t return protocol + \"://\" + user + (withPassword && pass ? \":\" + pass : '') + (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId);\n\t };\n\t /** Parses a string into this Dsn. */\n\n\n\t Dsn.prototype._fromString = function (str) {\n\t var match = DSN_REGEX.exec(str);\n\n\t if (!match) {\n\t throw new SentryError(ERROR_MESSAGE);\n\t }\n\n\t var _a = __read(match.slice(1), 6),\n\t protocol = _a[0],\n\t user = _a[1],\n\t _b = _a[2],\n\t pass = _b === void 0 ? '' : _b,\n\t host = _a[3],\n\t _c = _a[4],\n\t port = _c === void 0 ? '' : _c,\n\t lastPath = _a[5];\n\n\t var path = '';\n\t var projectId = lastPath;\n\t var split = projectId.split('/');\n\n\t if (split.length > 1) {\n\t path = split.slice(0, -1).join('/');\n\t projectId = split.pop();\n\t }\n\n\t this._fromComponents({\n\t host: host,\n\t pass: pass,\n\t path: path,\n\t projectId: projectId,\n\t port: port,\n\t protocol: protocol,\n\t user: user\n\t });\n\t };\n\t /** Maps Dsn components into this instance. */\n\n\n\t Dsn.prototype._fromComponents = function (components) {\n\t this.protocol = components.protocol;\n\t this.user = components.user;\n\t this.pass = components.pass || '';\n\t this.host = components.host;\n\t this.port = components.port || '';\n\t this.path = components.path || '';\n\t this.projectId = components.projectId;\n\t };\n\t /** Validates this Dsn and throws on error. */\n\n\n\t Dsn.prototype._validate = function () {\n\t var _this = this;\n\n\t ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {\n\t if (!_this[component]) {\n\t throw new SentryError(ERROR_MESSAGE);\n\t }\n\t });\n\n\t if (this.protocol !== 'http' && this.protocol !== 'https') {\n\t throw new SentryError(ERROR_MESSAGE);\n\t }\n\n\t if (this.port && isNaN(parseInt(this.port, 10))) {\n\t throw new SentryError(ERROR_MESSAGE);\n\t }\n\t };\n\n\t return Dsn;\n\t}();\n\n\t/**\n\t * Holds additional event information. {@link Scope.applyToEvent} will be\n\t * called by the client before an event will be sent.\n\t */\n\n\tvar Scope =\n\t/** @class */\n\tfunction () {\n\t function Scope() {\n\t /** Flag if notifiying is happening. */\n\t this._notifyingListeners = false;\n\t /** Callback for client to receive scope changes. */\n\n\t this._scopeListeners = [];\n\t /** Callback list that will be called after {@link applyToEvent}. */\n\n\t this._eventProcessors = [];\n\t /** Array of breadcrumbs. */\n\n\t this._breadcrumbs = [];\n\t /** User */\n\n\t this._user = {};\n\t /** Tags */\n\n\t this._tags = {};\n\t /** Extra */\n\n\t this._extra = {};\n\t /** Contexts */\n\n\t this._context = {};\n\t }\n\t /**\n\t * Add internal on change listener. Used for sub SDKs that need to store the scope.\n\t * @hidden\n\t */\n\n\n\t Scope.prototype.addScopeListener = function (callback) {\n\t this._scopeListeners.push(callback);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.addEventProcessor = function (callback) {\n\t this._eventProcessors.push(callback);\n\n\t return this;\n\t };\n\t /**\n\t * This will be called on every set call.\n\t */\n\n\n\t Scope.prototype._notifyScopeListeners = function () {\n\t var _this = this;\n\n\t if (!this._notifyingListeners) {\n\t this._notifyingListeners = true;\n\t setTimeout(function () {\n\t _this._scopeListeners.forEach(function (callback) {\n\t callback(_this);\n\t });\n\n\t _this._notifyingListeners = false;\n\t });\n\t }\n\t };\n\t /**\n\t * This will be called after {@link applyToEvent} is finished.\n\t */\n\n\n\t Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {\n\t var _this = this;\n\n\t if (index === void 0) {\n\t index = 0;\n\t }\n\n\t return new SyncPromise(function (resolve, reject) {\n\t var processor = processors[index]; // tslint:disable-next-line:strict-type-predicates\n\n\t if (event === null || typeof processor !== 'function') {\n\t resolve(event);\n\t } else {\n\t var result = processor(_assign({}, event), hint);\n\n\t if (isThenable$1(result)) {\n\t result.then(function (final) {\n\t return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve);\n\t }).then(null, reject);\n\t } else {\n\t _this._notifyEventProcessors(processors, result, hint, index + 1).then(resolve).then(null, reject);\n\t }\n\t }\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setUser = function (user) {\n\t this._user = user || {};\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setTags = function (tags) {\n\t this._tags = _assign({}, this._tags, tags);\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setTag = function (key, value) {\n\t var _a;\n\n\t this._tags = _assign({}, this._tags, (_a = {}, _a[key] = value, _a));\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setExtras = function (extras) {\n\t this._extra = _assign({}, this._extra, extras);\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setExtra = function (key, extra) {\n\t var _a;\n\n\t this._extra = _assign({}, this._extra, (_a = {}, _a[key] = extra, _a));\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setFingerprint = function (fingerprint) {\n\t this._fingerprint = fingerprint;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setLevel = function (level) {\n\t this._level = level;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setTransaction = function (transaction) {\n\t this._transaction = transaction;\n\n\t if (this._span) {\n\t this._span.transaction = transaction;\n\t }\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setContext = function (key, context) {\n\t var _a;\n\n\t this._context = _assign({}, this._context, (_a = {}, _a[key] = context, _a));\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setSpan = function (span) {\n\t this._span = span;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * Internal getter for Span, used in Hub.\n\t * @hidden\n\t */\n\n\n\t Scope.prototype.getSpan = function () {\n\t return this._span;\n\t };\n\t /**\n\t * Inherit values from the parent scope.\n\t * @param scope to clone.\n\t */\n\n\n\t Scope.clone = function (scope) {\n\t var newScope = new Scope();\n\n\t if (scope) {\n\t newScope._breadcrumbs = __spread(scope._breadcrumbs);\n\t newScope._tags = _assign({}, scope._tags);\n\t newScope._extra = _assign({}, scope._extra);\n\t newScope._context = _assign({}, scope._context);\n\t newScope._user = scope._user;\n\t newScope._level = scope._level;\n\t newScope._span = scope._span;\n\t newScope._transaction = scope._transaction;\n\t newScope._fingerprint = scope._fingerprint;\n\t newScope._eventProcessors = __spread(scope._eventProcessors);\n\t }\n\n\t return newScope;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.clear = function () {\n\t this._breadcrumbs = [];\n\t this._tags = {};\n\t this._extra = {};\n\t this._user = {};\n\t this._context = {};\n\t this._level = undefined;\n\t this._transaction = undefined;\n\t this._fingerprint = undefined;\n\t this._span = undefined;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {\n\t var mergedBreadcrumb = _assign({\n\t timestamp: timestampWithMs()\n\t }, breadcrumb);\n\n\t this._breadcrumbs = maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0 ? __spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs) : __spread(this._breadcrumbs, [mergedBreadcrumb]);\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.clearBreadcrumbs = function () {\n\t this._breadcrumbs = [];\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * Applies fingerprint from the scope to the event if there's one,\n\t * uses message if there's one instead or get rid of empty fingerprint\n\t */\n\n\n\t Scope.prototype._applyFingerprint = function (event) {\n\t // Make sure it's an array first and we actually have something in place\n\t event.fingerprint = event.fingerprint ? Array.isArray(event.fingerprint) ? event.fingerprint : [event.fingerprint] : []; // If we have something on the scope, then merge it with event\n\n\t if (this._fingerprint) {\n\t event.fingerprint = event.fingerprint.concat(this._fingerprint);\n\t } // If we have no data at all, remove empty array default\n\n\n\t if (event.fingerprint && !event.fingerprint.length) {\n\t delete event.fingerprint;\n\t }\n\t };\n\t /**\n\t * Applies the current context and fingerprint to the event.\n\t * Note that breadcrumbs will be added by the client.\n\t * Also if the event has already breadcrumbs on it, we do not merge them.\n\t * @param event Event\n\t * @param hint May contain additional informartion about the original exception.\n\t * @hidden\n\t */\n\n\n\t Scope.prototype.applyToEvent = function (event, hint) {\n\t if (this._extra && Object.keys(this._extra).length) {\n\t event.extra = _assign({}, this._extra, event.extra);\n\t }\n\n\t if (this._tags && Object.keys(this._tags).length) {\n\t event.tags = _assign({}, this._tags, event.tags);\n\t }\n\n\t if (this._user && Object.keys(this._user).length) {\n\t event.user = _assign({}, this._user, event.user);\n\t }\n\n\t if (this._context && Object.keys(this._context).length) {\n\t event.contexts = _assign({}, this._context, event.contexts);\n\t }\n\n\t if (this._level) {\n\t event.level = this._level;\n\t }\n\n\t if (this._transaction) {\n\t event.transaction = this._transaction;\n\t }\n\n\t if (this._span) {\n\t event.contexts = _assign({\n\t trace: this._span.getTraceContext()\n\t }, event.contexts);\n\t }\n\n\t this._applyFingerprint(event);\n\n\t event.breadcrumbs = __spread(event.breadcrumbs || [], this._breadcrumbs);\n\t event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n\t return this._notifyEventProcessors(__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint);\n\t };\n\n\t return Scope;\n\t}();\n\t/**\n\t * Retruns the global event processors.\n\t */\n\n\tfunction getGlobalEventProcessors() {\n\t var global = getGlobalObject();\n\t global.__SENTRY__ = global.__SENTRY__ || {};\n\t global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n\t return global.__SENTRY__.globalEventProcessors;\n\t}\n\t/**\n\t * Add a EventProcessor to be kept globally.\n\t * @param callback EventProcessor to add\n\t */\n\n\n\tfunction addGlobalEventProcessor(callback) {\n\t getGlobalEventProcessors().push(callback);\n\t}\n\n\t/**\n\t * API compatibility version of this hub.\n\t *\n\t * WARNING: This number should only be incresed when the global interface\n\t * changes a and new methods are introduced.\n\t *\n\t * @hidden\n\t */\n\n\tvar API_VERSION = 3;\n\t/**\n\t * Default maximum number of breadcrumbs added to an event. Can be overwritten\n\t * with {@link Options.maxBreadcrumbs}.\n\t */\n\n\tvar DEFAULT_BREADCRUMBS = 100;\n\t/**\n\t * Absolute maximum number of breadcrumbs added to an event. The\n\t * `maxBreadcrumbs` option cannot be higher than this value.\n\t */\n\n\tvar MAX_BREADCRUMBS = 100;\n\t/**\n\t * @inheritDoc\n\t */\n\n\tvar Hub =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * Creates a new instance of the hub, will push one {@link Layer} into the\n\t * internal stack on creation.\n\t *\n\t * @param client bound to the hub.\n\t * @param scope bound to the hub.\n\t * @param version number, higher number means higher priority.\n\t */\n\t function Hub(client, scope, _version) {\n\t if (scope === void 0) {\n\t scope = new Scope();\n\t }\n\n\t if (_version === void 0) {\n\t _version = API_VERSION;\n\t }\n\n\t this._version = _version;\n\t /** Is a {@link Layer}[] containing the client and scope */\n\n\t this._stack = [];\n\n\t this._stack.push({\n\t client: client,\n\t scope: scope\n\t });\n\t }\n\t /**\n\t * Internal helper function to call a method on the top client if it exists.\n\t *\n\t * @param method The method to call on the client.\n\t * @param args Arguments to pass to the client function.\n\t */\n\n\n\t Hub.prototype._invokeClient = function (method) {\n\t var _a;\n\n\t var args = [];\n\n\t for (var _i = 1; _i < arguments.length; _i++) {\n\t args[_i - 1] = arguments[_i];\n\t }\n\n\t var top = this.getStackTop();\n\n\t if (top && top.client && top.client[method]) {\n\t (_a = top.client)[method].apply(_a, __spread(args, [top.scope]));\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.isOlderThan = function (version) {\n\t return this._version < version;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.bindClient = function (client) {\n\t var top = this.getStackTop();\n\t top.client = client;\n\n\t if (client && client.setupIntegrations) {\n\t client.setupIntegrations();\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.pushScope = function () {\n\t // We want to clone the content of prev scope\n\t var stack = this.getStack();\n\t var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;\n\t var scope = Scope.clone(parentScope);\n\t this.getStack().push({\n\t client: this.getClient(),\n\t scope: scope\n\t });\n\t return scope;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.popScope = function () {\n\t return this.getStack().pop() !== undefined;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.withScope = function (callback) {\n\t var scope = this.pushScope();\n\n\t try {\n\t callback(scope);\n\t } finally {\n\t this.popScope();\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.getClient = function () {\n\t return this.getStackTop().client;\n\t };\n\t /** Returns the scope of the top stack. */\n\n\n\t Hub.prototype.getScope = function () {\n\t return this.getStackTop().scope;\n\t };\n\t /** Returns the scope stack for domains or the process. */\n\n\n\t Hub.prototype.getStack = function () {\n\t return this._stack;\n\t };\n\t /** Returns the topmost scope layer in the order domain > local > process. */\n\n\n\t Hub.prototype.getStackTop = function () {\n\t return this._stack[this._stack.length - 1];\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.captureException = function (exception, hint) {\n\t var eventId = this._lastEventId = uuid4();\n\t var finalHint = hint; // If there's no explicit hint provided, mimick the same thing that would happen\n\t // in the minimal itself to create a consistent behavior.\n\t // We don't do this in the client, as it's the lowest level API, and doing this,\n\t // would prevent user from having full control over direct calls.\n\n\t if (!hint) {\n\t var syntheticException = void 0;\n\n\t try {\n\t throw new Error('Sentry syntheticException');\n\t } catch (exception) {\n\t syntheticException = exception;\n\t }\n\n\t finalHint = {\n\t originalException: exception,\n\t syntheticException: syntheticException\n\t };\n\t }\n\n\t this._invokeClient('captureException', exception, _assign({}, finalHint, {\n\t event_id: eventId\n\t }));\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.captureMessage = function (message, level, hint) {\n\t var eventId = this._lastEventId = uuid4();\n\t var finalHint = hint; // If there's no explicit hint provided, mimick the same thing that would happen\n\t // in the minimal itself to create a consistent behavior.\n\t // We don't do this in the client, as it's the lowest level API, and doing this,\n\t // would prevent user from having full control over direct calls.\n\n\t if (!hint) {\n\t var syntheticException = void 0;\n\n\t try {\n\t throw new Error(message);\n\t } catch (exception) {\n\t syntheticException = exception;\n\t }\n\n\t finalHint = {\n\t originalException: message,\n\t syntheticException: syntheticException\n\t };\n\t }\n\n\t this._invokeClient('captureMessage', message, level, _assign({}, finalHint, {\n\t event_id: eventId\n\t }));\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.captureEvent = function (event, hint) {\n\t var eventId = this._lastEventId = uuid4();\n\n\t this._invokeClient('captureEvent', event, _assign({}, hint, {\n\t event_id: eventId\n\t }));\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.lastEventId = function () {\n\t return this._lastEventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope || !top.client) {\n\t return;\n\t }\n\n\t var _a = top.client.getOptions && top.client.getOptions() || {},\n\t _b = _a.beforeBreadcrumb,\n\t beforeBreadcrumb = _b === void 0 ? null : _b,\n\t _c = _a.maxBreadcrumbs,\n\t maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;\n\n\t if (maxBreadcrumbs <= 0) {\n\t return;\n\t }\n\n\t var timestamp = timestampWithMs();\n\n\t var mergedBreadcrumb = _assign({\n\t timestamp: timestamp\n\t }, breadcrumb);\n\n\t var finalBreadcrumb = beforeBreadcrumb ? consoleSandbox(function () {\n\t return beforeBreadcrumb(mergedBreadcrumb, hint);\n\t }) : mergedBreadcrumb;\n\n\t if (finalBreadcrumb === null) {\n\t return;\n\t }\n\n\t top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setUser = function (user) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setUser(user);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setTags = function (tags) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setTags(tags);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setExtras = function (extras) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setExtras(extras);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setTag = function (key, value) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setTag(key, value);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setExtra = function (key, extra) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setExtra(key, extra);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setContext = function (name, context) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setContext(name, context);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.configureScope = function (callback) {\n\t var top = this.getStackTop();\n\n\t if (top.scope && top.client) {\n\t callback(top.scope);\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.run = function (callback) {\n\t var oldHub = makeMain(this);\n\n\t try {\n\t callback(this);\n\t } finally {\n\t makeMain(oldHub);\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.getIntegration = function (integration) {\n\t var client = this.getClient();\n\n\t if (!client) {\n\t return null;\n\t }\n\n\t try {\n\t return client.getIntegration(integration);\n\t } catch (_oO) {\n\t logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Hub\");\n\t return null;\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.startSpan = function (spanOrSpanContext, forceNoChild) {\n\t if (forceNoChild === void 0) {\n\t forceNoChild = false;\n\t }\n\n\t return this._callExtensionMethod('startSpan', spanOrSpanContext, forceNoChild);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.traceHeaders = function () {\n\t return this._callExtensionMethod('traceHeaders');\n\t };\n\t /**\n\t * Calls global extension method and binding current instance to the function call\n\t */\n\t // @ts-ignore\n\n\n\t Hub.prototype._callExtensionMethod = function (method) {\n\t var args = [];\n\n\t for (var _i = 1; _i < arguments.length; _i++) {\n\t args[_i - 1] = arguments[_i];\n\t }\n\n\t var carrier = getMainCarrier();\n\t var sentry = carrier.__SENTRY__; // tslint:disable-next-line: strict-type-predicates\n\n\t if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n\t return sentry.extensions[method].apply(this, args);\n\t }\n\n\t logger.warn(\"Extension method \" + method + \" couldn't be found, doing nothing.\");\n\t };\n\n\t return Hub;\n\t}();\n\t/** Returns the global shim registry. */\n\n\tfunction getMainCarrier() {\n\t var carrier = getGlobalObject();\n\t carrier.__SENTRY__ = carrier.__SENTRY__ || {\n\t extensions: {},\n\t hub: undefined\n\t };\n\t return carrier;\n\t}\n\t/**\n\t * Replaces the current main hub with the passed one on the global object\n\t *\n\t * @returns The old replaced hub\n\t */\n\n\tfunction makeMain(hub) {\n\t var registry = getMainCarrier();\n\t var oldHub = getHubFromCarrier(registry);\n\t setHubOnCarrier(registry, hub);\n\t return oldHub;\n\t}\n\t/**\n\t * Returns the default hub instance.\n\t *\n\t * If a hub is already registered in the global carrier but this module\n\t * contains a more recent version, it replaces the registered version.\n\t * Otherwise, the currently registered hub will be returned.\n\t */\n\n\tfunction getCurrentHub() {\n\t // Get main carrier (global for every environment)\n\t var registry = getMainCarrier(); // If there's no hub, or its an old API, assign a new one\n\n\t if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n\t setHubOnCarrier(registry, new Hub());\n\t } // Prefer domains over global if they are there (applicable only to Node environment)\n\n\n\t if (isNodeEnv()) {\n\t return getHubFromActiveDomain(registry);\n\t } // Return hub that lives on a global object\n\n\n\t return getHubFromCarrier(registry);\n\t}\n\t/**\n\t * Try to read the hub from an active domain, fallback to the registry if one doesnt exist\n\t * @returns discovered hub\n\t */\n\n\tfunction getHubFromActiveDomain(registry) {\n\t try {\n\t var property = 'domain';\n\t var carrier = getMainCarrier();\n\t var sentry = carrier.__SENTRY__; // tslint:disable-next-line: strict-type-predicates\n\n\t if (!sentry || !sentry.extensions || !sentry.extensions[property]) {\n\t return getHubFromCarrier(registry);\n\t }\n\n\t var domain = sentry.extensions[property];\n\t var activeDomain = domain.active; // If there no active domain, just return global hub\n\n\t if (!activeDomain) {\n\t return getHubFromCarrier(registry);\n\t } // If there's no hub on current domain, or its an old API, assign a new one\n\n\n\t if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n\t var registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n\t setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n\t } // Return hub that lives on a domain\n\n\n\t return getHubFromCarrier(activeDomain);\n\t } catch (_Oo) {\n\t // Return hub that lives on a global object\n\t return getHubFromCarrier(registry);\n\t }\n\t}\n\t/**\n\t * This will tell whether a carrier has a hub on it or not\n\t * @param carrier object\n\t */\n\n\n\tfunction hasHubOnCarrier(carrier) {\n\t if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n\t return true;\n\t }\n\n\t return false;\n\t}\n\t/**\n\t * This will create a new {@link Hub} and add to the passed object on\n\t * __SENTRY__.hub.\n\t * @param carrier object\n\t * @hidden\n\t */\n\n\n\tfunction getHubFromCarrier(carrier) {\n\t if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n\t return carrier.__SENTRY__.hub;\n\t }\n\n\t carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n\t carrier.__SENTRY__.hub = new Hub();\n\t return carrier.__SENTRY__.hub;\n\t}\n\t/**\n\t * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n\t * @param carrier object\n\t * @param hub Hub\n\t */\n\n\tfunction setHubOnCarrier(carrier, hub) {\n\t if (!carrier) {\n\t return false;\n\t }\n\n\t carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n\t carrier.__SENTRY__.hub = hub;\n\t return true;\n\t}\n\n\t/**\n\t * This calls a function on the current hub.\n\t * @param method function to call on hub.\n\t * @param args to pass to function.\n\t */\n\n\tfunction callOnHub(method) {\n\t var args = [];\n\n\t for (var _i = 1; _i < arguments.length; _i++) {\n\t args[_i - 1] = arguments[_i];\n\t }\n\n\t var hub = getCurrentHub();\n\n\t if (hub && hub[method]) {\n\t // tslint:disable-next-line:no-unsafe-any\n\t return hub[method].apply(hub, __spread(args));\n\t }\n\n\t throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n\t}\n\t/**\n\t * Captures an exception event and sends it to Sentry.\n\t *\n\t * @param exception An exception-like object.\n\t * @returns The generated eventId.\n\t */\n\n\n\tfunction captureException(exception) {\n\t var syntheticException;\n\n\t try {\n\t throw new Error('Sentry syntheticException');\n\t } catch (exception) {\n\t syntheticException = exception;\n\t }\n\n\t return callOnHub('captureException', exception, {\n\t originalException: exception,\n\t syntheticException: syntheticException\n\t });\n\t}\n\t/**\n\t * Creates a new scope with and executes the given operation within.\n\t * The scope is automatically removed once the operation\n\t * finishes or throws.\n\t *\n\t * This is essentially a convenience function for:\n\t *\n\t * pushScope();\n\t * callback();\n\t * popScope();\n\t *\n\t * @param callback that will be enclosed into push/popScope.\n\t */\n\n\tfunction withScope(callback) {\n\t callOnHub('withScope', callback);\n\t}\n\n\tvar SENTRY_API_VERSION = '7';\n\t/** Helper class to provide urls to different Sentry endpoints. */\n\n\tvar API =\n\t/** @class */\n\tfunction () {\n\t /** Create a new instance of API */\n\t function API(dsn) {\n\t this.dsn = dsn;\n\t this._dsnObject = new Dsn(dsn);\n\t }\n\t /** Returns the Dsn object. */\n\n\n\t API.prototype.getDsn = function () {\n\t return this._dsnObject;\n\t };\n\t /** Returns a string with auth headers in the url to the store endpoint. */\n\n\n\t API.prototype.getStoreEndpoint = function () {\n\t return \"\" + this._getBaseUrl() + this.getStoreEndpointPath();\n\t };\n\t /** Returns the store endpoint with auth added in url encoded. */\n\n\n\t API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n\t var dsn = this._dsnObject;\n\t var auth = {\n\t sentry_key: dsn.user,\n\t sentry_version: SENTRY_API_VERSION\n\t }; // Auth is intentionally sent as part of query string (NOT as custom HTTP header)\n\t // to avoid preflight CORS requests\n\n\t return this.getStoreEndpoint() + \"?\" + urlEncode(auth);\n\t };\n\t /** Returns the base path of the url including the port. */\n\n\n\t API.prototype._getBaseUrl = function () {\n\t var dsn = this._dsnObject;\n\t var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n\t var port = dsn.port ? \":\" + dsn.port : '';\n\t return protocol + \"//\" + dsn.host + port;\n\t };\n\t /** Returns only the path component for the store endpoint. */\n\n\n\t API.prototype.getStoreEndpointPath = function () {\n\t var dsn = this._dsnObject;\n\t return (dsn.path ? \"/\" + dsn.path : '') + \"/api/\" + dsn.projectId + \"/store/\";\n\t };\n\t /** Returns an object that can be used in request headers. */\n\n\n\t API.prototype.getRequestHeaders = function (clientName, clientVersion) {\n\t var dsn = this._dsnObject;\n\t var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n\t header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n\t header.push(\"sentry_key=\" + dsn.user);\n\n\t if (dsn.pass) {\n\t header.push(\"sentry_secret=\" + dsn.pass);\n\t }\n\n\t return {\n\t 'Content-Type': 'application/json',\n\t 'X-Sentry-Auth': header.join(', ')\n\t };\n\t };\n\t /** Returns the url to the report dialog endpoint. */\n\n\n\t API.prototype.getReportDialogEndpoint = function (dialogOptions) {\n\t if (dialogOptions === void 0) {\n\t dialogOptions = {};\n\t }\n\n\t var dsn = this._dsnObject;\n\t var endpoint = \"\" + this._getBaseUrl() + (dsn.path ? \"/\" + dsn.path : '') + \"/api/embed/error-page/\";\n\t var encodedOptions = [];\n\t encodedOptions.push(\"dsn=\" + dsn.toString());\n\n\t for (var key in dialogOptions) {\n\t if (key === 'user') {\n\t if (!dialogOptions.user) {\n\t continue;\n\t }\n\n\t if (dialogOptions.user.name) {\n\t encodedOptions.push(\"name=\" + encodeURIComponent(dialogOptions.user.name));\n\t }\n\n\t if (dialogOptions.user.email) {\n\t encodedOptions.push(\"email=\" + encodeURIComponent(dialogOptions.user.email));\n\t }\n\t } else {\n\t encodedOptions.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]));\n\t }\n\t }\n\n\t if (encodedOptions.length) {\n\t return endpoint + \"?\" + encodedOptions.join('&');\n\t }\n\n\t return endpoint;\n\t };\n\n\t return API;\n\t}();\n\n\tvar installedIntegrations = [];\n\t/** Gets integration to install */\n\n\tfunction getIntegrationsToSetup(options) {\n\t var defaultIntegrations = options.defaultIntegrations && __spread(options.defaultIntegrations) || [];\n\t var userIntegrations = options.integrations;\n\t var integrations = [];\n\n\t if (Array.isArray(userIntegrations)) {\n\t var userIntegrationsNames_1 = userIntegrations.map(function (i) {\n\t return i.name;\n\t });\n\t var pickedIntegrationsNames_1 = []; // Leave only unique default integrations, that were not overridden with provided user integrations\n\n\t defaultIntegrations.forEach(function (defaultIntegration) {\n\t if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 && pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {\n\t integrations.push(defaultIntegration);\n\t pickedIntegrationsNames_1.push(defaultIntegration.name);\n\t }\n\t }); // Don't add same user integration twice\n\n\t userIntegrations.forEach(function (userIntegration) {\n\t if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {\n\t integrations.push(userIntegration);\n\t pickedIntegrationsNames_1.push(userIntegration.name);\n\t }\n\t });\n\t } else if (typeof userIntegrations === 'function') {\n\t integrations = userIntegrations(defaultIntegrations);\n\t integrations = Array.isArray(integrations) ? integrations : [integrations];\n\t } else {\n\t integrations = __spread(defaultIntegrations);\n\t } // Make sure that if present, `Debug` integration will always run last\n\n\n\t var integrationsNames = integrations.map(function (i) {\n\t return i.name;\n\t });\n\t var alwaysLastToRun = 'Debug';\n\n\t if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n\t integrations.push.apply(integrations, __spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n\t }\n\n\t return integrations;\n\t}\n\t/** Setup given integration */\n\n\tfunction setupIntegration(integration) {\n\t if (installedIntegrations.indexOf(integration.name) !== -1) {\n\t return;\n\t }\n\n\t integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n\t installedIntegrations.push(integration.name);\n\t logger.log(\"Integration installed: \" + integration.name);\n\t}\n\t/**\n\t * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n\t * integrations are added unless they were already provided before.\n\t * @param integrations array of integration instances\n\t * @param withDefault should enable default integrations\n\t */\n\n\tfunction setupIntegrations(options) {\n\t var integrations = {};\n\t getIntegrationsToSetup(options).forEach(function (integration) {\n\t integrations[integration.name] = integration;\n\t setupIntegration(integration);\n\t });\n\t return integrations;\n\t}\n\n\t/**\n\t * Base implementation for all JavaScript SDK clients.\n\t *\n\t * Call the constructor with the corresponding backend constructor and options\n\t * specific to the client subclass. To access these options later, use\n\t * {@link Client.getOptions}. Also, the Backend instance is available via\n\t * {@link Client.getBackend}.\n\t *\n\t * If a Dsn is specified in the options, it will be parsed and stored. Use\n\t * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n\t * invalid, the constructor will throw a {@link SentryException}. Note that\n\t * without a valid Dsn, the SDK will not send any events to Sentry.\n\t *\n\t * Before sending an event via the backend, it is passed through\n\t * {@link BaseClient.prepareEvent} to add SDK information and scope data\n\t * (breadcrumbs and context). To add more custom information, override this\n\t * method and extend the resulting prepared event.\n\t *\n\t * To issue automatically created events (e.g. via instrumentation), use\n\t * {@link Client.captureEvent}. It will prepare the event and pass it through\n\t * the callback lifecycle. To issue auto-breadcrumbs, use\n\t * {@link Client.addBreadcrumb}.\n\t *\n\t * @example\n\t * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {\n\t * public constructor(options: NodeOptions) {\n\t * super(NodeBackend, options);\n\t * }\n\t *\n\t * // ...\n\t * }\n\t */\n\n\tvar BaseClient =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * Initializes this client instance.\n\t *\n\t * @param backendClass A constructor function to create the backend.\n\t * @param options Options for the client.\n\t */\n\t function BaseClient(backendClass, options) {\n\t /** Array of used integrations. */\n\t this._integrations = {};\n\t /** Is the client still processing a call? */\n\n\t this._processing = false;\n\t this._backend = new backendClass(options);\n\t this._options = options;\n\n\t if (options.dsn) {\n\t this._dsn = new Dsn(options.dsn);\n\t }\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.captureException = function (exception, hint, scope) {\n\t var _this = this;\n\n\t var eventId = hint && hint.event_id;\n\t this._processing = true;\n\n\t this._getBackend().eventFromException(exception, hint).then(function (event) {\n\t return _this._processEvent(event, hint, scope);\n\t }).then(function (finalEvent) {\n\t // We need to check for finalEvent in case beforeSend returned null\n\t eventId = finalEvent && finalEvent.event_id;\n\t _this._processing = false;\n\t }).then(null, function (reason) {\n\t logger.error(reason);\n\t _this._processing = false;\n\t });\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n\t var _this = this;\n\n\t var eventId = hint && hint.event_id;\n\t this._processing = true;\n\t var promisedEvent = isPrimitive(message) ? this._getBackend().eventFromMessage(\"\" + message, level, hint) : this._getBackend().eventFromException(message, hint);\n\t promisedEvent.then(function (event) {\n\t return _this._processEvent(event, hint, scope);\n\t }).then(function (finalEvent) {\n\t // We need to check for finalEvent in case beforeSend returned null\n\t eventId = finalEvent && finalEvent.event_id;\n\t _this._processing = false;\n\t }).then(null, function (reason) {\n\t logger.error(reason);\n\t _this._processing = false;\n\t });\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.captureEvent = function (event, hint, scope) {\n\t var _this = this;\n\n\t var eventId = hint && hint.event_id;\n\t this._processing = true;\n\n\t this._processEvent(event, hint, scope).then(function (finalEvent) {\n\t // We need to check for finalEvent in case beforeSend returned null\n\t eventId = finalEvent && finalEvent.event_id;\n\t _this._processing = false;\n\t }).then(null, function (reason) {\n\t logger.error(reason);\n\t _this._processing = false;\n\t });\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.getDsn = function () {\n\t return this._dsn;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.getOptions = function () {\n\t return this._options;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.flush = function (timeout) {\n\t var _this = this;\n\n\t return this._isClientProcessing(timeout).then(function (status) {\n\t clearInterval(status.interval);\n\t return _this._getBackend().getTransport().close(timeout).then(function (transportFlushed) {\n\t return status.ready && transportFlushed;\n\t });\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.close = function (timeout) {\n\t var _this = this;\n\n\t return this.flush(timeout).then(function (result) {\n\t _this.getOptions().enabled = false;\n\t return result;\n\t });\n\t };\n\t /**\n\t * Sets up the integrations\n\t */\n\n\n\t BaseClient.prototype.setupIntegrations = function () {\n\t if (this._isEnabled()) {\n\t this._integrations = setupIntegrations(this._options);\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.getIntegration = function (integration) {\n\t try {\n\t return this._integrations[integration.id] || null;\n\t } catch (_oO) {\n\t logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n\t return null;\n\t }\n\t };\n\t /** Waits for the client to be done with processing. */\n\n\n\t BaseClient.prototype._isClientProcessing = function (timeout) {\n\t var _this = this;\n\n\t return new SyncPromise(function (resolve) {\n\t var ticked = 0;\n\t var tick = 1;\n\t var interval = 0;\n\t clearInterval(interval);\n\t interval = setInterval(function () {\n\t if (!_this._processing) {\n\t resolve({\n\t interval: interval,\n\t ready: true\n\t });\n\t } else {\n\t ticked += tick;\n\n\t if (timeout && ticked >= timeout) {\n\t resolve({\n\t interval: interval,\n\t ready: false\n\t });\n\t }\n\t }\n\t }, tick);\n\t });\n\t };\n\t /** Returns the current backend. */\n\n\n\t BaseClient.prototype._getBackend = function () {\n\t return this._backend;\n\t };\n\t /** Determines whether this SDK is enabled and a valid Dsn is present. */\n\n\n\t BaseClient.prototype._isEnabled = function () {\n\t return this.getOptions().enabled !== false && this._dsn !== undefined;\n\t };\n\t /**\n\t * Adds common information to events.\n\t *\n\t * The information includes release and environment from `options`,\n\t * breadcrumbs and context (extra, tags and user) from the scope.\n\t *\n\t * Information that is already present in the event is never overwritten. For\n\t * nested objects, such as the context, keys are merged.\n\t *\n\t * @param event The original event.\n\t * @param hint May contain additional informartion about the original exception.\n\t * @param scope A scope containing event metadata.\n\t * @returns A new event with more information.\n\t */\n\n\n\t BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n\t var _this = this;\n\n\t var _a = this.getOptions(),\n\t environment = _a.environment,\n\t release = _a.release,\n\t dist = _a.dist,\n\t _b = _a.maxValueLength,\n\t maxValueLength = _b === void 0 ? 250 : _b,\n\t _c = _a.normalizeDepth,\n\t normalizeDepth = _c === void 0 ? 3 : _c;\n\n\t var prepared = _assign({}, event);\n\n\t if (prepared.environment === undefined && environment !== undefined) {\n\t prepared.environment = environment;\n\t }\n\n\t if (prepared.release === undefined && release !== undefined) {\n\t prepared.release = release;\n\t }\n\n\t if (prepared.dist === undefined && dist !== undefined) {\n\t prepared.dist = dist;\n\t }\n\n\t if (prepared.message) {\n\t prepared.message = truncate(prepared.message, maxValueLength);\n\t }\n\n\t var exception = prepared.exception && prepared.exception.values && prepared.exception.values[0];\n\n\t if (exception && exception.value) {\n\t exception.value = truncate(exception.value, maxValueLength);\n\t }\n\n\t var request = prepared.request;\n\n\t if (request && request.url) {\n\t request.url = truncate(request.url, maxValueLength);\n\t }\n\n\t if (prepared.event_id === undefined) {\n\t prepared.event_id = hint && hint.event_id ? hint.event_id : uuid4();\n\t }\n\n\t this._addIntegrations(prepared.sdk); // We prepare the result here with a resolved Event.\n\n\n\t var result = SyncPromise.resolve(prepared); // This should be the last thing called, since we want that\n\t // {@link Hub.addEventProcessor} gets the finished prepared event.\n\n\t if (scope) {\n\t // In case we have a hub we reassign it.\n\t result = scope.applyToEvent(prepared, hint);\n\t }\n\n\t return result.then(function (evt) {\n\t // tslint:disable-next-line:strict-type-predicates\n\t if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n\t return _this._normalizeEvent(evt, normalizeDepth);\n\t }\n\n\t return evt;\n\t });\n\t };\n\t /**\n\t * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n\t * Normalized keys:\n\t * - `breadcrumbs.data`\n\t * - `user`\n\t * - `contexts`\n\t * - `extra`\n\t * @param event Event\n\t * @returns Normalized event\n\t */\n\n\n\t BaseClient.prototype._normalizeEvent = function (event, depth) {\n\t if (!event) {\n\t return null;\n\t } // tslint:disable:no-unsafe-any\n\n\n\t return _assign({}, event, event.breadcrumbs && {\n\t breadcrumbs: event.breadcrumbs.map(function (b) {\n\t return _assign({}, b, b.data && {\n\t data: normalize$1(b.data, depth)\n\t });\n\t })\n\t }, event.user && {\n\t user: normalize$1(event.user, depth)\n\t }, event.contexts && {\n\t contexts: normalize$1(event.contexts, depth)\n\t }, event.extra && {\n\t extra: normalize$1(event.extra, depth)\n\t });\n\t };\n\t /**\n\t * This function adds all used integrations to the SDK info in the event.\n\t * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.\n\t */\n\n\n\t BaseClient.prototype._addIntegrations = function (sdkInfo) {\n\t var integrationsArray = Object.keys(this._integrations);\n\n\t if (sdkInfo && integrationsArray.length > 0) {\n\t sdkInfo.integrations = integrationsArray;\n\t }\n\t };\n\t /**\n\t * Processes an event (either error or message) and sends it to Sentry.\n\t *\n\t * This also adds breadcrumbs and context information to the event. However,\n\t * platform specific meta data (such as the User's IP address) must be added\n\t * by the SDK implementor.\n\t *\n\t *\n\t * @param event The event to send to Sentry.\n\t * @param hint May contain additional informartion about the original exception.\n\t * @param scope A scope containing event metadata.\n\t * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n\t */\n\n\n\t BaseClient.prototype._processEvent = function (event, hint, scope) {\n\t var _this = this;\n\n\t var _a = this.getOptions(),\n\t beforeSend = _a.beforeSend,\n\t sampleRate = _a.sampleRate;\n\n\t if (!this._isEnabled()) {\n\t return SyncPromise.reject('SDK not enabled, will not send event.');\n\t } // 1.0 === 100% events are sent\n\t // 0.0 === 0% events are sent\n\n\n\t if (typeof sampleRate === 'number' && Math.random() > sampleRate) {\n\t return SyncPromise.reject('This event has been sampled, will not send event.');\n\t }\n\n\t return new SyncPromise(function (resolve, reject) {\n\t _this._prepareEvent(event, scope, hint).then(function (prepared) {\n\t if (prepared === null) {\n\t reject('An event processor returned null, will not send event.');\n\t return;\n\t }\n\n\t var finalEvent = prepared;\n\t var isInternalException = hint && hint.data && hint.data.__sentry__ === true;\n\n\t if (isInternalException || !beforeSend) {\n\t _this._getBackend().sendEvent(finalEvent);\n\n\t resolve(finalEvent);\n\t return;\n\t }\n\n\t var beforeSendResult = beforeSend(prepared, hint); // tslint:disable-next-line:strict-type-predicates\n\n\t if (typeof beforeSendResult === 'undefined') {\n\t logger.error('`beforeSend` method has to return `null` or a valid event.');\n\t } else if (isThenable$1(beforeSendResult)) {\n\t _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);\n\t } else {\n\t finalEvent = beforeSendResult;\n\n\t if (finalEvent === null) {\n\t logger.log('`beforeSend` returned `null`, will not send event.');\n\t resolve(null);\n\t return;\n\t } // From here on we are really async\n\n\n\t _this._getBackend().sendEvent(finalEvent);\n\n\t resolve(finalEvent);\n\t }\n\t }).then(null, function (reason) {\n\t _this.captureException(reason, {\n\t data: {\n\t __sentry__: true\n\t },\n\t originalException: reason\n\t });\n\n\t reject(\"Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: \" + reason);\n\t });\n\t });\n\t };\n\t /**\n\t * Resolves before send Promise and calls resolve/reject on parent SyncPromise.\n\t */\n\n\n\t BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {\n\t var _this = this;\n\n\t beforeSend.then(function (processedEvent) {\n\t if (processedEvent === null) {\n\t reject('`beforeSend` returned `null`, will not send event.');\n\t return;\n\t } // From here on we are really async\n\n\n\t _this._getBackend().sendEvent(processedEvent);\n\n\t resolve(processedEvent);\n\t }).then(null, function (e) {\n\t reject(\"beforeSend rejected with \" + e);\n\t });\n\t };\n\n\t return BaseClient;\n\t}();\n\n\t/** Noop transport */\n\n\tvar NoopTransport =\n\t/** @class */\n\tfunction () {\n\t function NoopTransport() {}\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t NoopTransport.prototype.sendEvent = function (_) {\n\t return SyncPromise.resolve({\n\t reason: \"NoopTransport: Event has been skipped because no Dsn is configured.\",\n\t status: Status.Skipped\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t NoopTransport.prototype.close = function (_) {\n\t return SyncPromise.resolve(true);\n\t };\n\n\t return NoopTransport;\n\t}();\n\n\t/**\n\t * This is the base implemention of a Backend.\n\t * @hidden\n\t */\n\n\tvar BaseBackend =\n\t/** @class */\n\tfunction () {\n\t /** Creates a new backend instance. */\n\t function BaseBackend(options) {\n\t this._options = options;\n\n\t if (!this._options.dsn) {\n\t logger.warn('No DSN provided, backend will not do anything.');\n\t }\n\n\t this._transport = this._setupTransport();\n\t }\n\t /**\n\t * Sets up the transport so it can be used later to send requests.\n\t */\n\n\n\t BaseBackend.prototype._setupTransport = function () {\n\t return new NoopTransport();\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n\t throw new SentryError('Backend has to implement `eventFromException` method');\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n\t throw new SentryError('Backend has to implement `eventFromMessage` method');\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseBackend.prototype.sendEvent = function (event) {\n\t this._transport.sendEvent(event).then(null, function (reason) {\n\t logger.error(\"Error while sending event: \" + reason);\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseBackend.prototype.getTransport = function () {\n\t return this._transport;\n\t };\n\n\t return BaseBackend;\n\t}();\n\n\t/**\n\t * Internal function to create a new SDK client instance. The client is\n\t * installed and then bound to the current scope.\n\t *\n\t * @param clientClass The client class to instanciate.\n\t * @param options Options to pass to the client.\n\t */\n\n\tfunction initAndBind(clientClass, options) {\n\t if (options.debug === true) {\n\t logger.enable();\n\t }\n\n\t var hub = getCurrentHub();\n\t var client = new clientClass(options);\n\t hub.bindClient(client);\n\t}\n\n\tvar originalFunctionToString;\n\t/** Patch toString calls to return proper name for wrapped functions */\n\n\tvar FunctionToString =\n\t/** @class */\n\tfunction () {\n\t function FunctionToString() {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = FunctionToString.id;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t FunctionToString.prototype.setupOnce = function () {\n\t originalFunctionToString = Function.prototype.toString;\n\n\t Function.prototype.toString = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var context = this.__sentry_original__ || this; // tslint:disable-next-line:no-unsafe-any\n\n\t return originalFunctionToString.apply(context, args);\n\t };\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t FunctionToString.id = 'FunctionToString';\n\t return FunctionToString;\n\t}();\n\n\tvar $some$1 = arrayIteration.some;\n\n\n\n\tvar STRICT_METHOD$4 = arrayMethodIsStrict('some');\n\tvar USES_TO_LENGTH$8 = arrayMethodUsesToLength('some');\n\n\t// `Array.prototype.some` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 || !USES_TO_LENGTH$8 }, {\n\t some: function some(callbackfn /* , thisArg */) {\n\t return $some$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// this is the result of a script being pulled in from an external domain and CORS.\n\n\tvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n\t/** Inbound filters configurable by the user */\n\n\tvar InboundFilters =\n\t/** @class */\n\tfunction () {\n\t function InboundFilters(_options) {\n\t if (_options === void 0) {\n\t _options = {};\n\t }\n\n\t this._options = _options;\n\t /**\n\t * @inheritDoc\n\t */\n\n\t this.name = InboundFilters.id;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t InboundFilters.prototype.setupOnce = function () {\n\t addGlobalEventProcessor(function (event) {\n\t var hub = getCurrentHub();\n\n\t if (!hub) {\n\t return event;\n\t }\n\n\t var self = hub.getIntegration(InboundFilters);\n\n\t if (self) {\n\t var client = hub.getClient();\n\t var clientOptions = client ? client.getOptions() : {};\n\n\t var options = self._mergeOptions(clientOptions);\n\n\t if (self._shouldDropEvent(event, options)) {\n\t return null;\n\t }\n\t }\n\n\t return event;\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._shouldDropEvent = function (event, options) {\n\t if (this._isSentryError(event, options)) {\n\t logger.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + getEventDescription(event));\n\t return true;\n\t }\n\n\t if (this._isIgnoredError(event, options)) {\n\t logger.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + getEventDescription(event));\n\t return true;\n\t }\n\n\t if (this._isBlacklistedUrl(event, options)) {\n\t logger.warn(\"Event dropped due to being matched by `blacklistUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n\t return true;\n\t }\n\n\t if (!this._isWhitelistedUrl(event, options)) {\n\t logger.warn(\"Event dropped due to not being matched by `whitelistUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n\t return true;\n\t }\n\n\t return false;\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._isSentryError = function (event, options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t if (!options.ignoreInternal) {\n\t return false;\n\t }\n\n\t try {\n\t return event && event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].type === 'SentryError' || false;\n\t } catch (_oO) {\n\t return false;\n\t }\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._isIgnoredError = function (event, options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t if (!options.ignoreErrors || !options.ignoreErrors.length) {\n\t return false;\n\t }\n\n\t return this._getPossibleEventMessages(event).some(function (message) {\n\t // Not sure why TypeScript complains here...\n\t return options.ignoreErrors.some(function (pattern) {\n\t return isMatchingPattern(message, pattern);\n\t });\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._isBlacklistedUrl = function (event, options) {\n\t if (options === void 0) {\n\t options = {};\n\t } // TODO: Use Glob instead?\n\n\n\t if (!options.blacklistUrls || !options.blacklistUrls.length) {\n\t return false;\n\t }\n\n\t var url = this._getEventFilterUrl(event);\n\n\t return !url ? false : options.blacklistUrls.some(function (pattern) {\n\t return isMatchingPattern(url, pattern);\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._isWhitelistedUrl = function (event, options) {\n\t if (options === void 0) {\n\t options = {};\n\t } // TODO: Use Glob instead?\n\n\n\t if (!options.whitelistUrls || !options.whitelistUrls.length) {\n\t return true;\n\t }\n\n\t var url = this._getEventFilterUrl(event);\n\n\t return !url ? true : options.whitelistUrls.some(function (pattern) {\n\t return isMatchingPattern(url, pattern);\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._mergeOptions = function (clientOptions) {\n\t if (clientOptions === void 0) {\n\t clientOptions = {};\n\t }\n\n\t return {\n\t blacklistUrls: __spread(this._options.blacklistUrls || [], clientOptions.blacklistUrls || []),\n\t ignoreErrors: __spread(this._options.ignoreErrors || [], clientOptions.ignoreErrors || [], DEFAULT_IGNORE_ERRORS),\n\t ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,\n\t whitelistUrls: __spread(this._options.whitelistUrls || [], clientOptions.whitelistUrls || [])\n\t };\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._getPossibleEventMessages = function (event) {\n\t if (event.message) {\n\t return [event.message];\n\t }\n\n\t if (event.exception) {\n\t try {\n\t var _a = event.exception.values && event.exception.values[0] || {},\n\t _b = _a.type,\n\t type = _b === void 0 ? '' : _b,\n\t _c = _a.value,\n\t value = _c === void 0 ? '' : _c;\n\n\t return [\"\" + value, type + \": \" + value];\n\t } catch (oO) {\n\t logger.error(\"Cannot extract message for event \" + getEventDescription(event));\n\t return [];\n\t }\n\t }\n\n\t return [];\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._getEventFilterUrl = function (event) {\n\t try {\n\t if (event.stacktrace) {\n\t var frames_1 = event.stacktrace.frames;\n\t return frames_1 && frames_1[frames_1.length - 1].filename || null;\n\t }\n\n\t if (event.exception) {\n\t var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;\n\t return frames_2 && frames_2[frames_2.length - 1].filename || null;\n\t }\n\n\t return null;\n\t } catch (oO) {\n\t logger.error(\"Cannot extract url for event \" + getEventDescription(event));\n\t return null;\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t InboundFilters.id = 'InboundFilters';\n\t return InboundFilters;\n\t}();\n\n\tvar UNKNOWN_FUNCTION = '?'; // Chromium based browsers: Chrome, Brave, new Opera, new Edge\n\n\tvar chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i; // gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n\t// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n\t// We need this specific case for now because we want no other regex to match.\n\n\tvar gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js))(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n\tvar winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\tvar geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\tvar chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n\t/** JSDoc */\n\n\tfunction computeStackTrace(ex) {\n\t // tslint:disable:no-unsafe-any\n\t var stack = null;\n\t var popSize = ex && ex.framesToPop;\n\n\t try {\n\t // This must be tried first because Opera 10 *destroys*\n\t // its stacktrace property if you try to access the stack\n\t // property first!!\n\t stack = computeStackTraceFromStacktraceProp(ex);\n\n\t if (stack) {\n\t return popFrames(stack, popSize);\n\t }\n\t } catch (e) {// no-empty\n\t }\n\n\t try {\n\t stack = computeStackTraceFromStackProp(ex);\n\n\t if (stack) {\n\t return popFrames(stack, popSize);\n\t }\n\t } catch (e) {// no-empty\n\t }\n\n\t return {\n\t message: extractMessage(ex),\n\t name: ex && ex.name,\n\t stack: [],\n\t failed: true\n\t };\n\t}\n\t/** JSDoc */\n\t// tslint:disable-next-line:cyclomatic-complexity\n\n\tfunction computeStackTraceFromStackProp(ex) {\n\t // tslint:disable:no-conditional-assignment\n\t if (!ex || !ex.stack) {\n\t return null;\n\t }\n\n\t var stack = [];\n\t var lines = ex.stack.split('\\n');\n\t var isEval;\n\t var submatch;\n\t var parts;\n\t var element;\n\n\t for (var i = 0; i < lines.length; ++i) {\n\t if (parts = chrome.exec(lines[i])) {\n\t var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n\n\t isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n\t if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n\t // throw out eval line/column and use top-most line/column number\n\t parts[2] = submatch[1]; // url\n\n\t parts[3] = submatch[2]; // line\n\n\t parts[4] = submatch[3]; // column\n\t }\n\n\t element = {\n\t // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `\n\t // prefix here seems like the quickest solution for now.\n\t url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],\n\t func: parts[1] || UNKNOWN_FUNCTION,\n\t args: isNative ? [parts[2]] : [],\n\t line: parts[3] ? +parts[3] : null,\n\t column: parts[4] ? +parts[4] : null\n\t };\n\t } else if (parts = winjs.exec(lines[i])) {\n\t element = {\n\t url: parts[2],\n\t func: parts[1] || UNKNOWN_FUNCTION,\n\t args: [],\n\t line: +parts[3],\n\t column: parts[4] ? +parts[4] : null\n\t };\n\t } else if (parts = gecko.exec(lines[i])) {\n\t isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n\n\t if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n\t // throw out eval line/column and use top-most line number\n\t parts[1] = parts[1] || \"eval\";\n\t parts[3] = submatch[1];\n\t parts[4] = submatch[2];\n\t parts[5] = ''; // no column when eval\n\t } else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\n\t // FireFox uses this awesome columnNumber property for its top frame\n\t // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n\t // so adding 1\n\t // NOTE: this hack doesn't work if top-most frame is eval\n\t stack[0].column = ex.columnNumber + 1;\n\t }\n\n\t element = {\n\t url: parts[3],\n\t func: parts[1] || UNKNOWN_FUNCTION,\n\t args: parts[2] ? parts[2].split(',') : [],\n\t line: parts[4] ? +parts[4] : null,\n\t column: parts[5] ? +parts[5] : null\n\t };\n\t } else {\n\t continue;\n\t }\n\n\t if (!element.func && element.line) {\n\t element.func = UNKNOWN_FUNCTION;\n\t }\n\n\t stack.push(element);\n\t }\n\n\t if (!stack.length) {\n\t return null;\n\t }\n\n\t return {\n\t message: extractMessage(ex),\n\t name: ex.name,\n\t stack: stack\n\t };\n\t}\n\t/** JSDoc */\n\n\n\tfunction computeStackTraceFromStacktraceProp(ex) {\n\t if (!ex || !ex.stacktrace) {\n\t return null;\n\t } // Access and store the stacktrace property before doing ANYTHING\n\t // else to it because Opera is not very good at providing it\n\t // reliably in other circumstances.\n\n\n\t var stacktrace = ex.stacktrace;\n\t var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\t var opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i;\n\t var lines = stacktrace.split('\\n');\n\t var stack = [];\n\t var parts;\n\n\t for (var line = 0; line < lines.length; line += 2) {\n\t // tslint:disable:no-conditional-assignment\n\t var element = null;\n\n\t if (parts = opera10Regex.exec(lines[line])) {\n\t element = {\n\t url: parts[2],\n\t func: parts[3],\n\t args: [],\n\t line: +parts[1],\n\t column: null\n\t };\n\t } else if (parts = opera11Regex.exec(lines[line])) {\n\t element = {\n\t url: parts[6],\n\t func: parts[3] || parts[4],\n\t args: parts[5] ? parts[5].split(',') : [],\n\t line: +parts[1],\n\t column: +parts[2]\n\t };\n\t }\n\n\t if (element) {\n\t if (!element.func && element.line) {\n\t element.func = UNKNOWN_FUNCTION;\n\t }\n\n\t stack.push(element);\n\t }\n\t }\n\n\t if (!stack.length) {\n\t return null;\n\t }\n\n\t return {\n\t message: extractMessage(ex),\n\t name: ex.name,\n\t stack: stack\n\t };\n\t}\n\t/** Remove N number of frames from the stack */\n\n\n\tfunction popFrames(stacktrace, popSize) {\n\t try {\n\t return _assign({}, stacktrace, {\n\t stack: stacktrace.stack.slice(popSize)\n\t });\n\t } catch (e) {\n\t return stacktrace;\n\t }\n\t}\n\t/**\n\t * There are cases where stacktrace.message is an Event object\n\t * https://github.com/getsentry/sentry-javascript/issues/1949\n\t * In this specific case we try to extract stacktrace.message.error.message\n\t */\n\n\n\tfunction extractMessage(ex) {\n\t var message = ex && ex.message;\n\n\t if (!message) {\n\t return 'No error message';\n\t }\n\n\t if (message.error && typeof message.error.message === 'string') {\n\t return message.error.message;\n\t }\n\n\t return message;\n\t}\n\n\tvar STACKTRACE_LIMIT = 50;\n\t/**\n\t * This function creates an exception from an TraceKitStackTrace\n\t * @param stacktrace TraceKitStackTrace that will be converted to an exception\n\t * @hidden\n\t */\n\n\tfunction exceptionFromStacktrace(stacktrace) {\n\t var frames = prepareFramesForEvent(stacktrace.stack);\n\t var exception = {\n\t type: stacktrace.name,\n\t value: stacktrace.message\n\t };\n\n\t if (frames && frames.length) {\n\t exception.stacktrace = {\n\t frames: frames\n\t };\n\t } // tslint:disable-next-line:strict-type-predicates\n\n\n\t if (exception.type === undefined && exception.value === '') {\n\t exception.value = 'Unrecoverable error caught';\n\t }\n\n\t return exception;\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction eventFromPlainObject(exception, syntheticException, rejection) {\n\t var event = {\n\t exception: {\n\t values: [{\n\t type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n\t value: \"Non-Error \" + (rejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + extractExceptionKeysForMessage(exception)\n\t }]\n\t },\n\t extra: {\n\t __serialized__: normalizeToSize(exception)\n\t }\n\t };\n\n\t if (syntheticException) {\n\t var stacktrace = computeStackTrace(syntheticException);\n\t var frames_1 = prepareFramesForEvent(stacktrace.stack);\n\t event.stacktrace = {\n\t frames: frames_1\n\t };\n\t }\n\n\t return event;\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction eventFromStacktrace(stacktrace) {\n\t var exception = exceptionFromStacktrace(stacktrace);\n\t return {\n\t exception: {\n\t values: [exception]\n\t }\n\t };\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction prepareFramesForEvent(stack) {\n\t if (!stack || !stack.length) {\n\t return [];\n\t }\n\n\t var localStack = stack;\n\t var firstFrameFunction = localStack[0].func || '';\n\t var lastFrameFunction = localStack[localStack.length - 1].func || ''; // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n\n\t if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n\t localStack = localStack.slice(1);\n\t } // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n\n\n\t if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n\t localStack = localStack.slice(0, -1);\n\t } // The frame where the crash happened, should be the last entry in the array\n\n\n\t return localStack.map(function (frame) {\n\t return {\n\t colno: frame.column === null ? undefined : frame.column,\n\t filename: frame.url || localStack[0].url,\n\t function: frame.func || '?',\n\t in_app: true,\n\t lineno: frame.line === null ? undefined : frame.line\n\t };\n\t }).slice(0, STACKTRACE_LIMIT).reverse();\n\t}\n\n\t/** JSDoc */\n\n\tfunction eventFromUnknownInput(exception, syntheticException, options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t var event;\n\n\t if (isErrorEvent(exception) && exception.error) {\n\t // If it is an ErrorEvent with `error` property, extract it to get actual Error\n\t var errorEvent = exception;\n\t exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment\n\n\t event = eventFromStacktrace(computeStackTrace(exception));\n\t return event;\n\t }\n\n\t if (isDOMError(exception) || isDOMException(exception)) {\n\t // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n\t // then we just extract the name and message, as they don't provide anything else\n\t // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n\t // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n\t var domException = exception;\n\t var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n\t var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n\t event = eventFromString(message, syntheticException, options);\n\t addExceptionTypeValue(event, message);\n\t return event;\n\t }\n\n\t if (isError(exception)) {\n\t // we have a real Error object, do nothing\n\t event = eventFromStacktrace(computeStackTrace(exception));\n\t return event;\n\t }\n\n\t if (isPlainObject(exception) || isEvent(exception)) {\n\t // If it is plain Object or Event, serialize it manually and extract options\n\t // This will allow us to group events based on top-level keys\n\t // which is much better than creating new group when any key/value change\n\t var objectException = exception;\n\t event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n\t addExceptionMechanism(event, {\n\t synthetic: true\n\t });\n\t return event;\n\t } // If none of previous checks were valid, then it means that it's not:\n\t // - an instance of DOMError\n\t // - an instance of DOMException\n\t // - an instance of Event\n\t // - an instance of Error\n\t // - a valid ErrorEvent (one with an error property)\n\t // - a plain Object\n\t //\n\t // So bail out and capture it as a simple message:\n\n\n\t event = eventFromString(exception, syntheticException, options);\n\t addExceptionTypeValue(event, \"\" + exception, undefined);\n\t addExceptionMechanism(event, {\n\t synthetic: true\n\t });\n\t return event;\n\t} // this._options.attachStacktrace\n\n\t/** JSDoc */\n\n\tfunction eventFromString(input, syntheticException, options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t var event = {\n\t message: input\n\t };\n\n\t if (options.attachStacktrace && syntheticException) {\n\t var stacktrace = computeStackTrace(syntheticException);\n\t var frames_1 = prepareFramesForEvent(stacktrace.stack);\n\t event.stacktrace = {\n\t frames: frames_1\n\t };\n\t }\n\n\t return event;\n\t}\n\n\t/** Base Transport class implementation */\n\n\tvar BaseTransport =\n\t/** @class */\n\tfunction () {\n\t function BaseTransport(options) {\n\t this.options = options;\n\t /** A simple buffer holding all requests. */\n\n\t this._buffer = new PromiseBuffer(30);\n\t this.url = new API(this.options.dsn).getStoreEndpointWithUrlEncodedAuth();\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseTransport.prototype.sendEvent = function (_) {\n\t throw new SentryError('Transport Class has to implement `sendEvent` method');\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseTransport.prototype.close = function (timeout) {\n\t return this._buffer.drain(timeout);\n\t };\n\n\t return BaseTransport;\n\t}();\n\n\tvar global$3 = getGlobalObject();\n\t/** `fetch` based transport */\n\n\tvar FetchTransport =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(FetchTransport, _super);\n\n\t function FetchTransport() {\n\t var _this = _super !== null && _super.apply(this, arguments) || this;\n\t /** Locks transport after receiving 429 response */\n\n\n\t _this._disabledUntil = new Date(Date.now());\n\t return _this;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t FetchTransport.prototype.sendEvent = function (event) {\n\t var _this = this;\n\n\t if (new Date(Date.now()) < this._disabledUntil) {\n\t return Promise.reject({\n\t event: event,\n\t reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n\t status: 429\n\t });\n\t }\n\n\t var defaultOptions = {\n\t body: JSON.stringify(event),\n\t method: 'POST',\n\t // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n\t // https://caniuse.com/#feat=referrer-policy\n\t // It doesn't. And it throw exception instead of ignoring this parameter...\n\t // REF: https://github.com/getsentry/raven-js/issues/1233\n\t referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n\t };\n\n\t if (this.options.headers !== undefined) {\n\t defaultOptions.headers = this.options.headers;\n\t }\n\n\t return this._buffer.add(new SyncPromise(function (resolve, reject) {\n\t global$3.fetch(_this.url, defaultOptions).then(function (response) {\n\t var status = Status.fromHttpCode(response.status);\n\n\t if (status === Status.Success) {\n\t resolve({\n\t status: status\n\t });\n\t return;\n\t }\n\n\t if (status === Status.RateLimit) {\n\t var now = Date.now();\n\t _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, response.headers.get('Retry-After')));\n\t logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n\t }\n\n\t reject(response);\n\t }).catch(reject);\n\t }));\n\t };\n\n\t return FetchTransport;\n\t}(BaseTransport);\n\n\t/** `XHR` based transport */\n\n\tvar XHRTransport =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(XHRTransport, _super);\n\n\t function XHRTransport() {\n\t var _this = _super !== null && _super.apply(this, arguments) || this;\n\t /** Locks transport after receiving 429 response */\n\n\n\t _this._disabledUntil = new Date(Date.now());\n\t return _this;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t XHRTransport.prototype.sendEvent = function (event) {\n\t var _this = this;\n\n\t if (new Date(Date.now()) < this._disabledUntil) {\n\t return Promise.reject({\n\t event: event,\n\t reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n\t status: 429\n\t });\n\t }\n\n\t return this._buffer.add(new SyncPromise(function (resolve, reject) {\n\t var request = new XMLHttpRequest();\n\n\t request.onreadystatechange = function () {\n\t if (request.readyState !== 4) {\n\t return;\n\t }\n\n\t var status = Status.fromHttpCode(request.status);\n\n\t if (status === Status.Success) {\n\t resolve({\n\t status: status\n\t });\n\t return;\n\t }\n\n\t if (status === Status.RateLimit) {\n\t var now = Date.now();\n\t _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, request.getResponseHeader('Retry-After')));\n\t logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n\t }\n\n\t reject(request);\n\t };\n\n\t request.open('POST', _this.url);\n\n\t for (var header in _this.options.headers) {\n\t if (_this.options.headers.hasOwnProperty(header)) {\n\t request.setRequestHeader(header, _this.options.headers[header]);\n\t }\n\t }\n\n\t request.send(JSON.stringify(event));\n\t }));\n\t };\n\n\t return XHRTransport;\n\t}(BaseTransport);\n\n\t/**\n\t * The Sentry Browser SDK Backend.\n\t * @hidden\n\t */\n\n\tvar BrowserBackend =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(BrowserBackend, _super);\n\n\t function BrowserBackend() {\n\t return _super !== null && _super.apply(this, arguments) || this;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserBackend.prototype._setupTransport = function () {\n\t if (!this._options.dsn) {\n\t // We return the noop transport here in case there is no Dsn.\n\t return _super.prototype._setupTransport.call(this);\n\t }\n\n\t var transportOptions = _assign({}, this._options.transportOptions, {\n\t dsn: this._options.dsn\n\t });\n\n\t if (this._options.transport) {\n\t return new this._options.transport(transportOptions);\n\t }\n\n\t if (supportsFetch()) {\n\t return new FetchTransport(transportOptions);\n\t }\n\n\t return new XHRTransport(transportOptions);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserBackend.prototype.eventFromException = function (exception, hint) {\n\t var syntheticException = hint && hint.syntheticException || undefined;\n\t var event = eventFromUnknownInput(exception, syntheticException, {\n\t attachStacktrace: this._options.attachStacktrace\n\t });\n\t addExceptionMechanism(event, {\n\t handled: true,\n\t type: 'generic'\n\t });\n\t event.level = Severity.Error;\n\n\t if (hint && hint.event_id) {\n\t event.event_id = hint.event_id;\n\t }\n\n\t return SyncPromise.resolve(event);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n\t if (level === void 0) {\n\t level = Severity.Info;\n\t }\n\n\t var syntheticException = hint && hint.syntheticException || undefined;\n\t var event = eventFromString(message, syntheticException, {\n\t attachStacktrace: this._options.attachStacktrace\n\t });\n\t event.level = level;\n\n\t if (hint && hint.event_id) {\n\t event.event_id = hint.event_id;\n\t }\n\n\t return SyncPromise.resolve(event);\n\t };\n\n\t return BrowserBackend;\n\t}(BaseBackend);\n\n\tvar SDK_NAME = 'sentry.javascript.browser';\n\tvar SDK_VERSION = '5.15.5';\n\n\t/**\n\t * The Sentry Browser SDK Client.\n\t *\n\t * @see BrowserOptions for documentation on configuration options.\n\t * @see SentryClient for usage documentation.\n\t */\n\n\tvar BrowserClient =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(BrowserClient, _super);\n\t /**\n\t * Creates a new Browser SDK instance.\n\t *\n\t * @param options Configuration options for this SDK.\n\t */\n\n\n\t function BrowserClient(options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t return _super.call(this, BrowserBackend, options) || this;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n\t event.platform = event.platform || 'javascript';\n\t event.sdk = _assign({}, event.sdk, {\n\t name: SDK_NAME,\n\t packages: __spread(event.sdk && event.sdk.packages || [], [{\n\t name: 'npm:@sentry/browser',\n\t version: SDK_VERSION\n\t }]),\n\t version: SDK_VERSION\n\t });\n\t return _super.prototype._prepareEvent.call(this, event, scope, hint);\n\t };\n\t /**\n\t * Show a report dialog to the user to send feedback to a specific event.\n\t *\n\t * @param options Set individual options for the dialog\n\t */\n\n\n\t BrowserClient.prototype.showReportDialog = function (options) {\n\t if (options === void 0) {\n\t options = {};\n\t } // doesn't work without a document (React Native)\n\n\n\t var document = getGlobalObject().document;\n\n\t if (!document) {\n\t return;\n\t }\n\n\t if (!this._isEnabled()) {\n\t logger.error('Trying to call showReportDialog with Sentry Client is disabled');\n\t return;\n\t }\n\n\t var dsn = options.dsn || this.getDsn();\n\n\t if (!options.eventId) {\n\t logger.error('Missing `eventId` option in showReportDialog call');\n\t return;\n\t }\n\n\t if (!dsn) {\n\t logger.error('Missing `Dsn` option in showReportDialog call');\n\t return;\n\t }\n\n\t var script = document.createElement('script');\n\t script.async = true;\n\t script.src = new API(dsn).getReportDialogEndpoint(options);\n\n\t if (options.onLoad) {\n\t script.onload = options.onLoad;\n\t }\n\n\t (document.head || document.body).appendChild(script);\n\t };\n\n\t return BrowserClient;\n\t}(BaseClient);\n\n\tvar ignoreOnError = 0;\n\t/**\n\t * @hidden\n\t */\n\n\tfunction shouldIgnoreOnError() {\n\t return ignoreOnError > 0;\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction ignoreNextOnError() {\n\t // onerror should trigger before setTimeout\n\t ignoreOnError += 1;\n\t setTimeout(function () {\n\t ignoreOnError -= 1;\n\t });\n\t}\n\t/**\n\t * Instruments the given function and sends an event to Sentry every time the\n\t * function throws an exception.\n\t *\n\t * @param fn A function to wrap.\n\t * @returns The wrapped function.\n\t * @hidden\n\t */\n\n\tfunction wrap$1(fn, options, before) {\n\t if (options === void 0) {\n\t options = {};\n\t } // tslint:disable-next-line:strict-type-predicates\n\n\n\t if (typeof fn !== 'function') {\n\t return fn;\n\t }\n\n\t try {\n\t // We don't wanna wrap it twice\n\t if (fn.__sentry__) {\n\t return fn;\n\t } // If this has already been wrapped in the past, return that wrapped function\n\n\n\t if (fn.__sentry_wrapped__) {\n\t return fn.__sentry_wrapped__;\n\t }\n\t } catch (e) {\n\t // Just accessing custom props in some Selenium environments\n\t // can cause a \"Permission denied\" exception (see raven-js#495).\n\t // Bail on wrapping and return the function as-is (defers to window.onerror).\n\t return fn;\n\t }\n\n\t var sentryWrapped = function sentryWrapped() {\n\t var args = Array.prototype.slice.call(arguments); // tslint:disable:no-unsafe-any\n\n\t try {\n\t // tslint:disable-next-line:strict-type-predicates\n\t if (before && typeof before === 'function') {\n\t before.apply(this, arguments);\n\t }\n\n\t var wrappedArguments = args.map(function (arg) {\n\t return wrap$1(arg, options);\n\t });\n\n\t if (fn.handleEvent) {\n\t // Attempt to invoke user-land function\n\t // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n\t // means the sentry.javascript SDK caught an error invoking your application code. This\n\t // is expected behavior and NOT indicative of a bug with sentry.javascript.\n\t return fn.handleEvent.apply(this, wrappedArguments);\n\t } // Attempt to invoke user-land function\n\t // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n\t // means the sentry.javascript SDK caught an error invoking your application code. This\n\t // is expected behavior and NOT indicative of a bug with sentry.javascript.\n\n\n\t return fn.apply(this, wrappedArguments); // tslint:enable:no-unsafe-any\n\t } catch (ex) {\n\t ignoreNextOnError();\n\t withScope(function (scope) {\n\t scope.addEventProcessor(function (event) {\n\t var processedEvent = _assign({}, event);\n\n\t if (options.mechanism) {\n\t addExceptionTypeValue(processedEvent, undefined, undefined);\n\t addExceptionMechanism(processedEvent, options.mechanism);\n\t }\n\n\t processedEvent.extra = _assign({}, processedEvent.extra, {\n\t arguments: args\n\t });\n\t return processedEvent;\n\t });\n\t captureException(ex);\n\t });\n\t throw ex;\n\t }\n\t }; // Accessing some objects may throw\n\t // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n\n\n\t try {\n\t for (var property in fn) {\n\t if (Object.prototype.hasOwnProperty.call(fn, property)) {\n\t sentryWrapped[property] = fn[property];\n\t }\n\t }\n\t } catch (_oO) {} // tslint:disable-line:no-empty\n\n\n\t fn.prototype = fn.prototype || {};\n\t sentryWrapped.prototype = fn.prototype;\n\t Object.defineProperty(fn, '__sentry_wrapped__', {\n\t enumerable: false,\n\t value: sentryWrapped\n\t }); // Signal that this function has been wrapped/filled already\n\t // for both debugging and to prevent it to being wrapped/filled twice\n\n\t Object.defineProperties(sentryWrapped, {\n\t __sentry__: {\n\t enumerable: false,\n\t value: true\n\t },\n\t __sentry_original__: {\n\t enumerable: false,\n\t value: fn\n\t }\n\t }); // Restore original function name (not all browsers allow that)\n\n\t try {\n\t var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n\n\t if (descriptor.configurable) {\n\t Object.defineProperty(sentryWrapped, 'name', {\n\t get: function get() {\n\t return fn.name;\n\t }\n\t });\n\t }\n\t } catch (_oO) {\n\t /*no-empty*/\n\t }\n\n\t return sentryWrapped;\n\t}\n\n\t/** Global handlers */\n\n\tvar GlobalHandlers =\n\t/** @class */\n\tfunction () {\n\t /** JSDoc */\n\t function GlobalHandlers(options) {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = GlobalHandlers.id;\n\t /** JSDoc */\n\n\t this._onErrorHandlerInstalled = false;\n\t /** JSDoc */\n\n\t this._onUnhandledRejectionHandlerInstalled = false;\n\t this._options = _assign({\n\t onerror: true,\n\t onunhandledrejection: true\n\t }, options);\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t GlobalHandlers.prototype.setupOnce = function () {\n\t Error.stackTraceLimit = 50;\n\n\t if (this._options.onerror) {\n\t logger.log('Global Handler attached: onerror');\n\n\t this._installGlobalOnErrorHandler();\n\t }\n\n\t if (this._options.onunhandledrejection) {\n\t logger.log('Global Handler attached: onunhandledrejection');\n\n\t this._installGlobalOnUnhandledRejectionHandler();\n\t }\n\t };\n\t /** JSDoc */\n\n\n\t GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {\n\t var _this = this;\n\n\t if (this._onErrorHandlerInstalled) {\n\t return;\n\t }\n\n\t addInstrumentationHandler({\n\t callback: function callback(data) {\n\t var error = data.error;\n\t var currentHub = getCurrentHub();\n\t var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n\t var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n\t if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n\t return;\n\t }\n\n\t var client = currentHub.getClient();\n\t var event = isPrimitive(error) ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column) : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, {\n\t attachStacktrace: client && client.getOptions().attachStacktrace,\n\t rejection: false\n\t }), data.url, data.line, data.column);\n\t addExceptionMechanism(event, {\n\t handled: false,\n\t type: 'onerror'\n\t });\n\t currentHub.captureEvent(event, {\n\t originalException: error\n\t });\n\t },\n\t type: 'error'\n\t });\n\t this._onErrorHandlerInstalled = true;\n\t };\n\t /** JSDoc */\n\n\n\t GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {\n\t var _this = this;\n\n\t if (this._onUnhandledRejectionHandlerInstalled) {\n\t return;\n\t }\n\n\t addInstrumentationHandler({\n\t callback: function callback(e) {\n\t var error = e; // dig the object of the rejection out of known event types\n\n\t try {\n\t // PromiseRejectionEvents store the object of the rejection under 'reason'\n\t // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n\t if ('reason' in e) {\n\t error = e.reason;\n\t } // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n\t // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n\t // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n\t // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n\t // https://github.com/getsentry/sentry-javascript/issues/2380\n\t else if ('detail' in e && 'reason' in e.detail) {\n\t error = e.detail.reason;\n\t }\n\t } catch (_oO) {// no-empty\n\t }\n\n\t var currentHub = getCurrentHub();\n\t var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n\t var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n\t if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n\t return true;\n\t }\n\n\t var client = currentHub.getClient();\n\t var event = isPrimitive(error) ? _this._eventFromIncompleteRejection(error) : eventFromUnknownInput(error, undefined, {\n\t attachStacktrace: client && client.getOptions().attachStacktrace,\n\t rejection: true\n\t });\n\t event.level = Severity.Error;\n\t addExceptionMechanism(event, {\n\t handled: false,\n\t type: 'onunhandledrejection'\n\t });\n\t currentHub.captureEvent(event, {\n\t originalException: error\n\t });\n\t return;\n\t },\n\t type: 'unhandledrejection'\n\t });\n\t this._onUnhandledRejectionHandlerInstalled = true;\n\t };\n\t /**\n\t * This function creates a stack from an old, error-less onerror handler.\n\t */\n\n\n\t GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {\n\t var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i; // If 'message' is ErrorEvent, get real message from inside\n\n\t var message = isErrorEvent(msg) ? msg.message : msg;\n\t var name;\n\n\t if (isString(message)) {\n\t var groups = message.match(ERROR_TYPES_RE);\n\n\t if (groups) {\n\t name = groups[1];\n\t message = groups[2];\n\t }\n\t }\n\n\t var event = {\n\t exception: {\n\t values: [{\n\t type: name || 'Error',\n\t value: message\n\t }]\n\t }\n\t };\n\t return this._enhanceEventWithInitialFrame(event, url, line, column);\n\t };\n\t /**\n\t * This function creates an Event from an TraceKitStackTrace that has part of it missing.\n\t */\n\n\n\t GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {\n\t return {\n\t exception: {\n\t values: [{\n\t type: 'UnhandledRejection',\n\t value: \"Non-Error promise rejection captured with value: \" + error\n\t }]\n\t }\n\t };\n\t };\n\t /** JSDoc */\n\n\n\t GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {\n\t event.exception = event.exception || {};\n\t event.exception.values = event.exception.values || [];\n\t event.exception.values[0] = event.exception.values[0] || {};\n\t event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n\t event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n\t var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n\t var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n\t var filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n\t if (event.exception.values[0].stacktrace.frames.length === 0) {\n\t event.exception.values[0].stacktrace.frames.push({\n\t colno: colno,\n\t filename: filename,\n\t function: '?',\n\t in_app: true,\n\t lineno: lineno\n\t });\n\t }\n\n\t return event;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t GlobalHandlers.id = 'GlobalHandlers';\n\t return GlobalHandlers;\n\t}();\n\n\t/** Wrap timer functions and event targets to catch errors and provide better meta data */\n\n\tvar TryCatch =\n\t/** @class */\n\tfunction () {\n\t function TryCatch() {\n\t /** JSDoc */\n\t this._ignoreOnError = 0;\n\t /**\n\t * @inheritDoc\n\t */\n\n\t this.name = TryCatch.id;\n\t }\n\t /** JSDoc */\n\n\n\t TryCatch.prototype._wrapTimeFunction = function (original) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var originalCallback = args[0];\n\t args[0] = wrap$1(originalCallback, {\n\t mechanism: {\n\t data: {\n\t function: getFunctionName(original)\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t });\n\t return original.apply(this, args);\n\t };\n\t };\n\t /** JSDoc */\n\n\n\t TryCatch.prototype._wrapRAF = function (original) {\n\t return function (callback) {\n\t return original(wrap$1(callback, {\n\t mechanism: {\n\t data: {\n\t function: 'requestAnimationFrame',\n\t handler: getFunctionName(original)\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t }));\n\t };\n\t };\n\t /** JSDoc */\n\n\n\t TryCatch.prototype._wrapEventTarget = function (target) {\n\t var global = getGlobalObject();\n\t var proto = global[target] && global[target].prototype;\n\n\t if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n\t return;\n\t }\n\n\t fill(proto, 'addEventListener', function (original) {\n\t return function (eventName, fn, options) {\n\t try {\n\t // tslint:disable-next-line:no-unbound-method strict-type-predicates\n\t if (typeof fn.handleEvent === 'function') {\n\t fn.handleEvent = wrap$1(fn.handleEvent.bind(fn), {\n\t mechanism: {\n\t data: {\n\t function: 'handleEvent',\n\t handler: getFunctionName(fn),\n\t target: target\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t });\n\t }\n\t } catch (err) {// can sometimes get 'Permission denied to access property \"handle Event'\n\t }\n\n\t return original.call(this, eventName, wrap$1(fn, {\n\t mechanism: {\n\t data: {\n\t function: 'addEventListener',\n\t handler: getFunctionName(fn),\n\t target: target\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t }), options);\n\t };\n\t });\n\t fill(proto, 'removeEventListener', function (original) {\n\t return function (eventName, fn, options) {\n\t var callback = fn;\n\n\t try {\n\t callback = callback && (callback.__sentry_wrapped__ || callback);\n\t } catch (e) {// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n\t }\n\n\t return original.call(this, eventName, callback, options);\n\t };\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t TryCatch.prototype._wrapXHR = function (originalSend) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var xhr = this; // tslint:disable-line:no-this-assignment\n\n\t var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\t xmlHttpRequestProps.forEach(function (prop) {\n\t if (prop in xhr && typeof xhr[prop] === 'function') {\n\t fill(xhr, prop, function (original) {\n\t var wrapOptions = {\n\t mechanism: {\n\t data: {\n\t function: prop,\n\t handler: getFunctionName(original)\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t }; // If Instrument integration has been called before TryCatch, get the name of original function\n\n\t if (original.__sentry_original__) {\n\t wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__);\n\t } // Otherwise wrap directly\n\n\n\t return wrap$1(original, wrapOptions);\n\t });\n\t }\n\t });\n\t return originalSend.apply(this, args);\n\t };\n\t };\n\t /**\n\t * Wrap timer functions and event targets to catch errors\n\t * and provide better metadata.\n\t */\n\n\n\t TryCatch.prototype.setupOnce = function () {\n\t this._ignoreOnError = this._ignoreOnError;\n\t var global = getGlobalObject();\n\t fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n\t fill(global, 'setInterval', this._wrapTimeFunction.bind(this));\n\t fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n\n\t if ('XMLHttpRequest' in global) {\n\t fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));\n\t }\n\n\t ['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'].forEach(this._wrapEventTarget.bind(this));\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t TryCatch.id = 'TryCatch';\n\t return TryCatch;\n\t}();\n\n\t/**\n\t * Default Breadcrumbs instrumentations\n\t * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n\t */\n\n\tvar Breadcrumbs =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * @inheritDoc\n\t */\n\t function Breadcrumbs(options) {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = Breadcrumbs.id;\n\t this._options = _assign({\n\t console: true,\n\t dom: true,\n\t fetch: true,\n\t history: true,\n\t sentry: true,\n\t xhr: true\n\t }, options);\n\t }\n\t /**\n\t * Creates breadcrumbs from console API calls\n\t */\n\n\n\t Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {\n\t var breadcrumb = {\n\t category: 'console',\n\t data: {\n\t arguments: handlerData.args,\n\t logger: 'console'\n\t },\n\t level: Severity.fromString(handlerData.level),\n\t message: safeJoin(handlerData.args, ' ')\n\t };\n\n\t if (handlerData.level === 'assert') {\n\t if (handlerData.args[0] === false) {\n\t breadcrumb.message = \"Assertion failed: \" + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');\n\t breadcrumb.data.arguments = handlerData.args.slice(1);\n\t } else {\n\t // Don't capture a breadcrumb for passed assertions\n\t return;\n\t }\n\t }\n\n\t getCurrentHub().addBreadcrumb(breadcrumb, {\n\t input: handlerData.args,\n\t level: handlerData.level\n\t });\n\t };\n\t /**\n\t * Creates breadcrumbs from DOM API calls\n\t */\n\n\n\t Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {\n\t var target; // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n\n\t try {\n\t target = handlerData.event.target ? htmlTreeAsString(handlerData.event.target) : htmlTreeAsString(handlerData.event);\n\t } catch (e) {\n\t target = '<unknown>';\n\t }\n\n\t if (target.length === 0) {\n\t return;\n\t }\n\n\t getCurrentHub().addBreadcrumb({\n\t category: \"ui.\" + handlerData.name,\n\t message: target\n\t }, {\n\t event: handlerData.event,\n\t name: handlerData.name\n\t });\n\t };\n\t /**\n\t * Creates breadcrumbs from XHR API calls\n\t */\n\n\n\t Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {\n\t if (handlerData.endTimestamp) {\n\t // We only capture complete, non-sentry requests\n\t if (handlerData.xhr.__sentry_own_request__) {\n\t return;\n\t }\n\n\t getCurrentHub().addBreadcrumb({\n\t category: 'xhr',\n\t data: handlerData.xhr.__sentry_xhr__,\n\t type: 'http'\n\t }, {\n\t xhr: handlerData.xhr\n\t });\n\t return;\n\t } // We only capture issued sentry requests\n\n\n\t if (this._options.sentry && handlerData.xhr.__sentry_own_request__) {\n\t addSentryBreadcrumb(handlerData.args[0]);\n\t }\n\t };\n\t /**\n\t * Creates breadcrumbs from fetch API calls\n\t */\n\n\n\t Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {\n\t // We only capture complete fetch requests\n\t if (!handlerData.endTimestamp) {\n\t return;\n\t }\n\n\t var client = getCurrentHub().getClient();\n\t var dsn = client && client.getDsn();\n\n\t if (this._options.sentry && dsn) {\n\t var filterUrl = new API(dsn).getStoreEndpoint(); // if Sentry key appears in URL, don't capture it as a request\n\t // but rather as our own 'sentry' type breadcrumb\n\n\t if (filterUrl && handlerData.fetchData.url.indexOf(filterUrl) !== -1 && handlerData.fetchData.method === 'POST' && handlerData.args[1] && handlerData.args[1].body) {\n\t addSentryBreadcrumb(handlerData.args[1].body);\n\t return;\n\t }\n\t }\n\n\t if (handlerData.error) {\n\t getCurrentHub().addBreadcrumb({\n\t category: 'fetch',\n\t data: _assign({}, handlerData.fetchData, {\n\t status_code: handlerData.response.status\n\t }),\n\t level: Severity.Error,\n\t type: 'http'\n\t }, {\n\t data: handlerData.error,\n\t input: handlerData.args\n\t });\n\t } else {\n\t getCurrentHub().addBreadcrumb({\n\t category: 'fetch',\n\t data: _assign({}, handlerData.fetchData, {\n\t status_code: handlerData.response.status\n\t }),\n\t type: 'http'\n\t }, {\n\t input: handlerData.args,\n\t response: handlerData.response\n\t });\n\t }\n\t };\n\t /**\n\t * Creates breadcrumbs from history API calls\n\t */\n\n\n\t Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {\n\t var global = getGlobalObject();\n\t var from = handlerData.from;\n\t var to = handlerData.to;\n\t var parsedLoc = parseUrl(global.location.href);\n\t var parsedFrom = parseUrl(from);\n\t var parsedTo = parseUrl(to); // Initial pushState doesn't provide `from` information\n\n\t if (!parsedFrom.path) {\n\t parsedFrom = parsedLoc;\n\t } // Use only the path component of the URL if the URL matches the current\n\t // document (almost all the time when using pushState)\n\n\n\t if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n\t // tslint:disable-next-line:no-parameter-reassignment\n\t to = parsedTo.relative;\n\t }\n\n\t if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n\t // tslint:disable-next-line:no-parameter-reassignment\n\t from = parsedFrom.relative;\n\t }\n\n\t getCurrentHub().addBreadcrumb({\n\t category: 'navigation',\n\t data: {\n\t from: from,\n\t to: to\n\t }\n\t });\n\t };\n\t /**\n\t * Instrument browser built-ins w/ breadcrumb capturing\n\t * - Console API\n\t * - DOM API (click/typing)\n\t * - XMLHttpRequest API\n\t * - Fetch API\n\t * - History API\n\t */\n\n\n\t Breadcrumbs.prototype.setupOnce = function () {\n\t var _this = this;\n\n\t if (this._options.console) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._consoleBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'console'\n\t });\n\t }\n\n\t if (this._options.dom) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._domBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'dom'\n\t });\n\t }\n\n\t if (this._options.xhr) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._xhrBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'xhr'\n\t });\n\t }\n\n\t if (this._options.fetch) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._fetchBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'fetch'\n\t });\n\t }\n\n\t if (this._options.history) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._historyBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'history'\n\t });\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Breadcrumbs.id = 'Breadcrumbs';\n\t return Breadcrumbs;\n\t}();\n\t/**\n\t * Create a breadcrumb of `sentry` from the events themselves\n\t */\n\n\tfunction addSentryBreadcrumb(serializedData) {\n\t // There's always something that can go wrong with deserialization...\n\t try {\n\t var event_1 = JSON.parse(serializedData);\n\t getCurrentHub().addBreadcrumb({\n\t category: \"sentry.\" + (event_1.type === 'transaction' ? 'transaction' : 'event'),\n\t event_id: event_1.event_id,\n\t level: event_1.level || Severity.fromString('error'),\n\t message: getEventDescription(event_1)\n\t }, {\n\t event: event_1\n\t });\n\t } catch (_oO) {\n\t logger.error('Error while adding sentry type breadcrumb');\n\t }\n\t}\n\n\tvar DEFAULT_KEY = 'cause';\n\tvar DEFAULT_LIMIT = 5;\n\t/** Adds SDK info to an event. */\n\n\tvar LinkedErrors =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * @inheritDoc\n\t */\n\t function LinkedErrors(options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t this.name = LinkedErrors.id;\n\t this._key = options.key || DEFAULT_KEY;\n\t this._limit = options.limit || DEFAULT_LIMIT;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t LinkedErrors.prototype.setupOnce = function () {\n\t addGlobalEventProcessor(function (event, hint) {\n\t var self = getCurrentHub().getIntegration(LinkedErrors);\n\n\t if (self) {\n\t return self._handler(event, hint);\n\t }\n\n\t return event;\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t LinkedErrors.prototype._handler = function (event, hint) {\n\t if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n\t return event;\n\t }\n\n\t var linkedErrors = this._walkErrorTree(hint.originalException, this._key);\n\n\t event.exception.values = __spread(linkedErrors, event.exception.values);\n\t return event;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {\n\t if (stack === void 0) {\n\t stack = [];\n\t }\n\n\t if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) {\n\t return stack;\n\t }\n\n\t var stacktrace = computeStackTrace(error[key]);\n\t var exception = exceptionFromStacktrace(stacktrace);\n\t return this._walkErrorTree(error[key], key, __spread([exception], stack));\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t LinkedErrors.id = 'LinkedErrors';\n\t return LinkedErrors;\n\t}();\n\n\tvar global$4 = getGlobalObject();\n\t/** UserAgent */\n\n\tvar UserAgent =\n\t/** @class */\n\tfunction () {\n\t function UserAgent() {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = UserAgent.id;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t UserAgent.prototype.setupOnce = function () {\n\t addGlobalEventProcessor(function (event) {\n\t if (getCurrentHub().getIntegration(UserAgent)) {\n\t if (!global$4.navigator || !global$4.location) {\n\t return event;\n\t } // Request Interface: https://docs.sentry.io/development/sdk-dev/event-payloads/request/\n\n\n\t var request = event.request || {};\n\t request.url = request.url || global$4.location.href;\n\t request.headers = request.headers || {};\n\t request.headers['User-Agent'] = global$4.navigator.userAgent;\n\t return _assign({}, event, {\n\t request: request\n\t });\n\t }\n\n\t return event;\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t UserAgent.id = 'UserAgent';\n\t return UserAgent;\n\t}();\n\n\tvar defaultIntegrations = [new InboundFilters(), new FunctionToString(), new TryCatch(), new Breadcrumbs(), new GlobalHandlers(), new LinkedErrors(), new UserAgent()];\n\t/**\n\t * The Sentry Browser SDK Client.\n\t *\n\t * To use this SDK, call the {@link init} function as early as possible when\n\t * loading the web page. To set context information or send manual events, use\n\t * the provided methods.\n\t *\n\t * @example\n\t *\n\t * ```\n\t *\n\t * import { init } from '@sentry/browser';\n\t *\n\t * init({\n\t * dsn: '__DSN__',\n\t * // ...\n\t * });\n\t * ```\n\t *\n\t * @example\n\t * ```\n\t *\n\t * import { configureScope } from '@sentry/browser';\n\t * configureScope((scope: Scope) => {\n\t * scope.setExtra({ battery: 0.7 });\n\t * scope.setTag({ user_mode: 'admin' });\n\t * scope.setUser({ id: '4711' });\n\t * });\n\t * ```\n\t *\n\t * @example\n\t * ```\n\t *\n\t * import { addBreadcrumb } from '@sentry/browser';\n\t * addBreadcrumb({\n\t * message: 'My Breadcrumb',\n\t * // ...\n\t * });\n\t * ```\n\t *\n\t * @example\n\t *\n\t * ```\n\t *\n\t * import * as Sentry from '@sentry/browser';\n\t * Sentry.captureMessage('Hello, world!');\n\t * Sentry.captureException(new Error('Good bye'));\n\t * Sentry.captureEvent({\n\t * message: 'Manual',\n\t * stacktrace: [\n\t * // ...\n\t * ],\n\t * });\n\t * ```\n\t *\n\t * @see {@link BrowserOptions} for documentation on configuration options.\n\t */\n\n\tfunction init(options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t if (options.defaultIntegrations === undefined) {\n\t options.defaultIntegrations = defaultIntegrations;\n\t }\n\n\t if (options.release === undefined) {\n\t var window_1 = getGlobalObject(); // This supports the variable that sentry-webpack-plugin injects\n\n\t if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n\t options.release = window_1.SENTRY_RELEASE.id;\n\t }\n\t }\n\n\t initAndBind(BrowserClient, options);\n\t}\n\n\tvar $find$1 = arrayIteration.find;\n\n\n\n\tvar FIND = 'find';\n\tvar SKIPS_HOLES = true;\n\n\tvar USES_TO_LENGTH$9 = arrayMethodUsesToLength(FIND);\n\n\t// Shouldn't skip holes\n\tif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n\t// `Array.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t_export({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH$9 }, {\n\t find: function find(callbackfn /* , that = undefined */) {\n\t return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables(FIND);\n\n\t// a string of all valid unicode whitespaces\n\t// eslint-disable-next-line max-len\n\tvar whitespaces = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\tvar whitespace = '[' + whitespaces + ']';\n\tvar ltrim = RegExp('^' + whitespace + whitespace + '*');\n\tvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n\t// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\n\tvar createMethod$4 = function (TYPE) {\n\t return function ($this) {\n\t var string = String(requireObjectCoercible($this));\n\t if (TYPE & 1) string = string.replace(ltrim, '');\n\t if (TYPE & 2) string = string.replace(rtrim, '');\n\t return string;\n\t };\n\t};\n\n\tvar stringTrim = {\n\t // `String.prototype.{ trimLeft, trimStart }` methods\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n\t start: createMethod$4(1),\n\t // `String.prototype.{ trimRight, trimEnd }` methods\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n\t end: createMethod$4(2),\n\t // `String.prototype.trim` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t trim: createMethod$4(3)\n\t};\n\n\tvar getOwnPropertyNames$2 = objectGetOwnPropertyNames.f;\n\tvar getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;\n\tvar defineProperty$9 = objectDefineProperty.f;\n\tvar trim = stringTrim.trim;\n\n\tvar NUMBER = 'Number';\n\tvar NativeNumber = global_1[NUMBER];\n\tvar NumberPrototype = NativeNumber.prototype;\n\n\t// Opera ~12 has broken Object#toString\n\tvar BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;\n\n\t// `ToNumber` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tonumber\n\tvar toNumber = function (argument) {\n\t var it = toPrimitive(argument, false);\n\t var first, third, radix, maxCode, digits, length, index, code;\n\t if (typeof it == 'string' && it.length > 2) {\n\t it = trim(it);\n\t first = it.charCodeAt(0);\n\t if (first === 43 || first === 45) {\n\t third = it.charCodeAt(2);\n\t if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n\t } else if (first === 48) {\n\t switch (it.charCodeAt(1)) {\n\t case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i\n\t case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n\t default: return +it;\n\t }\n\t digits = it.slice(2);\n\t length = digits.length;\n\t for (index = 0; index < length; index++) {\n\t code = digits.charCodeAt(index);\n\t // parseInt parses a string to a first unavailable symbol\n\t // but ToNumber should return NaN if a string contains unavailable symbols\n\t if (code < 48 || code > maxCode) return NaN;\n\t } return parseInt(digits, radix);\n\t }\n\t } return +it;\n\t};\n\n\t// `Number` constructor\n\t// https://tc39.github.io/ecma262/#sec-number-constructor\n\tif (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n\t var NumberWrapper = function Number(value) {\n\t var it = arguments.length < 1 ? 0 : value;\n\t var dummy = this;\n\t return dummy instanceof NumberWrapper\n\t // check on 1..constructor(foo) case\n\t && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)\n\t ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n\t };\n\t for (var keys$3 = descriptors ? getOwnPropertyNames$2(NativeNumber) : (\n\t // ES3:\n\t 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n\t // ES2015 (in case, if modules with ES2015 Number statics required before):\n\t 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n\t 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n\t ).split(','), j$1 = 0, key$1; keys$3.length > j$1; j$1++) {\n\t if (has(NativeNumber, key$1 = keys$3[j$1]) && !has(NumberWrapper, key$1)) {\n\t defineProperty$9(NumberWrapper, key$1, getOwnPropertyDescriptor$3(NativeNumber, key$1));\n\t }\n\t }\n\t NumberWrapper.prototype = NumberPrototype;\n\t NumberPrototype.constructor = NumberWrapper;\n\t redefine(global_1, NUMBER, NumberWrapper);\n\t}\n\n\t// `Number.isNaN` method\n\t// https://tc39.github.io/ecma262/#sec-number.isnan\n\t_export({ target: 'Number', stat: true }, {\n\t isNaN: function isNaN(number) {\n\t // eslint-disable-next-line no-self-compare\n\t return number != number;\n\t }\n\t});\n\n\tvar propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\n\t// `Object.{ entries, values }` methods implementation\n\tvar createMethod$5 = function (TO_ENTRIES) {\n\t return function (it) {\n\t var O = toIndexedObject(it);\n\t var keys = objectKeys(O);\n\t var length = keys.length;\n\t var i = 0;\n\t var result = [];\n\t var key;\n\t while (length > i) {\n\t key = keys[i++];\n\t if (!descriptors || propertyIsEnumerable.call(O, key)) {\n\t result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n\t }\n\t }\n\t return result;\n\t };\n\t};\n\n\tvar objectToArray = {\n\t // `Object.entries` method\n\t // https://tc39.github.io/ecma262/#sec-object.entries\n\t entries: createMethod$5(true),\n\t // `Object.values` method\n\t // https://tc39.github.io/ecma262/#sec-object.values\n\t values: createMethod$5(false)\n\t};\n\n\tvar $entries = objectToArray.entries;\n\n\t// `Object.entries` method\n\t// https://tc39.github.io/ecma262/#sec-object.entries\n\t_export({ target: 'Object', stat: true }, {\n\t entries: function entries(O) {\n\t return $entries(O);\n\t }\n\t});\n\n\tfunction _classCallCheck$1(e, t) {\n\t if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n\t}\n\n\tfunction _defineProperties$1(e, t) {\n\t for (var n = 0; n < t.length; n++) {\n\t var r = t[n];\n\t r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n\t }\n\t}\n\n\tfunction _createClass$1(e, t, n) {\n\t return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n\t}\n\n\tfunction _defineProperty$1(e, t, n) {\n\t return t in e ? Object.defineProperty(e, t, {\n\t value: n,\n\t enumerable: !0,\n\t configurable: !0,\n\t writable: !0\n\t }) : e[t] = n, e;\n\t}\n\n\tfunction _slicedToArray$1(e, t) {\n\t return _arrayWithHoles$1(e) || _iterableToArrayLimit$1(e, t) || _nonIterableRest$1();\n\t}\n\n\tfunction _arrayWithHoles$1(e) {\n\t if (Array.isArray(e)) return e;\n\t}\n\n\tfunction _iterableToArrayLimit$1(e, t) {\n\t var n = [],\n\t r = !0,\n\t o = !1,\n\t i = void 0;\n\n\t try {\n\t for (var s, a = e[Symbol.iterator](); !(r = (s = a.next()).done) && (n.push(s.value), !t || n.length !== t); r = !0) {\n\t ;\n\t }\n\t } catch (e) {\n\t o = !0, i = e;\n\t } finally {\n\t try {\n\t r || null == a.return || a.return();\n\t } finally {\n\t if (o) throw i;\n\t }\n\t }\n\n\t return n;\n\t}\n\n\tfunction _nonIterableRest$1() {\n\t throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n\t}\n\n\tvar getConstructor = function getConstructor(e) {\n\t return null != e ? e.constructor : null;\n\t},\n\t instanceOf = function instanceOf(e, t) {\n\t return !!(e && t && e instanceof t);\n\t},\n\t isNullOrUndefined = function isNullOrUndefined(e) {\n\t return null == e;\n\t},\n\t isObject$1 = function isObject(e) {\n\t return getConstructor(e) === Object;\n\t},\n\t isNumber = function isNumber(e) {\n\t return getConstructor(e) === Number && !Number.isNaN(e);\n\t},\n\t isString$1 = function isString(e) {\n\t return getConstructor(e) === String;\n\t},\n\t isBoolean = function isBoolean(e) {\n\t return getConstructor(e) === Boolean;\n\t},\n\t isFunction = function isFunction(e) {\n\t return getConstructor(e) === Function;\n\t},\n\t isArray$1 = function isArray(e) {\n\t return Array.isArray(e);\n\t},\n\t isNodeList = function isNodeList(e) {\n\t return instanceOf(e, NodeList);\n\t},\n\t isElement$1 = function isElement(e) {\n\t return instanceOf(e, Element);\n\t},\n\t isEvent$1 = function isEvent(e) {\n\t return instanceOf(e, Event);\n\t},\n\t isEmpty = function isEmpty(e) {\n\t return isNullOrUndefined(e) || (isString$1(e) || isArray$1(e) || isNodeList(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n\t},\n\t is = {\n\t nullOrUndefined: isNullOrUndefined,\n\t object: isObject$1,\n\t number: isNumber,\n\t string: isString$1,\n\t boolean: isBoolean,\n\t function: isFunction,\n\t array: isArray$1,\n\t nodeList: isNodeList,\n\t element: isElement$1,\n\t event: isEvent$1,\n\t empty: isEmpty\n\t},\n\t constants = {\n\t facebook: {\n\t domain: \"facebook.com\",\n\t url: function url(e) {\n\t return \"https://graph.facebook.com/?id=\".concat(e, \"&fields=og_object{engagement}\");\n\t },\n\t shareCount: function shareCount(e) {\n\t return e.og_object.engagement.count;\n\t },\n\t popup: {\n\t width: 640,\n\t height: 360\n\t }\n\t },\n\t twitter: {\n\t domain: \"twitter.com\",\n\t url: function url() {\n\t return null;\n\t },\n\t shareCount: function shareCount() {\n\t return null;\n\t },\n\t popup: {\n\t width: 640,\n\t height: 240\n\t }\n\t },\n\t pinterest: {\n\t domain: \"pinterest.com\",\n\t url: function url(e) {\n\t return \"https://widgets.pinterest.com/v1/urls/count.json?url=\".concat(e);\n\t },\n\t shareCount: function shareCount(e) {\n\t return e.count;\n\t },\n\t popup: {\n\t width: 830,\n\t height: 700\n\t }\n\t },\n\t github: {\n\t domain: \"github.com\",\n\t url: function url(e, t) {\n\t return \"https://api.github.com/repos/\".concat(e).concat(is.string(t) ? \"?access_token=\".concat(t) : \"\");\n\t },\n\t shareCount: function shareCount(e) {\n\t return e.data.stargazers_count;\n\t }\n\t },\n\t youtube: {\n\t domain: \"youtube.com\",\n\t url: function url(e, t) {\n\t return \"https://www.googleapis.com/youtube/v3/channels?part=statistics&id=\".concat(e, \"&key=\").concat(t);\n\t },\n\t shareCount: function shareCount(e) {\n\t if (!is.empty(e.error)) return null;\n\n\t var t = _slicedToArray$1(e.items, 1)[0];\n\n\t return is.empty(t) ? null : t.statistics.subscriberCount;\n\t }\n\t }\n\t},\n\t defaults = {\n\t debug: !1,\n\t wrapper: {\n\t className: \"shr\"\n\t },\n\t count: {\n\t className: \"shr__count\",\n\t displayZero: !1,\n\t format: !0,\n\t position: \"after\",\n\t increment: !0\n\t },\n\t tokens: {\n\t github: \"\",\n\t youtube: \"\"\n\t },\n\t storage: {\n\t enabled: !0,\n\t key: \"shr\",\n\t ttl: 3e5\n\t }\n\t};\n\n\tfunction getJSONP(e) {\n\t return new Promise(function (t, n) {\n\t var r = \"jsonp_callback_\".concat(Math.round(1e5 * Math.random())),\n\t o = document.createElement(\"script\");\n\t o.addEventListener(\"error\", function (e) {\n\t return n(e);\n\t }), window[r] = function (e) {\n\t delete window[r], document.body.removeChild(o), t(e);\n\t };\n\t var i = new URL(e);\n\t i.searchParams.set(\"callback\", r), o.setAttribute(\"src\", i.toString()), document.body.appendChild(o);\n\t });\n\t}\n\n\tvar noop = function noop() {},\n\t Console = function () {\n\t function e() {\n\t var t = !!(0 < arguments.length && void 0 !== arguments[0]) && arguments[0];\n\t _classCallCheck$1(this, e), this.enabled = window.console && t, this.enabled && this.log(\"Debugging enabled\");\n\t }\n\n\t return _createClass$1(e, [{\n\t key: \"log\",\n\t get: function get() {\n\t return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n\t }\n\t }, {\n\t key: \"warn\",\n\t get: function get() {\n\t return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n\t }\n\t }, {\n\t key: \"error\",\n\t get: function get() {\n\t return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n\t }\n\t }]), e;\n\t}();\n\n\tfunction matches(e, t) {\n\t return function () {\n\t return Array.from(document.querySelectorAll(t)).includes(this);\n\t }.call(e, t);\n\t}\n\n\tfunction wrap$2(e, t) {\n\t var n = e.length ? e : [e];\n\t Array.from(n).reverse().forEach(function (e, n) {\n\t var r = 0 < n ? t.cloneNode(!0) : t,\n\t o = e.parentNode,\n\t i = e.nextSibling;\n\t r.appendChild(e), i ? o.insertBefore(r, i) : o.appendChild(r);\n\t });\n\t}\n\n\tfunction setAttributes(e, t) {\n\t !is.element(e) || is.empty(t) || Object.entries(t).filter(function (e) {\n\t var t = _slicedToArray$1(e, 2)[1];\n\n\t return !is.nullOrUndefined(t);\n\t }).forEach(function (t) {\n\t var n = _slicedToArray$1(t, 2),\n\t r = n[0],\n\t o = n[1];\n\n\t return e.setAttribute(r, o);\n\t });\n\t}\n\n\tfunction createElement(e, t, n) {\n\t var r = document.createElement(e);\n\t return is.object(t) && setAttributes(r, t), is.string(n) && (r.innerText = n), r;\n\t}\n\n\tfunction formatNumber(e) {\n\t var t = /\\./.test(1.1.toLocaleString()) ? \".\" : \",\",\n\t n = new RegExp(\"\\\\\".concat(t, \"\\\\d+$\"));\n\t return Math.round(e).toLocaleString().replace(n, \"\");\n\t}\n\n\tfunction extend() {\n\t for (var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}, t = arguments.length, n = Array(1 < t ? t - 1 : 0), r = 1; r < t; r++) {\n\t n[r - 1] = arguments[r];\n\t }\n\n\t if (!n.length) return e;\n\t var o = n.shift();\n\t return is.object(o) ? (Object.keys(o).forEach(function (t) {\n\t is.object(o[t]) ? (!Object.keys(e).includes(t) && Object.assign(e, _defineProperty$1({}, t, {})), extend(e[t], o[t])) : Object.assign(e, _defineProperty$1({}, t, o[t]));\n\t }), extend.apply(void 0, [e].concat(n))) : e;\n\t}\n\n\tvar Storage = function () {\n\t function e(t, n) {\n\t var r = !(2 < arguments.length && void 0 !== arguments[2]) || arguments[2];\n\t _classCallCheck$1(this, e), this.enabled = r && e.supported, this.key = t, this.ttl = n;\n\t }\n\n\t return _createClass$1(e, [{\n\t key: \"get\",\n\t value: function value(t) {\n\t if (!e.supported || !this.enabled) return null;\n\t var n = window.localStorage.getItem(this.key);\n\t if (is.empty(n)) return null;\n\t var r = window.localStorage.getItem(\"\".concat(this.key, \"_ttl\"));\n\t if (is.empty(r) || r < Date.now()) return null;\n\t var o = JSON.parse(n);\n\t return is.string(t) && t.length ? o[t] : o;\n\t }\n\t }, {\n\t key: \"set\",\n\t value: function value(t) {\n\t if (e.supported && this.enabled && is.object(t)) {\n\t var n = this.get();\n\t is.empty(n) && (n = {}), extend(n, t), window.localStorage.setItem(this.key, JSON.stringify(n)), window.localStorage.setItem(\"\".concat(this.key, \"_ttl\"), Date.now() + this.ttl);\n\t }\n\t }\n\t }], [{\n\t key: \"supported\",\n\t get: function get() {\n\t try {\n\t return \"localStorage\" in window && (window.localStorage.setItem(\"___test\", \"___test\"), window.localStorage.removeItem(\"___test\"), !0);\n\t } catch (e) {\n\t return !1;\n\t }\n\t }\n\t }]), e;\n\t}();\n\n\tfunction getDomain(e) {\n\t var t = new URL(e).hostname,\n\t n = t.split(\".\"),\n\t r = n.length;\n\t return 2 < r && (t = \"\".concat(n[r - 2], \".\").concat(n[r - 1]), 2 === n[r - 2].length && 2 === n[r - 1].length && (t = \"\".concat(n[r - 3], \".\").concat(t))), t;\n\t}\n\n\tvar Shr = function () {\n\t function e(t, n) {\n\t var r = this;\n\t _classCallCheck$1(this, e), this.elements = {\n\t count: null,\n\t trigger: null,\n\t popup: null\n\t }, is.element(t) ? this.elements.trigger = t : is.string(t) && (this.elements.trigger = document.querySelector(t)), is.element(this.elements.trigger) && is.empty(this.elements.trigger.shr) && (this.config = extend({}, defaults, n, {\n\t networks: constants\n\t }), this.console = new Console(this.config.debug), this.storage = new Storage(this.config.storage.key, this.config.storage.ttl, this.config.storage.enabled), this.getCount().then(function (e) {\n\t return r.updateDisplay(e);\n\t }).catch(function () {}), this.listeners(!0), this.elements.trigger.shr = this);\n\t }\n\n\t return _createClass$1(e, [{\n\t key: \"destroy\",\n\t value: function value() {\n\t this.listeners(!1);\n\t }\n\t }, {\n\t key: \"listeners\",\n\t value: function value() {\n\t var e = this,\n\t t = !!(0 < arguments.length && void 0 !== arguments[0]) && arguments[0] ? \"addEventListener\" : \"removeEventListener\";\n\t this.elements.trigger[t](\"click\", function (t) {\n\t return e.share(t);\n\t }, !1);\n\t }\n\t }, {\n\t key: \"share\",\n\t value: function value(e) {\n\t var t = this;\n\t this.openPopup(e);\n\t var n = this.config.count.increment;\n\t this.getCount().then(function (e) {\n\t return t.updateDisplay(e, n);\n\t }).catch(function () {});\n\t }\n\t }, {\n\t key: \"openPopup\",\n\t value: function value(e) {\n\t if (!is.empty(this.network) && this.networkConfig.popup) {\n\t is.event(e) && e.preventDefault();\n\t var t = this.networkConfig.popup,\n\t n = t.width,\n\t r = t.height,\n\t o = \"shr-popup--\".concat(this.network);\n\t if (this.popup && !this.popup.closed) this.popup.focus(), this.console.log(\"Popup re-focused.\");else {\n\t var i = void 0 === window.screenLeft ? window.screen.left : window.screenLeft,\n\t s = void 0 === window.screenTop ? window.screen.top : window.screenTop,\n\t a = window.screen.width / 2 - n / 2 + i,\n\t c = window.screen.height / 2 - r / 2 + s;\n\t this.popup = window.open(this.href, o, \"top=\".concat(c, \",left=\").concat(a, \",width=\").concat(n, \",height=\").concat(r)), !this.popup || this.popup.closed || !is.boolean(this.popup.closed) ? this.console.error(\"Popup blocked.\") : (this.popup.focus(), this.console.log(\"Popup opened.\"));\n\t }\n\t }\n\t }\n\t }, {\n\t key: \"getCount\",\n\t value: function value() {\n\t var e = this,\n\t t = !(0 < arguments.length && void 0 !== arguments[0]) || arguments[0];\n\t return new Promise(function (n, r) {\n\t var o = e.apiUrl;\n\t if (is.empty(o)) r(new Error(\"No URL available for \".concat(e.network, \".\")));else {\n\t if (t) {\n\t var i = e.storage.get(e.target);\n\n\t if (!is.empty(i) && Object.keys(i).includes(e.network)) {\n\t var s = i[e.network];\n\t return n(is.number(s) ? s : 0), void e.console.log(\"getCount for '\".concat(e.target, \"' for '\").concat(e.network, \"' resolved from cache.\"));\n\t }\n\t }\n\n\t getJSONP(o).then(function (t) {\n\t var r = 0,\n\t o = e.elements.trigger.getAttribute(\"data-shr-display\");\n\t r = is.empty(o) ? e.networkConfig.shareCount(t) : t[o], is.empty(r) ? r = 0 : (r = parseInt(r, 10), !is.number(r) && (r = 0)), e.storage.set(_defineProperty$1({}, e.target, _defineProperty$1({}, e.network, r))), n(r);\n\t }).catch(r);\n\t }\n\t });\n\t }\n\t }, {\n\t key: \"updateDisplay\",\n\t value: function value(e) {\n\t var t = !!(1 < arguments.length && void 0 !== arguments[1]) && arguments[1],\n\t n = this.config,\n\t r = n.count,\n\t o = n.wrapper,\n\t i = t ? e + 1 : e,\n\t s = r.position.toLowerCase();\n\n\t if (0 < i || r.displayZero) {\n\t var a = function a(e) {\n\t return Math.round(i / e * 10) / 10;\n\t },\n\t c = formatNumber(i);\n\n\t r.format && (1e6 < i ? c = \"\".concat(a(1e6), \"M\") : 1e3 < i && (c = \"\".concat(a(1e3), \"K\"))), is.element(this.elements.count) ? this.elements.count.textContent = c : (wrap$2(this.elements.trigger, createElement(\"span\", {\n\t class: o.className\n\t })), this.elements.count = createElement(\"span\", {\n\t class: \"\".concat(r.className, \" \").concat(r.className, \"--\").concat(s)\n\t }, c), this.elements.trigger.insertAdjacentElement(\"after\" === s ? \"afterend\" : \"beforebegin\", this.elements.count));\n\t }\n\t }\n\t }, {\n\t key: \"href\",\n\t get: function get() {\n\t return is.element(this.elements.trigger) ? this.elements.trigger.href : null;\n\t }\n\t }, {\n\t key: \"network\",\n\t get: function get() {\n\t var e = this;\n\t if (!is.element(this.elements.trigger)) return null;\n\t var t = this.config.networks;\n\t return Object.keys(t).find(function (n) {\n\t return getDomain(e.href) === t[n].domain;\n\t });\n\t }\n\t }, {\n\t key: \"networkConfig\",\n\t get: function get() {\n\t return is.empty(this.network) ? null : this.config.networks[this.network];\n\t }\n\t }, {\n\t key: \"target\",\n\t get: function get() {\n\t if (is.empty(this.network)) return null;\n\t var e = new URL(this.href);\n\n\t switch (this.network) {\n\t case \"facebook\":\n\t return e.searchParams.get(\"u\");\n\n\t case \"github\":\n\t return e.pathname.substring(1);\n\n\t case \"youtube\":\n\t return e.pathname.split(\"/\").pop();\n\n\t default:\n\t return e.searchParams.get(\"url\");\n\t }\n\t }\n\t }, {\n\t key: \"apiUrl\",\n\t get: function get() {\n\t if (is.empty(this.network)) return null;\n\t var e = this.config.tokens;\n\n\t switch (this.network) {\n\t case \"github\":\n\t return this.networkConfig.url(this.target, e.github);\n\n\t case \"youtube\":\n\t return this.networkConfig.url(this.target, e.youtube);\n\n\t default:\n\t return this.networkConfig.url(encodeURIComponent(this.target));\n\t }\n\t }\n\t }], [{\n\t key: \"setup\",\n\t value: function value(t) {\n\t var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n\t r = null;\n\t if (is.string(t) ? r = Array.from(document.querySelectorAll(t)) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\t var o = Object.assign({}, defaults, n);\n\t is.string(t) && o.watch && new MutationObserver(function (n) {\n\t Array.from(n).forEach(function (n) {\n\t Array.from(n.addedNodes).forEach(function (n) {\n\t is.element(n) && matches(n, t) && new e(n, o);\n\t });\n\t });\n\t }).observe(document.body, {\n\t childList: !0,\n\t subtree: !0\n\t });\n\t return r.map(function (t) {\n\t return new e(t, n);\n\t });\n\t }\n\t }]), e;\n\t}();\n\n\tvar check$1 = function (it) {\n\t return it && it.Math == Math && it;\n\t};\n\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar global_1$1 =\n\t // eslint-disable-next-line no-undef\n\t check$1(typeof globalThis == 'object' && globalThis) ||\n\t check$1(typeof window == 'object' && window) ||\n\t check$1(typeof self == 'object' && self) ||\n\t check$1(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\n\t // eslint-disable-next-line no-new-func\n\t (function () { return this; })() || Function('return this')();\n\n\tvar fails$1 = function (exec) {\n\t try {\n\t return !!exec();\n\t } catch (error) {\n\t return true;\n\t }\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar descriptors$1 = !fails$1(function () {\n\t return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n\t});\n\n\tvar nativePropertyIsEnumerable$2 = {}.propertyIsEnumerable;\n\tvar getOwnPropertyDescriptor$4 = Object.getOwnPropertyDescriptor;\n\n\t// Nashorn ~ JDK8 bug\n\tvar NASHORN_BUG$1 = getOwnPropertyDescriptor$4 && !nativePropertyIsEnumerable$2.call({ 1: 2 }, 1);\n\n\t// `Object.prototype.propertyIsEnumerable` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n\tvar f$8 = NASHORN_BUG$1 ? function propertyIsEnumerable(V) {\n\t var descriptor = getOwnPropertyDescriptor$4(this, V);\n\t return !!descriptor && descriptor.enumerable;\n\t} : nativePropertyIsEnumerable$2;\n\n\tvar objectPropertyIsEnumerable$1 = {\n\t\tf: f$8\n\t};\n\n\tvar createPropertyDescriptor$1 = function (bitmap, value) {\n\t return {\n\t enumerable: !(bitmap & 1),\n\t configurable: !(bitmap & 2),\n\t writable: !(bitmap & 4),\n\t value: value\n\t };\n\t};\n\n\tvar toString$2 = {}.toString;\n\n\tvar classofRaw$1 = function (it) {\n\t return toString$2.call(it).slice(8, -1);\n\t};\n\n\tvar split$1 = ''.split;\n\n\t// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\tvar indexedObject$1 = fails$1(function () {\n\t // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n\t // eslint-disable-next-line no-prototype-builtins\n\t return !Object('z').propertyIsEnumerable(0);\n\t}) ? function (it) {\n\t return classofRaw$1(it) == 'String' ? split$1.call(it, '') : Object(it);\n\t} : Object;\n\n\t// `RequireObjectCoercible` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n\tvar requireObjectCoercible$1 = function (it) {\n\t if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n\t return it;\n\t};\n\n\t// toObject with fallback for non-array-like ES3 strings\n\n\n\n\tvar toIndexedObject$1 = function (it) {\n\t return indexedObject$1(requireObjectCoercible$1(it));\n\t};\n\n\tvar isObject$2 = function (it) {\n\t return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n\t// `ToPrimitive` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toprimitive\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tvar toPrimitive$1 = function (input, PREFERRED_STRING) {\n\t if (!isObject$2(input)) return input;\n\t var fn, val;\n\t if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject$2(val = fn.call(input))) return val;\n\t if (typeof (fn = input.valueOf) == 'function' && !isObject$2(val = fn.call(input))) return val;\n\t if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject$2(val = fn.call(input))) return val;\n\t throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n\tvar hasOwnProperty$1 = {}.hasOwnProperty;\n\n\tvar has$2 = function (it, key) {\n\t return hasOwnProperty$1.call(it, key);\n\t};\n\n\tvar document$3 = global_1$1.document;\n\t// typeof document.createElement is 'object' in old IE\n\tvar EXISTS$1 = isObject$2(document$3) && isObject$2(document$3.createElement);\n\n\tvar documentCreateElement$1 = function (it) {\n\t return EXISTS$1 ? document$3.createElement(it) : {};\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar ie8DomDefine$1 = !descriptors$1 && !fails$1(function () {\n\t return Object.defineProperty(documentCreateElement$1('div'), 'a', {\n\t get: function () { return 7; }\n\t }).a != 7;\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor$3 = Object.getOwnPropertyDescriptor;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\tvar f$9 = descriptors$1 ? nativeGetOwnPropertyDescriptor$3 : function getOwnPropertyDescriptor(O, P) {\n\t O = toIndexedObject$1(O);\n\t P = toPrimitive$1(P, true);\n\t if (ie8DomDefine$1) try {\n\t return nativeGetOwnPropertyDescriptor$3(O, P);\n\t } catch (error) { /* empty */ }\n\t if (has$2(O, P)) return createPropertyDescriptor$1(!objectPropertyIsEnumerable$1.f.call(O, P), O[P]);\n\t};\n\n\tvar objectGetOwnPropertyDescriptor$1 = {\n\t\tf: f$9\n\t};\n\n\tvar anObject$1 = function (it) {\n\t if (!isObject$2(it)) {\n\t throw TypeError(String(it) + ' is not an object');\n\t } return it;\n\t};\n\n\tvar nativeDefineProperty$2 = Object.defineProperty;\n\n\t// `Object.defineProperty` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperty\n\tvar f$a = descriptors$1 ? nativeDefineProperty$2 : function defineProperty(O, P, Attributes) {\n\t anObject$1(O);\n\t P = toPrimitive$1(P, true);\n\t anObject$1(Attributes);\n\t if (ie8DomDefine$1) try {\n\t return nativeDefineProperty$2(O, P, Attributes);\n\t } catch (error) { /* empty */ }\n\t if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n\t if ('value' in Attributes) O[P] = Attributes.value;\n\t return O;\n\t};\n\n\tvar objectDefineProperty$1 = {\n\t\tf: f$a\n\t};\n\n\tvar createNonEnumerableProperty$1 = descriptors$1 ? function (object, key, value) {\n\t return objectDefineProperty$1.f(object, key, createPropertyDescriptor$1(1, value));\n\t} : function (object, key, value) {\n\t object[key] = value;\n\t return object;\n\t};\n\n\tvar setGlobal$1 = function (key, value) {\n\t try {\n\t createNonEnumerableProperty$1(global_1$1, key, value);\n\t } catch (error) {\n\t global_1$1[key] = value;\n\t } return value;\n\t};\n\n\tvar SHARED$1 = '__core-js_shared__';\n\tvar store$2 = global_1$1[SHARED$1] || setGlobal$1(SHARED$1, {});\n\n\tvar sharedStore$1 = store$2;\n\n\tvar functionToString$1 = Function.toString;\n\n\t// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\n\tif (typeof sharedStore$1.inspectSource != 'function') {\n\t sharedStore$1.inspectSource = function (it) {\n\t return functionToString$1.call(it);\n\t };\n\t}\n\n\tvar inspectSource$1 = sharedStore$1.inspectSource;\n\n\tvar WeakMap$3 = global_1$1.WeakMap;\n\n\tvar nativeWeakMap$1 = typeof WeakMap$3 === 'function' && /native code/.test(inspectSource$1(WeakMap$3));\n\n\tvar isPure$1 = false;\n\n\tvar shared$1 = createCommonjsModule(function (module) {\n\t(module.exports = function (key, value) {\n\t return sharedStore$1[key] || (sharedStore$1[key] = value !== undefined ? value : {});\n\t})('versions', []).push({\n\t version: '3.7.0',\n\t mode: 'global',\n\t copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n\t});\n\t});\n\n\tvar id$2 = 0;\n\tvar postfix$1 = Math.random();\n\n\tvar uid$1 = function (key) {\n\t return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id$2 + postfix$1).toString(36);\n\t};\n\n\tvar keys$4 = shared$1('keys');\n\n\tvar sharedKey$1 = function (key) {\n\t return keys$4[key] || (keys$4[key] = uid$1(key));\n\t};\n\n\tvar hiddenKeys$2 = {};\n\n\tvar WeakMap$4 = global_1$1.WeakMap;\n\tvar set$3, get$2, has$3;\n\n\tvar enforce$1 = function (it) {\n\t return has$3(it) ? get$2(it) : set$3(it, {});\n\t};\n\n\tvar getterFor$1 = function (TYPE) {\n\t return function (it) {\n\t var state;\n\t if (!isObject$2(it) || (state = get$2(it)).type !== TYPE) {\n\t throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n\t } return state;\n\t };\n\t};\n\n\tif (nativeWeakMap$1) {\n\t var store$3 = sharedStore$1.state || (sharedStore$1.state = new WeakMap$4());\n\t var wmget$1 = store$3.get;\n\t var wmhas$1 = store$3.has;\n\t var wmset$1 = store$3.set;\n\t set$3 = function (it, metadata) {\n\t metadata.facade = it;\n\t wmset$1.call(store$3, it, metadata);\n\t return metadata;\n\t };\n\t get$2 = function (it) {\n\t return wmget$1.call(store$3, it) || {};\n\t };\n\t has$3 = function (it) {\n\t return wmhas$1.call(store$3, it);\n\t };\n\t} else {\n\t var STATE$1 = sharedKey$1('state');\n\t hiddenKeys$2[STATE$1] = true;\n\t set$3 = function (it, metadata) {\n\t metadata.facade = it;\n\t createNonEnumerableProperty$1(it, STATE$1, metadata);\n\t return metadata;\n\t };\n\t get$2 = function (it) {\n\t return has$2(it, STATE$1) ? it[STATE$1] : {};\n\t };\n\t has$3 = function (it) {\n\t return has$2(it, STATE$1);\n\t };\n\t}\n\n\tvar internalState$1 = {\n\t set: set$3,\n\t get: get$2,\n\t has: has$3,\n\t enforce: enforce$1,\n\t getterFor: getterFor$1\n\t};\n\n\tvar redefine$1 = createCommonjsModule(function (module) {\n\tvar getInternalState = internalState$1.get;\n\tvar enforceInternalState = internalState$1.enforce;\n\tvar TEMPLATE = String(String).split('String');\n\n\t(module.exports = function (O, key, value, options) {\n\t var unsafe = options ? !!options.unsafe : false;\n\t var simple = options ? !!options.enumerable : false;\n\t var noTargetGet = options ? !!options.noTargetGet : false;\n\t var state;\n\t if (typeof value == 'function') {\n\t if (typeof key == 'string' && !has$2(value, 'name')) {\n\t createNonEnumerableProperty$1(value, 'name', key);\n\t }\n\t state = enforceInternalState(value);\n\t if (!state.source) {\n\t state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n\t }\n\t }\n\t if (O === global_1$1) {\n\t if (simple) O[key] = value;\n\t else setGlobal$1(key, value);\n\t return;\n\t } else if (!unsafe) {\n\t delete O[key];\n\t } else if (!noTargetGet && O[key]) {\n\t simple = true;\n\t }\n\t if (simple) O[key] = value;\n\t else createNonEnumerableProperty$1(O, key, value);\n\t// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\t})(Function.prototype, 'toString', function toString() {\n\t return typeof this == 'function' && getInternalState(this).source || inspectSource$1(this);\n\t});\n\t});\n\n\tvar path$1 = global_1$1;\n\n\tvar aFunction$2 = function (variable) {\n\t return typeof variable == 'function' ? variable : undefined;\n\t};\n\n\tvar getBuiltIn$1 = function (namespace, method) {\n\t return arguments.length < 2 ? aFunction$2(path$1[namespace]) || aFunction$2(global_1$1[namespace])\n\t : path$1[namespace] && path$1[namespace][method] || global_1$1[namespace] && global_1$1[namespace][method];\n\t};\n\n\tvar ceil$1 = Math.ceil;\n\tvar floor$6 = Math.floor;\n\n\t// `ToInteger` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tointeger\n\tvar toInteger$1 = function (argument) {\n\t return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor$6 : ceil$1)(argument);\n\t};\n\n\tvar min$7 = Math.min;\n\n\t// `ToLength` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tolength\n\tvar toLength$1 = function (argument) {\n\t return argument > 0 ? min$7(toInteger$1(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n\t};\n\n\tvar max$4 = Math.max;\n\tvar min$8 = Math.min;\n\n\t// Helper for a popular repeating case of the spec:\n\t// Let integer be ? ToInteger(index).\n\t// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\n\tvar toAbsoluteIndex$1 = function (index, length) {\n\t var integer = toInteger$1(index);\n\t return integer < 0 ? max$4(integer + length, 0) : min$8(integer, length);\n\t};\n\n\t// `Array.prototype.{ indexOf, includes }` methods implementation\n\tvar createMethod$6 = function (IS_INCLUDES) {\n\t return function ($this, el, fromIndex) {\n\t var O = toIndexedObject$1($this);\n\t var length = toLength$1(O.length);\n\t var index = toAbsoluteIndex$1(fromIndex, length);\n\t var value;\n\t // Array#includes uses SameValueZero equality algorithm\n\t // eslint-disable-next-line no-self-compare\n\t if (IS_INCLUDES && el != el) while (length > index) {\n\t value = O[index++];\n\t // eslint-disable-next-line no-self-compare\n\t if (value != value) return true;\n\t // Array#indexOf ignores holes, Array#includes - not\n\t } else for (;length > index; index++) {\n\t if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n\t } return !IS_INCLUDES && -1;\n\t };\n\t};\n\n\tvar arrayIncludes$1 = {\n\t // `Array.prototype.includes` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t includes: createMethod$6(true),\n\t // `Array.prototype.indexOf` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t indexOf: createMethod$6(false)\n\t};\n\n\tvar indexOf$1 = arrayIncludes$1.indexOf;\n\n\n\tvar objectKeysInternal$1 = function (object, names) {\n\t var O = toIndexedObject$1(object);\n\t var i = 0;\n\t var result = [];\n\t var key;\n\t for (key in O) !has$2(hiddenKeys$2, key) && has$2(O, key) && result.push(key);\n\t // Don't enum bug & hidden keys\n\t while (names.length > i) if (has$2(O, key = names[i++])) {\n\t ~indexOf$1(result, key) || result.push(key);\n\t }\n\t return result;\n\t};\n\n\t// IE8- don't enum bug keys\n\tvar enumBugKeys$1 = [\n\t 'constructor',\n\t 'hasOwnProperty',\n\t 'isPrototypeOf',\n\t 'propertyIsEnumerable',\n\t 'toLocaleString',\n\t 'toString',\n\t 'valueOf'\n\t];\n\n\tvar hiddenKeys$3 = enumBugKeys$1.concat('length', 'prototype');\n\n\t// `Object.getOwnPropertyNames` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\tvar f$b = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n\t return objectKeysInternal$1(O, hiddenKeys$3);\n\t};\n\n\tvar objectGetOwnPropertyNames$1 = {\n\t\tf: f$b\n\t};\n\n\tvar f$c = Object.getOwnPropertySymbols;\n\n\tvar objectGetOwnPropertySymbols$1 = {\n\t\tf: f$c\n\t};\n\n\t// all object keys, includes non-enumerable and symbols\n\tvar ownKeys$2 = getBuiltIn$1('Reflect', 'ownKeys') || function ownKeys(it) {\n\t var keys = objectGetOwnPropertyNames$1.f(anObject$1(it));\n\t var getOwnPropertySymbols = objectGetOwnPropertySymbols$1.f;\n\t return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n\t};\n\n\tvar copyConstructorProperties$1 = function (target, source) {\n\t var keys = ownKeys$2(source);\n\t var defineProperty = objectDefineProperty$1.f;\n\t var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor$1.f;\n\t for (var i = 0; i < keys.length; i++) {\n\t var key = keys[i];\n\t if (!has$2(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n\t }\n\t};\n\n\tvar replacement$1 = /#|\\.prototype\\./;\n\n\tvar isForced$1 = function (feature, detection) {\n\t var value = data$1[normalize$2(feature)];\n\t return value == POLYFILL$1 ? true\n\t : value == NATIVE$1 ? false\n\t : typeof detection == 'function' ? fails$1(detection)\n\t : !!detection;\n\t};\n\n\tvar normalize$2 = isForced$1.normalize = function (string) {\n\t return String(string).replace(replacement$1, '.').toLowerCase();\n\t};\n\n\tvar data$1 = isForced$1.data = {};\n\tvar NATIVE$1 = isForced$1.NATIVE = 'N';\n\tvar POLYFILL$1 = isForced$1.POLYFILL = 'P';\n\n\tvar isForced_1$1 = isForced$1;\n\n\tvar getOwnPropertyDescriptor$5 = objectGetOwnPropertyDescriptor$1.f;\n\n\n\n\n\n\n\t/*\n\t options.target - name of the target object\n\t options.global - target is the global object\n\t options.stat - export as static methods of target\n\t options.proto - export as prototype methods of target\n\t options.real - real prototype method for the `pure` version\n\t options.forced - export even if the native feature is available\n\t options.bind - bind methods to the target, required for the `pure` version\n\t options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n\t options.unsafe - use the simple assignment of property instead of delete + defineProperty\n\t options.sham - add a flag to not completely full polyfills\n\t options.enumerable - export as enumerable property\n\t options.noTargetGet - prevent calling a getter on target\n\t*/\n\tvar _export$1 = function (options, source) {\n\t var TARGET = options.target;\n\t var GLOBAL = options.global;\n\t var STATIC = options.stat;\n\t var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n\t if (GLOBAL) {\n\t target = global_1$1;\n\t } else if (STATIC) {\n\t target = global_1$1[TARGET] || setGlobal$1(TARGET, {});\n\t } else {\n\t target = (global_1$1[TARGET] || {}).prototype;\n\t }\n\t if (target) for (key in source) {\n\t sourceProperty = source[key];\n\t if (options.noTargetGet) {\n\t descriptor = getOwnPropertyDescriptor$5(target, key);\n\t targetProperty = descriptor && descriptor.value;\n\t } else targetProperty = target[key];\n\t FORCED = isForced_1$1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n\t // contained in target\n\t if (!FORCED && targetProperty !== undefined) {\n\t if (typeof sourceProperty === typeof targetProperty) continue;\n\t copyConstructorProperties$1(sourceProperty, targetProperty);\n\t }\n\t // add a flag to not completely full polyfills\n\t if (options.sham || (targetProperty && targetProperty.sham)) {\n\t createNonEnumerableProperty$1(sourceProperty, 'sham', true);\n\t }\n\t // extend global\n\t redefine$1(target, key, sourceProperty, options);\n\t }\n\t};\n\n\t// `IsArray` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isarray\n\tvar isArray$2 = Array.isArray || function isArray(arg) {\n\t return classofRaw$1(arg) == 'Array';\n\t};\n\n\t// `ToObject` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toobject\n\tvar toObject$1 = function (argument) {\n\t return Object(requireObjectCoercible$1(argument));\n\t};\n\n\tvar createProperty$1 = function (object, key, value) {\n\t var propertyKey = toPrimitive$1(key);\n\t if (propertyKey in object) objectDefineProperty$1.f(object, propertyKey, createPropertyDescriptor$1(0, value));\n\t else object[propertyKey] = value;\n\t};\n\n\tvar nativeSymbol$1 = !!Object.getOwnPropertySymbols && !fails$1(function () {\n\t // Chrome 38 Symbol has incorrect toString conversion\n\t // eslint-disable-next-line no-undef\n\t return !String(Symbol());\n\t});\n\n\tvar useSymbolAsUid$1 = nativeSymbol$1\n\t // eslint-disable-next-line no-undef\n\t && !Symbol.sham\n\t // eslint-disable-next-line no-undef\n\t && typeof Symbol.iterator == 'symbol';\n\n\tvar WellKnownSymbolsStore$2 = shared$1('wks');\n\tvar Symbol$2 = global_1$1.Symbol;\n\tvar createWellKnownSymbol$1 = useSymbolAsUid$1 ? Symbol$2 : Symbol$2 && Symbol$2.withoutSetter || uid$1;\n\n\tvar wellKnownSymbol$1 = function (name) {\n\t if (!has$2(WellKnownSymbolsStore$2, name)) {\n\t if (nativeSymbol$1 && has$2(Symbol$2, name)) WellKnownSymbolsStore$2[name] = Symbol$2[name];\n\t else WellKnownSymbolsStore$2[name] = createWellKnownSymbol$1('Symbol.' + name);\n\t } return WellKnownSymbolsStore$2[name];\n\t};\n\n\tvar SPECIES$7 = wellKnownSymbol$1('species');\n\n\t// `ArraySpeciesCreate` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n\tvar arraySpeciesCreate$1 = function (originalArray, length) {\n\t var C;\n\t if (isArray$2(originalArray)) {\n\t C = originalArray.constructor;\n\t // cross-realm fallback\n\t if (typeof C == 'function' && (C === Array || isArray$2(C.prototype))) C = undefined;\n\t else if (isObject$2(C)) {\n\t C = C[SPECIES$7];\n\t if (C === null) C = undefined;\n\t }\n\t } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n\t};\n\n\tvar engineUserAgent$1 = getBuiltIn$1('navigator', 'userAgent') || '';\n\n\tvar process$5 = global_1$1.process;\n\tvar versions$1 = process$5 && process$5.versions;\n\tvar v8$1 = versions$1 && versions$1.v8;\n\tvar match$1, version$1;\n\n\tif (v8$1) {\n\t match$1 = v8$1.split('.');\n\t version$1 = match$1[0] + match$1[1];\n\t} else if (engineUserAgent$1) {\n\t match$1 = engineUserAgent$1.match(/Edge\\/(\\d+)/);\n\t if (!match$1 || match$1[1] >= 74) {\n\t match$1 = engineUserAgent$1.match(/Chrome\\/(\\d+)/);\n\t if (match$1) version$1 = match$1[1];\n\t }\n\t}\n\n\tvar engineV8Version$1 = version$1 && +version$1;\n\n\tvar SPECIES$8 = wellKnownSymbol$1('species');\n\n\tvar arrayMethodHasSpeciesSupport$1 = function (METHOD_NAME) {\n\t // We can't use this feature detection in V8 since it causes\n\t // deoptimization and serious performance degradation\n\t // https://github.com/zloirock/core-js/issues/677\n\t return engineV8Version$1 >= 51 || !fails$1(function () {\n\t var array = [];\n\t var constructor = array.constructor = {};\n\t constructor[SPECIES$8] = function () {\n\t return { foo: 1 };\n\t };\n\t return array[METHOD_NAME](Boolean).foo !== 1;\n\t });\n\t};\n\n\tvar IS_CONCAT_SPREADABLE$1 = wellKnownSymbol$1('isConcatSpreadable');\n\tvar MAX_SAFE_INTEGER$2 = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_INDEX_EXCEEDED$1 = 'Maximum allowed index exceeded';\n\n\t// We can't use this feature detection in V8 since it causes\n\t// deoptimization and serious performance degradation\n\t// https://github.com/zloirock/core-js/issues/679\n\tvar IS_CONCAT_SPREADABLE_SUPPORT$1 = engineV8Version$1 >= 51 || !fails$1(function () {\n\t var array = [];\n\t array[IS_CONCAT_SPREADABLE$1] = false;\n\t return array.concat()[0] !== array;\n\t});\n\n\tvar SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport$1('concat');\n\n\tvar isConcatSpreadable$1 = function (O) {\n\t if (!isObject$2(O)) return false;\n\t var spreadable = O[IS_CONCAT_SPREADABLE$1];\n\t return spreadable !== undefined ? !!spreadable : isArray$2(O);\n\t};\n\n\tvar FORCED$8 = !IS_CONCAT_SPREADABLE_SUPPORT$1 || !SPECIES_SUPPORT$1;\n\n\t// `Array.prototype.concat` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n\t// with adding support of @@isConcatSpreadable and @@species\n\t_export$1({ target: 'Array', proto: true, forced: FORCED$8 }, {\n\t concat: function concat(arg) { // eslint-disable-line no-unused-vars\n\t var O = toObject$1(this);\n\t var A = arraySpeciesCreate$1(O, 0);\n\t var n = 0;\n\t var i, k, length, len, E;\n\t for (i = -1, length = arguments.length; i < length; i++) {\n\t E = i === -1 ? O : arguments[i];\n\t if (isConcatSpreadable$1(E)) {\n\t len = toLength$1(E.length);\n\t if (n + len > MAX_SAFE_INTEGER$2) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED$1);\n\t for (k = 0; k < len; k++, n++) if (k in E) createProperty$1(A, n, E[k]);\n\t } else {\n\t if (n >= MAX_SAFE_INTEGER$2) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED$1);\n\t createProperty$1(A, n++, E);\n\t }\n\t }\n\t A.length = n;\n\t return A;\n\t }\n\t});\n\n\tvar aFunction$3 = function (it) {\n\t if (typeof it != 'function') {\n\t throw TypeError(String(it) + ' is not a function');\n\t } return it;\n\t};\n\n\t// optional / simple context binding\n\tvar functionBindContext$1 = function (fn, that, length) {\n\t aFunction$3(fn);\n\t if (that === undefined) return fn;\n\t switch (length) {\n\t case 0: return function () {\n\t return fn.call(that);\n\t };\n\t case 1: return function (a) {\n\t return fn.call(that, a);\n\t };\n\t case 2: return function (a, b) {\n\t return fn.call(that, a, b);\n\t };\n\t case 3: return function (a, b, c) {\n\t return fn.call(that, a, b, c);\n\t };\n\t }\n\t return function (/* ...args */) {\n\t return fn.apply(that, arguments);\n\t };\n\t};\n\n\tvar push$1 = [].push;\n\n\t// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n\tvar createMethod$7 = function (TYPE) {\n\t var IS_MAP = TYPE == 1;\n\t var IS_FILTER = TYPE == 2;\n\t var IS_SOME = TYPE == 3;\n\t var IS_EVERY = TYPE == 4;\n\t var IS_FIND_INDEX = TYPE == 6;\n\t var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n\t return function ($this, callbackfn, that, specificCreate) {\n\t var O = toObject$1($this);\n\t var self = indexedObject$1(O);\n\t var boundFunction = functionBindContext$1(callbackfn, that, 3);\n\t var length = toLength$1(self.length);\n\t var index = 0;\n\t var create = specificCreate || arraySpeciesCreate$1;\n\t var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n\t var value, result;\n\t for (;length > index; index++) if (NO_HOLES || index in self) {\n\t value = self[index];\n\t result = boundFunction(value, index, O);\n\t if (TYPE) {\n\t if (IS_MAP) target[index] = result; // map\n\t else if (result) switch (TYPE) {\n\t case 3: return true; // some\n\t case 5: return value; // find\n\t case 6: return index; // findIndex\n\t case 2: push$1.call(target, value); // filter\n\t } else if (IS_EVERY) return false; // every\n\t }\n\t }\n\t return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n\t };\n\t};\n\n\tvar arrayIteration$1 = {\n\t // `Array.prototype.forEach` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t forEach: createMethod$7(0),\n\t // `Array.prototype.map` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t map: createMethod$7(1),\n\t // `Array.prototype.filter` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t filter: createMethod$7(2),\n\t // `Array.prototype.some` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t some: createMethod$7(3),\n\t // `Array.prototype.every` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.every\n\t every: createMethod$7(4),\n\t // `Array.prototype.find` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t find: createMethod$7(5),\n\t // `Array.prototype.findIndex` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n\t findIndex: createMethod$7(6)\n\t};\n\n\tvar defineProperty$a = Object.defineProperty;\n\tvar cache$1 = {};\n\n\tvar thrower$1 = function (it) { throw it; };\n\n\tvar arrayMethodUsesToLength$1 = function (METHOD_NAME, options) {\n\t if (has$2(cache$1, METHOD_NAME)) return cache$1[METHOD_NAME];\n\t if (!options) options = {};\n\t var method = [][METHOD_NAME];\n\t var ACCESSORS = has$2(options, 'ACCESSORS') ? options.ACCESSORS : false;\n\t var argument0 = has$2(options, 0) ? options[0] : thrower$1;\n\t var argument1 = has$2(options, 1) ? options[1] : undefined;\n\n\t return cache$1[METHOD_NAME] = !!method && !fails$1(function () {\n\t if (ACCESSORS && !descriptors$1) return true;\n\t var O = { length: -1 };\n\n\t if (ACCESSORS) defineProperty$a(O, 1, { enumerable: true, get: thrower$1 });\n\t else O[1] = 1;\n\n\t method.call(O, argument0, argument1);\n\t });\n\t};\n\n\tvar $filter$2 = arrayIteration$1.filter;\n\n\n\n\tvar HAS_SPECIES_SUPPORT$4 = arrayMethodHasSpeciesSupport$1('filter');\n\t// Edge 14- issue\n\tvar USES_TO_LENGTH$a = arrayMethodUsesToLength$1('filter');\n\n\t// `Array.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t// with adding support of @@species\n\t_export$1({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$4 || !USES_TO_LENGTH$a }, {\n\t filter: function filter(callbackfn /* , thisArg */) {\n\t return $filter$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\tvar objectKeys$1 = Object.keys || function keys(O) {\n\t return objectKeysInternal$1(O, enumBugKeys$1);\n\t};\n\n\t// `Object.defineProperties` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperties\n\tvar objectDefineProperties$1 = descriptors$1 ? Object.defineProperties : function defineProperties(O, Properties) {\n\t anObject$1(O);\n\t var keys = objectKeys$1(Properties);\n\t var length = keys.length;\n\t var index = 0;\n\t var key;\n\t while (length > index) objectDefineProperty$1.f(O, key = keys[index++], Properties[key]);\n\t return O;\n\t};\n\n\tvar html$1 = getBuiltIn$1('document', 'documentElement');\n\n\tvar GT$1 = '>';\n\tvar LT$1 = '<';\n\tvar PROTOTYPE$3 = 'prototype';\n\tvar SCRIPT$1 = 'script';\n\tvar IE_PROTO$2 = sharedKey$1('IE_PROTO');\n\n\tvar EmptyConstructor$1 = function () { /* empty */ };\n\n\tvar scriptTag$1 = function (content) {\n\t return LT$1 + SCRIPT$1 + GT$1 + content + LT$1 + '/' + SCRIPT$1 + GT$1;\n\t};\n\n\t// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\n\tvar NullProtoObjectViaActiveX$1 = function (activeXDocument) {\n\t activeXDocument.write(scriptTag$1(''));\n\t activeXDocument.close();\n\t var temp = activeXDocument.parentWindow.Object;\n\t activeXDocument = null; // avoid memory leak\n\t return temp;\n\t};\n\n\t// Create object with fake `null` prototype: use iframe Object with cleared prototype\n\tvar NullProtoObjectViaIFrame$1 = function () {\n\t // Thrash, waste and sodomy: IE GC bug\n\t var iframe = documentCreateElement$1('iframe');\n\t var JS = 'java' + SCRIPT$1 + ':';\n\t var iframeDocument;\n\t iframe.style.display = 'none';\n\t html$1.appendChild(iframe);\n\t // https://github.com/zloirock/core-js/issues/475\n\t iframe.src = String(JS);\n\t iframeDocument = iframe.contentWindow.document;\n\t iframeDocument.open();\n\t iframeDocument.write(scriptTag$1('document.F=Object'));\n\t iframeDocument.close();\n\t return iframeDocument.F;\n\t};\n\n\t// Check for document.domain and active x support\n\t// No need to use active x approach when document.domain is not set\n\t// see https://github.com/es-shims/es5-shim/issues/150\n\t// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n\t// avoid IE GC bug\n\tvar activeXDocument$1;\n\tvar NullProtoObject$1 = function () {\n\t try {\n\t /* global ActiveXObject */\n\t activeXDocument$1 = document.domain && new ActiveXObject('htmlfile');\n\t } catch (error) { /* ignore */ }\n\t NullProtoObject$1 = activeXDocument$1 ? NullProtoObjectViaActiveX$1(activeXDocument$1) : NullProtoObjectViaIFrame$1();\n\t var length = enumBugKeys$1.length;\n\t while (length--) delete NullProtoObject$1[PROTOTYPE$3][enumBugKeys$1[length]];\n\t return NullProtoObject$1();\n\t};\n\n\thiddenKeys$2[IE_PROTO$2] = true;\n\n\t// `Object.create` method\n\t// https://tc39.github.io/ecma262/#sec-object.create\n\tvar objectCreate$1 = Object.create || function create(O, Properties) {\n\t var result;\n\t if (O !== null) {\n\t EmptyConstructor$1[PROTOTYPE$3] = anObject$1(O);\n\t result = new EmptyConstructor$1();\n\t EmptyConstructor$1[PROTOTYPE$3] = null;\n\t // add \"__proto__\" for Object.getPrototypeOf polyfill\n\t result[IE_PROTO$2] = O;\n\t } else result = NullProtoObject$1();\n\t return Properties === undefined ? result : objectDefineProperties$1(result, Properties);\n\t};\n\n\tvar UNSCOPABLES$1 = wellKnownSymbol$1('unscopables');\n\tvar ArrayPrototype$2 = Array.prototype;\n\n\t// Array.prototype[@@unscopables]\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\tif (ArrayPrototype$2[UNSCOPABLES$1] == undefined) {\n\t objectDefineProperty$1.f(ArrayPrototype$2, UNSCOPABLES$1, {\n\t configurable: true,\n\t value: objectCreate$1(null)\n\t });\n\t}\n\n\t// add a key to Array.prototype[@@unscopables]\n\tvar addToUnscopables$1 = function (key) {\n\t ArrayPrototype$2[UNSCOPABLES$1][key] = true;\n\t};\n\n\tvar $find$2 = arrayIteration$1.find;\n\n\n\n\tvar FIND$1 = 'find';\n\tvar SKIPS_HOLES$1 = true;\n\n\tvar USES_TO_LENGTH$b = arrayMethodUsesToLength$1(FIND$1);\n\n\t// Shouldn't skip holes\n\tif (FIND$1 in []) Array(1)[FIND$1](function () { SKIPS_HOLES$1 = false; });\n\n\t// `Array.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t_export$1({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 || !USES_TO_LENGTH$b }, {\n\t find: function find(callbackfn /* , that = undefined */) {\n\t return $find$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables$1(FIND$1);\n\n\tvar iteratorClose = function (iterator) {\n\t var returnMethod = iterator['return'];\n\t if (returnMethod !== undefined) {\n\t return anObject$1(returnMethod.call(iterator)).value;\n\t }\n\t};\n\n\t// call something on iterator step with safe closing on error\n\tvar callWithSafeIterationClosing$1 = function (iterator, fn, value, ENTRIES) {\n\t try {\n\t return ENTRIES ? fn(anObject$1(value)[0], value[1]) : fn(value);\n\t // 7.4.6 IteratorClose(iterator, completion)\n\t } catch (error) {\n\t iteratorClose(iterator);\n\t throw error;\n\t }\n\t};\n\n\tvar iterators$1 = {};\n\n\tvar ITERATOR$9 = wellKnownSymbol$1('iterator');\n\tvar ArrayPrototype$3 = Array.prototype;\n\n\t// check on default Array iterator\n\tvar isArrayIteratorMethod$1 = function (it) {\n\t return it !== undefined && (iterators$1.Array === it || ArrayPrototype$3[ITERATOR$9] === it);\n\t};\n\n\tvar TO_STRING_TAG$5 = wellKnownSymbol$1('toStringTag');\n\tvar test$1 = {};\n\n\ttest$1[TO_STRING_TAG$5] = 'z';\n\n\tvar toStringTagSupport$1 = String(test$1) === '[object z]';\n\n\tvar TO_STRING_TAG$6 = wellKnownSymbol$1('toStringTag');\n\t// ES3 wrong here\n\tvar CORRECT_ARGUMENTS$1 = classofRaw$1(function () { return arguments; }()) == 'Arguments';\n\n\t// fallback for IE11 Script Access Denied error\n\tvar tryGet$1 = function (it, key) {\n\t try {\n\t return it[key];\n\t } catch (error) { /* empty */ }\n\t};\n\n\t// getting tag from ES6+ `Object.prototype.toString`\n\tvar classof$1 = toStringTagSupport$1 ? classofRaw$1 : function (it) {\n\t var O, tag, result;\n\t return it === undefined ? 'Undefined' : it === null ? 'Null'\n\t // @@toStringTag case\n\t : typeof (tag = tryGet$1(O = Object(it), TO_STRING_TAG$6)) == 'string' ? tag\n\t // builtinTag case\n\t : CORRECT_ARGUMENTS$1 ? classofRaw$1(O)\n\t // ES3 arguments fallback\n\t : (result = classofRaw$1(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n\t};\n\n\tvar ITERATOR$a = wellKnownSymbol$1('iterator');\n\n\tvar getIteratorMethod$1 = function (it) {\n\t if (it != undefined) return it[ITERATOR$a]\n\t || it['@@iterator']\n\t || iterators$1[classof$1(it)];\n\t};\n\n\t// `Array.from` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\tvar arrayFrom$1 = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n\t var O = toObject$1(arrayLike);\n\t var C = typeof this == 'function' ? this : Array;\n\t var argumentsLength = arguments.length;\n\t var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n\t var mapping = mapfn !== undefined;\n\t var iteratorMethod = getIteratorMethod$1(O);\n\t var index = 0;\n\t var length, result, step, iterator, next, value;\n\t if (mapping) mapfn = functionBindContext$1(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n\t // if the target is not iterable or it's an array with the default iterator - use a simple case\n\t if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod$1(iteratorMethod))) {\n\t iterator = iteratorMethod.call(O);\n\t next = iterator.next;\n\t result = new C();\n\t for (;!(step = next.call(iterator)).done; index++) {\n\t value = mapping ? callWithSafeIterationClosing$1(iterator, mapfn, [step.value, index], true) : step.value;\n\t createProperty$1(result, index, value);\n\t }\n\t } else {\n\t length = toLength$1(O.length);\n\t result = new C(length);\n\t for (;length > index; index++) {\n\t value = mapping ? mapfn(O[index], index) : O[index];\n\t createProperty$1(result, index, value);\n\t }\n\t }\n\t result.length = index;\n\t return result;\n\t};\n\n\tvar ITERATOR$b = wellKnownSymbol$1('iterator');\n\tvar SAFE_CLOSING$1 = false;\n\n\ttry {\n\t var called$1 = 0;\n\t var iteratorWithReturn$1 = {\n\t next: function () {\n\t return { done: !!called$1++ };\n\t },\n\t 'return': function () {\n\t SAFE_CLOSING$1 = true;\n\t }\n\t };\n\t iteratorWithReturn$1[ITERATOR$b] = function () {\n\t return this;\n\t };\n\t // eslint-disable-next-line no-throw-literal\n\t Array.from(iteratorWithReturn$1, function () { throw 2; });\n\t} catch (error) { /* empty */ }\n\n\tvar checkCorrectnessOfIteration$1 = function (exec, SKIP_CLOSING) {\n\t if (!SKIP_CLOSING && !SAFE_CLOSING$1) return false;\n\t var ITERATION_SUPPORT = false;\n\t try {\n\t var object = {};\n\t object[ITERATOR$b] = function () {\n\t return {\n\t next: function () {\n\t return { done: ITERATION_SUPPORT = true };\n\t }\n\t };\n\t };\n\t exec(object);\n\t } catch (error) { /* empty */ }\n\t return ITERATION_SUPPORT;\n\t};\n\n\tvar INCORRECT_ITERATION$2 = !checkCorrectnessOfIteration$1(function (iterable) {\n\t Array.from(iterable);\n\t});\n\n\t// `Array.from` method\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\t_export$1({ target: 'Array', stat: true, forced: INCORRECT_ITERATION$2 }, {\n\t from: arrayFrom$1\n\t});\n\n\tvar $includes$2 = arrayIncludes$1.includes;\n\n\n\n\tvar USES_TO_LENGTH$c = arrayMethodUsesToLength$1('indexOf', { ACCESSORS: true, 1: 0 });\n\n\t// `Array.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t_export$1({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$c }, {\n\t includes: function includes(el /* , fromIndex = 0 */) {\n\t return $includes$2(this, el, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables$1('includes');\n\n\tvar correctPrototypeGetter$1 = !fails$1(function () {\n\t function F() { /* empty */ }\n\t F.prototype.constructor = null;\n\t return Object.getPrototypeOf(new F()) !== F.prototype;\n\t});\n\n\tvar IE_PROTO$3 = sharedKey$1('IE_PROTO');\n\tvar ObjectPrototype$4 = Object.prototype;\n\n\t// `Object.getPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.getprototypeof\n\tvar objectGetPrototypeOf$1 = correctPrototypeGetter$1 ? Object.getPrototypeOf : function (O) {\n\t O = toObject$1(O);\n\t if (has$2(O, IE_PROTO$3)) return O[IE_PROTO$3];\n\t if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n\t return O.constructor.prototype;\n\t } return O instanceof Object ? ObjectPrototype$4 : null;\n\t};\n\n\tvar ITERATOR$c = wellKnownSymbol$1('iterator');\n\tvar BUGGY_SAFARI_ITERATORS$2 = false;\n\n\tvar returnThis$3 = function () { return this; };\n\n\t// `%IteratorPrototype%` object\n\t// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\n\tvar IteratorPrototype$3, PrototypeOfArrayIteratorPrototype$1, arrayIterator$1;\n\n\tif ([].keys) {\n\t arrayIterator$1 = [].keys();\n\t // Safari 8 has buggy iterators w/o `next`\n\t if (!('next' in arrayIterator$1)) BUGGY_SAFARI_ITERATORS$2 = true;\n\t else {\n\t PrototypeOfArrayIteratorPrototype$1 = objectGetPrototypeOf$1(objectGetPrototypeOf$1(arrayIterator$1));\n\t if (PrototypeOfArrayIteratorPrototype$1 !== Object.prototype) IteratorPrototype$3 = PrototypeOfArrayIteratorPrototype$1;\n\t }\n\t}\n\n\tif (IteratorPrototype$3 == undefined) IteratorPrototype$3 = {};\n\n\t// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\tif ( !has$2(IteratorPrototype$3, ITERATOR$c)) {\n\t createNonEnumerableProperty$1(IteratorPrototype$3, ITERATOR$c, returnThis$3);\n\t}\n\n\tvar iteratorsCore$1 = {\n\t IteratorPrototype: IteratorPrototype$3,\n\t BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS$2\n\t};\n\n\tvar defineProperty$b = objectDefineProperty$1.f;\n\n\n\n\tvar TO_STRING_TAG$7 = wellKnownSymbol$1('toStringTag');\n\n\tvar setToStringTag$1 = function (it, TAG, STATIC) {\n\t if (it && !has$2(it = STATIC ? it : it.prototype, TO_STRING_TAG$7)) {\n\t defineProperty$b(it, TO_STRING_TAG$7, { configurable: true, value: TAG });\n\t }\n\t};\n\n\tvar IteratorPrototype$4 = iteratorsCore$1.IteratorPrototype;\n\n\n\n\n\n\tvar returnThis$4 = function () { return this; };\n\n\tvar createIteratorConstructor$1 = function (IteratorConstructor, NAME, next) {\n\t var TO_STRING_TAG = NAME + ' Iterator';\n\t IteratorConstructor.prototype = objectCreate$1(IteratorPrototype$4, { next: createPropertyDescriptor$1(1, next) });\n\t setToStringTag$1(IteratorConstructor, TO_STRING_TAG, false);\n\t iterators$1[TO_STRING_TAG] = returnThis$4;\n\t return IteratorConstructor;\n\t};\n\n\tvar aPossiblePrototype$1 = function (it) {\n\t if (!isObject$2(it) && it !== null) {\n\t throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n\t } return it;\n\t};\n\n\t// `Object.setPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n\t// Works with __proto__ only. Old v8 can't work with null proto objects.\n\t/* eslint-disable no-proto */\n\tvar objectSetPrototypeOf$1 = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n\t var CORRECT_SETTER = false;\n\t var test = {};\n\t var setter;\n\t try {\n\t setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n\t setter.call(test, []);\n\t CORRECT_SETTER = test instanceof Array;\n\t } catch (error) { /* empty */ }\n\t return function setPrototypeOf(O, proto) {\n\t anObject$1(O);\n\t aPossiblePrototype$1(proto);\n\t if (CORRECT_SETTER) setter.call(O, proto);\n\t else O.__proto__ = proto;\n\t return O;\n\t };\n\t}() : undefined);\n\n\tvar IteratorPrototype$5 = iteratorsCore$1.IteratorPrototype;\n\tvar BUGGY_SAFARI_ITERATORS$3 = iteratorsCore$1.BUGGY_SAFARI_ITERATORS;\n\tvar ITERATOR$d = wellKnownSymbol$1('iterator');\n\tvar KEYS$1 = 'keys';\n\tvar VALUES$1 = 'values';\n\tvar ENTRIES$1 = 'entries';\n\n\tvar returnThis$5 = function () { return this; };\n\n\tvar defineIterator$1 = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n\t createIteratorConstructor$1(IteratorConstructor, NAME, next);\n\n\t var getIterationMethod = function (KIND) {\n\t if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n\t if (!BUGGY_SAFARI_ITERATORS$3 && KIND in IterablePrototype) return IterablePrototype[KIND];\n\t switch (KIND) {\n\t case KEYS$1: return function keys() { return new IteratorConstructor(this, KIND); };\n\t case VALUES$1: return function values() { return new IteratorConstructor(this, KIND); };\n\t case ENTRIES$1: return function entries() { return new IteratorConstructor(this, KIND); };\n\t } return function () { return new IteratorConstructor(this); };\n\t };\n\n\t var TO_STRING_TAG = NAME + ' Iterator';\n\t var INCORRECT_VALUES_NAME = false;\n\t var IterablePrototype = Iterable.prototype;\n\t var nativeIterator = IterablePrototype[ITERATOR$d]\n\t || IterablePrototype['@@iterator']\n\t || DEFAULT && IterablePrototype[DEFAULT];\n\t var defaultIterator = !BUGGY_SAFARI_ITERATORS$3 && nativeIterator || getIterationMethod(DEFAULT);\n\t var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n\t var CurrentIteratorPrototype, methods, KEY;\n\n\t // fix native\n\t if (anyNativeIterator) {\n\t CurrentIteratorPrototype = objectGetPrototypeOf$1(anyNativeIterator.call(new Iterable()));\n\t if (IteratorPrototype$5 !== Object.prototype && CurrentIteratorPrototype.next) {\n\t if ( objectGetPrototypeOf$1(CurrentIteratorPrototype) !== IteratorPrototype$5) {\n\t if (objectSetPrototypeOf$1) {\n\t objectSetPrototypeOf$1(CurrentIteratorPrototype, IteratorPrototype$5);\n\t } else if (typeof CurrentIteratorPrototype[ITERATOR$d] != 'function') {\n\t createNonEnumerableProperty$1(CurrentIteratorPrototype, ITERATOR$d, returnThis$5);\n\t }\n\t }\n\t // Set @@toStringTag to native iterators\n\t setToStringTag$1(CurrentIteratorPrototype, TO_STRING_TAG, true);\n\t }\n\t }\n\n\t // fix Array#{values, @@iterator}.name in V8 / FF\n\t if (DEFAULT == VALUES$1 && nativeIterator && nativeIterator.name !== VALUES$1) {\n\t INCORRECT_VALUES_NAME = true;\n\t defaultIterator = function values() { return nativeIterator.call(this); };\n\t }\n\n\t // define iterator\n\t if ( IterablePrototype[ITERATOR$d] !== defaultIterator) {\n\t createNonEnumerableProperty$1(IterablePrototype, ITERATOR$d, defaultIterator);\n\t }\n\t iterators$1[NAME] = defaultIterator;\n\n\t // export additional methods\n\t if (DEFAULT) {\n\t methods = {\n\t values: getIterationMethod(VALUES$1),\n\t keys: IS_SET ? defaultIterator : getIterationMethod(KEYS$1),\n\t entries: getIterationMethod(ENTRIES$1)\n\t };\n\t if (FORCED) for (KEY in methods) {\n\t if (BUGGY_SAFARI_ITERATORS$3 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n\t redefine$1(IterablePrototype, KEY, methods[KEY]);\n\t }\n\t } else _export$1({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$3 || INCORRECT_VALUES_NAME }, methods);\n\t }\n\n\t return methods;\n\t};\n\n\tvar ARRAY_ITERATOR$1 = 'Array Iterator';\n\tvar setInternalState$9 = internalState$1.set;\n\tvar getInternalState$5 = internalState$1.getterFor(ARRAY_ITERATOR$1);\n\n\t// `Array.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n\t// `Array.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n\t// `Array.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.values\n\t// `Array.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n\t// `CreateArrayIterator` internal method\n\t// https://tc39.github.io/ecma262/#sec-createarrayiterator\n\tvar es_array_iterator$1 = defineIterator$1(Array, 'Array', function (iterated, kind) {\n\t setInternalState$9(this, {\n\t type: ARRAY_ITERATOR$1,\n\t target: toIndexedObject$1(iterated), // target\n\t index: 0, // next index\n\t kind: kind // kind\n\t });\n\t// `%ArrayIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n\t}, function () {\n\t var state = getInternalState$5(this);\n\t var target = state.target;\n\t var kind = state.kind;\n\t var index = state.index++;\n\t if (!target || index >= target.length) {\n\t state.target = undefined;\n\t return { value: undefined, done: true };\n\t }\n\t if (kind == 'keys') return { value: index, done: false };\n\t if (kind == 'values') return { value: target[index], done: false };\n\t return { value: [index, target[index]], done: false };\n\t}, 'values');\n\n\t// argumentsList[@@iterator] is %ArrayProto_values%\n\t// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n\t// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\n\titerators$1.Arguments = iterators$1.Array;\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables$1('keys');\n\taddToUnscopables$1('values');\n\taddToUnscopables$1('entries');\n\n\tvar arrayMethodIsStrict$1 = function (METHOD_NAME, argument) {\n\t var method = [][METHOD_NAME];\n\t return !!method && fails$1(function () {\n\t // eslint-disable-next-line no-useless-call,no-throw-literal\n\t method.call(null, argument || function () { throw 1; }, 1);\n\t });\n\t};\n\n\tvar nativeJoin$1 = [].join;\n\n\tvar ES3_STRINGS$1 = indexedObject$1 != Object;\n\tvar STRICT_METHOD$5 = arrayMethodIsStrict$1('join', ',');\n\n\t// `Array.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.join\n\t_export$1({ target: 'Array', proto: true, forced: ES3_STRINGS$1 || !STRICT_METHOD$5 }, {\n\t join: function join(separator) {\n\t return nativeJoin$1.call(toIndexedObject$1(this), separator === undefined ? ',' : separator);\n\t }\n\t});\n\n\tvar $map$2 = arrayIteration$1.map;\n\n\n\n\tvar HAS_SPECIES_SUPPORT$5 = arrayMethodHasSpeciesSupport$1('map');\n\t// FF49- issue\n\tvar USES_TO_LENGTH$d = arrayMethodUsesToLength$1('map');\n\n\t// `Array.prototype.map` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t// with adding support of @@species\n\t_export$1({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$5 || !USES_TO_LENGTH$d }, {\n\t map: function map(callbackfn /* , thisArg */) {\n\t return $map$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// makes subclassing work correct for wrapped built-ins\n\tvar inheritIfRequired$1 = function ($this, dummy, Wrapper) {\n\t var NewTarget, NewTargetPrototype;\n\t if (\n\t // it can work only with native `setPrototypeOf`\n\t objectSetPrototypeOf$1 &&\n\t // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n\t typeof (NewTarget = dummy.constructor) == 'function' &&\n\t NewTarget !== Wrapper &&\n\t isObject$2(NewTargetPrototype = NewTarget.prototype) &&\n\t NewTargetPrototype !== Wrapper.prototype\n\t ) objectSetPrototypeOf$1($this, NewTargetPrototype);\n\t return $this;\n\t};\n\n\t// a string of all valid unicode whitespaces\n\t// eslint-disable-next-line max-len\n\tvar whitespaces$1 = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\tvar whitespace$1 = '[' + whitespaces$1 + ']';\n\tvar ltrim$1 = RegExp('^' + whitespace$1 + whitespace$1 + '*');\n\tvar rtrim$1 = RegExp(whitespace$1 + whitespace$1 + '*$');\n\n\t// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\n\tvar createMethod$8 = function (TYPE) {\n\t return function ($this) {\n\t var string = String(requireObjectCoercible$1($this));\n\t if (TYPE & 1) string = string.replace(ltrim$1, '');\n\t if (TYPE & 2) string = string.replace(rtrim$1, '');\n\t return string;\n\t };\n\t};\n\n\tvar stringTrim$1 = {\n\t // `String.prototype.{ trimLeft, trimStart }` methods\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n\t start: createMethod$8(1),\n\t // `String.prototype.{ trimRight, trimEnd }` methods\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n\t end: createMethod$8(2),\n\t // `String.prototype.trim` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t trim: createMethod$8(3)\n\t};\n\n\tvar getOwnPropertyNames$3 = objectGetOwnPropertyNames$1.f;\n\tvar getOwnPropertyDescriptor$6 = objectGetOwnPropertyDescriptor$1.f;\n\tvar defineProperty$c = objectDefineProperty$1.f;\n\tvar trim$1 = stringTrim$1.trim;\n\n\tvar NUMBER$1 = 'Number';\n\tvar NativeNumber$1 = global_1$1[NUMBER$1];\n\tvar NumberPrototype$1 = NativeNumber$1.prototype;\n\n\t// Opera ~12 has broken Object#toString\n\tvar BROKEN_CLASSOF$1 = classofRaw$1(objectCreate$1(NumberPrototype$1)) == NUMBER$1;\n\n\t// `ToNumber` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tonumber\n\tvar toNumber$1 = function (argument) {\n\t var it = toPrimitive$1(argument, false);\n\t var first, third, radix, maxCode, digits, length, index, code;\n\t if (typeof it == 'string' && it.length > 2) {\n\t it = trim$1(it);\n\t first = it.charCodeAt(0);\n\t if (first === 43 || first === 45) {\n\t third = it.charCodeAt(2);\n\t if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n\t } else if (first === 48) {\n\t switch (it.charCodeAt(1)) {\n\t case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i\n\t case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n\t default: return +it;\n\t }\n\t digits = it.slice(2);\n\t length = digits.length;\n\t for (index = 0; index < length; index++) {\n\t code = digits.charCodeAt(index);\n\t // parseInt parses a string to a first unavailable symbol\n\t // but ToNumber should return NaN if a string contains unavailable symbols\n\t if (code < 48 || code > maxCode) return NaN;\n\t } return parseInt(digits, radix);\n\t }\n\t } return +it;\n\t};\n\n\t// `Number` constructor\n\t// https://tc39.github.io/ecma262/#sec-number-constructor\n\tif (isForced_1$1(NUMBER$1, !NativeNumber$1(' 0o1') || !NativeNumber$1('0b1') || NativeNumber$1('+0x1'))) {\n\t var NumberWrapper$1 = function Number(value) {\n\t var it = arguments.length < 1 ? 0 : value;\n\t var dummy = this;\n\t return dummy instanceof NumberWrapper$1\n\t // check on 1..constructor(foo) case\n\t && (BROKEN_CLASSOF$1 ? fails$1(function () { NumberPrototype$1.valueOf.call(dummy); }) : classofRaw$1(dummy) != NUMBER$1)\n\t ? inheritIfRequired$1(new NativeNumber$1(toNumber$1(it)), dummy, NumberWrapper$1) : toNumber$1(it);\n\t };\n\t for (var keys$5 = descriptors$1 ? getOwnPropertyNames$3(NativeNumber$1) : (\n\t // ES3:\n\t 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n\t // ES2015 (in case, if modules with ES2015 Number statics required before):\n\t 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n\t 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n\t ).split(','), j$2 = 0, key$2; keys$5.length > j$2; j$2++) {\n\t if (has$2(NativeNumber$1, key$2 = keys$5[j$2]) && !has$2(NumberWrapper$1, key$2)) {\n\t defineProperty$c(NumberWrapper$1, key$2, getOwnPropertyDescriptor$6(NativeNumber$1, key$2));\n\t }\n\t }\n\t NumberWrapper$1.prototype = NumberPrototype$1;\n\t NumberPrototype$1.constructor = NumberWrapper$1;\n\t redefine$1(global_1$1, NUMBER$1, NumberWrapper$1);\n\t}\n\n\tvar FAILS_ON_PRIMITIVES$2 = fails$1(function () { objectKeys$1(1); });\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\t_export$1({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$2 }, {\n\t keys: function keys(it) {\n\t return objectKeys$1(toObject$1(it));\n\t }\n\t});\n\n\t// `Object.prototype.toString` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tvar objectToString$1 = toStringTagSupport$1 ? {}.toString : function toString() {\n\t return '[object ' + classof$1(this) + ']';\n\t};\n\n\t// `Object.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tif (!toStringTagSupport$1) {\n\t redefine$1(Object.prototype, 'toString', objectToString$1, { unsafe: true });\n\t}\n\n\t// `RegExp.prototype.flags` getter implementation\n\t// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n\tvar regexpFlags$1 = function () {\n\t var that = anObject$1(this);\n\t var result = '';\n\t if (that.global) result += 'g';\n\t if (that.ignoreCase) result += 'i';\n\t if (that.multiline) result += 'm';\n\t if (that.dotAll) result += 's';\n\t if (that.unicode) result += 'u';\n\t if (that.sticky) result += 'y';\n\t return result;\n\t};\n\n\t// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n\t// so we use an intermediate function.\n\tfunction RE$1(s, f) {\n\t return RegExp(s, f);\n\t}\n\n\tvar UNSUPPORTED_Y$3 = fails$1(function () {\n\t // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n\t var re = RE$1('a', 'y');\n\t re.lastIndex = 2;\n\t return re.exec('abcd') != null;\n\t});\n\n\tvar BROKEN_CARET$1 = fails$1(function () {\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n\t var re = RE$1('^r', 'gy');\n\t re.lastIndex = 2;\n\t return re.exec('str') != null;\n\t});\n\n\tvar regexpStickyHelpers$1 = {\n\t\tUNSUPPORTED_Y: UNSUPPORTED_Y$3,\n\t\tBROKEN_CARET: BROKEN_CARET$1\n\t};\n\n\tvar nativeExec$1 = RegExp.prototype.exec;\n\t// This always refers to the native implementation, because the\n\t// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n\t// which loads this file before patching the method.\n\tvar nativeReplace$1 = String.prototype.replace;\n\n\tvar patchedExec$1 = nativeExec$1;\n\n\tvar UPDATES_LAST_INDEX_WRONG$1 = (function () {\n\t var re1 = /a/;\n\t var re2 = /b*/g;\n\t nativeExec$1.call(re1, 'a');\n\t nativeExec$1.call(re2, 'a');\n\t return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n\t})();\n\n\tvar UNSUPPORTED_Y$4 = regexpStickyHelpers$1.UNSUPPORTED_Y || regexpStickyHelpers$1.BROKEN_CARET;\n\n\t// nonparticipating capturing group, copied from es5-shim's String#split patch.\n\tvar NPCG_INCLUDED$1 = /()??/.exec('')[1] !== undefined;\n\n\tvar PATCH$1 = UPDATES_LAST_INDEX_WRONG$1 || NPCG_INCLUDED$1 || UNSUPPORTED_Y$4;\n\n\tif (PATCH$1) {\n\t patchedExec$1 = function exec(str) {\n\t var re = this;\n\t var lastIndex, reCopy, match, i;\n\t var sticky = UNSUPPORTED_Y$4 && re.sticky;\n\t var flags = regexpFlags$1.call(re);\n\t var source = re.source;\n\t var charsAdded = 0;\n\t var strCopy = str;\n\n\t if (sticky) {\n\t flags = flags.replace('y', '');\n\t if (flags.indexOf('g') === -1) {\n\t flags += 'g';\n\t }\n\n\t strCopy = String(str).slice(re.lastIndex);\n\t // Support anchored sticky behavior.\n\t if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n\t source = '(?: ' + source + ')';\n\t strCopy = ' ' + strCopy;\n\t charsAdded++;\n\t }\n\t // ^(? + rx + ) is needed, in combination with some str slicing, to\n\t // simulate the 'y' flag.\n\t reCopy = new RegExp('^(?:' + source + ')', flags);\n\t }\n\n\t if (NPCG_INCLUDED$1) {\n\t reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n\t }\n\t if (UPDATES_LAST_INDEX_WRONG$1) lastIndex = re.lastIndex;\n\n\t match = nativeExec$1.call(sticky ? reCopy : re, strCopy);\n\n\t if (sticky) {\n\t if (match) {\n\t match.input = match.input.slice(charsAdded);\n\t match[0] = match[0].slice(charsAdded);\n\t match.index = re.lastIndex;\n\t re.lastIndex += match[0].length;\n\t } else re.lastIndex = 0;\n\t } else if (UPDATES_LAST_INDEX_WRONG$1 && match) {\n\t re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n\t }\n\t if (NPCG_INCLUDED$1 && match && match.length > 1) {\n\t // Fix browsers whose `exec` methods don't consistently return `undefined`\n\t // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n\t nativeReplace$1.call(match[0], reCopy, function () {\n\t for (i = 1; i < arguments.length - 2; i++) {\n\t if (arguments[i] === undefined) match[i] = undefined;\n\t }\n\t });\n\t }\n\n\t return match;\n\t };\n\t}\n\n\tvar regexpExec$1 = patchedExec$1;\n\n\t_export$1({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec$1 }, {\n\t exec: regexpExec$1\n\t});\n\n\tvar TO_STRING$1 = 'toString';\n\tvar RegExpPrototype$2 = RegExp.prototype;\n\tvar nativeToString$1 = RegExpPrototype$2[TO_STRING$1];\n\n\tvar NOT_GENERIC$1 = fails$1(function () { return nativeToString$1.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n\t// FF44- RegExp#toString has a wrong name\n\tvar INCORRECT_NAME$1 = nativeToString$1.name != TO_STRING$1;\n\n\t// `RegExp.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\n\tif (NOT_GENERIC$1 || INCORRECT_NAME$1) {\n\t redefine$1(RegExp.prototype, TO_STRING$1, function toString() {\n\t var R = anObject$1(this);\n\t var p = String(R.source);\n\t var rf = R.flags;\n\t var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype$2) ? regexpFlags$1.call(R) : rf);\n\t return '/' + p + '/' + f;\n\t }, { unsafe: true });\n\t}\n\n\tvar MATCH$3 = wellKnownSymbol$1('match');\n\n\t// `IsRegExp` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isregexp\n\tvar isRegexp$1 = function (it) {\n\t var isRegExp;\n\t return isObject$2(it) && ((isRegExp = it[MATCH$3]) !== undefined ? !!isRegExp : classofRaw$1(it) == 'RegExp');\n\t};\n\n\tvar notARegexp$1 = function (it) {\n\t if (isRegexp$1(it)) {\n\t throw TypeError(\"The method doesn't accept regular expressions\");\n\t } return it;\n\t};\n\n\tvar MATCH$4 = wellKnownSymbol$1('match');\n\n\tvar correctIsRegexpLogic$1 = function (METHOD_NAME) {\n\t var regexp = /./;\n\t try {\n\t '/./'[METHOD_NAME](regexp);\n\t } catch (error1) {\n\t try {\n\t regexp[MATCH$4] = false;\n\t return '/./'[METHOD_NAME](regexp);\n\t } catch (error2) { /* empty */ }\n\t } return false;\n\t};\n\n\t// `String.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n\t_export$1({ target: 'String', proto: true, forced: !correctIsRegexpLogic$1('includes') }, {\n\t includes: function includes(searchString /* , position = 0 */) {\n\t return !!~String(requireObjectCoercible$1(this))\n\t .indexOf(notARegexp$1(searchString), arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// `String.prototype.{ codePointAt, at }` methods implementation\n\tvar createMethod$9 = function (CONVERT_TO_STRING) {\n\t return function ($this, pos) {\n\t var S = String(requireObjectCoercible$1($this));\n\t var position = toInteger$1(pos);\n\t var size = S.length;\n\t var first, second;\n\t if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n\t first = S.charCodeAt(position);\n\t return first < 0xD800 || first > 0xDBFF || position + 1 === size\n\t || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n\t ? CONVERT_TO_STRING ? S.charAt(position) : first\n\t : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n\t };\n\t};\n\n\tvar stringMultibyte$1 = {\n\t // `String.prototype.codePointAt` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n\t codeAt: createMethod$9(false),\n\t // `String.prototype.at` method\n\t // https://github.com/mathiasbynens/String.prototype.at\n\t charAt: createMethod$9(true)\n\t};\n\n\tvar charAt$2 = stringMultibyte$1.charAt;\n\n\n\n\tvar STRING_ITERATOR$1 = 'String Iterator';\n\tvar setInternalState$a = internalState$1.set;\n\tvar getInternalState$6 = internalState$1.getterFor(STRING_ITERATOR$1);\n\n\t// `String.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\n\tdefineIterator$1(String, 'String', function (iterated) {\n\t setInternalState$a(this, {\n\t type: STRING_ITERATOR$1,\n\t string: String(iterated),\n\t index: 0\n\t });\n\t// `%StringIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n\t}, function next() {\n\t var state = getInternalState$6(this);\n\t var string = state.string;\n\t var index = state.index;\n\t var point;\n\t if (index >= string.length) return { value: undefined, done: true };\n\t point = charAt$2(string, index);\n\t state.index += point.length;\n\t return { value: point, done: false };\n\t});\n\n\t// TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\n\n\n\n\n\tvar SPECIES$9 = wellKnownSymbol$1('species');\n\n\tvar REPLACE_SUPPORTS_NAMED_GROUPS$1 = !fails$1(function () {\n\t // #replace needs built-in support for named groups.\n\t // #match works fine because it just return the exec results, even if it has\n\t // a \"grops\" property.\n\t var re = /./;\n\t re.exec = function () {\n\t var result = [];\n\t result.groups = { a: '7' };\n\t return result;\n\t };\n\t return ''.replace(re, '$<a>') !== '7';\n\t});\n\n\t// IE <= 11 replaces $0 with the whole match, as if it was $&\n\t// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\n\tvar REPLACE_KEEPS_$0$1 = (function () {\n\t return 'a'.replace(/./, '$0') === '$0';\n\t})();\n\n\tvar REPLACE$1 = wellKnownSymbol$1('replace');\n\t// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\n\tvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE$1 = (function () {\n\t if (/./[REPLACE$1]) {\n\t return /./[REPLACE$1]('a', '$0') === '';\n\t }\n\t return false;\n\t})();\n\n\t// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n\t// Weex JS has frozen built-in prototypes, so use try / catch wrapper\n\tvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC$1 = !fails$1(function () {\n\t var re = /(?:)/;\n\t var originalExec = re.exec;\n\t re.exec = function () { return originalExec.apply(this, arguments); };\n\t var result = 'ab'.split(re);\n\t return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n\t});\n\n\tvar fixRegexpWellKnownSymbolLogic$1 = function (KEY, length, exec, sham) {\n\t var SYMBOL = wellKnownSymbol$1(KEY);\n\n\t var DELEGATES_TO_SYMBOL = !fails$1(function () {\n\t // String methods call symbol-named RegEp methods\n\t var O = {};\n\t O[SYMBOL] = function () { return 7; };\n\t return ''[KEY](O) != 7;\n\t });\n\n\t var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails$1(function () {\n\t // Symbol-named RegExp methods call .exec\n\t var execCalled = false;\n\t var re = /a/;\n\n\t if (KEY === 'split') {\n\t // We can't use real regex here since it causes deoptimization\n\t // and serious performance degradation in V8\n\t // https://github.com/zloirock/core-js/issues/306\n\t re = {};\n\t // RegExp[@@split] doesn't call the regex's exec method, but first creates\n\t // a new one. We need to return the patched regex when creating the new one.\n\t re.constructor = {};\n\t re.constructor[SPECIES$9] = function () { return re; };\n\t re.flags = '';\n\t re[SYMBOL] = /./[SYMBOL];\n\t }\n\n\t re.exec = function () { execCalled = true; return null; };\n\n\t re[SYMBOL]('');\n\t return !execCalled;\n\t });\n\n\t if (\n\t !DELEGATES_TO_SYMBOL ||\n\t !DELEGATES_TO_EXEC ||\n\t (KEY === 'replace' && !(\n\t REPLACE_SUPPORTS_NAMED_GROUPS$1 &&\n\t REPLACE_KEEPS_$0$1 &&\n\t !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE$1\n\t )) ||\n\t (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC$1)\n\t ) {\n\t var nativeRegExpMethod = /./[SYMBOL];\n\t var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n\t if (regexp.exec === regexpExec$1) {\n\t if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n\t // The native String method already delegates to @@method (this\n\t // polyfilled function), leasing to infinite recursion.\n\t // We avoid it by directly calling the native @@method method.\n\t return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n\t }\n\t return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n\t }\n\t return { done: false };\n\t }, {\n\t REPLACE_KEEPS_$0: REPLACE_KEEPS_$0$1,\n\t REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE$1\n\t });\n\t var stringMethod = methods[0];\n\t var regexMethod = methods[1];\n\n\t redefine$1(String.prototype, KEY, stringMethod);\n\t redefine$1(RegExp.prototype, SYMBOL, length == 2\n\t // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n\t // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n\t ? function (string, arg) { return regexMethod.call(string, this, arg); }\n\t // 21.2.5.6 RegExp.prototype[@@match](string)\n\t // 21.2.5.9 RegExp.prototype[@@search](string)\n\t : function (string) { return regexMethod.call(string, this); }\n\t );\n\t }\n\n\t if (sham) createNonEnumerableProperty$1(RegExp.prototype[SYMBOL], 'sham', true);\n\t};\n\n\t// `SameValue` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-samevalue\n\tvar sameValue$1 = Object.is || function is(x, y) {\n\t // eslint-disable-next-line no-self-compare\n\t return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n\t};\n\n\t// `RegExpExec` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-regexpexec\n\tvar regexpExecAbstract$1 = function (R, S) {\n\t var exec = R.exec;\n\t if (typeof exec === 'function') {\n\t var result = exec.call(R, S);\n\t if (typeof result !== 'object') {\n\t throw TypeError('RegExp exec method returned something other than an Object or null');\n\t }\n\t return result;\n\t }\n\n\t if (classofRaw$1(R) !== 'RegExp') {\n\t throw TypeError('RegExp#exec called on incompatible receiver');\n\t }\n\n\t return regexpExec$1.call(R, S);\n\t};\n\n\t// @@search logic\n\tfixRegexpWellKnownSymbolLogic$1('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n\t return [\n\t // `String.prototype.search` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.search\n\t function search(regexp) {\n\t var O = requireObjectCoercible$1(this);\n\t var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n\t return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n\t },\n\t // `RegExp.prototype[@@search]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n\t function (regexp) {\n\t var res = maybeCallNative(nativeSearch, regexp, this);\n\t if (res.done) return res.value;\n\n\t var rx = anObject$1(regexp);\n\t var S = String(this);\n\n\t var previousLastIndex = rx.lastIndex;\n\t if (!sameValue$1(previousLastIndex, 0)) rx.lastIndex = 0;\n\t var result = regexpExecAbstract$1(rx, S);\n\t if (!sameValue$1(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n\t return result === null ? -1 : result.index;\n\t }\n\t ];\n\t});\n\n\tvar redefineAll$1 = function (target, src, options) {\n\t for (var key in src) redefine$1(target, key, src[key], options);\n\t return target;\n\t};\n\n\tvar freezing$1 = !fails$1(function () {\n\t return Object.isExtensible(Object.preventExtensions({}));\n\t});\n\n\tvar internalMetadata$1 = createCommonjsModule(function (module) {\n\tvar defineProperty = objectDefineProperty$1.f;\n\n\n\n\tvar METADATA = uid$1('meta');\n\tvar id = 0;\n\n\tvar isExtensible = Object.isExtensible || function () {\n\t return true;\n\t};\n\n\tvar setMetadata = function (it) {\n\t defineProperty(it, METADATA, { value: {\n\t objectID: 'O' + ++id, // object ID\n\t weakData: {} // weak collections IDs\n\t } });\n\t};\n\n\tvar fastKey = function (it, create) {\n\t // return a primitive with prefix\n\t if (!isObject$2(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\t if (!has$2(it, METADATA)) {\n\t // can't set metadata to uncaught frozen object\n\t if (!isExtensible(it)) return 'F';\n\t // not necessary to add metadata\n\t if (!create) return 'E';\n\t // add missing metadata\n\t setMetadata(it);\n\t // return object ID\n\t } return it[METADATA].objectID;\n\t};\n\n\tvar getWeakData = function (it, create) {\n\t if (!has$2(it, METADATA)) {\n\t // can't set metadata to uncaught frozen object\n\t if (!isExtensible(it)) return true;\n\t // not necessary to add metadata\n\t if (!create) return false;\n\t // add missing metadata\n\t setMetadata(it);\n\t // return the store of weak collections IDs\n\t } return it[METADATA].weakData;\n\t};\n\n\t// add metadata on freeze-family methods calling\n\tvar onFreeze = function (it) {\n\t if (freezing$1 && meta.REQUIRED && isExtensible(it) && !has$2(it, METADATA)) setMetadata(it);\n\t return it;\n\t};\n\n\tvar meta = module.exports = {\n\t REQUIRED: false,\n\t fastKey: fastKey,\n\t getWeakData: getWeakData,\n\t onFreeze: onFreeze\n\t};\n\n\thiddenKeys$2[METADATA] = true;\n\t});\n\tvar internalMetadata_1$1 = internalMetadata$1.REQUIRED;\n\tvar internalMetadata_2$1 = internalMetadata$1.fastKey;\n\tvar internalMetadata_3$1 = internalMetadata$1.getWeakData;\n\tvar internalMetadata_4$1 = internalMetadata$1.onFreeze;\n\n\tvar Result = function (stopped, result) {\n\t this.stopped = stopped;\n\t this.result = result;\n\t};\n\n\tvar iterate = function (iterable, unboundFunction, options) {\n\t var that = options && options.that;\n\t var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n\t var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n\t var INTERRUPTED = !!(options && options.INTERRUPTED);\n\t var fn = functionBindContext$1(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n\t var iterator, iterFn, index, length, result, next, step;\n\n\t var stop = function (condition) {\n\t if (iterator) iteratorClose(iterator);\n\t return new Result(true, condition);\n\t };\n\n\t var callFn = function (value) {\n\t if (AS_ENTRIES) {\n\t anObject$1(value);\n\t return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n\t } return INTERRUPTED ? fn(value, stop) : fn(value);\n\t };\n\n\t if (IS_ITERATOR) {\n\t iterator = iterable;\n\t } else {\n\t iterFn = getIteratorMethod$1(iterable);\n\t if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n\t // optimisation for array iterators\n\t if (isArrayIteratorMethod$1(iterFn)) {\n\t for (index = 0, length = toLength$1(iterable.length); length > index; index++) {\n\t result = callFn(iterable[index]);\n\t if (result && result instanceof Result) return result;\n\t } return new Result(false);\n\t }\n\t iterator = iterFn.call(iterable);\n\t }\n\n\t next = iterator.next;\n\t while (!(step = next.call(iterator)).done) {\n\t try {\n\t result = callFn(step.value);\n\t } catch (error) {\n\t iteratorClose(iterator);\n\t throw error;\n\t }\n\t if (typeof result == 'object' && result && result instanceof Result) return result;\n\t } return new Result(false);\n\t};\n\n\tvar anInstance$1 = function (it, Constructor, name) {\n\t if (!(it instanceof Constructor)) {\n\t throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n\t } return it;\n\t};\n\n\tvar collection$1 = function (CONSTRUCTOR_NAME, wrapper, common) {\n\t var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n\t var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n\t var ADDER = IS_MAP ? 'set' : 'add';\n\t var NativeConstructor = global_1$1[CONSTRUCTOR_NAME];\n\t var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n\t var Constructor = NativeConstructor;\n\t var exported = {};\n\n\t var fixMethod = function (KEY) {\n\t var nativeMethod = NativePrototype[KEY];\n\t redefine$1(NativePrototype, KEY,\n\t KEY == 'add' ? function add(value) {\n\t nativeMethod.call(this, value === 0 ? 0 : value);\n\t return this;\n\t } : KEY == 'delete' ? function (key) {\n\t return IS_WEAK && !isObject$2(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : KEY == 'get' ? function get(key) {\n\t return IS_WEAK && !isObject$2(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : KEY == 'has' ? function has(key) {\n\t return IS_WEAK && !isObject$2(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : function set(key, value) {\n\t nativeMethod.call(this, key === 0 ? 0 : key, value);\n\t return this;\n\t }\n\t );\n\t };\n\n\t // eslint-disable-next-line max-len\n\t if (isForced_1$1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails$1(function () {\n\t new NativeConstructor().entries().next();\n\t })))) {\n\t // create collection constructor\n\t Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n\t internalMetadata$1.REQUIRED = true;\n\t } else if (isForced_1$1(CONSTRUCTOR_NAME, true)) {\n\t var instance = new Constructor();\n\t // early implementations not supports chaining\n\t var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n\t // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n\t var THROWS_ON_PRIMITIVES = fails$1(function () { instance.has(1); });\n\t // most early implementations doesn't supports iterables, most modern - not close it correctly\n\t // eslint-disable-next-line no-new\n\t var ACCEPT_ITERABLES = checkCorrectnessOfIteration$1(function (iterable) { new NativeConstructor(iterable); });\n\t // for early implementations -0 and +0 not the same\n\t var BUGGY_ZERO = !IS_WEAK && fails$1(function () {\n\t // V8 ~ Chromium 42- fails only with 5+ elements\n\t var $instance = new NativeConstructor();\n\t var index = 5;\n\t while (index--) $instance[ADDER](index, index);\n\t return !$instance.has(-0);\n\t });\n\n\t if (!ACCEPT_ITERABLES) {\n\t Constructor = wrapper(function (dummy, iterable) {\n\t anInstance$1(dummy, Constructor, CONSTRUCTOR_NAME);\n\t var that = inheritIfRequired$1(new NativeConstructor(), dummy, Constructor);\n\t if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n\t return that;\n\t });\n\t Constructor.prototype = NativePrototype;\n\t NativePrototype.constructor = Constructor;\n\t }\n\n\t if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n\t fixMethod('delete');\n\t fixMethod('has');\n\t IS_MAP && fixMethod('get');\n\t }\n\n\t if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n\t // weak collections should not contains .clear method\n\t if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n\t }\n\n\t exported[CONSTRUCTOR_NAME] = Constructor;\n\t _export$1({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n\t setToStringTag$1(Constructor, CONSTRUCTOR_NAME);\n\n\t if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n\t return Constructor;\n\t};\n\n\tvar getWeakData$1 = internalMetadata$1.getWeakData;\n\n\n\n\n\n\n\n\n\tvar setInternalState$b = internalState$1.set;\n\tvar internalStateGetterFor$1 = internalState$1.getterFor;\n\tvar find$2 = arrayIteration$1.find;\n\tvar findIndex$1 = arrayIteration$1.findIndex;\n\tvar id$3 = 0;\n\n\t// fallback for uncaught frozen keys\n\tvar uncaughtFrozenStore$1 = function (store) {\n\t return store.frozen || (store.frozen = new UncaughtFrozenStore$1());\n\t};\n\n\tvar UncaughtFrozenStore$1 = function () {\n\t this.entries = [];\n\t};\n\n\tvar findUncaughtFrozen$1 = function (store, key) {\n\t return find$2(store.entries, function (it) {\n\t return it[0] === key;\n\t });\n\t};\n\n\tUncaughtFrozenStore$1.prototype = {\n\t get: function (key) {\n\t var entry = findUncaughtFrozen$1(this, key);\n\t if (entry) return entry[1];\n\t },\n\t has: function (key) {\n\t return !!findUncaughtFrozen$1(this, key);\n\t },\n\t set: function (key, value) {\n\t var entry = findUncaughtFrozen$1(this, key);\n\t if (entry) entry[1] = value;\n\t else this.entries.push([key, value]);\n\t },\n\t 'delete': function (key) {\n\t var index = findIndex$1(this.entries, function (it) {\n\t return it[0] === key;\n\t });\n\t if (~index) this.entries.splice(index, 1);\n\t return !!~index;\n\t }\n\t};\n\n\tvar collectionWeak$1 = {\n\t getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n\t var C = wrapper(function (that, iterable) {\n\t anInstance$1(that, C, CONSTRUCTOR_NAME);\n\t setInternalState$b(that, {\n\t type: CONSTRUCTOR_NAME,\n\t id: id$3++,\n\t frozen: undefined\n\t });\n\t if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n\t });\n\n\t var getInternalState = internalStateGetterFor$1(CONSTRUCTOR_NAME);\n\n\t var define = function (that, key, value) {\n\t var state = getInternalState(that);\n\t var data = getWeakData$1(anObject$1(key), true);\n\t if (data === true) uncaughtFrozenStore$1(state).set(key, value);\n\t else data[state.id] = value;\n\t return that;\n\t };\n\n\t redefineAll$1(C.prototype, {\n\t // 23.3.3.2 WeakMap.prototype.delete(key)\n\t // 23.4.3.3 WeakSet.prototype.delete(value)\n\t 'delete': function (key) {\n\t var state = getInternalState(this);\n\t if (!isObject$2(key)) return false;\n\t var data = getWeakData$1(key);\n\t if (data === true) return uncaughtFrozenStore$1(state)['delete'](key);\n\t return data && has$2(data, state.id) && delete data[state.id];\n\t },\n\t // 23.3.3.4 WeakMap.prototype.has(key)\n\t // 23.4.3.4 WeakSet.prototype.has(value)\n\t has: function has(key) {\n\t var state = getInternalState(this);\n\t if (!isObject$2(key)) return false;\n\t var data = getWeakData$1(key);\n\t if (data === true) return uncaughtFrozenStore$1(state).has(key);\n\t return data && has$2(data, state.id);\n\t }\n\t });\n\n\t redefineAll$1(C.prototype, IS_MAP ? {\n\t // 23.3.3.3 WeakMap.prototype.get(key)\n\t get: function get(key) {\n\t var state = getInternalState(this);\n\t if (isObject$2(key)) {\n\t var data = getWeakData$1(key);\n\t if (data === true) return uncaughtFrozenStore$1(state).get(key);\n\t return data ? data[state.id] : undefined;\n\t }\n\t },\n\t // 23.3.3.5 WeakMap.prototype.set(key, value)\n\t set: function set(key, value) {\n\t return define(this, key, value);\n\t }\n\t } : {\n\t // 23.4.3.1 WeakSet.prototype.add(value)\n\t add: function add(value) {\n\t return define(this, value, true);\n\t }\n\t });\n\n\t return C;\n\t }\n\t};\n\n\tvar es_weakMap = createCommonjsModule(function (module) {\n\n\n\n\n\n\n\tvar enforceIternalState = internalState$1.enforce;\n\n\n\tvar IS_IE11 = !global_1$1.ActiveXObject && 'ActiveXObject' in global_1$1;\n\tvar isExtensible = Object.isExtensible;\n\tvar InternalWeakMap;\n\n\tvar wrapper = function (init) {\n\t return function WeakMap() {\n\t return init(this, arguments.length ? arguments[0] : undefined);\n\t };\n\t};\n\n\t// `WeakMap` constructor\n\t// https://tc39.github.io/ecma262/#sec-weakmap-constructor\n\tvar $WeakMap = module.exports = collection$1('WeakMap', wrapper, collectionWeak$1);\n\n\t// IE11 WeakMap frozen keys fix\n\t// We can't use feature detection because it crash some old IE builds\n\t// https://github.com/zloirock/core-js/issues/485\n\tif (nativeWeakMap$1 && IS_IE11) {\n\t InternalWeakMap = collectionWeak$1.getConstructor(wrapper, 'WeakMap', true);\n\t internalMetadata$1.REQUIRED = true;\n\t var WeakMapPrototype = $WeakMap.prototype;\n\t var nativeDelete = WeakMapPrototype['delete'];\n\t var nativeHas = WeakMapPrototype.has;\n\t var nativeGet = WeakMapPrototype.get;\n\t var nativeSet = WeakMapPrototype.set;\n\t redefineAll$1(WeakMapPrototype, {\n\t 'delete': function (key) {\n\t if (isObject$2(key) && !isExtensible(key)) {\n\t var state = enforceIternalState(this);\n\t if (!state.frozen) state.frozen = new InternalWeakMap();\n\t return nativeDelete.call(this, key) || state.frozen['delete'](key);\n\t } return nativeDelete.call(this, key);\n\t },\n\t has: function has(key) {\n\t if (isObject$2(key) && !isExtensible(key)) {\n\t var state = enforceIternalState(this);\n\t if (!state.frozen) state.frozen = new InternalWeakMap();\n\t return nativeHas.call(this, key) || state.frozen.has(key);\n\t } return nativeHas.call(this, key);\n\t },\n\t get: function get(key) {\n\t if (isObject$2(key) && !isExtensible(key)) {\n\t var state = enforceIternalState(this);\n\t if (!state.frozen) state.frozen = new InternalWeakMap();\n\t return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n\t } return nativeGet.call(this, key);\n\t },\n\t set: function set(key, value) {\n\t if (isObject$2(key) && !isExtensible(key)) {\n\t var state = enforceIternalState(this);\n\t if (!state.frozen) state.frozen = new InternalWeakMap();\n\t nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n\t } else nativeSet.call(this, key, value);\n\t return this;\n\t }\n\t });\n\t}\n\t});\n\n\t// iterable DOM collections\n\t// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\n\tvar domIterables$1 = {\n\t CSSRuleList: 0,\n\t CSSStyleDeclaration: 0,\n\t CSSValueList: 0,\n\t ClientRectList: 0,\n\t DOMRectList: 0,\n\t DOMStringList: 0,\n\t DOMTokenList: 1,\n\t DataTransferItemList: 0,\n\t FileList: 0,\n\t HTMLAllCollection: 0,\n\t HTMLCollection: 0,\n\t HTMLFormElement: 0,\n\t HTMLSelectElement: 0,\n\t MediaList: 0,\n\t MimeTypeArray: 0,\n\t NamedNodeMap: 0,\n\t NodeList: 1,\n\t PaintRequestList: 0,\n\t Plugin: 0,\n\t PluginArray: 0,\n\t SVGLengthList: 0,\n\t SVGNumberList: 0,\n\t SVGPathSegList: 0,\n\t SVGPointList: 0,\n\t SVGStringList: 0,\n\t SVGTransformList: 0,\n\t SourceBufferList: 0,\n\t StyleSheetList: 0,\n\t TextTrackCueList: 0,\n\t TextTrackList: 0,\n\t TouchList: 0\n\t};\n\n\tvar ITERATOR$e = wellKnownSymbol$1('iterator');\n\tvar TO_STRING_TAG$8 = wellKnownSymbol$1('toStringTag');\n\tvar ArrayValues$1 = es_array_iterator$1.values;\n\n\tfor (var COLLECTION_NAME$2 in domIterables$1) {\n\t var Collection$2 = global_1$1[COLLECTION_NAME$2];\n\t var CollectionPrototype$2 = Collection$2 && Collection$2.prototype;\n\t if (CollectionPrototype$2) {\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$2[ITERATOR$e] !== ArrayValues$1) try {\n\t createNonEnumerableProperty$1(CollectionPrototype$2, ITERATOR$e, ArrayValues$1);\n\t } catch (error) {\n\t CollectionPrototype$2[ITERATOR$e] = ArrayValues$1;\n\t }\n\t if (!CollectionPrototype$2[TO_STRING_TAG$8]) {\n\t createNonEnumerableProperty$1(CollectionPrototype$2, TO_STRING_TAG$8, COLLECTION_NAME$2);\n\t }\n\t if (domIterables$1[COLLECTION_NAME$2]) for (var METHOD_NAME$1 in es_array_iterator$1) {\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$2[METHOD_NAME$1] !== es_array_iterator$1[METHOD_NAME$1]) try {\n\t createNonEnumerableProperty$1(CollectionPrototype$2, METHOD_NAME$1, es_array_iterator$1[METHOD_NAME$1]);\n\t } catch (error) {\n\t CollectionPrototype$2[METHOD_NAME$1] = es_array_iterator$1[METHOD_NAME$1];\n\t }\n\t }\n\t }\n\t}\n\n\tvar $every$1 = arrayIteration$1.every;\n\n\n\n\tvar STRICT_METHOD$6 = arrayMethodIsStrict$1('every');\n\tvar USES_TO_LENGTH$e = arrayMethodUsesToLength$1('every');\n\n\t// `Array.prototype.every` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.every\n\t_export$1({ target: 'Array', proto: true, forced: !STRICT_METHOD$6 || !USES_TO_LENGTH$e }, {\n\t every: function every(callbackfn /* , thisArg */) {\n\t return $every$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tvar $forEach$3 = arrayIteration$1.forEach;\n\n\n\n\tvar STRICT_METHOD$7 = arrayMethodIsStrict$1('forEach');\n\tvar USES_TO_LENGTH$f = arrayMethodUsesToLength$1('forEach');\n\n\t// `Array.prototype.forEach` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\tvar arrayForEach$1 = (!STRICT_METHOD$7 || !USES_TO_LENGTH$f) ? function forEach(callbackfn /* , thisArg */) {\n\t return $forEach$3(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t} : [].forEach;\n\n\t// `Array.prototype.forEach` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t_export$1({ target: 'Array', proto: true, forced: [].forEach != arrayForEach$1 }, {\n\t forEach: arrayForEach$1\n\t});\n\n\tvar $indexOf$2 = arrayIncludes$1.indexOf;\n\n\n\n\tvar nativeIndexOf$1 = [].indexOf;\n\n\tvar NEGATIVE_ZERO$2 = !!nativeIndexOf$1 && 1 / [1].indexOf(1, -0) < 0;\n\tvar STRICT_METHOD$8 = arrayMethodIsStrict$1('indexOf');\n\tvar USES_TO_LENGTH$g = arrayMethodUsesToLength$1('indexOf', { ACCESSORS: true, 1: 0 });\n\n\t// `Array.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t_export$1({ target: 'Array', proto: true, forced: NEGATIVE_ZERO$2 || !STRICT_METHOD$8 || !USES_TO_LENGTH$g }, {\n\t indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n\t return NEGATIVE_ZERO$2\n\t // convert -0 to +0\n\t ? nativeIndexOf$1.apply(this, arguments) || 0\n\t : $indexOf$2(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tvar nativeAssign$1 = Object.assign;\n\tvar defineProperty$d = Object.defineProperty;\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\tvar objectAssign$1 = !nativeAssign$1 || fails$1(function () {\n\t // should have correct order of operations (Edge bug)\n\t if (descriptors$1 && nativeAssign$1({ b: 1 }, nativeAssign$1(defineProperty$d({}, 'a', {\n\t enumerable: true,\n\t get: function () {\n\t defineProperty$d(this, 'b', {\n\t value: 3,\n\t enumerable: false\n\t });\n\t }\n\t }), { b: 2 })).b !== 1) return true;\n\t // should work with symbols and should have deterministic property order (V8 bug)\n\t var A = {};\n\t var B = {};\n\t // eslint-disable-next-line no-undef\n\t var symbol = Symbol();\n\t var alphabet = 'abcdefghijklmnopqrst';\n\t A[symbol] = 7;\n\t alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n\t return nativeAssign$1({}, A)[symbol] != 7 || objectKeys$1(nativeAssign$1({}, B)).join('') != alphabet;\n\t}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n\t var T = toObject$1(target);\n\t var argumentsLength = arguments.length;\n\t var index = 1;\n\t var getOwnPropertySymbols = objectGetOwnPropertySymbols$1.f;\n\t var propertyIsEnumerable = objectPropertyIsEnumerable$1.f;\n\t while (argumentsLength > index) {\n\t var S = indexedObject$1(arguments[index++]);\n\t var keys = getOwnPropertySymbols ? objectKeys$1(S).concat(getOwnPropertySymbols(S)) : objectKeys$1(S);\n\t var length = keys.length;\n\t var j = 0;\n\t var key;\n\t while (length > j) {\n\t key = keys[j++];\n\t if (!descriptors$1 || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n\t }\n\t } return T;\n\t} : nativeAssign$1;\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\t_export$1({ target: 'Object', stat: true, forced: Object.assign !== objectAssign$1 }, {\n\t assign: objectAssign$1\n\t});\n\n\tvar SPECIES$a = wellKnownSymbol$1('species');\n\n\t// `SpeciesConstructor` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-speciesconstructor\n\tvar speciesConstructor$1 = function (O, defaultConstructor) {\n\t var C = anObject$1(O).constructor;\n\t var S;\n\t return C === undefined || (S = anObject$1(C)[SPECIES$a]) == undefined ? defaultConstructor : aFunction$3(S);\n\t};\n\n\tvar charAt$3 = stringMultibyte$1.charAt;\n\n\t// `AdvanceStringIndex` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-advancestringindex\n\tvar advanceStringIndex$1 = function (S, index, unicode) {\n\t return index + (unicode ? charAt$3(S, index).length : 1);\n\t};\n\n\tvar arrayPush$1 = [].push;\n\tvar min$9 = Math.min;\n\tvar MAX_UINT32$1 = 0xFFFFFFFF;\n\n\t// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n\tvar SUPPORTS_Y$1 = !fails$1(function () { return !RegExp(MAX_UINT32$1, 'y'); });\n\n\t// @@split logic\n\tfixRegexpWellKnownSymbolLogic$1('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n\t var internalSplit;\n\t if (\n\t 'abbc'.split(/(b)*/)[1] == 'c' ||\n\t 'test'.split(/(?:)/, -1).length != 4 ||\n\t 'ab'.split(/(?:ab)*/).length != 2 ||\n\t '.'.split(/(.?)(.?)/).length != 4 ||\n\t '.'.split(/()()/).length > 1 ||\n\t ''.split(/.?/).length\n\t ) {\n\t // based on es5-shim implementation, need to rework it\n\t internalSplit = function (separator, limit) {\n\t var string = String(requireObjectCoercible$1(this));\n\t var lim = limit === undefined ? MAX_UINT32$1 : limit >>> 0;\n\t if (lim === 0) return [];\n\t if (separator === undefined) return [string];\n\t // If `separator` is not a regex, use native split\n\t if (!isRegexp$1(separator)) {\n\t return nativeSplit.call(string, separator, lim);\n\t }\n\t var output = [];\n\t var flags = (separator.ignoreCase ? 'i' : '') +\n\t (separator.multiline ? 'm' : '') +\n\t (separator.unicode ? 'u' : '') +\n\t (separator.sticky ? 'y' : '');\n\t var lastLastIndex = 0;\n\t // Make `global` and avoid `lastIndex` issues by working with a copy\n\t var separatorCopy = new RegExp(separator.source, flags + 'g');\n\t var match, lastIndex, lastLength;\n\t while (match = regexpExec$1.call(separatorCopy, string)) {\n\t lastIndex = separatorCopy.lastIndex;\n\t if (lastIndex > lastLastIndex) {\n\t output.push(string.slice(lastLastIndex, match.index));\n\t if (match.length > 1 && match.index < string.length) arrayPush$1.apply(output, match.slice(1));\n\t lastLength = match[0].length;\n\t lastLastIndex = lastIndex;\n\t if (output.length >= lim) break;\n\t }\n\t if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n\t }\n\t if (lastLastIndex === string.length) {\n\t if (lastLength || !separatorCopy.test('')) output.push('');\n\t } else output.push(string.slice(lastLastIndex));\n\t return output.length > lim ? output.slice(0, lim) : output;\n\t };\n\t // Chakra, V8\n\t } else if ('0'.split(undefined, 0).length) {\n\t internalSplit = function (separator, limit) {\n\t return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n\t };\n\t } else internalSplit = nativeSplit;\n\n\t return [\n\t // `String.prototype.split` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.split\n\t function split(separator, limit) {\n\t var O = requireObjectCoercible$1(this);\n\t var splitter = separator == undefined ? undefined : separator[SPLIT];\n\t return splitter !== undefined\n\t ? splitter.call(separator, O, limit)\n\t : internalSplit.call(String(O), separator, limit);\n\t },\n\t // `RegExp.prototype[@@split]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n\t //\n\t // NOTE: This cannot be properly polyfilled in engines that don't support\n\t // the 'y' flag.\n\t function (regexp, limit) {\n\t var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n\t if (res.done) return res.value;\n\n\t var rx = anObject$1(regexp);\n\t var S = String(this);\n\t var C = speciesConstructor$1(rx, RegExp);\n\n\t var unicodeMatching = rx.unicode;\n\t var flags = (rx.ignoreCase ? 'i' : '') +\n\t (rx.multiline ? 'm' : '') +\n\t (rx.unicode ? 'u' : '') +\n\t (SUPPORTS_Y$1 ? 'y' : 'g');\n\n\t // ^(? + rx + ) is needed, in combination with some S slicing, to\n\t // simulate the 'y' flag.\n\t var splitter = new C(SUPPORTS_Y$1 ? rx : '^(?:' + rx.source + ')', flags);\n\t var lim = limit === undefined ? MAX_UINT32$1 : limit >>> 0;\n\t if (lim === 0) return [];\n\t if (S.length === 0) return regexpExecAbstract$1(splitter, S) === null ? [S] : [];\n\t var p = 0;\n\t var q = 0;\n\t var A = [];\n\t while (q < S.length) {\n\t splitter.lastIndex = SUPPORTS_Y$1 ? q : 0;\n\t var z = regexpExecAbstract$1(splitter, SUPPORTS_Y$1 ? S : S.slice(q));\n\t var e;\n\t if (\n\t z === null ||\n\t (e = min$9(toLength$1(splitter.lastIndex + (SUPPORTS_Y$1 ? 0 : q)), S.length)) === p\n\t ) {\n\t q = advanceStringIndex$1(S, q, unicodeMatching);\n\t } else {\n\t A.push(S.slice(p, q));\n\t if (A.length === lim) return A;\n\t for (var i = 1; i <= z.length - 1; i++) {\n\t A.push(z[i]);\n\t if (A.length === lim) return A;\n\t }\n\t q = p = e;\n\t }\n\t }\n\t A.push(S.slice(p));\n\t return A;\n\t }\n\t ];\n\t}, !SUPPORTS_Y$1);\n\n\tvar non = '\\u200B\\u0085\\u180E';\n\n\t// check that a method works with the correct list\n\t// of whitespaces and has a correct name\n\tvar stringTrimForced = function (METHOD_NAME) {\n\t return fails$1(function () {\n\t return !!whitespaces$1[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces$1[METHOD_NAME].name !== METHOD_NAME;\n\t });\n\t};\n\n\tvar $trim = stringTrim$1.trim;\n\n\n\t// `String.prototype.trim` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t_export$1({ target: 'String', proto: true, forced: stringTrimForced('trim') }, {\n\t trim: function trim() {\n\t return $trim(this);\n\t }\n\t});\n\n\tfor (var COLLECTION_NAME$3 in domIterables$1) {\n\t var Collection$3 = global_1$1[COLLECTION_NAME$3];\n\t var CollectionPrototype$3 = Collection$3 && Collection$3.prototype;\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$3 && CollectionPrototype$3.forEach !== arrayForEach$1) try {\n\t createNonEnumerableProperty$1(CollectionPrototype$3, 'forEach', arrayForEach$1);\n\t } catch (error) {\n\t CollectionPrototype$3.forEach = arrayForEach$1;\n\t }\n\t}\n\n\tvar ITERATOR$f = wellKnownSymbol$1('iterator');\n\n\tvar nativeUrl$1 = !fails$1(function () {\n\t var url = new URL('b?a=1&b=2&c=3', 'http://a');\n\t var searchParams = url.searchParams;\n\t var result = '';\n\t url.pathname = 'c%20d';\n\t searchParams.forEach(function (value, key) {\n\t searchParams['delete']('b');\n\t result += key + value;\n\t });\n\t return (isPure$1 && !url.toJSON)\n\t || !searchParams.sort\n\t || url.href !== 'http://a/c%20d?a=1&c=3'\n\t || searchParams.get('c') !== '3'\n\t || String(new URLSearchParams('?a=1')) !== 'a=1'\n\t || !searchParams[ITERATOR$f]\n\t // throws in Edge\n\t || new URL('https://a@b').username !== 'a'\n\t || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n\t // not punycoded in Edge\n\t || new URL('http://тест').host !== 'xn--e1aybc'\n\t // not escaped in Chrome 62-\n\t || new URL('http://a#б').hash !== '#%D0%B1'\n\t // fails in Chrome 66-\n\t || result !== 'a1c3'\n\t // throws in Safari\n\t || new URL('http://x', undefined).host !== 'x';\n\t});\n\n\t// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\n\tvar maxInt$1 = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\tvar base$1 = 36;\n\tvar tMin$1 = 1;\n\tvar tMax$1 = 26;\n\tvar skew$1 = 38;\n\tvar damp$1 = 700;\n\tvar initialBias$1 = 72;\n\tvar initialN$1 = 128; // 0x80\n\tvar delimiter$1 = '-'; // '\\x2D'\n\tvar regexNonASCII$1 = /[^\\0-\\u007E]/; // non-ASCII chars\n\tvar regexSeparators$1 = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\tvar OVERFLOW_ERROR$1 = 'Overflow: input needs wider integers to process';\n\tvar baseMinusTMin$1 = base$1 - tMin$1;\n\tvar floor$7 = Math.floor;\n\tvar stringFromCharCode$1 = String.fromCharCode;\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t */\n\tvar ucs2decode$1 = function (string) {\n\t var output = [];\n\t var counter = 0;\n\t var length = string.length;\n\t while (counter < length) {\n\t var value = string.charCodeAt(counter++);\n\t if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t // It's a high surrogate, and there is a next character.\n\t var extra = string.charCodeAt(counter++);\n\t if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t } else {\n\t // It's an unmatched surrogate; only append this code unit, in case the\n\t // next code unit is the high surrogate of a surrogate pair.\n\t output.push(value);\n\t counter--;\n\t }\n\t } else {\n\t output.push(value);\n\t }\n\t }\n\t return output;\n\t};\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t */\n\tvar digitToBasic$1 = function (digit) {\n\t // 0..25 map to ASCII a..z or A..Z\n\t // 26..35 map to ASCII 0..9\n\t return digit + 22 + 75 * (digit < 26);\n\t};\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t */\n\tvar adapt$1 = function (delta, numPoints, firstTime) {\n\t var k = 0;\n\t delta = firstTime ? floor$7(delta / damp$1) : delta >> 1;\n\t delta += floor$7(delta / numPoints);\n\t for (; delta > baseMinusTMin$1 * tMax$1 >> 1; k += base$1) {\n\t delta = floor$7(delta / baseMinusTMin$1);\n\t }\n\t return floor$7(k + (baseMinusTMin$1 + 1) * delta / (delta + skew$1));\n\t};\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t */\n\t// eslint-disable-next-line max-statements\n\tvar encode$1 = function (input) {\n\t var output = [];\n\n\t // Convert the input in UCS-2 to an array of Unicode code points.\n\t input = ucs2decode$1(input);\n\n\t // Cache the length.\n\t var inputLength = input.length;\n\n\t // Initialize the state.\n\t var n = initialN$1;\n\t var delta = 0;\n\t var bias = initialBias$1;\n\t var i, currentValue;\n\n\t // Handle the basic code points.\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue < 0x80) {\n\t output.push(stringFromCharCode$1(currentValue));\n\t }\n\t }\n\n\t var basicLength = output.length; // number of basic code points.\n\t var handledCPCount = basicLength; // number of code points that have been handled;\n\n\t // Finish the basic string with a delimiter unless it's empty.\n\t if (basicLength) {\n\t output.push(delimiter$1);\n\t }\n\n\t // Main encoding loop:\n\t while (handledCPCount < inputLength) {\n\t // All non-basic code points < n have been handled already. Find the next larger one:\n\t var m = maxInt$1;\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue >= n && currentValue < m) {\n\t m = currentValue;\n\t }\n\t }\n\n\t // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n\t var handledCPCountPlusOne = handledCPCount + 1;\n\t if (m - n > floor$7((maxInt$1 - delta) / handledCPCountPlusOne)) {\n\t throw RangeError(OVERFLOW_ERROR$1);\n\t }\n\n\t delta += (m - n) * handledCPCountPlusOne;\n\t n = m;\n\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue < n && ++delta > maxInt$1) {\n\t throw RangeError(OVERFLOW_ERROR$1);\n\t }\n\t if (currentValue == n) {\n\t // Represent delta as a generalized variable-length integer.\n\t var q = delta;\n\t for (var k = base$1; /* no condition */; k += base$1) {\n\t var t = k <= bias ? tMin$1 : (k >= bias + tMax$1 ? tMax$1 : k - bias);\n\t if (q < t) break;\n\t var qMinusT = q - t;\n\t var baseMinusT = base$1 - t;\n\t output.push(stringFromCharCode$1(digitToBasic$1(t + qMinusT % baseMinusT)));\n\t q = floor$7(qMinusT / baseMinusT);\n\t }\n\n\t output.push(stringFromCharCode$1(digitToBasic$1(q)));\n\t bias = adapt$1(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t delta = 0;\n\t ++handledCPCount;\n\t }\n\t }\n\n\t ++delta;\n\t ++n;\n\t }\n\t return output.join('');\n\t};\n\n\tvar stringPunycodeToAscii$1 = function (input) {\n\t var encoded = [];\n\t var labels = input.toLowerCase().replace(regexSeparators$1, '\\u002E').split('.');\n\t var i, label;\n\t for (i = 0; i < labels.length; i++) {\n\t label = labels[i];\n\t encoded.push(regexNonASCII$1.test(label) ? 'xn--' + encode$1(label) : label);\n\t }\n\t return encoded.join('.');\n\t};\n\n\tvar getIterator$1 = function (it) {\n\t var iteratorMethod = getIteratorMethod$1(it);\n\t if (typeof iteratorMethod != 'function') {\n\t throw TypeError(String(it) + ' is not iterable');\n\t } return anObject$1(iteratorMethod.call(it));\n\t};\n\n\t// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\tvar $fetch$2 = getBuiltIn$1('fetch');\n\tvar Headers$2 = getBuiltIn$1('Headers');\n\tvar ITERATOR$g = wellKnownSymbol$1('iterator');\n\tvar URL_SEARCH_PARAMS$1 = 'URLSearchParams';\n\tvar URL_SEARCH_PARAMS_ITERATOR$1 = URL_SEARCH_PARAMS$1 + 'Iterator';\n\tvar setInternalState$c = internalState$1.set;\n\tvar getInternalParamsState$1 = internalState$1.getterFor(URL_SEARCH_PARAMS$1);\n\tvar getInternalIteratorState$1 = internalState$1.getterFor(URL_SEARCH_PARAMS_ITERATOR$1);\n\n\tvar plus$1 = /\\+/g;\n\tvar sequences$1 = Array(4);\n\n\tvar percentSequence$1 = function (bytes) {\n\t return sequences$1[bytes - 1] || (sequences$1[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n\t};\n\n\tvar percentDecode$1 = function (sequence) {\n\t try {\n\t return decodeURIComponent(sequence);\n\t } catch (error) {\n\t return sequence;\n\t }\n\t};\n\n\tvar deserialize$1 = function (it) {\n\t var result = it.replace(plus$1, ' ');\n\t var bytes = 4;\n\t try {\n\t return decodeURIComponent(result);\n\t } catch (error) {\n\t while (bytes) {\n\t result = result.replace(percentSequence$1(bytes--), percentDecode$1);\n\t }\n\t return result;\n\t }\n\t};\n\n\tvar find$3 = /[!'()~]|%20/g;\n\n\tvar replace$1 = {\n\t '!': '%21',\n\t \"'\": '%27',\n\t '(': '%28',\n\t ')': '%29',\n\t '~': '%7E',\n\t '%20': '+'\n\t};\n\n\tvar replacer$1 = function (match) {\n\t return replace$1[match];\n\t};\n\n\tvar serialize$1 = function (it) {\n\t return encodeURIComponent(it).replace(find$3, replacer$1);\n\t};\n\n\tvar parseSearchParams$1 = function (result, query) {\n\t if (query) {\n\t var attributes = query.split('&');\n\t var index = 0;\n\t var attribute, entry;\n\t while (index < attributes.length) {\n\t attribute = attributes[index++];\n\t if (attribute.length) {\n\t entry = attribute.split('=');\n\t result.push({\n\t key: deserialize$1(entry.shift()),\n\t value: deserialize$1(entry.join('='))\n\t });\n\t }\n\t }\n\t }\n\t};\n\n\tvar updateSearchParams$1 = function (query) {\n\t this.entries.length = 0;\n\t parseSearchParams$1(this.entries, query);\n\t};\n\n\tvar validateArgumentsLength$1 = function (passed, required) {\n\t if (passed < required) throw TypeError('Not enough arguments');\n\t};\n\n\tvar URLSearchParamsIterator$1 = createIteratorConstructor$1(function Iterator(params, kind) {\n\t setInternalState$c(this, {\n\t type: URL_SEARCH_PARAMS_ITERATOR$1,\n\t iterator: getIterator$1(getInternalParamsState$1(params).entries),\n\t kind: kind\n\t });\n\t}, 'Iterator', function next() {\n\t var state = getInternalIteratorState$1(this);\n\t var kind = state.kind;\n\t var step = state.iterator.next();\n\t var entry = step.value;\n\t if (!step.done) {\n\t step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n\t } return step;\n\t});\n\n\t// `URLSearchParams` constructor\n\t// https://url.spec.whatwg.org/#interface-urlsearchparams\n\tvar URLSearchParamsConstructor$1 = function URLSearchParams(/* init */) {\n\t anInstance$1(this, URLSearchParamsConstructor$1, URL_SEARCH_PARAMS$1);\n\t var init = arguments.length > 0 ? arguments[0] : undefined;\n\t var that = this;\n\t var entries = [];\n\t var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n\t setInternalState$c(that, {\n\t type: URL_SEARCH_PARAMS$1,\n\t entries: entries,\n\t updateURL: function () { /* empty */ },\n\t updateSearchParams: updateSearchParams$1\n\t });\n\n\t if (init !== undefined) {\n\t if (isObject$2(init)) {\n\t iteratorMethod = getIteratorMethod$1(init);\n\t if (typeof iteratorMethod === 'function') {\n\t iterator = iteratorMethod.call(init);\n\t next = iterator.next;\n\t while (!(step = next.call(iterator)).done) {\n\t entryIterator = getIterator$1(anObject$1(step.value));\n\t entryNext = entryIterator.next;\n\t if (\n\t (first = entryNext.call(entryIterator)).done ||\n\t (second = entryNext.call(entryIterator)).done ||\n\t !entryNext.call(entryIterator).done\n\t ) throw TypeError('Expected sequence with length 2');\n\t entries.push({ key: first.value + '', value: second.value + '' });\n\t }\n\t } else for (key in init) if (has$2(init, key)) entries.push({ key: key, value: init[key] + '' });\n\t } else {\n\t parseSearchParams$1(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n\t }\n\t }\n\t};\n\n\tvar URLSearchParamsPrototype$1 = URLSearchParamsConstructor$1.prototype;\n\n\tredefineAll$1(URLSearchParamsPrototype$1, {\n\t // `URLSearchParams.prototype.append` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n\t append: function append(name, value) {\n\t validateArgumentsLength$1(arguments.length, 2);\n\t var state = getInternalParamsState$1(this);\n\t state.entries.push({ key: name + '', value: value + '' });\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.delete` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n\t 'delete': function (name) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var state = getInternalParamsState$1(this);\n\t var entries = state.entries;\n\t var key = name + '';\n\t var index = 0;\n\t while (index < entries.length) {\n\t if (entries[index].key === key) entries.splice(index, 1);\n\t else index++;\n\t }\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.get` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n\t get: function get(name) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var entries = getInternalParamsState$1(this).entries;\n\t var key = name + '';\n\t var index = 0;\n\t for (; index < entries.length; index++) {\n\t if (entries[index].key === key) return entries[index].value;\n\t }\n\t return null;\n\t },\n\t // `URLSearchParams.prototype.getAll` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n\t getAll: function getAll(name) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var entries = getInternalParamsState$1(this).entries;\n\t var key = name + '';\n\t var result = [];\n\t var index = 0;\n\t for (; index < entries.length; index++) {\n\t if (entries[index].key === key) result.push(entries[index].value);\n\t }\n\t return result;\n\t },\n\t // `URLSearchParams.prototype.has` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n\t has: function has(name) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var entries = getInternalParamsState$1(this).entries;\n\t var key = name + '';\n\t var index = 0;\n\t while (index < entries.length) {\n\t if (entries[index++].key === key) return true;\n\t }\n\t return false;\n\t },\n\t // `URLSearchParams.prototype.set` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n\t set: function set(name, value) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var state = getInternalParamsState$1(this);\n\t var entries = state.entries;\n\t var found = false;\n\t var key = name + '';\n\t var val = value + '';\n\t var index = 0;\n\t var entry;\n\t for (; index < entries.length; index++) {\n\t entry = entries[index];\n\t if (entry.key === key) {\n\t if (found) entries.splice(index--, 1);\n\t else {\n\t found = true;\n\t entry.value = val;\n\t }\n\t }\n\t }\n\t if (!found) entries.push({ key: key, value: val });\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.sort` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n\t sort: function sort() {\n\t var state = getInternalParamsState$1(this);\n\t var entries = state.entries;\n\t // Array#sort is not stable in some engines\n\t var slice = entries.slice();\n\t var entry, entriesIndex, sliceIndex;\n\t entries.length = 0;\n\t for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n\t entry = slice[sliceIndex];\n\t for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n\t if (entries[entriesIndex].key > entry.key) {\n\t entries.splice(entriesIndex, 0, entry);\n\t break;\n\t }\n\t }\n\t if (entriesIndex === sliceIndex) entries.push(entry);\n\t }\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.forEach` method\n\t forEach: function forEach(callback /* , thisArg */) {\n\t var entries = getInternalParamsState$1(this).entries;\n\t var boundFunction = functionBindContext$1(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n\t var index = 0;\n\t var entry;\n\t while (index < entries.length) {\n\t entry = entries[index++];\n\t boundFunction(entry.value, entry.key, this);\n\t }\n\t },\n\t // `URLSearchParams.prototype.keys` method\n\t keys: function keys() {\n\t return new URLSearchParamsIterator$1(this, 'keys');\n\t },\n\t // `URLSearchParams.prototype.values` method\n\t values: function values() {\n\t return new URLSearchParamsIterator$1(this, 'values');\n\t },\n\t // `URLSearchParams.prototype.entries` method\n\t entries: function entries() {\n\t return new URLSearchParamsIterator$1(this, 'entries');\n\t }\n\t}, { enumerable: true });\n\n\t// `URLSearchParams.prototype[@@iterator]` method\n\tredefine$1(URLSearchParamsPrototype$1, ITERATOR$g, URLSearchParamsPrototype$1.entries);\n\n\t// `URLSearchParams.prototype.toString` method\n\t// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\n\tredefine$1(URLSearchParamsPrototype$1, 'toString', function toString() {\n\t var entries = getInternalParamsState$1(this).entries;\n\t var result = [];\n\t var index = 0;\n\t var entry;\n\t while (index < entries.length) {\n\t entry = entries[index++];\n\t result.push(serialize$1(entry.key) + '=' + serialize$1(entry.value));\n\t } return result.join('&');\n\t}, { enumerable: true });\n\n\tsetToStringTag$1(URLSearchParamsConstructor$1, URL_SEARCH_PARAMS$1);\n\n\t_export$1({ global: true, forced: !nativeUrl$1 }, {\n\t URLSearchParams: URLSearchParamsConstructor$1\n\t});\n\n\t// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n\t// https://github.com/zloirock/core-js/issues/674\n\tif (!nativeUrl$1 && typeof $fetch$2 == 'function' && typeof Headers$2 == 'function') {\n\t _export$1({ global: true, enumerable: true, forced: true }, {\n\t fetch: function fetch(input /* , init */) {\n\t var args = [input];\n\t var init, body, headers;\n\t if (arguments.length > 1) {\n\t init = arguments[1];\n\t if (isObject$2(init)) {\n\t body = init.body;\n\t if (classof$1(body) === URL_SEARCH_PARAMS$1) {\n\t headers = init.headers ? new Headers$2(init.headers) : new Headers$2();\n\t if (!headers.has('content-type')) {\n\t headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n\t }\n\t init = objectCreate$1(init, {\n\t body: createPropertyDescriptor$1(0, String(body)),\n\t headers: createPropertyDescriptor$1(0, headers)\n\t });\n\t }\n\t }\n\t args.push(init);\n\t } return $fetch$2.apply(this, args);\n\t }\n\t });\n\t}\n\n\tvar web_urlSearchParams$1 = {\n\t URLSearchParams: URLSearchParamsConstructor$1,\n\t getState: getInternalParamsState$1\n\t};\n\n\t// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\tvar codeAt$1 = stringMultibyte$1.codeAt;\n\n\n\n\n\n\tvar NativeURL$1 = global_1$1.URL;\n\tvar URLSearchParams$2 = web_urlSearchParams$1.URLSearchParams;\n\tvar getInternalSearchParamsState$1 = web_urlSearchParams$1.getState;\n\tvar setInternalState$d = internalState$1.set;\n\tvar getInternalURLState$1 = internalState$1.getterFor('URL');\n\tvar floor$8 = Math.floor;\n\tvar pow$2 = Math.pow;\n\n\tvar INVALID_AUTHORITY$1 = 'Invalid authority';\n\tvar INVALID_SCHEME$1 = 'Invalid scheme';\n\tvar INVALID_HOST$1 = 'Invalid host';\n\tvar INVALID_PORT$1 = 'Invalid port';\n\n\tvar ALPHA$1 = /[A-Za-z]/;\n\tvar ALPHANUMERIC$1 = /[\\d+-.A-Za-z]/;\n\tvar DIGIT$1 = /\\d/;\n\tvar HEX_START$1 = /^(0x|0X)/;\n\tvar OCT$1 = /^[0-7]+$/;\n\tvar DEC$1 = /^\\d+$/;\n\tvar HEX$1 = /^[\\dA-Fa-f]+$/;\n\t// eslint-disable-next-line no-control-regex\n\tvar FORBIDDEN_HOST_CODE_POINT$1 = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n\t// eslint-disable-next-line no-control-regex\n\tvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT$1 = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n\t// eslint-disable-next-line no-control-regex\n\tvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE$1 = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n\t// eslint-disable-next-line no-control-regex\n\tvar TAB_AND_NEW_LINE$1 = /[\\u0009\\u000A\\u000D]/g;\n\tvar EOF$1;\n\n\tvar parseHost$1 = function (url, input) {\n\t var result, codePoints, index;\n\t if (input.charAt(0) == '[') {\n\t if (input.charAt(input.length - 1) != ']') return INVALID_HOST$1;\n\t result = parseIPv6$1(input.slice(1, -1));\n\t if (!result) return INVALID_HOST$1;\n\t url.host = result;\n\t // opaque host\n\t } else if (!isSpecial$1(url)) {\n\t if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT$1.test(input)) return INVALID_HOST$1;\n\t result = '';\n\t codePoints = arrayFrom$1(input);\n\t for (index = 0; index < codePoints.length; index++) {\n\t result += percentEncode$1(codePoints[index], C0ControlPercentEncodeSet$1);\n\t }\n\t url.host = result;\n\t } else {\n\t input = stringPunycodeToAscii$1(input);\n\t if (FORBIDDEN_HOST_CODE_POINT$1.test(input)) return INVALID_HOST$1;\n\t result = parseIPv4$1(input);\n\t if (result === null) return INVALID_HOST$1;\n\t url.host = result;\n\t }\n\t};\n\n\tvar parseIPv4$1 = function (input) {\n\t var parts = input.split('.');\n\t var partsLength, numbers, index, part, radix, number, ipv4;\n\t if (parts.length && parts[parts.length - 1] == '') {\n\t parts.pop();\n\t }\n\t partsLength = parts.length;\n\t if (partsLength > 4) return input;\n\t numbers = [];\n\t for (index = 0; index < partsLength; index++) {\n\t part = parts[index];\n\t if (part == '') return input;\n\t radix = 10;\n\t if (part.length > 1 && part.charAt(0) == '0') {\n\t radix = HEX_START$1.test(part) ? 16 : 8;\n\t part = part.slice(radix == 8 ? 1 : 2);\n\t }\n\t if (part === '') {\n\t number = 0;\n\t } else {\n\t if (!(radix == 10 ? DEC$1 : radix == 8 ? OCT$1 : HEX$1).test(part)) return input;\n\t number = parseInt(part, radix);\n\t }\n\t numbers.push(number);\n\t }\n\t for (index = 0; index < partsLength; index++) {\n\t number = numbers[index];\n\t if (index == partsLength - 1) {\n\t if (number >= pow$2(256, 5 - partsLength)) return null;\n\t } else if (number > 255) return null;\n\t }\n\t ipv4 = numbers.pop();\n\t for (index = 0; index < numbers.length; index++) {\n\t ipv4 += numbers[index] * pow$2(256, 3 - index);\n\t }\n\t return ipv4;\n\t};\n\n\t// eslint-disable-next-line max-statements\n\tvar parseIPv6$1 = function (input) {\n\t var address = [0, 0, 0, 0, 0, 0, 0, 0];\n\t var pieceIndex = 0;\n\t var compress = null;\n\t var pointer = 0;\n\t var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n\t var char = function () {\n\t return input.charAt(pointer);\n\t };\n\n\t if (char() == ':') {\n\t if (input.charAt(1) != ':') return;\n\t pointer += 2;\n\t pieceIndex++;\n\t compress = pieceIndex;\n\t }\n\t while (char()) {\n\t if (pieceIndex == 8) return;\n\t if (char() == ':') {\n\t if (compress !== null) return;\n\t pointer++;\n\t pieceIndex++;\n\t compress = pieceIndex;\n\t continue;\n\t }\n\t value = length = 0;\n\t while (length < 4 && HEX$1.test(char())) {\n\t value = value * 16 + parseInt(char(), 16);\n\t pointer++;\n\t length++;\n\t }\n\t if (char() == '.') {\n\t if (length == 0) return;\n\t pointer -= length;\n\t if (pieceIndex > 6) return;\n\t numbersSeen = 0;\n\t while (char()) {\n\t ipv4Piece = null;\n\t if (numbersSeen > 0) {\n\t if (char() == '.' && numbersSeen < 4) pointer++;\n\t else return;\n\t }\n\t if (!DIGIT$1.test(char())) return;\n\t while (DIGIT$1.test(char())) {\n\t number = parseInt(char(), 10);\n\t if (ipv4Piece === null) ipv4Piece = number;\n\t else if (ipv4Piece == 0) return;\n\t else ipv4Piece = ipv4Piece * 10 + number;\n\t if (ipv4Piece > 255) return;\n\t pointer++;\n\t }\n\t address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n\t numbersSeen++;\n\t if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n\t }\n\t if (numbersSeen != 4) return;\n\t break;\n\t } else if (char() == ':') {\n\t pointer++;\n\t if (!char()) return;\n\t } else if (char()) return;\n\t address[pieceIndex++] = value;\n\t }\n\t if (compress !== null) {\n\t swaps = pieceIndex - compress;\n\t pieceIndex = 7;\n\t while (pieceIndex != 0 && swaps > 0) {\n\t swap = address[pieceIndex];\n\t address[pieceIndex--] = address[compress + swaps - 1];\n\t address[compress + --swaps] = swap;\n\t }\n\t } else if (pieceIndex != 8) return;\n\t return address;\n\t};\n\n\tvar findLongestZeroSequence$1 = function (ipv6) {\n\t var maxIndex = null;\n\t var maxLength = 1;\n\t var currStart = null;\n\t var currLength = 0;\n\t var index = 0;\n\t for (; index < 8; index++) {\n\t if (ipv6[index] !== 0) {\n\t if (currLength > maxLength) {\n\t maxIndex = currStart;\n\t maxLength = currLength;\n\t }\n\t currStart = null;\n\t currLength = 0;\n\t } else {\n\t if (currStart === null) currStart = index;\n\t ++currLength;\n\t }\n\t }\n\t if (currLength > maxLength) {\n\t maxIndex = currStart;\n\t maxLength = currLength;\n\t }\n\t return maxIndex;\n\t};\n\n\tvar serializeHost$1 = function (host) {\n\t var result, index, compress, ignore0;\n\t // ipv4\n\t if (typeof host == 'number') {\n\t result = [];\n\t for (index = 0; index < 4; index++) {\n\t result.unshift(host % 256);\n\t host = floor$8(host / 256);\n\t } return result.join('.');\n\t // ipv6\n\t } else if (typeof host == 'object') {\n\t result = '';\n\t compress = findLongestZeroSequence$1(host);\n\t for (index = 0; index < 8; index++) {\n\t if (ignore0 && host[index] === 0) continue;\n\t if (ignore0) ignore0 = false;\n\t if (compress === index) {\n\t result += index ? ':' : '::';\n\t ignore0 = true;\n\t } else {\n\t result += host[index].toString(16);\n\t if (index < 7) result += ':';\n\t }\n\t }\n\t return '[' + result + ']';\n\t } return host;\n\t};\n\n\tvar C0ControlPercentEncodeSet$1 = {};\n\tvar fragmentPercentEncodeSet$1 = objectAssign$1({}, C0ControlPercentEncodeSet$1, {\n\t ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n\t});\n\tvar pathPercentEncodeSet$1 = objectAssign$1({}, fragmentPercentEncodeSet$1, {\n\t '#': 1, '?': 1, '{': 1, '}': 1\n\t});\n\tvar userinfoPercentEncodeSet$1 = objectAssign$1({}, pathPercentEncodeSet$1, {\n\t '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n\t});\n\n\tvar percentEncode$1 = function (char, set) {\n\t var code = codeAt$1(char, 0);\n\t return code > 0x20 && code < 0x7F && !has$2(set, char) ? char : encodeURIComponent(char);\n\t};\n\n\tvar specialSchemes$1 = {\n\t ftp: 21,\n\t file: null,\n\t http: 80,\n\t https: 443,\n\t ws: 80,\n\t wss: 443\n\t};\n\n\tvar isSpecial$1 = function (url) {\n\t return has$2(specialSchemes$1, url.scheme);\n\t};\n\n\tvar includesCredentials$1 = function (url) {\n\t return url.username != '' || url.password != '';\n\t};\n\n\tvar cannotHaveUsernamePasswordPort$1 = function (url) {\n\t return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n\t};\n\n\tvar isWindowsDriveLetter$1 = function (string, normalized) {\n\t var second;\n\t return string.length == 2 && ALPHA$1.test(string.charAt(0))\n\t && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n\t};\n\n\tvar startsWithWindowsDriveLetter$1 = function (string) {\n\t var third;\n\t return string.length > 1 && isWindowsDriveLetter$1(string.slice(0, 2)) && (\n\t string.length == 2 ||\n\t ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n\t );\n\t};\n\n\tvar shortenURLsPath$1 = function (url) {\n\t var path = url.path;\n\t var pathSize = path.length;\n\t if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter$1(path[0], true))) {\n\t path.pop();\n\t }\n\t};\n\n\tvar isSingleDot$1 = function (segment) {\n\t return segment === '.' || segment.toLowerCase() === '%2e';\n\t};\n\n\tvar isDoubleDot$1 = function (segment) {\n\t segment = segment.toLowerCase();\n\t return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n\t};\n\n\t// States:\n\tvar SCHEME_START$1 = {};\n\tvar SCHEME$1 = {};\n\tvar NO_SCHEME$1 = {};\n\tvar SPECIAL_RELATIVE_OR_AUTHORITY$1 = {};\n\tvar PATH_OR_AUTHORITY$1 = {};\n\tvar RELATIVE$1 = {};\n\tvar RELATIVE_SLASH$1 = {};\n\tvar SPECIAL_AUTHORITY_SLASHES$1 = {};\n\tvar SPECIAL_AUTHORITY_IGNORE_SLASHES$1 = {};\n\tvar AUTHORITY$1 = {};\n\tvar HOST$1 = {};\n\tvar HOSTNAME$1 = {};\n\tvar PORT$1 = {};\n\tvar FILE$1 = {};\n\tvar FILE_SLASH$1 = {};\n\tvar FILE_HOST$1 = {};\n\tvar PATH_START$1 = {};\n\tvar PATH$1 = {};\n\tvar CANNOT_BE_A_BASE_URL_PATH$1 = {};\n\tvar QUERY$1 = {};\n\tvar FRAGMENT$1 = {};\n\n\t// eslint-disable-next-line max-statements\n\tvar parseURL$1 = function (url, input, stateOverride, base) {\n\t var state = stateOverride || SCHEME_START$1;\n\t var pointer = 0;\n\t var buffer = '';\n\t var seenAt = false;\n\t var seenBracket = false;\n\t var seenPasswordToken = false;\n\t var codePoints, char, bufferCodePoints, failure;\n\n\t if (!stateOverride) {\n\t url.scheme = '';\n\t url.username = '';\n\t url.password = '';\n\t url.host = null;\n\t url.port = null;\n\t url.path = [];\n\t url.query = null;\n\t url.fragment = null;\n\t url.cannotBeABaseURL = false;\n\t input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE$1, '');\n\t }\n\n\t input = input.replace(TAB_AND_NEW_LINE$1, '');\n\n\t codePoints = arrayFrom$1(input);\n\n\t while (pointer <= codePoints.length) {\n\t char = codePoints[pointer];\n\t switch (state) {\n\t case SCHEME_START$1:\n\t if (char && ALPHA$1.test(char)) {\n\t buffer += char.toLowerCase();\n\t state = SCHEME$1;\n\t } else if (!stateOverride) {\n\t state = NO_SCHEME$1;\n\t continue;\n\t } else return INVALID_SCHEME$1;\n\t break;\n\n\t case SCHEME$1:\n\t if (char && (ALPHANUMERIC$1.test(char) || char == '+' || char == '-' || char == '.')) {\n\t buffer += char.toLowerCase();\n\t } else if (char == ':') {\n\t if (stateOverride && (\n\t (isSpecial$1(url) != has$2(specialSchemes$1, buffer)) ||\n\t (buffer == 'file' && (includesCredentials$1(url) || url.port !== null)) ||\n\t (url.scheme == 'file' && !url.host)\n\t )) return;\n\t url.scheme = buffer;\n\t if (stateOverride) {\n\t if (isSpecial$1(url) && specialSchemes$1[url.scheme] == url.port) url.port = null;\n\t return;\n\t }\n\t buffer = '';\n\t if (url.scheme == 'file') {\n\t state = FILE$1;\n\t } else if (isSpecial$1(url) && base && base.scheme == url.scheme) {\n\t state = SPECIAL_RELATIVE_OR_AUTHORITY$1;\n\t } else if (isSpecial$1(url)) {\n\t state = SPECIAL_AUTHORITY_SLASHES$1;\n\t } else if (codePoints[pointer + 1] == '/') {\n\t state = PATH_OR_AUTHORITY$1;\n\t pointer++;\n\t } else {\n\t url.cannotBeABaseURL = true;\n\t url.path.push('');\n\t state = CANNOT_BE_A_BASE_URL_PATH$1;\n\t }\n\t } else if (!stateOverride) {\n\t buffer = '';\n\t state = NO_SCHEME$1;\n\t pointer = 0;\n\t continue;\n\t } else return INVALID_SCHEME$1;\n\t break;\n\n\t case NO_SCHEME$1:\n\t if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME$1;\n\t if (base.cannotBeABaseURL && char == '#') {\n\t url.scheme = base.scheme;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t url.cannotBeABaseURL = true;\n\t state = FRAGMENT$1;\n\t break;\n\t }\n\t state = base.scheme == 'file' ? FILE$1 : RELATIVE$1;\n\t continue;\n\n\t case SPECIAL_RELATIVE_OR_AUTHORITY$1:\n\t if (char == '/' && codePoints[pointer + 1] == '/') {\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES$1;\n\t pointer++;\n\t } else {\n\t state = RELATIVE$1;\n\t continue;\n\t } break;\n\n\t case PATH_OR_AUTHORITY$1:\n\t if (char == '/') {\n\t state = AUTHORITY$1;\n\t break;\n\t } else {\n\t state = PATH$1;\n\t continue;\n\t }\n\n\t case RELATIVE$1:\n\t url.scheme = base.scheme;\n\t if (char == EOF$1) {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t } else if (char == '/' || (char == '\\\\' && isSpecial$1(url))) {\n\t state = RELATIVE_SLASH$1;\n\t } else if (char == '?') {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (char == '#') {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.path.pop();\n\t state = PATH$1;\n\t continue;\n\t } break;\n\n\t case RELATIVE_SLASH$1:\n\t if (isSpecial$1(url) && (char == '/' || char == '\\\\')) {\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES$1;\n\t } else if (char == '/') {\n\t state = AUTHORITY$1;\n\t } else {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t state = PATH$1;\n\t continue;\n\t } break;\n\n\t case SPECIAL_AUTHORITY_SLASHES$1:\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES$1;\n\t if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n\t pointer++;\n\t break;\n\n\t case SPECIAL_AUTHORITY_IGNORE_SLASHES$1:\n\t if (char != '/' && char != '\\\\') {\n\t state = AUTHORITY$1;\n\t continue;\n\t } break;\n\n\t case AUTHORITY$1:\n\t if (char == '@') {\n\t if (seenAt) buffer = '%40' + buffer;\n\t seenAt = true;\n\t bufferCodePoints = arrayFrom$1(buffer);\n\t for (var i = 0; i < bufferCodePoints.length; i++) {\n\t var codePoint = bufferCodePoints[i];\n\t if (codePoint == ':' && !seenPasswordToken) {\n\t seenPasswordToken = true;\n\t continue;\n\t }\n\t var encodedCodePoints = percentEncode$1(codePoint, userinfoPercentEncodeSet$1);\n\t if (seenPasswordToken) url.password += encodedCodePoints;\n\t else url.username += encodedCodePoints;\n\t }\n\t buffer = '';\n\t } else if (\n\t char == EOF$1 || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial$1(url))\n\t ) {\n\t if (seenAt && buffer == '') return INVALID_AUTHORITY$1;\n\t pointer -= arrayFrom$1(buffer).length + 1;\n\t buffer = '';\n\t state = HOST$1;\n\t } else buffer += char;\n\t break;\n\n\t case HOST$1:\n\t case HOSTNAME$1:\n\t if (stateOverride && url.scheme == 'file') {\n\t state = FILE_HOST$1;\n\t continue;\n\t } else if (char == ':' && !seenBracket) {\n\t if (buffer == '') return INVALID_HOST$1;\n\t failure = parseHost$1(url, buffer);\n\t if (failure) return failure;\n\t buffer = '';\n\t state = PORT$1;\n\t if (stateOverride == HOSTNAME$1) return;\n\t } else if (\n\t char == EOF$1 || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial$1(url))\n\t ) {\n\t if (isSpecial$1(url) && buffer == '') return INVALID_HOST$1;\n\t if (stateOverride && buffer == '' && (includesCredentials$1(url) || url.port !== null)) return;\n\t failure = parseHost$1(url, buffer);\n\t if (failure) return failure;\n\t buffer = '';\n\t state = PATH_START$1;\n\t if (stateOverride) return;\n\t continue;\n\t } else {\n\t if (char == '[') seenBracket = true;\n\t else if (char == ']') seenBracket = false;\n\t buffer += char;\n\t } break;\n\n\t case PORT$1:\n\t if (DIGIT$1.test(char)) {\n\t buffer += char;\n\t } else if (\n\t char == EOF$1 || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial$1(url)) ||\n\t stateOverride\n\t ) {\n\t if (buffer != '') {\n\t var port = parseInt(buffer, 10);\n\t if (port > 0xFFFF) return INVALID_PORT$1;\n\t url.port = (isSpecial$1(url) && port === specialSchemes$1[url.scheme]) ? null : port;\n\t buffer = '';\n\t }\n\t if (stateOverride) return;\n\t state = PATH_START$1;\n\t continue;\n\t } else return INVALID_PORT$1;\n\t break;\n\n\t case FILE$1:\n\t url.scheme = 'file';\n\t if (char == '/' || char == '\\\\') state = FILE_SLASH$1;\n\t else if (base && base.scheme == 'file') {\n\t if (char == EOF$1) {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t } else if (char == '?') {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (char == '#') {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else {\n\t if (!startsWithWindowsDriveLetter$1(codePoints.slice(pointer).join(''))) {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t shortenURLsPath$1(url);\n\t }\n\t state = PATH$1;\n\t continue;\n\t }\n\t } else {\n\t state = PATH$1;\n\t continue;\n\t } break;\n\n\t case FILE_SLASH$1:\n\t if (char == '/' || char == '\\\\') {\n\t state = FILE_HOST$1;\n\t break;\n\t }\n\t if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter$1(codePoints.slice(pointer).join(''))) {\n\t if (isWindowsDriveLetter$1(base.path[0], true)) url.path.push(base.path[0]);\n\t else url.host = base.host;\n\t }\n\t state = PATH$1;\n\t continue;\n\n\t case FILE_HOST$1:\n\t if (char == EOF$1 || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n\t if (!stateOverride && isWindowsDriveLetter$1(buffer)) {\n\t state = PATH$1;\n\t } else if (buffer == '') {\n\t url.host = '';\n\t if (stateOverride) return;\n\t state = PATH_START$1;\n\t } else {\n\t failure = parseHost$1(url, buffer);\n\t if (failure) return failure;\n\t if (url.host == 'localhost') url.host = '';\n\t if (stateOverride) return;\n\t buffer = '';\n\t state = PATH_START$1;\n\t } continue;\n\t } else buffer += char;\n\t break;\n\n\t case PATH_START$1:\n\t if (isSpecial$1(url)) {\n\t state = PATH$1;\n\t if (char != '/' && char != '\\\\') continue;\n\t } else if (!stateOverride && char == '?') {\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (!stateOverride && char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else if (char != EOF$1) {\n\t state = PATH$1;\n\t if (char != '/') continue;\n\t } break;\n\n\t case PATH$1:\n\t if (\n\t char == EOF$1 || char == '/' ||\n\t (char == '\\\\' && isSpecial$1(url)) ||\n\t (!stateOverride && (char == '?' || char == '#'))\n\t ) {\n\t if (isDoubleDot$1(buffer)) {\n\t shortenURLsPath$1(url);\n\t if (char != '/' && !(char == '\\\\' && isSpecial$1(url))) {\n\t url.path.push('');\n\t }\n\t } else if (isSingleDot$1(buffer)) {\n\t if (char != '/' && !(char == '\\\\' && isSpecial$1(url))) {\n\t url.path.push('');\n\t }\n\t } else {\n\t if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter$1(buffer)) {\n\t if (url.host) url.host = '';\n\t buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n\t }\n\t url.path.push(buffer);\n\t }\n\t buffer = '';\n\t if (url.scheme == 'file' && (char == EOF$1 || char == '?' || char == '#')) {\n\t while (url.path.length > 1 && url.path[0] === '') {\n\t url.path.shift();\n\t }\n\t }\n\t if (char == '?') {\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t }\n\t } else {\n\t buffer += percentEncode$1(char, pathPercentEncodeSet$1);\n\t } break;\n\n\t case CANNOT_BE_A_BASE_URL_PATH$1:\n\t if (char == '?') {\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else if (char != EOF$1) {\n\t url.path[0] += percentEncode$1(char, C0ControlPercentEncodeSet$1);\n\t } break;\n\n\t case QUERY$1:\n\t if (!stateOverride && char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else if (char != EOF$1) {\n\t if (char == \"'\" && isSpecial$1(url)) url.query += '%27';\n\t else if (char == '#') url.query += '%23';\n\t else url.query += percentEncode$1(char, C0ControlPercentEncodeSet$1);\n\t } break;\n\n\t case FRAGMENT$1:\n\t if (char != EOF$1) url.fragment += percentEncode$1(char, fragmentPercentEncodeSet$1);\n\t break;\n\t }\n\n\t pointer++;\n\t }\n\t};\n\n\t// `URL` constructor\n\t// https://url.spec.whatwg.org/#url-class\n\tvar URLConstructor$1 = function URL(url /* , base */) {\n\t var that = anInstance$1(this, URLConstructor$1, 'URL');\n\t var base = arguments.length > 1 ? arguments[1] : undefined;\n\t var urlString = String(url);\n\t var state = setInternalState$d(that, { type: 'URL' });\n\t var baseState, failure;\n\t if (base !== undefined) {\n\t if (base instanceof URLConstructor$1) baseState = getInternalURLState$1(base);\n\t else {\n\t failure = parseURL$1(baseState = {}, String(base));\n\t if (failure) throw TypeError(failure);\n\t }\n\t }\n\t failure = parseURL$1(state, urlString, null, baseState);\n\t if (failure) throw TypeError(failure);\n\t var searchParams = state.searchParams = new URLSearchParams$2();\n\t var searchParamsState = getInternalSearchParamsState$1(searchParams);\n\t searchParamsState.updateSearchParams(state.query);\n\t searchParamsState.updateURL = function () {\n\t state.query = String(searchParams) || null;\n\t };\n\t if (!descriptors$1) {\n\t that.href = serializeURL$1.call(that);\n\t that.origin = getOrigin$1.call(that);\n\t that.protocol = getProtocol$1.call(that);\n\t that.username = getUsername$1.call(that);\n\t that.password = getPassword$1.call(that);\n\t that.host = getHost$1.call(that);\n\t that.hostname = getHostname$1.call(that);\n\t that.port = getPort$1.call(that);\n\t that.pathname = getPathname$1.call(that);\n\t that.search = getSearch$1.call(that);\n\t that.searchParams = getSearchParams$1.call(that);\n\t that.hash = getHash$1.call(that);\n\t }\n\t};\n\n\tvar URLPrototype$1 = URLConstructor$1.prototype;\n\n\tvar serializeURL$1 = function () {\n\t var url = getInternalURLState$1(this);\n\t var scheme = url.scheme;\n\t var username = url.username;\n\t var password = url.password;\n\t var host = url.host;\n\t var port = url.port;\n\t var path = url.path;\n\t var query = url.query;\n\t var fragment = url.fragment;\n\t var output = scheme + ':';\n\t if (host !== null) {\n\t output += '//';\n\t if (includesCredentials$1(url)) {\n\t output += username + (password ? ':' + password : '') + '@';\n\t }\n\t output += serializeHost$1(host);\n\t if (port !== null) output += ':' + port;\n\t } else if (scheme == 'file') output += '//';\n\t output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t if (query !== null) output += '?' + query;\n\t if (fragment !== null) output += '#' + fragment;\n\t return output;\n\t};\n\n\tvar getOrigin$1 = function () {\n\t var url = getInternalURLState$1(this);\n\t var scheme = url.scheme;\n\t var port = url.port;\n\t if (scheme == 'blob') try {\n\t return new URL(scheme.path[0]).origin;\n\t } catch (error) {\n\t return 'null';\n\t }\n\t if (scheme == 'file' || !isSpecial$1(url)) return 'null';\n\t return scheme + '://' + serializeHost$1(url.host) + (port !== null ? ':' + port : '');\n\t};\n\n\tvar getProtocol$1 = function () {\n\t return getInternalURLState$1(this).scheme + ':';\n\t};\n\n\tvar getUsername$1 = function () {\n\t return getInternalURLState$1(this).username;\n\t};\n\n\tvar getPassword$1 = function () {\n\t return getInternalURLState$1(this).password;\n\t};\n\n\tvar getHost$1 = function () {\n\t var url = getInternalURLState$1(this);\n\t var host = url.host;\n\t var port = url.port;\n\t return host === null ? ''\n\t : port === null ? serializeHost$1(host)\n\t : serializeHost$1(host) + ':' + port;\n\t};\n\n\tvar getHostname$1 = function () {\n\t var host = getInternalURLState$1(this).host;\n\t return host === null ? '' : serializeHost$1(host);\n\t};\n\n\tvar getPort$1 = function () {\n\t var port = getInternalURLState$1(this).port;\n\t return port === null ? '' : String(port);\n\t};\n\n\tvar getPathname$1 = function () {\n\t var url = getInternalURLState$1(this);\n\t var path = url.path;\n\t return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t};\n\n\tvar getSearch$1 = function () {\n\t var query = getInternalURLState$1(this).query;\n\t return query ? '?' + query : '';\n\t};\n\n\tvar getSearchParams$1 = function () {\n\t return getInternalURLState$1(this).searchParams;\n\t};\n\n\tvar getHash$1 = function () {\n\t var fragment = getInternalURLState$1(this).fragment;\n\t return fragment ? '#' + fragment : '';\n\t};\n\n\tvar accessorDescriptor$1 = function (getter, setter) {\n\t return { get: getter, set: setter, configurable: true, enumerable: true };\n\t};\n\n\tif (descriptors$1) {\n\t objectDefineProperties$1(URLPrototype$1, {\n\t // `URL.prototype.href` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-href\n\t href: accessorDescriptor$1(serializeURL$1, function (href) {\n\t var url = getInternalURLState$1(this);\n\t var urlString = String(href);\n\t var failure = parseURL$1(url, urlString);\n\t if (failure) throw TypeError(failure);\n\t getInternalSearchParamsState$1(url.searchParams).updateSearchParams(url.query);\n\t }),\n\t // `URL.prototype.origin` getter\n\t // https://url.spec.whatwg.org/#dom-url-origin\n\t origin: accessorDescriptor$1(getOrigin$1),\n\t // `URL.prototype.protocol` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-protocol\n\t protocol: accessorDescriptor$1(getProtocol$1, function (protocol) {\n\t var url = getInternalURLState$1(this);\n\t parseURL$1(url, String(protocol) + ':', SCHEME_START$1);\n\t }),\n\t // `URL.prototype.username` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-username\n\t username: accessorDescriptor$1(getUsername$1, function (username) {\n\t var url = getInternalURLState$1(this);\n\t var codePoints = arrayFrom$1(String(username));\n\t if (cannotHaveUsernamePasswordPort$1(url)) return;\n\t url.username = '';\n\t for (var i = 0; i < codePoints.length; i++) {\n\t url.username += percentEncode$1(codePoints[i], userinfoPercentEncodeSet$1);\n\t }\n\t }),\n\t // `URL.prototype.password` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-password\n\t password: accessorDescriptor$1(getPassword$1, function (password) {\n\t var url = getInternalURLState$1(this);\n\t var codePoints = arrayFrom$1(String(password));\n\t if (cannotHaveUsernamePasswordPort$1(url)) return;\n\t url.password = '';\n\t for (var i = 0; i < codePoints.length; i++) {\n\t url.password += percentEncode$1(codePoints[i], userinfoPercentEncodeSet$1);\n\t }\n\t }),\n\t // `URL.prototype.host` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-host\n\t host: accessorDescriptor$1(getHost$1, function (host) {\n\t var url = getInternalURLState$1(this);\n\t if (url.cannotBeABaseURL) return;\n\t parseURL$1(url, String(host), HOST$1);\n\t }),\n\t // `URL.prototype.hostname` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-hostname\n\t hostname: accessorDescriptor$1(getHostname$1, function (hostname) {\n\t var url = getInternalURLState$1(this);\n\t if (url.cannotBeABaseURL) return;\n\t parseURL$1(url, String(hostname), HOSTNAME$1);\n\t }),\n\t // `URL.prototype.port` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-port\n\t port: accessorDescriptor$1(getPort$1, function (port) {\n\t var url = getInternalURLState$1(this);\n\t if (cannotHaveUsernamePasswordPort$1(url)) return;\n\t port = String(port);\n\t if (port == '') url.port = null;\n\t else parseURL$1(url, port, PORT$1);\n\t }),\n\t // `URL.prototype.pathname` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-pathname\n\t pathname: accessorDescriptor$1(getPathname$1, function (pathname) {\n\t var url = getInternalURLState$1(this);\n\t if (url.cannotBeABaseURL) return;\n\t url.path = [];\n\t parseURL$1(url, pathname + '', PATH_START$1);\n\t }),\n\t // `URL.prototype.search` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-search\n\t search: accessorDescriptor$1(getSearch$1, function (search) {\n\t var url = getInternalURLState$1(this);\n\t search = String(search);\n\t if (search == '') {\n\t url.query = null;\n\t } else {\n\t if ('?' == search.charAt(0)) search = search.slice(1);\n\t url.query = '';\n\t parseURL$1(url, search, QUERY$1);\n\t }\n\t getInternalSearchParamsState$1(url.searchParams).updateSearchParams(url.query);\n\t }),\n\t // `URL.prototype.searchParams` getter\n\t // https://url.spec.whatwg.org/#dom-url-searchparams\n\t searchParams: accessorDescriptor$1(getSearchParams$1),\n\t // `URL.prototype.hash` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-hash\n\t hash: accessorDescriptor$1(getHash$1, function (hash) {\n\t var url = getInternalURLState$1(this);\n\t hash = String(hash);\n\t if (hash == '') {\n\t url.fragment = null;\n\t return;\n\t }\n\t if ('#' == hash.charAt(0)) hash = hash.slice(1);\n\t url.fragment = '';\n\t parseURL$1(url, hash, FRAGMENT$1);\n\t })\n\t });\n\t}\n\n\t// `URL.prototype.toJSON` method\n\t// https://url.spec.whatwg.org/#dom-url-tojson\n\tredefine$1(URLPrototype$1, 'toJSON', function toJSON() {\n\t return serializeURL$1.call(this);\n\t}, { enumerable: true });\n\n\t// `URL.prototype.toString` method\n\t// https://url.spec.whatwg.org/#URL-stringification-behavior\n\tredefine$1(URLPrototype$1, 'toString', function toString() {\n\t return serializeURL$1.call(this);\n\t}, { enumerable: true });\n\n\tif (NativeURL$1) {\n\t var nativeCreateObjectURL$1 = NativeURL$1.createObjectURL;\n\t var nativeRevokeObjectURL$1 = NativeURL$1.revokeObjectURL;\n\t // `URL.createObjectURL` method\n\t // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n\t // eslint-disable-next-line no-unused-vars\n\t if (nativeCreateObjectURL$1) redefine$1(URLConstructor$1, 'createObjectURL', function createObjectURL(blob) {\n\t return nativeCreateObjectURL$1.apply(NativeURL$1, arguments);\n\t });\n\t // `URL.revokeObjectURL` method\n\t // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n\t // eslint-disable-next-line no-unused-vars\n\t if (nativeRevokeObjectURL$1) redefine$1(URLConstructor$1, 'revokeObjectURL', function revokeObjectURL(url) {\n\t return nativeRevokeObjectURL$1.apply(NativeURL$1, arguments);\n\t });\n\t}\n\n\tsetToStringTag$1(URLConstructor$1, 'URL');\n\n\t_export$1({ global: true, forced: !nativeUrl$1, sham: !descriptors$1 }, {\n\t URL: URLConstructor$1\n\t});\n\n\tvar $some$2 = arrayIteration$1.some;\n\n\n\n\tvar STRICT_METHOD$9 = arrayMethodIsStrict$1('some');\n\tvar USES_TO_LENGTH$h = arrayMethodUsesToLength$1('some');\n\n\t// `Array.prototype.some` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t_export$1({ target: 'Array', proto: true, forced: !STRICT_METHOD$9 || !USES_TO_LENGTH$h }, {\n\t some: function some(callbackfn /* , thisArg */) {\n\t return $some$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// `thisNumberValue` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-thisnumbervalue\n\tvar thisNumberValue = function (value) {\n\t if (typeof value != 'number' && classofRaw$1(value) != 'Number') {\n\t throw TypeError('Incorrect invocation');\n\t }\n\t return +value;\n\t};\n\n\t// `String.prototype.repeat` method implementation\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n\tvar stringRepeat = ''.repeat || function repeat(count) {\n\t var str = String(requireObjectCoercible$1(this));\n\t var result = '';\n\t var n = toInteger$1(count);\n\t if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n\t for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n\t return result;\n\t};\n\n\tvar nativeToFixed = 1.0.toFixed;\n\tvar floor$9 = Math.floor;\n\n\tvar pow$3 = function (x, n, acc) {\n\t return n === 0 ? acc : n % 2 === 1 ? pow$3(x, n - 1, acc * x) : pow$3(x * x, n / 2, acc);\n\t};\n\n\tvar log$1 = function (x) {\n\t var n = 0;\n\t var x2 = x;\n\t while (x2 >= 4096) {\n\t n += 12;\n\t x2 /= 4096;\n\t }\n\t while (x2 >= 2) {\n\t n += 1;\n\t x2 /= 2;\n\t } return n;\n\t};\n\n\tvar FORCED$9 = nativeToFixed && (\n\t 0.00008.toFixed(3) !== '0.000' ||\n\t 0.9.toFixed(0) !== '1' ||\n\t 1.255.toFixed(2) !== '1.25' ||\n\t 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n\t) || !fails$1(function () {\n\t // V8 ~ Android 4.3-\n\t nativeToFixed.call({});\n\t});\n\n\t// `Number.prototype.toFixed` method\n\t// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n\t_export$1({ target: 'Number', proto: true, forced: FORCED$9 }, {\n\t // eslint-disable-next-line max-statements\n\t toFixed: function toFixed(fractionDigits) {\n\t var number = thisNumberValue(this);\n\t var fractDigits = toInteger$1(fractionDigits);\n\t var data = [0, 0, 0, 0, 0, 0];\n\t var sign = '';\n\t var result = '0';\n\t var e, z, j, k;\n\n\t var multiply = function (n, c) {\n\t var index = -1;\n\t var c2 = c;\n\t while (++index < 6) {\n\t c2 += n * data[index];\n\t data[index] = c2 % 1e7;\n\t c2 = floor$9(c2 / 1e7);\n\t }\n\t };\n\n\t var divide = function (n) {\n\t var index = 6;\n\t var c = 0;\n\t while (--index >= 0) {\n\t c += data[index];\n\t data[index] = floor$9(c / n);\n\t c = (c % n) * 1e7;\n\t }\n\t };\n\n\t var dataToString = function () {\n\t var index = 6;\n\t var s = '';\n\t while (--index >= 0) {\n\t if (s !== '' || index === 0 || data[index] !== 0) {\n\t var t = String(data[index]);\n\t s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;\n\t }\n\t } return s;\n\t };\n\n\t if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n\t // eslint-disable-next-line no-self-compare\n\t if (number != number) return 'NaN';\n\t if (number <= -1e21 || number >= 1e21) return String(number);\n\t if (number < 0) {\n\t sign = '-';\n\t number = -number;\n\t }\n\t if (number > 1e-21) {\n\t e = log$1(number * pow$3(2, 69, 1)) - 69;\n\t z = e < 0 ? number * pow$3(2, -e, 1) : number / pow$3(2, e, 1);\n\t z *= 0x10000000000000;\n\t e = 52 - e;\n\t if (e > 0) {\n\t multiply(0, z);\n\t j = fractDigits;\n\t while (j >= 7) {\n\t multiply(1e7, 0);\n\t j -= 7;\n\t }\n\t multiply(pow$3(10, j, 1), 0);\n\t j = e - 1;\n\t while (j >= 23) {\n\t divide(1 << 23);\n\t j -= 23;\n\t }\n\t divide(1 << j);\n\t multiply(1, 1);\n\t divide(2);\n\t result = dataToString();\n\t } else {\n\t multiply(0, z);\n\t multiply(1 << -e, 0);\n\t result = dataToString() + stringRepeat.call('0', fractDigits);\n\t }\n\t }\n\t if (fractDigits > 0) {\n\t k = result.length;\n\t result = sign + (k <= fractDigits\n\t ? '0.' + stringRepeat.call('0', fractDigits - k) + result\n\t : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n\t } else {\n\t result = sign + result;\n\t } return result;\n\t }\n\t});\n\n\tvar propertyIsEnumerable$1 = objectPropertyIsEnumerable$1.f;\n\n\t// `Object.{ entries, values }` methods implementation\n\tvar createMethod$a = function (TO_ENTRIES) {\n\t return function (it) {\n\t var O = toIndexedObject$1(it);\n\t var keys = objectKeys$1(O);\n\t var length = keys.length;\n\t var i = 0;\n\t var result = [];\n\t var key;\n\t while (length > i) {\n\t key = keys[i++];\n\t if (!descriptors$1 || propertyIsEnumerable$1.call(O, key)) {\n\t result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n\t }\n\t }\n\t return result;\n\t };\n\t};\n\n\tvar objectToArray$1 = {\n\t // `Object.entries` method\n\t // https://tc39.github.io/ecma262/#sec-object.entries\n\t entries: createMethod$a(true),\n\t // `Object.values` method\n\t // https://tc39.github.io/ecma262/#sec-object.values\n\t values: createMethod$a(false)\n\t};\n\n\tvar $entries$1 = objectToArray$1.entries;\n\n\t// `Object.entries` method\n\t// https://tc39.github.io/ecma262/#sec-object.entries\n\t_export$1({ target: 'Object', stat: true }, {\n\t entries: function entries(O) {\n\t return $entries$1(O);\n\t }\n\t});\n\n\tvar $values = objectToArray$1.values;\n\n\t// `Object.values` method\n\t// https://tc39.github.io/ecma262/#sec-object.values\n\t_export$1({ target: 'Object', stat: true }, {\n\t values: function values(O) {\n\t return $values(O);\n\t }\n\t});\n\n\tvar max$5 = Math.max;\n\tvar min$a = Math.min;\n\tvar floor$a = Math.floor;\n\tvar SUBSTITUTION_SYMBOLS$1 = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\n\tvar SUBSTITUTION_SYMBOLS_NO_NAMED$1 = /\\$([$&'`]|\\d\\d?)/g;\n\n\tvar maybeToString$1 = function (it) {\n\t return it === undefined ? it : String(it);\n\t};\n\n\t// @@replace logic\n\tfixRegexpWellKnownSymbolLogic$1('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n\t var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n\t var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n\t var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n\t return [\n\t // `String.prototype.replace` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n\t function replace(searchValue, replaceValue) {\n\t var O = requireObjectCoercible$1(this);\n\t var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n\t return replacer !== undefined\n\t ? replacer.call(searchValue, O, replaceValue)\n\t : nativeReplace.call(String(O), searchValue, replaceValue);\n\t },\n\t // `RegExp.prototype[@@replace]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n\t function (regexp, replaceValue) {\n\t if (\n\t (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n\t (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n\t ) {\n\t var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n\t if (res.done) return res.value;\n\t }\n\n\t var rx = anObject$1(regexp);\n\t var S = String(this);\n\n\t var functionalReplace = typeof replaceValue === 'function';\n\t if (!functionalReplace) replaceValue = String(replaceValue);\n\n\t var global = rx.global;\n\t if (global) {\n\t var fullUnicode = rx.unicode;\n\t rx.lastIndex = 0;\n\t }\n\t var results = [];\n\t while (true) {\n\t var result = regexpExecAbstract$1(rx, S);\n\t if (result === null) break;\n\n\t results.push(result);\n\t if (!global) break;\n\n\t var matchStr = String(result[0]);\n\t if (matchStr === '') rx.lastIndex = advanceStringIndex$1(S, toLength$1(rx.lastIndex), fullUnicode);\n\t }\n\n\t var accumulatedResult = '';\n\t var nextSourcePosition = 0;\n\t for (var i = 0; i < results.length; i++) {\n\t result = results[i];\n\n\t var matched = String(result[0]);\n\t var position = max$5(min$a(toInteger$1(result.index), S.length), 0);\n\t var captures = [];\n\t // NOTE: This is equivalent to\n\t // captures = result.slice(1).map(maybeToString)\n\t // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n\t // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n\t // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n\t for (var j = 1; j < result.length; j++) captures.push(maybeToString$1(result[j]));\n\t var namedCaptures = result.groups;\n\t if (functionalReplace) {\n\t var replacerArgs = [matched].concat(captures, position, S);\n\t if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n\t var replacement = String(replaceValue.apply(undefined, replacerArgs));\n\t } else {\n\t replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n\t }\n\t if (position >= nextSourcePosition) {\n\t accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n\t nextSourcePosition = position + matched.length;\n\t }\n\t }\n\t return accumulatedResult + S.slice(nextSourcePosition);\n\t }\n\t ];\n\n\t // https://tc39.github.io/ecma262/#sec-getsubstitution\n\t function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n\t var tailPos = position + matched.length;\n\t var m = captures.length;\n\t var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED$1;\n\t if (namedCaptures !== undefined) {\n\t namedCaptures = toObject$1(namedCaptures);\n\t symbols = SUBSTITUTION_SYMBOLS$1;\n\t }\n\t return nativeReplace.call(replacement, symbols, function (match, ch) {\n\t var capture;\n\t switch (ch.charAt(0)) {\n\t case '$': return '$';\n\t case '&': return matched;\n\t case '`': return str.slice(0, position);\n\t case \"'\": return str.slice(tailPos);\n\t case '<':\n\t capture = namedCaptures[ch.slice(1, -1)];\n\t break;\n\t default: // \\d\\d?\n\t var n = +ch;\n\t if (n === 0) return match;\n\t if (n > m) {\n\t var f = floor$a(n / 10);\n\t if (f === 0) return match;\n\t if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n\t return match;\n\t }\n\t capture = captures[n - 1];\n\t }\n\t return capture === undefined ? '' : capture;\n\t });\n\t }\n\t});\n\n\tvar nativeGetOwnPropertyNames$2 = objectGetOwnPropertyNames$1.f;\n\n\tvar toString$3 = {}.toString;\n\n\tvar windowNames$1 = typeof window == 'object' && window && Object.getOwnPropertyNames\n\t ? Object.getOwnPropertyNames(window) : [];\n\n\tvar getWindowNames$1 = function (it) {\n\t try {\n\t return nativeGetOwnPropertyNames$2(it);\n\t } catch (error) {\n\t return windowNames$1.slice();\n\t }\n\t};\n\n\t// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\tvar f$d = function getOwnPropertyNames(it) {\n\t return windowNames$1 && toString$3.call(it) == '[object Window]'\n\t ? getWindowNames$1(it)\n\t : nativeGetOwnPropertyNames$2(toIndexedObject$1(it));\n\t};\n\n\tvar objectGetOwnPropertyNamesExternal$1 = {\n\t\tf: f$d\n\t};\n\n\tvar f$e = wellKnownSymbol$1;\n\n\tvar wellKnownSymbolWrapped$1 = {\n\t\tf: f$e\n\t};\n\n\tvar defineProperty$e = objectDefineProperty$1.f;\n\n\tvar defineWellKnownSymbol$1 = function (NAME) {\n\t var Symbol = path$1.Symbol || (path$1.Symbol = {});\n\t if (!has$2(Symbol, NAME)) defineProperty$e(Symbol, NAME, {\n\t value: wellKnownSymbolWrapped$1.f(NAME)\n\t });\n\t};\n\n\tvar $forEach$4 = arrayIteration$1.forEach;\n\n\tvar HIDDEN$1 = sharedKey$1('hidden');\n\tvar SYMBOL$1 = 'Symbol';\n\tvar PROTOTYPE$4 = 'prototype';\n\tvar TO_PRIMITIVE$1 = wellKnownSymbol$1('toPrimitive');\n\tvar setInternalState$e = internalState$1.set;\n\tvar getInternalState$7 = internalState$1.getterFor(SYMBOL$1);\n\tvar ObjectPrototype$5 = Object[PROTOTYPE$4];\n\tvar $Symbol$1 = global_1$1.Symbol;\n\tvar $stringify$1 = getBuiltIn$1('JSON', 'stringify');\n\tvar nativeGetOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor$1.f;\n\tvar nativeDefineProperty$3 = objectDefineProperty$1.f;\n\tvar nativeGetOwnPropertyNames$3 = objectGetOwnPropertyNamesExternal$1.f;\n\tvar nativePropertyIsEnumerable$3 = objectPropertyIsEnumerable$1.f;\n\tvar AllSymbols$1 = shared$1('symbols');\n\tvar ObjectPrototypeSymbols$1 = shared$1('op-symbols');\n\tvar StringToSymbolRegistry$1 = shared$1('string-to-symbol-registry');\n\tvar SymbolToStringRegistry$1 = shared$1('symbol-to-string-registry');\n\tvar WellKnownSymbolsStore$3 = shared$1('wks');\n\tvar QObject$1 = global_1$1.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar USE_SETTER$1 = !QObject$1 || !QObject$1[PROTOTYPE$4] || !QObject$1[PROTOTYPE$4].findChild;\n\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDescriptor$1 = descriptors$1 && fails$1(function () {\n\t return objectCreate$1(nativeDefineProperty$3({}, 'a', {\n\t get: function () { return nativeDefineProperty$3(this, 'a', { value: 7 }).a; }\n\t })).a != 7;\n\t}) ? function (O, P, Attributes) {\n\t var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$4(ObjectPrototype$5, P);\n\t if (ObjectPrototypeDescriptor) delete ObjectPrototype$5[P];\n\t nativeDefineProperty$3(O, P, Attributes);\n\t if (ObjectPrototypeDescriptor && O !== ObjectPrototype$5) {\n\t nativeDefineProperty$3(ObjectPrototype$5, P, ObjectPrototypeDescriptor);\n\t }\n\t} : nativeDefineProperty$3;\n\n\tvar wrap$3 = function (tag, description) {\n\t var symbol = AllSymbols$1[tag] = objectCreate$1($Symbol$1[PROTOTYPE$4]);\n\t setInternalState$e(symbol, {\n\t type: SYMBOL$1,\n\t tag: tag,\n\t description: description\n\t });\n\t if (!descriptors$1) symbol.description = description;\n\t return symbol;\n\t};\n\n\tvar isSymbol$1 = useSymbolAsUid$1 ? function (it) {\n\t return typeof it == 'symbol';\n\t} : function (it) {\n\t return Object(it) instanceof $Symbol$1;\n\t};\n\n\tvar $defineProperty$1 = function defineProperty(O, P, Attributes) {\n\t if (O === ObjectPrototype$5) $defineProperty$1(ObjectPrototypeSymbols$1, P, Attributes);\n\t anObject$1(O);\n\t var key = toPrimitive$1(P, true);\n\t anObject$1(Attributes);\n\t if (has$2(AllSymbols$1, key)) {\n\t if (!Attributes.enumerable) {\n\t if (!has$2(O, HIDDEN$1)) nativeDefineProperty$3(O, HIDDEN$1, createPropertyDescriptor$1(1, {}));\n\t O[HIDDEN$1][key] = true;\n\t } else {\n\t if (has$2(O, HIDDEN$1) && O[HIDDEN$1][key]) O[HIDDEN$1][key] = false;\n\t Attributes = objectCreate$1(Attributes, { enumerable: createPropertyDescriptor$1(0, false) });\n\t } return setSymbolDescriptor$1(O, key, Attributes);\n\t } return nativeDefineProperty$3(O, key, Attributes);\n\t};\n\n\tvar $defineProperties$1 = function defineProperties(O, Properties) {\n\t anObject$1(O);\n\t var properties = toIndexedObject$1(Properties);\n\t var keys = objectKeys$1(properties).concat($getOwnPropertySymbols$1(properties));\n\t $forEach$4(keys, function (key) {\n\t if (!descriptors$1 || $propertyIsEnumerable$1.call(properties, key)) $defineProperty$1(O, key, properties[key]);\n\t });\n\t return O;\n\t};\n\n\tvar $create$1 = function create(O, Properties) {\n\t return Properties === undefined ? objectCreate$1(O) : $defineProperties$1(objectCreate$1(O), Properties);\n\t};\n\n\tvar $propertyIsEnumerable$1 = function propertyIsEnumerable(V) {\n\t var P = toPrimitive$1(V, true);\n\t var enumerable = nativePropertyIsEnumerable$3.call(this, P);\n\t if (this === ObjectPrototype$5 && has$2(AllSymbols$1, P) && !has$2(ObjectPrototypeSymbols$1, P)) return false;\n\t return enumerable || !has$2(this, P) || !has$2(AllSymbols$1, P) || has$2(this, HIDDEN$1) && this[HIDDEN$1][P] ? enumerable : true;\n\t};\n\n\tvar $getOwnPropertyDescriptor$1 = function getOwnPropertyDescriptor(O, P) {\n\t var it = toIndexedObject$1(O);\n\t var key = toPrimitive$1(P, true);\n\t if (it === ObjectPrototype$5 && has$2(AllSymbols$1, key) && !has$2(ObjectPrototypeSymbols$1, key)) return;\n\t var descriptor = nativeGetOwnPropertyDescriptor$4(it, key);\n\t if (descriptor && has$2(AllSymbols$1, key) && !(has$2(it, HIDDEN$1) && it[HIDDEN$1][key])) {\n\t descriptor.enumerable = true;\n\t }\n\t return descriptor;\n\t};\n\n\tvar $getOwnPropertyNames$1 = function getOwnPropertyNames(O) {\n\t var names = nativeGetOwnPropertyNames$3(toIndexedObject$1(O));\n\t var result = [];\n\t $forEach$4(names, function (key) {\n\t if (!has$2(AllSymbols$1, key) && !has$2(hiddenKeys$2, key)) result.push(key);\n\t });\n\t return result;\n\t};\n\n\tvar $getOwnPropertySymbols$1 = function getOwnPropertySymbols(O) {\n\t var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$5;\n\t var names = nativeGetOwnPropertyNames$3(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols$1 : toIndexedObject$1(O));\n\t var result = [];\n\t $forEach$4(names, function (key) {\n\t if (has$2(AllSymbols$1, key) && (!IS_OBJECT_PROTOTYPE || has$2(ObjectPrototype$5, key))) {\n\t result.push(AllSymbols$1[key]);\n\t }\n\t });\n\t return result;\n\t};\n\n\t// `Symbol` constructor\n\t// https://tc39.github.io/ecma262/#sec-symbol-constructor\n\tif (!nativeSymbol$1) {\n\t $Symbol$1 = function Symbol() {\n\t if (this instanceof $Symbol$1) throw TypeError('Symbol is not a constructor');\n\t var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t var tag = uid$1(description);\n\t var setter = function (value) {\n\t if (this === ObjectPrototype$5) setter.call(ObjectPrototypeSymbols$1, value);\n\t if (has$2(this, HIDDEN$1) && has$2(this[HIDDEN$1], tag)) this[HIDDEN$1][tag] = false;\n\t setSymbolDescriptor$1(this, tag, createPropertyDescriptor$1(1, value));\n\t };\n\t if (descriptors$1 && USE_SETTER$1) setSymbolDescriptor$1(ObjectPrototype$5, tag, { configurable: true, set: setter });\n\t return wrap$3(tag, description);\n\t };\n\n\t redefine$1($Symbol$1[PROTOTYPE$4], 'toString', function toString() {\n\t return getInternalState$7(this).tag;\n\t });\n\n\t redefine$1($Symbol$1, 'withoutSetter', function (description) {\n\t return wrap$3(uid$1(description), description);\n\t });\n\n\t objectPropertyIsEnumerable$1.f = $propertyIsEnumerable$1;\n\t objectDefineProperty$1.f = $defineProperty$1;\n\t objectGetOwnPropertyDescriptor$1.f = $getOwnPropertyDescriptor$1;\n\t objectGetOwnPropertyNames$1.f = objectGetOwnPropertyNamesExternal$1.f = $getOwnPropertyNames$1;\n\t objectGetOwnPropertySymbols$1.f = $getOwnPropertySymbols$1;\n\n\t wellKnownSymbolWrapped$1.f = function (name) {\n\t return wrap$3(wellKnownSymbol$1(name), name);\n\t };\n\n\t if (descriptors$1) {\n\t // https://github.com/tc39/proposal-Symbol-description\n\t nativeDefineProperty$3($Symbol$1[PROTOTYPE$4], 'description', {\n\t configurable: true,\n\t get: function description() {\n\t return getInternalState$7(this).description;\n\t }\n\t });\n\t {\n\t redefine$1(ObjectPrototype$5, 'propertyIsEnumerable', $propertyIsEnumerable$1, { unsafe: true });\n\t }\n\t }\n\t}\n\n\t_export$1({ global: true, wrap: true, forced: !nativeSymbol$1, sham: !nativeSymbol$1 }, {\n\t Symbol: $Symbol$1\n\t});\n\n\t$forEach$4(objectKeys$1(WellKnownSymbolsStore$3), function (name) {\n\t defineWellKnownSymbol$1(name);\n\t});\n\n\t_export$1({ target: SYMBOL$1, stat: true, forced: !nativeSymbol$1 }, {\n\t // `Symbol.for` method\n\t // https://tc39.github.io/ecma262/#sec-symbol.for\n\t 'for': function (key) {\n\t var string = String(key);\n\t if (has$2(StringToSymbolRegistry$1, string)) return StringToSymbolRegistry$1[string];\n\t var symbol = $Symbol$1(string);\n\t StringToSymbolRegistry$1[string] = symbol;\n\t SymbolToStringRegistry$1[symbol] = string;\n\t return symbol;\n\t },\n\t // `Symbol.keyFor` method\n\t // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n\t keyFor: function keyFor(sym) {\n\t if (!isSymbol$1(sym)) throw TypeError(sym + ' is not a symbol');\n\t if (has$2(SymbolToStringRegistry$1, sym)) return SymbolToStringRegistry$1[sym];\n\t },\n\t useSetter: function () { USE_SETTER$1 = true; },\n\t useSimple: function () { USE_SETTER$1 = false; }\n\t});\n\n\t_export$1({ target: 'Object', stat: true, forced: !nativeSymbol$1, sham: !descriptors$1 }, {\n\t // `Object.create` method\n\t // https://tc39.github.io/ecma262/#sec-object.create\n\t create: $create$1,\n\t // `Object.defineProperty` method\n\t // https://tc39.github.io/ecma262/#sec-object.defineproperty\n\t defineProperty: $defineProperty$1,\n\t // `Object.defineProperties` method\n\t // https://tc39.github.io/ecma262/#sec-object.defineproperties\n\t defineProperties: $defineProperties$1,\n\t // `Object.getOwnPropertyDescriptor` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor$1\n\t});\n\n\t_export$1({ target: 'Object', stat: true, forced: !nativeSymbol$1 }, {\n\t // `Object.getOwnPropertyNames` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\t getOwnPropertyNames: $getOwnPropertyNames$1,\n\t // `Object.getOwnPropertySymbols` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n\t getOwnPropertySymbols: $getOwnPropertySymbols$1\n\t});\n\n\t// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n\t// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n\t_export$1({ target: 'Object', stat: true, forced: fails$1(function () { objectGetOwnPropertySymbols$1.f(1); }) }, {\n\t getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n\t return objectGetOwnPropertySymbols$1.f(toObject$1(it));\n\t }\n\t});\n\n\t// `JSON.stringify` method behavior with symbols\n\t// https://tc39.github.io/ecma262/#sec-json.stringify\n\tif ($stringify$1) {\n\t var FORCED_JSON_STRINGIFY$1 = !nativeSymbol$1 || fails$1(function () {\n\t var symbol = $Symbol$1();\n\t // MS Edge converts symbol values to JSON as {}\n\t return $stringify$1([symbol]) != '[null]'\n\t // WebKit converts symbol values to JSON as null\n\t || $stringify$1({ a: symbol }) != '{}'\n\t // V8 throws on boxed symbols\n\t || $stringify$1(Object(symbol)) != '{}';\n\t });\n\n\t _export$1({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY$1 }, {\n\t // eslint-disable-next-line no-unused-vars\n\t stringify: function stringify(it, replacer, space) {\n\t var args = [it];\n\t var index = 1;\n\t var $replacer;\n\t while (arguments.length > index) args.push(arguments[index++]);\n\t $replacer = replacer;\n\t if (!isObject$2(replacer) && it === undefined || isSymbol$1(it)) return; // IE8 returns string on undefined\n\t if (!isArray$2(replacer)) replacer = function (key, value) {\n\t if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n\t if (!isSymbol$1(value)) return value;\n\t };\n\t args[1] = replacer;\n\t return $stringify$1.apply(null, args);\n\t }\n\t });\n\t}\n\n\t// `Symbol.prototype[@@toPrimitive]` method\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\n\tif (!$Symbol$1[PROTOTYPE$4][TO_PRIMITIVE$1]) {\n\t createNonEnumerableProperty$1($Symbol$1[PROTOTYPE$4], TO_PRIMITIVE$1, $Symbol$1[PROTOTYPE$4].valueOf);\n\t}\n\t// `Symbol.prototype[@@toStringTag]` property\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\n\tsetToStringTag$1($Symbol$1, SYMBOL$1);\n\n\thiddenKeys$2[HIDDEN$1] = true;\n\n\t// `Number.isNaN` method\n\t// https://tc39.github.io/ecma262/#sec-number.isnan\n\t_export$1({ target: 'Number', stat: true }, {\n\t isNaN: function isNaN(number) {\n\t // eslint-disable-next-line no-self-compare\n\t return number != number;\n\t }\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor$5 = objectGetOwnPropertyDescriptor$1.f;\n\n\n\tvar FAILS_ON_PRIMITIVES$3 = fails$1(function () { nativeGetOwnPropertyDescriptor$5(1); });\n\tvar FORCED$a = !descriptors$1 || FAILS_ON_PRIMITIVES$3;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\t_export$1({ target: 'Object', stat: true, forced: FORCED$a, sham: !descriptors$1 }, {\n\t getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n\t return nativeGetOwnPropertyDescriptor$5(toIndexedObject$1(it), key);\n\t }\n\t});\n\n\t// `Object.getOwnPropertyDescriptors` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\t_export$1({ target: 'Object', stat: true, sham: !descriptors$1 }, {\n\t getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n\t var O = toIndexedObject$1(object);\n\t var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor$1.f;\n\t var keys = ownKeys$2(O);\n\t var result = {};\n\t var index = 0;\n\t var key, descriptor;\n\t while (keys.length > index) {\n\t descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n\t if (descriptor !== undefined) createProperty$1(result, key, descriptor);\n\t }\n\t return result;\n\t }\n\t});\n\n\t// @@match logic\n\tfixRegexpWellKnownSymbolLogic$1('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n\t return [\n\t // `String.prototype.match` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.match\n\t function match(regexp) {\n\t var O = requireObjectCoercible$1(this);\n\t var matcher = regexp == undefined ? undefined : regexp[MATCH];\n\t return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n\t },\n\t // `RegExp.prototype[@@match]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n\t function (regexp) {\n\t var res = maybeCallNative(nativeMatch, regexp, this);\n\t if (res.done) return res.value;\n\n\t var rx = anObject$1(regexp);\n\t var S = String(this);\n\n\t if (!rx.global) return regexpExecAbstract$1(rx, S);\n\n\t var fullUnicode = rx.unicode;\n\t rx.lastIndex = 0;\n\t var A = [];\n\t var n = 0;\n\t var result;\n\t while ((result = regexpExecAbstract$1(rx, S)) !== null) {\n\t var matchStr = String(result[0]);\n\t A[n] = matchStr;\n\t if (matchStr === '') rx.lastIndex = advanceStringIndex$1(S, toLength$1(rx.lastIndex), fullUnicode);\n\t n++;\n\t }\n\t return n === 0 ? null : A;\n\t }\n\t ];\n\t});\n\n\tfunction _classCallCheck$2(e, t) {\n\t if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n\t}\n\n\tfunction _defineProperties$2(e, t) {\n\t for (var n = 0; n < t.length; n++) {\n\t var r = t[n];\n\t r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n\t }\n\t}\n\n\tfunction _createClass$2(e, t, n) {\n\t return t && _defineProperties$2(e.prototype, t), n && _defineProperties$2(e, n), e;\n\t}\n\n\tfunction _defineProperty$2(e, t, n) {\n\t return t in e ? Object.defineProperty(e, t, {\n\t value: n,\n\t enumerable: !0,\n\t configurable: !0,\n\t writable: !0\n\t }) : e[t] = n, e;\n\t}\n\n\tfunction ownKeys$3(e, t) {\n\t var n = Object.keys(e);\n\n\t if (Object.getOwnPropertySymbols) {\n\t var r = Object.getOwnPropertySymbols(e);\n\t t && (r = r.filter(function (t) {\n\t return Object.getOwnPropertyDescriptor(e, t).enumerable;\n\t })), n.push.apply(n, r);\n\t }\n\n\t return n;\n\t}\n\n\tfunction _objectSpread2$1(e) {\n\t for (var t = 1; t < arguments.length; t++) {\n\t var n = null != arguments[t] ? arguments[t] : {};\n\t t % 2 ? ownKeys$3(Object(n), !0).forEach(function (t) {\n\t _defineProperty$2(e, t, n[t]);\n\t }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$3(Object(n)).forEach(function (t) {\n\t Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n\t });\n\t }\n\n\t return e;\n\t}\n\n\tvar defaults$1 = {\n\t addCSS: !0,\n\t thumbWidth: 15,\n\t watch: !0\n\t};\n\n\tfunction matches$1(e, t) {\n\t return function () {\n\t return Array.from(document.querySelectorAll(t)).includes(this);\n\t }.call(e, t);\n\t}\n\n\tfunction trigger(e, t) {\n\t if (e && t) {\n\t var n = new Event(t, {\n\t bubbles: !0\n\t });\n\t e.dispatchEvent(n);\n\t }\n\t}\n\n\tvar getConstructor$1 = function getConstructor(e) {\n\t return null != e ? e.constructor : null;\n\t},\n\t instanceOf$1 = function instanceOf(e, t) {\n\t return !!(e && t && e instanceof t);\n\t},\n\t isNullOrUndefined$1 = function isNullOrUndefined(e) {\n\t return null == e;\n\t},\n\t isObject$3 = function isObject(e) {\n\t return getConstructor$1(e) === Object;\n\t},\n\t isNumber$1 = function isNumber(e) {\n\t return getConstructor$1(e) === Number && !Number.isNaN(e);\n\t},\n\t isString$2 = function isString(e) {\n\t return getConstructor$1(e) === String;\n\t},\n\t isBoolean$1 = function isBoolean(e) {\n\t return getConstructor$1(e) === Boolean;\n\t},\n\t isFunction$1 = function isFunction(e) {\n\t return getConstructor$1(e) === Function;\n\t},\n\t isArray$3 = function isArray(e) {\n\t return Array.isArray(e);\n\t},\n\t isNodeList$1 = function isNodeList(e) {\n\t return instanceOf$1(e, NodeList);\n\t},\n\t isElement$2 = function isElement(e) {\n\t return instanceOf$1(e, Element);\n\t},\n\t isEvent$2 = function isEvent(e) {\n\t return instanceOf$1(e, Event);\n\t},\n\t isEmpty$1 = function isEmpty(e) {\n\t return isNullOrUndefined$1(e) || (isString$2(e) || isArray$3(e) || isNodeList$1(e)) && !e.length || isObject$3(e) && !Object.keys(e).length;\n\t},\n\t is$1 = {\n\t nullOrUndefined: isNullOrUndefined$1,\n\t object: isObject$3,\n\t number: isNumber$1,\n\t string: isString$2,\n\t boolean: isBoolean$1,\n\t function: isFunction$1,\n\t array: isArray$3,\n\t nodeList: isNodeList$1,\n\t element: isElement$2,\n\t event: isEvent$2,\n\t empty: isEmpty$1\n\t};\n\n\tfunction getDecimalPlaces(e) {\n\t var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\t return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n\t}\n\n\tfunction round(e, t) {\n\t if (1 > t) {\n\t var n = getDecimalPlaces(t);\n\t return parseFloat(e.toFixed(n));\n\t }\n\n\t return Math.round(e / t) * t;\n\t}\n\n\tvar RangeTouch = function () {\n\t function e(t, n) {\n\t _classCallCheck$2(this, e), is$1.element(t) ? this.element = t : is$1.string(t) && (this.element = document.querySelector(t)), is$1.element(this.element) && is$1.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults$1, {}, n), this.init());\n\t }\n\n\t return _createClass$2(e, [{\n\t key: \"init\",\n\t value: function value() {\n\t e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n\t }\n\t }, {\n\t key: \"destroy\",\n\t value: function value() {\n\t e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n\t }\n\t }, {\n\t key: \"listeners\",\n\t value: function value(e) {\n\t var t = this,\n\t n = e ? \"addEventListener\" : \"removeEventListener\";\n\t [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n\t t.element[n](e, function (e) {\n\t return t.set(e);\n\t }, !1);\n\t });\n\t }\n\t }, {\n\t key: \"get\",\n\t value: function value(t) {\n\t if (!e.enabled || !is$1.event(t)) return null;\n\t var n,\n\t r = t.target,\n\t i = t.changedTouches[0],\n\t o = parseFloat(r.getAttribute(\"min\")) || 0,\n\t s = parseFloat(r.getAttribute(\"max\")) || 100,\n\t u = parseFloat(r.getAttribute(\"step\")) || 1,\n\t c = r.getBoundingClientRect(),\n\t a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n\t return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n\t }\n\t }, {\n\t key: \"set\",\n\t value: function value(t) {\n\t e.enabled && is$1.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n\t }\n\t }], [{\n\t key: \"setup\",\n\t value: function value(t) {\n\t var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n\t r = null;\n\t if (is$1.empty(t) || is$1.string(t) ? r = Array.from(document.querySelectorAll(is$1.string(t) ? t : 'input[type=\"range\"]')) : is$1.element(t) ? r = [t] : is$1.nodeList(t) ? r = Array.from(t) : is$1.array(t) && (r = t.filter(is$1.element)), is$1.empty(r)) return null;\n\n\t var i = _objectSpread2$1({}, defaults$1, {}, n);\n\n\t if (is$1.string(t) && i.watch) {\n\t var o = new MutationObserver(function (n) {\n\t Array.from(n).forEach(function (n) {\n\t Array.from(n.addedNodes).forEach(function (n) {\n\t is$1.element(n) && matches$1(n, t) && new e(n, i);\n\t });\n\t });\n\t });\n\t o.observe(document.body, {\n\t childList: !0,\n\t subtree: !0\n\t });\n\t }\n\n\t return r.map(function (t) {\n\t return new e(t, n);\n\t });\n\t }\n\t }, {\n\t key: \"enabled\",\n\t get: function get() {\n\t return \"ontouchstart\" in document.documentElement;\n\t }\n\t }]), e;\n\t}();\n\n\tvar nativePromiseConstructor$1 = global_1$1.Promise;\n\n\tvar SPECIES$b = wellKnownSymbol$1('species');\n\n\tvar setSpecies$1 = function (CONSTRUCTOR_NAME) {\n\t var Constructor = getBuiltIn$1(CONSTRUCTOR_NAME);\n\t var defineProperty = objectDefineProperty$1.f;\n\n\t if (descriptors$1 && Constructor && !Constructor[SPECIES$b]) {\n\t defineProperty(Constructor, SPECIES$b, {\n\t configurable: true,\n\t get: function () { return this; }\n\t });\n\t }\n\t};\n\n\tvar engineIsIos$1 = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent$1);\n\n\tvar engineIsNode = classofRaw$1(global_1$1.process) == 'process';\n\n\tvar location$1 = global_1$1.location;\n\tvar set$4 = global_1$1.setImmediate;\n\tvar clear$1 = global_1$1.clearImmediate;\n\tvar process$6 = global_1$1.process;\n\tvar MessageChannel$1 = global_1$1.MessageChannel;\n\tvar Dispatch$1 = global_1$1.Dispatch;\n\tvar counter$1 = 0;\n\tvar queue$1 = {};\n\tvar ONREADYSTATECHANGE$1 = 'onreadystatechange';\n\tvar defer$1, channel$1, port$1;\n\n\tvar run$1 = function (id) {\n\t // eslint-disable-next-line no-prototype-builtins\n\t if (queue$1.hasOwnProperty(id)) {\n\t var fn = queue$1[id];\n\t delete queue$1[id];\n\t fn();\n\t }\n\t};\n\n\tvar runner$1 = function (id) {\n\t return function () {\n\t run$1(id);\n\t };\n\t};\n\n\tvar listener$1 = function (event) {\n\t run$1(event.data);\n\t};\n\n\tvar post$1 = function (id) {\n\t // old engines have not location.origin\n\t global_1$1.postMessage(id + '', location$1.protocol + '//' + location$1.host);\n\t};\n\n\t// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n\tif (!set$4 || !clear$1) {\n\t set$4 = function setImmediate(fn) {\n\t var args = [];\n\t var i = 1;\n\t while (arguments.length > i) args.push(arguments[i++]);\n\t queue$1[++counter$1] = function () {\n\t // eslint-disable-next-line no-new-func\n\t (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n\t };\n\t defer$1(counter$1);\n\t return counter$1;\n\t };\n\t clear$1 = function clearImmediate(id) {\n\t delete queue$1[id];\n\t };\n\t // Node.js 0.8-\n\t if (engineIsNode) {\n\t defer$1 = function (id) {\n\t process$6.nextTick(runner$1(id));\n\t };\n\t // Sphere (JS game engine) Dispatch API\n\t } else if (Dispatch$1 && Dispatch$1.now) {\n\t defer$1 = function (id) {\n\t Dispatch$1.now(runner$1(id));\n\t };\n\t // Browsers with MessageChannel, includes WebWorkers\n\t // except iOS - https://github.com/zloirock/core-js/issues/624\n\t } else if (MessageChannel$1 && !engineIsIos$1) {\n\t channel$1 = new MessageChannel$1();\n\t port$1 = channel$1.port2;\n\t channel$1.port1.onmessage = listener$1;\n\t defer$1 = functionBindContext$1(port$1.postMessage, port$1, 1);\n\t // Browsers with postMessage, skip WebWorkers\n\t // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n\t } else if (\n\t global_1$1.addEventListener &&\n\t typeof postMessage == 'function' &&\n\t !global_1$1.importScripts &&\n\t location$1 && location$1.protocol !== 'file:' &&\n\t !fails$1(post$1)\n\t ) {\n\t defer$1 = post$1;\n\t global_1$1.addEventListener('message', listener$1, false);\n\t // IE8-\n\t } else if (ONREADYSTATECHANGE$1 in documentCreateElement$1('script')) {\n\t defer$1 = function (id) {\n\t html$1.appendChild(documentCreateElement$1('script'))[ONREADYSTATECHANGE$1] = function () {\n\t html$1.removeChild(this);\n\t run$1(id);\n\t };\n\t };\n\t // Rest old browsers\n\t } else {\n\t defer$1 = function (id) {\n\t setTimeout(runner$1(id), 0);\n\t };\n\t }\n\t}\n\n\tvar task$2 = {\n\t set: set$4,\n\t clear: clear$1\n\t};\n\n\tvar getOwnPropertyDescriptor$7 = objectGetOwnPropertyDescriptor$1.f;\n\tvar macrotask$1 = task$2.set;\n\n\n\n\tvar MutationObserver$2 = global_1$1.MutationObserver || global_1$1.WebKitMutationObserver;\n\tvar document$4 = global_1$1.document;\n\tvar process$7 = global_1$1.process;\n\tvar Promise$2 = global_1$1.Promise;\n\t// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\n\tvar queueMicrotaskDescriptor$1 = getOwnPropertyDescriptor$7(global_1$1, 'queueMicrotask');\n\tvar queueMicrotask$1 = queueMicrotaskDescriptor$1 && queueMicrotaskDescriptor$1.value;\n\n\tvar flush$1, head$1, last$1, notify$2, toggle$1, node$1, promise$1, then$1;\n\n\t// modern engines have queueMicrotask method\n\tif (!queueMicrotask$1) {\n\t flush$1 = function () {\n\t var parent, fn;\n\t if (engineIsNode && (parent = process$7.domain)) parent.exit();\n\t while (head$1) {\n\t fn = head$1.fn;\n\t head$1 = head$1.next;\n\t try {\n\t fn();\n\t } catch (error) {\n\t if (head$1) notify$2();\n\t else last$1 = undefined;\n\t throw error;\n\t }\n\t } last$1 = undefined;\n\t if (parent) parent.enter();\n\t };\n\n\t // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n\t if (!engineIsIos$1 && !engineIsNode && MutationObserver$2 && document$4) {\n\t toggle$1 = true;\n\t node$1 = document$4.createTextNode('');\n\t new MutationObserver$2(flush$1).observe(node$1, { characterData: true });\n\t notify$2 = function () {\n\t node$1.data = toggle$1 = !toggle$1;\n\t };\n\t // environments with maybe non-completely correct, but existent Promise\n\t } else if (Promise$2 && Promise$2.resolve) {\n\t // Promise.resolve without an argument throws an error in LG WebOS 2\n\t promise$1 = Promise$2.resolve(undefined);\n\t then$1 = promise$1.then;\n\t notify$2 = function () {\n\t then$1.call(promise$1, flush$1);\n\t };\n\t // Node.js without promises\n\t } else if (engineIsNode) {\n\t notify$2 = function () {\n\t process$7.nextTick(flush$1);\n\t };\n\t // for other environments - macrotask based on:\n\t // - setImmediate\n\t // - MessageChannel\n\t // - window.postMessag\n\t // - onreadystatechange\n\t // - setTimeout\n\t } else {\n\t notify$2 = function () {\n\t // strange IE + webpack dev server bug - use .call(global)\n\t macrotask$1.call(global_1$1, flush$1);\n\t };\n\t }\n\t}\n\n\tvar microtask$1 = queueMicrotask$1 || function (fn) {\n\t var task = { fn: fn, next: undefined };\n\t if (last$1) last$1.next = task;\n\t if (!head$1) {\n\t head$1 = task;\n\t notify$2();\n\t } last$1 = task;\n\t};\n\n\tvar PromiseCapability$1 = function (C) {\n\t var resolve, reject;\n\t this.promise = new C(function ($$resolve, $$reject) {\n\t if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n\t resolve = $$resolve;\n\t reject = $$reject;\n\t });\n\t this.resolve = aFunction$3(resolve);\n\t this.reject = aFunction$3(reject);\n\t};\n\n\t// 25.4.1.5 NewPromiseCapability(C)\n\tvar f$f = function (C) {\n\t return new PromiseCapability$1(C);\n\t};\n\n\tvar newPromiseCapability$2 = {\n\t\tf: f$f\n\t};\n\n\tvar promiseResolve$1 = function (C, x) {\n\t anObject$1(C);\n\t if (isObject$2(x) && x.constructor === C) return x;\n\t var promiseCapability = newPromiseCapability$2.f(C);\n\t var resolve = promiseCapability.resolve;\n\t resolve(x);\n\t return promiseCapability.promise;\n\t};\n\n\tvar hostReportErrors$1 = function (a, b) {\n\t var console = global_1$1.console;\n\t if (console && console.error) {\n\t arguments.length === 1 ? console.error(a) : console.error(a, b);\n\t }\n\t};\n\n\tvar perform$1 = function (exec) {\n\t try {\n\t return { error: false, value: exec() };\n\t } catch (error) {\n\t return { error: true, value: error };\n\t }\n\t};\n\n\tvar task$3 = task$2.set;\n\n\n\n\n\n\n\n\n\n\n\n\tvar SPECIES$c = wellKnownSymbol$1('species');\n\tvar PROMISE$1 = 'Promise';\n\tvar getInternalState$8 = internalState$1.get;\n\tvar setInternalState$f = internalState$1.set;\n\tvar getInternalPromiseState$1 = internalState$1.getterFor(PROMISE$1);\n\tvar PromiseConstructor$1 = nativePromiseConstructor$1;\n\tvar TypeError$2 = global_1$1.TypeError;\n\tvar document$5 = global_1$1.document;\n\tvar process$8 = global_1$1.process;\n\tvar $fetch$3 = getBuiltIn$1('fetch');\n\tvar newPromiseCapability$3 = newPromiseCapability$2.f;\n\tvar newGenericPromiseCapability$1 = newPromiseCapability$3;\n\tvar DISPATCH_EVENT$1 = !!(document$5 && document$5.createEvent && global_1$1.dispatchEvent);\n\tvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\n\tvar UNHANDLED_REJECTION$1 = 'unhandledrejection';\n\tvar REJECTION_HANDLED$1 = 'rejectionhandled';\n\tvar PENDING$1 = 0;\n\tvar FULFILLED$1 = 1;\n\tvar REJECTED$1 = 2;\n\tvar HANDLED$1 = 1;\n\tvar UNHANDLED$1 = 2;\n\tvar Internal$1, OwnPromiseCapability$1, PromiseWrapper$1, nativeThen$1;\n\n\tvar FORCED$b = isForced_1$1(PROMISE$1, function () {\n\t var GLOBAL_CORE_JS_PROMISE = inspectSource$1(PromiseConstructor$1) !== String(PromiseConstructor$1);\n\t if (!GLOBAL_CORE_JS_PROMISE) {\n\t // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n\t // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n\t // We can't detect it synchronously, so just check versions\n\t if (engineV8Version$1 === 66) return true;\n\t // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n\t if (!engineIsNode && !NATIVE_REJECTION_EVENT) return true;\n\t }\n\t // We can't use @@species feature detection in V8 since it causes\n\t // deoptimization and performance degradation\n\t // https://github.com/zloirock/core-js/issues/679\n\t if (engineV8Version$1 >= 51 && /native code/.test(PromiseConstructor$1)) return false;\n\t // Detect correctness of subclassing with @@species support\n\t var promise = PromiseConstructor$1.resolve(1);\n\t var FakePromise = function (exec) {\n\t exec(function () { /* empty */ }, function () { /* empty */ });\n\t };\n\t var constructor = promise.constructor = {};\n\t constructor[SPECIES$c] = FakePromise;\n\t return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n\t});\n\n\tvar INCORRECT_ITERATION$3 = FORCED$b || !checkCorrectnessOfIteration$1(function (iterable) {\n\t PromiseConstructor$1.all(iterable)['catch'](function () { /* empty */ });\n\t});\n\n\t// helpers\n\tvar isThenable$2 = function (it) {\n\t var then;\n\t return isObject$2(it) && typeof (then = it.then) == 'function' ? then : false;\n\t};\n\n\tvar notify$3 = function (state, isReject) {\n\t if (state.notified) return;\n\t state.notified = true;\n\t var chain = state.reactions;\n\t microtask$1(function () {\n\t var value = state.value;\n\t var ok = state.state == FULFILLED$1;\n\t var index = 0;\n\t // variable length - can't use forEach\n\t while (chain.length > index) {\n\t var reaction = chain[index++];\n\t var handler = ok ? reaction.ok : reaction.fail;\n\t var resolve = reaction.resolve;\n\t var reject = reaction.reject;\n\t var domain = reaction.domain;\n\t var result, then, exited;\n\t try {\n\t if (handler) {\n\t if (!ok) {\n\t if (state.rejection === UNHANDLED$1) onHandleUnhandled$1(state);\n\t state.rejection = HANDLED$1;\n\t }\n\t if (handler === true) result = value;\n\t else {\n\t if (domain) domain.enter();\n\t result = handler(value); // can throw\n\t if (domain) {\n\t domain.exit();\n\t exited = true;\n\t }\n\t }\n\t if (result === reaction.promise) {\n\t reject(TypeError$2('Promise-chain cycle'));\n\t } else if (then = isThenable$2(result)) {\n\t then.call(result, resolve, reject);\n\t } else resolve(result);\n\t } else reject(value);\n\t } catch (error) {\n\t if (domain && !exited) domain.exit();\n\t reject(error);\n\t }\n\t }\n\t state.reactions = [];\n\t state.notified = false;\n\t if (isReject && !state.rejection) onUnhandled$1(state);\n\t });\n\t};\n\n\tvar dispatchEvent$1 = function (name, promise, reason) {\n\t var event, handler;\n\t if (DISPATCH_EVENT$1) {\n\t event = document$5.createEvent('Event');\n\t event.promise = promise;\n\t event.reason = reason;\n\t event.initEvent(name, false, true);\n\t global_1$1.dispatchEvent(event);\n\t } else event = { promise: promise, reason: reason };\n\t if (!NATIVE_REJECTION_EVENT && (handler = global_1$1['on' + name])) handler(event);\n\t else if (name === UNHANDLED_REJECTION$1) hostReportErrors$1('Unhandled promise rejection', reason);\n\t};\n\n\tvar onUnhandled$1 = function (state) {\n\t task$3.call(global_1$1, function () {\n\t var promise = state.facade;\n\t var value = state.value;\n\t var IS_UNHANDLED = isUnhandled$1(state);\n\t var result;\n\t if (IS_UNHANDLED) {\n\t result = perform$1(function () {\n\t if (engineIsNode) {\n\t process$8.emit('unhandledRejection', value, promise);\n\t } else dispatchEvent$1(UNHANDLED_REJECTION$1, promise, value);\n\t });\n\t // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n\t state.rejection = engineIsNode || isUnhandled$1(state) ? UNHANDLED$1 : HANDLED$1;\n\t if (result.error) throw result.value;\n\t }\n\t });\n\t};\n\n\tvar isUnhandled$1 = function (state) {\n\t return state.rejection !== HANDLED$1 && !state.parent;\n\t};\n\n\tvar onHandleUnhandled$1 = function (state) {\n\t task$3.call(global_1$1, function () {\n\t var promise = state.facade;\n\t if (engineIsNode) {\n\t process$8.emit('rejectionHandled', promise);\n\t } else dispatchEvent$1(REJECTION_HANDLED$1, promise, state.value);\n\t });\n\t};\n\n\tvar bind$1 = function (fn, state, unwrap) {\n\t return function (value) {\n\t fn(state, value, unwrap);\n\t };\n\t};\n\n\tvar internalReject$1 = function (state, value, unwrap) {\n\t if (state.done) return;\n\t state.done = true;\n\t if (unwrap) state = unwrap;\n\t state.value = value;\n\t state.state = REJECTED$1;\n\t notify$3(state, true);\n\t};\n\n\tvar internalResolve$1 = function (state, value, unwrap) {\n\t if (state.done) return;\n\t state.done = true;\n\t if (unwrap) state = unwrap;\n\t try {\n\t if (state.facade === value) throw TypeError$2(\"Promise can't be resolved itself\");\n\t var then = isThenable$2(value);\n\t if (then) {\n\t microtask$1(function () {\n\t var wrapper = { done: false };\n\t try {\n\t then.call(value,\n\t bind$1(internalResolve$1, wrapper, state),\n\t bind$1(internalReject$1, wrapper, state)\n\t );\n\t } catch (error) {\n\t internalReject$1(wrapper, error, state);\n\t }\n\t });\n\t } else {\n\t state.value = value;\n\t state.state = FULFILLED$1;\n\t notify$3(state, false);\n\t }\n\t } catch (error) {\n\t internalReject$1({ done: false }, error, state);\n\t }\n\t};\n\n\t// constructor polyfill\n\tif (FORCED$b) {\n\t // 25.4.3.1 Promise(executor)\n\t PromiseConstructor$1 = function Promise(executor) {\n\t anInstance$1(this, PromiseConstructor$1, PROMISE$1);\n\t aFunction$3(executor);\n\t Internal$1.call(this);\n\t var state = getInternalState$8(this);\n\t try {\n\t executor(bind$1(internalResolve$1, state), bind$1(internalReject$1, state));\n\t } catch (error) {\n\t internalReject$1(state, error);\n\t }\n\t };\n\t // eslint-disable-next-line no-unused-vars\n\t Internal$1 = function Promise(executor) {\n\t setInternalState$f(this, {\n\t type: PROMISE$1,\n\t done: false,\n\t notified: false,\n\t parent: false,\n\t reactions: [],\n\t rejection: false,\n\t state: PENDING$1,\n\t value: undefined\n\t });\n\t };\n\t Internal$1.prototype = redefineAll$1(PromiseConstructor$1.prototype, {\n\t // `Promise.prototype.then` method\n\t // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n\t then: function then(onFulfilled, onRejected) {\n\t var state = getInternalPromiseState$1(this);\n\t var reaction = newPromiseCapability$3(speciesConstructor$1(this, PromiseConstructor$1));\n\t reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n\t reaction.fail = typeof onRejected == 'function' && onRejected;\n\t reaction.domain = engineIsNode ? process$8.domain : undefined;\n\t state.parent = true;\n\t state.reactions.push(reaction);\n\t if (state.state != PENDING$1) notify$3(state, false);\n\t return reaction.promise;\n\t },\n\t // `Promise.prototype.catch` method\n\t // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n\t 'catch': function (onRejected) {\n\t return this.then(undefined, onRejected);\n\t }\n\t });\n\t OwnPromiseCapability$1 = function () {\n\t var promise = new Internal$1();\n\t var state = getInternalState$8(promise);\n\t this.promise = promise;\n\t this.resolve = bind$1(internalResolve$1, state);\n\t this.reject = bind$1(internalReject$1, state);\n\t };\n\t newPromiseCapability$2.f = newPromiseCapability$3 = function (C) {\n\t return C === PromiseConstructor$1 || C === PromiseWrapper$1\n\t ? new OwnPromiseCapability$1(C)\n\t : newGenericPromiseCapability$1(C);\n\t };\n\n\t if ( typeof nativePromiseConstructor$1 == 'function') {\n\t nativeThen$1 = nativePromiseConstructor$1.prototype.then;\n\n\t // wrap native Promise#then for native async functions\n\t redefine$1(nativePromiseConstructor$1.prototype, 'then', function then(onFulfilled, onRejected) {\n\t var that = this;\n\t return new PromiseConstructor$1(function (resolve, reject) {\n\t nativeThen$1.call(that, resolve, reject);\n\t }).then(onFulfilled, onRejected);\n\t // https://github.com/zloirock/core-js/issues/640\n\t }, { unsafe: true });\n\n\t // wrap fetch result\n\t if (typeof $fetch$3 == 'function') _export$1({ global: true, enumerable: true, forced: true }, {\n\t // eslint-disable-next-line no-unused-vars\n\t fetch: function fetch(input /* , init */) {\n\t return promiseResolve$1(PromiseConstructor$1, $fetch$3.apply(global_1$1, arguments));\n\t }\n\t });\n\t }\n\t}\n\n\t_export$1({ global: true, wrap: true, forced: FORCED$b }, {\n\t Promise: PromiseConstructor$1\n\t});\n\n\tsetToStringTag$1(PromiseConstructor$1, PROMISE$1, false);\n\tsetSpecies$1(PROMISE$1);\n\n\tPromiseWrapper$1 = getBuiltIn$1(PROMISE$1);\n\n\t// statics\n\t_export$1({ target: PROMISE$1, stat: true, forced: FORCED$b }, {\n\t // `Promise.reject` method\n\t // https://tc39.github.io/ecma262/#sec-promise.reject\n\t reject: function reject(r) {\n\t var capability = newPromiseCapability$3(this);\n\t capability.reject.call(undefined, r);\n\t return capability.promise;\n\t }\n\t});\n\n\t_export$1({ target: PROMISE$1, stat: true, forced: FORCED$b }, {\n\t // `Promise.resolve` method\n\t // https://tc39.github.io/ecma262/#sec-promise.resolve\n\t resolve: function resolve(x) {\n\t return promiseResolve$1( this, x);\n\t }\n\t});\n\n\t_export$1({ target: PROMISE$1, stat: true, forced: INCORRECT_ITERATION$3 }, {\n\t // `Promise.all` method\n\t // https://tc39.github.io/ecma262/#sec-promise.all\n\t all: function all(iterable) {\n\t var C = this;\n\t var capability = newPromiseCapability$3(C);\n\t var resolve = capability.resolve;\n\t var reject = capability.reject;\n\t var result = perform$1(function () {\n\t var $promiseResolve = aFunction$3(C.resolve);\n\t var values = [];\n\t var counter = 0;\n\t var remaining = 1;\n\t iterate(iterable, function (promise) {\n\t var index = counter++;\n\t var alreadyCalled = false;\n\t values.push(undefined);\n\t remaining++;\n\t $promiseResolve.call(C, promise).then(function (value) {\n\t if (alreadyCalled) return;\n\t alreadyCalled = true;\n\t values[index] = value;\n\t --remaining || resolve(values);\n\t }, reject);\n\t });\n\t --remaining || resolve(values);\n\t });\n\t if (result.error) reject(result.value);\n\t return capability.promise;\n\t },\n\t // `Promise.race` method\n\t // https://tc39.github.io/ecma262/#sec-promise.race\n\t race: function race(iterable) {\n\t var C = this;\n\t var capability = newPromiseCapability$3(C);\n\t var reject = capability.reject;\n\t var result = perform$1(function () {\n\t var $promiseResolve = aFunction$3(C.resolve);\n\t iterate(iterable, function (promise) {\n\t $promiseResolve.call(C, promise).then(capability.resolve, reject);\n\t });\n\t });\n\t if (result.error) reject(result.value);\n\t return capability.promise;\n\t }\n\t});\n\n\tvar getOwnPropertyDescriptor$8 = objectGetOwnPropertyDescriptor$1.f;\n\n\n\n\n\n\n\tvar nativeStartsWith = ''.startsWith;\n\tvar min$b = Math.min;\n\n\tvar CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic$1('startsWith');\n\t// https://github.com/zloirock/core-js/pull/702\n\tvar MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () {\n\t var descriptor = getOwnPropertyDescriptor$8(String.prototype, 'startsWith');\n\t return descriptor && !descriptor.writable;\n\t}();\n\n\t// `String.prototype.startsWith` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n\t_export$1({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n\t startsWith: function startsWith(searchString /* , position = 0 */) {\n\t var that = String(requireObjectCoercible$1(this));\n\t notARegexp$1(searchString);\n\t var index = toLength$1(min$b(arguments.length > 1 ? arguments[1] : undefined, that.length));\n\t var search = String(searchString);\n\t return nativeStartsWith\n\t ? nativeStartsWith.call(that, search, index)\n\t : that.slice(index, index + search.length) === search;\n\t }\n\t});\n\n\t// ==========================================================================\n\t// Type checking utils\n\t// ==========================================================================\n\tvar getConstructor$2 = function getConstructor(input) {\n\t return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n\t};\n\n\tvar instanceOf$2 = function instanceOf(input, constructor) {\n\t return Boolean(input && constructor && input instanceof constructor);\n\t};\n\n\tvar isNullOrUndefined$2 = function isNullOrUndefined(input) {\n\t return input === null || typeof input === 'undefined';\n\t};\n\n\tvar isObject$4 = function isObject(input) {\n\t return getConstructor$2(input) === Object;\n\t};\n\n\tvar isNumber$2 = function isNumber(input) {\n\t return getConstructor$2(input) === Number && !Number.isNaN(input);\n\t};\n\n\tvar isString$3 = function isString(input) {\n\t return getConstructor$2(input) === String;\n\t};\n\n\tvar isBoolean$2 = function isBoolean(input) {\n\t return getConstructor$2(input) === Boolean;\n\t};\n\n\tvar isFunction$2 = function isFunction(input) {\n\t return getConstructor$2(input) === Function;\n\t};\n\n\tvar isArray$4 = function isArray(input) {\n\t return Array.isArray(input);\n\t};\n\n\tvar isWeakMap = function isWeakMap(input) {\n\t return instanceOf$2(input, WeakMap);\n\t};\n\n\tvar isNodeList$2 = function isNodeList(input) {\n\t return instanceOf$2(input, NodeList);\n\t};\n\n\tvar isElement$3 = function isElement(input) {\n\t return instanceOf$2(input, Element);\n\t};\n\n\tvar isTextNode = function isTextNode(input) {\n\t return getConstructor$2(input) === Text;\n\t};\n\n\tvar isEvent$3 = function isEvent(input) {\n\t return instanceOf$2(input, Event);\n\t};\n\n\tvar isKeyboardEvent = function isKeyboardEvent(input) {\n\t return instanceOf$2(input, KeyboardEvent);\n\t};\n\n\tvar isCue = function isCue(input) {\n\t return instanceOf$2(input, window.TextTrackCue) || instanceOf$2(input, window.VTTCue);\n\t};\n\n\tvar isTrack = function isTrack(input) {\n\t return instanceOf$2(input, TextTrack) || !isNullOrUndefined$2(input) && isString$3(input.kind);\n\t};\n\n\tvar isPromise = function isPromise(input) {\n\t return instanceOf$2(input, Promise) && isFunction$2(input.then);\n\t};\n\n\tvar isEmpty$2 = function isEmpty(input) {\n\t return isNullOrUndefined$2(input) || (isString$3(input) || isArray$4(input) || isNodeList$2(input)) && !input.length || isObject$4(input) && !Object.keys(input).length;\n\t};\n\n\tvar isUrl = function isUrl(input) {\n\t // Accept a URL object\n\t if (instanceOf$2(input, window.URL)) {\n\t return true;\n\t } // Must be string from here\n\n\n\t if (!isString$3(input)) {\n\t return false;\n\t } // Add the protocol if required\n\n\n\t var string = input;\n\n\t if (!input.startsWith('http://') || !input.startsWith('https://')) {\n\t string = \"http://\".concat(input);\n\t }\n\n\t try {\n\t return !isEmpty$2(new URL(string).hostname);\n\t } catch (e) {\n\t return false;\n\t }\n\t};\n\n\tvar is$2 = {\n\t nullOrUndefined: isNullOrUndefined$2,\n\t object: isObject$4,\n\t number: isNumber$2,\n\t string: isString$3,\n\t boolean: isBoolean$2,\n\t function: isFunction$2,\n\t array: isArray$4,\n\t weakMap: isWeakMap,\n\t nodeList: isNodeList$2,\n\t element: isElement$3,\n\t textNode: isTextNode,\n\t event: isEvent$3,\n\t keyboardEvent: isKeyboardEvent,\n\t cue: isCue,\n\t track: isTrack,\n\t promise: isPromise,\n\t url: isUrl,\n\t empty: isEmpty$2\n\t};\n\n\tvar transitionEndEvent = function () {\n\t var element = document.createElement('span');\n\t var events = {\n\t WebkitTransition: 'webkitTransitionEnd',\n\t MozTransition: 'transitionend',\n\t OTransition: 'oTransitionEnd otransitionend',\n\t transition: 'transitionend'\n\t };\n\t var type = Object.keys(events).find(function (event) {\n\t return element.style[event] !== undefined;\n\t });\n\t return is$2.string(type) ? events[type] : false;\n\t}(); // Force repaint of element\n\n\tfunction repaint(element, delay) {\n\t setTimeout(function () {\n\t try {\n\t // eslint-disable-next-line no-param-reassign\n\t element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n\t element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n\t element.hidden = false;\n\t } catch (e) {// Do nothing\n\t }\n\t }, delay);\n\t}\n\n\t// ==========================================================================\n\t// Browser sniffing\n\t// Unfortunately, due to mixed support, UA sniffing is required\n\t// ==========================================================================\n\tvar browser = {\n\t isIE:\n\t /* @cc_on!@ */\n\t !!document.documentMode,\n\t isEdge: window.navigator.userAgent.includes('Edge'),\n\t isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n\t isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n\t isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)\n\t};\n\n\t// `Array.prototype.{ reduce, reduceRight }` methods implementation\n\tvar createMethod$b = function (IS_RIGHT) {\n\t return function (that, callbackfn, argumentsLength, memo) {\n\t aFunction$3(callbackfn);\n\t var O = toObject$1(that);\n\t var self = indexedObject$1(O);\n\t var length = toLength$1(O.length);\n\t var index = IS_RIGHT ? length - 1 : 0;\n\t var i = IS_RIGHT ? -1 : 1;\n\t if (argumentsLength < 2) while (true) {\n\t if (index in self) {\n\t memo = self[index];\n\t index += i;\n\t break;\n\t }\n\t index += i;\n\t if (IS_RIGHT ? index < 0 : length <= index) {\n\t throw TypeError('Reduce of empty array with no initial value');\n\t }\n\t }\n\t for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n\t memo = callbackfn(memo, self[index], index, O);\n\t }\n\t return memo;\n\t };\n\t};\n\n\tvar arrayReduce$1 = {\n\t // `Array.prototype.reduce` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n\t left: createMethod$b(false),\n\t // `Array.prototype.reduceRight` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n\t right: createMethod$b(true)\n\t};\n\n\tvar $reduce$1 = arrayReduce$1.left;\n\n\n\n\n\n\tvar STRICT_METHOD$a = arrayMethodIsStrict$1('reduce');\n\tvar USES_TO_LENGTH$i = arrayMethodUsesToLength$1('reduce', { 1: 0 });\n\t// Chrome 80-82 has a critical bug\n\t// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\n\tvar CHROME_BUG = !engineIsNode && engineV8Version$1 > 79 && engineV8Version$1 < 83;\n\n\t// `Array.prototype.reduce` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n\t_export$1({ target: 'Array', proto: true, forced: !STRICT_METHOD$a || !USES_TO_LENGTH$i || CHROME_BUG }, {\n\t reduce: function reduce(callbackfn /* , initialValue */) {\n\t return $reduce$1(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tfunction cloneDeep(object) {\n\t return JSON.parse(JSON.stringify(object));\n\t} // Get a nested value in an object\n\n\tfunction getDeep(object, path) {\n\t return path.split('.').reduce(function (obj, key) {\n\t return obj && obj[key];\n\t }, object);\n\t} // Deep extend destination object with N more objects\n\n\tfunction extend$1() {\n\t var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t sources[_key - 1] = arguments[_key];\n\t }\n\n\t if (!sources.length) {\n\t return target;\n\t }\n\n\t var source = sources.shift();\n\n\t if (!is$2.object(source)) {\n\t return target;\n\t }\n\n\t Object.keys(source).forEach(function (key) {\n\t if (is$2.object(source[key])) {\n\t if (!Object.keys(target).includes(key)) {\n\t Object.assign(target, _defineProperty({}, key, {}));\n\t }\n\n\t extend$1(target[key], source[key]);\n\t } else {\n\t Object.assign(target, _defineProperty({}, key, source[key]));\n\t }\n\t });\n\t return extend$1.apply(void 0, [target].concat(sources));\n\t}\n\n\tfunction wrap$4(elements, wrapper) {\n\t // Convert `elements` to an array, if necessary.\n\t var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n\t // first element (see `child` below).\n\n\t Array.from(targets).reverse().forEach(function (element, index) {\n\t var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n\t var parent = element.parentNode;\n\t var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n\t // parent).\n\n\t child.appendChild(element); // If the element had a sibling, insert the wrapper before\n\t // the sibling to maintain the HTML structure; otherwise, just\n\t // append it to the parent.\n\n\t if (sibling) {\n\t parent.insertBefore(child, sibling);\n\t } else {\n\t parent.appendChild(child);\n\t }\n\t });\n\t} // Set attributes\n\n\tfunction setAttributes$1(element, attributes) {\n\t if (!is$2.element(element) || is$2.empty(attributes)) {\n\t return;\n\t } // Assume null and undefined attributes should be left out,\n\t // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n\t Object.entries(attributes).filter(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t value = _ref2[1];\n\n\t return !is$2.nullOrUndefined(value);\n\t }).forEach(function (_ref3) {\n\t var _ref4 = _slicedToArray(_ref3, 2),\n\t key = _ref4[0],\n\t value = _ref4[1];\n\n\t return element.setAttribute(key, value);\n\t });\n\t} // Create a DocumentFragment\n\n\tfunction createElement$1(type, attributes, text) {\n\t // Create a new <element>\n\t var element = document.createElement(type); // Set all passed attributes\n\n\t if (is$2.object(attributes)) {\n\t setAttributes$1(element, attributes);\n\t } // Add text node\n\n\n\t if (is$2.string(text)) {\n\t element.innerText = text;\n\t } // Return built element\n\n\n\t return element;\n\t} // Inaert an element after another\n\n\tfunction insertAfter(element, target) {\n\t if (!is$2.element(element) || !is$2.element(target)) {\n\t return;\n\t }\n\n\t target.parentNode.insertBefore(element, target.nextSibling);\n\t} // Insert a DocumentFragment\n\n\tfunction insertElement(type, parent, attributes, text) {\n\t if (!is$2.element(parent)) {\n\t return;\n\t }\n\n\t parent.appendChild(createElement$1(type, attributes, text));\n\t} // Remove element(s)\n\n\tfunction removeElement(element) {\n\t if (is$2.nodeList(element) || is$2.array(element)) {\n\t Array.from(element).forEach(removeElement);\n\t return;\n\t }\n\n\t if (!is$2.element(element) || !is$2.element(element.parentNode)) {\n\t return;\n\t }\n\n\t element.parentNode.removeChild(element);\n\t} // Remove all child elements\n\n\tfunction emptyElement(element) {\n\t if (!is$2.element(element)) {\n\t return;\n\t }\n\n\t var length = element.childNodes.length;\n\n\t while (length > 0) {\n\t element.removeChild(element.lastChild);\n\t length -= 1;\n\t }\n\t} // Replace element\n\n\tfunction replaceElement(newChild, oldChild) {\n\t if (!is$2.element(oldChild) || !is$2.element(oldChild.parentNode) || !is$2.element(newChild)) {\n\t return null;\n\t }\n\n\t oldChild.parentNode.replaceChild(newChild, oldChild);\n\t return newChild;\n\t} // Get an attribute object from a string selector\n\n\tfunction getAttributesFromSelector(sel, existingAttributes) {\n\t // For example:\n\t // '.test' to { class: 'test' }\n\t // '#test' to { id: 'test' }\n\t // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\t if (!is$2.string(sel) || is$2.empty(sel)) {\n\t return {};\n\t }\n\n\t var attributes = {};\n\t var existing = extend$1({}, existingAttributes);\n\t sel.split(',').forEach(function (s) {\n\t // Remove whitespace\n\t var selector = s.trim();\n\t var className = selector.replace('.', '');\n\t var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n\t var parts = stripped.split('=');\n\n\t var _parts = _slicedToArray(parts, 1),\n\t key = _parts[0];\n\n\t var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n\t var start = selector.charAt(0);\n\n\t switch (start) {\n\t case '.':\n\t // Add to existing classname\n\t if (is$2.string(existing.class)) {\n\t attributes.class = \"\".concat(existing.class, \" \").concat(className);\n\t } else {\n\t attributes.class = className;\n\t }\n\n\t break;\n\n\t case '#':\n\t // ID selector\n\t attributes.id = selector.replace('#', '');\n\t break;\n\n\t case '[':\n\t // Attribute selector\n\t attributes[key] = value;\n\t break;\n\t }\n\t });\n\t return extend$1(existing, attributes);\n\t} // Toggle hidden\n\n\tfunction toggleHidden(element, hidden) {\n\t if (!is$2.element(element)) {\n\t return;\n\t }\n\n\t var hide = hidden;\n\n\t if (!is$2.boolean(hide)) {\n\t hide = !element.hidden;\n\t } // eslint-disable-next-line no-param-reassign\n\n\n\t element.hidden = hide;\n\t} // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\n\tfunction toggleClass(element, className, force) {\n\t if (is$2.nodeList(element)) {\n\t return Array.from(element).map(function (e) {\n\t return toggleClass(e, className, force);\n\t });\n\t }\n\n\t if (is$2.element(element)) {\n\t var method = 'toggle';\n\n\t if (typeof force !== 'undefined') {\n\t method = force ? 'add' : 'remove';\n\t }\n\n\t element.classList[method](className);\n\t return element.classList.contains(className);\n\t }\n\n\t return false;\n\t} // Has class name\n\n\tfunction hasClass(element, className) {\n\t return is$2.element(element) && element.classList.contains(className);\n\t} // Element matches selector\n\n\tfunction matches$2(element, selector) {\n\t var _Element = Element,\n\t prototype = _Element.prototype;\n\n\t function match() {\n\t return Array.from(document.querySelectorAll(selector)).includes(this);\n\t }\n\n\t var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\t return method.call(element, selector);\n\t} // Closest ancestor element matching selector (also tests element itself)\n\n\tfunction closest(element, selector) {\n\t var _Element2 = Element,\n\t prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n\t function closestElement() {\n\t var el = this;\n\n\t do {\n\t if (matches$2.matches(el, selector)) return el;\n\t el = el.parentElement || el.parentNode;\n\t } while (el !== null && el.nodeType === 1);\n\n\t return null;\n\t }\n\n\t var method = prototype.closest || closestElement;\n\t return method.call(element, selector);\n\t} // Find all elements\n\n\tfunction getElements(selector) {\n\t return this.elements.container.querySelectorAll(selector);\n\t} // Find a single element\n\n\tfunction getElement(selector) {\n\t return this.elements.container.querySelector(selector);\n\t} // Set focus and tab focus class\n\n\tfunction setFocus() {\n\t var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t if (!is$2.element(element)) {\n\t return;\n\t } // Set regular focus\n\n\n\t element.focus({\n\t preventScroll: true\n\t }); // If we want to mimic keyboard focus via tab\n\n\t if (tabFocus) {\n\t toggleClass(element, this.config.classNames.tabFocus);\n\t }\n\t}\n\n\tvar defaultCodecs = {\n\t 'audio/ogg': 'vorbis',\n\t 'audio/wav': '1',\n\t 'video/webm': 'vp8, vorbis',\n\t 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n\t 'video/ogg': 'theora'\n\t}; // Check for feature support\n\n\tvar support = {\n\t // Basic support\n\t audio: 'canPlayType' in document.createElement('audio'),\n\t video: 'canPlayType' in document.createElement('video'),\n\t // Check for support\n\t // Basic functionality vs full UI\n\t check: function check(type, provider, playsinline) {\n\t var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\t var api = support[type] || provider !== 'html5';\n\t var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\t return {\n\t api: api,\n\t ui: ui\n\t };\n\t },\n\t // Picture-in-picture support\n\t // Safari & Chrome only currently\n\t pip: function () {\n\t if (browser.isIPhone) {\n\t return false;\n\t } // Safari\n\t // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n\t if (is$2.function(createElement$1('video').webkitSetPresentationMode)) {\n\t return true;\n\t } // Chrome\n\t // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n\t if (document.pictureInPictureEnabled && !createElement$1('video').disablePictureInPicture) {\n\t return true;\n\t }\n\n\t return false;\n\t }(),\n\t // Airplay support\n\t // Safari only currently\n\t airplay: is$2.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\t // Inline playback support\n\t // https://webkit.org/blog/6784/new-video-policies-for-ios/\n\t playsinline: 'playsInline' in document.createElement('video'),\n\t // Check for mime type support against a player instance\n\t // Credits: http://diveintohtml5.info/everything.html\n\t // Related: http://www.leanbackplayer.com/test/h5mt.html\n\t mime: function mime(input) {\n\t if (is$2.empty(input)) {\n\t return false;\n\t }\n\n\t var _input$split = input.split('/'),\n\t _input$split2 = _slicedToArray(_input$split, 1),\n\t mediaType = _input$split2[0];\n\n\t var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n\t if (!this.isHTML5 || mediaType !== this.type) {\n\t return false;\n\t } // Add codec if required\n\n\n\t if (Object.keys(defaultCodecs).includes(type)) {\n\t type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n\t }\n\n\t try {\n\t return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n\t } catch (e) {\n\t return false;\n\t }\n\t },\n\t // Check for textTracks support\n\t textTracks: 'textTracks' in document.createElement('video'),\n\t // <input type=\"range\"> Sliders\n\t rangeInput: function () {\n\t var range = document.createElement('input');\n\t range.type = 'range';\n\t return range.type === 'range';\n\t }(),\n\t // Touch\n\t // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n\t touch: 'ontouchstart' in document.documentElement,\n\t // Detect transitions support\n\t transitions: transitionEndEvent !== false,\n\t // Reduced motion iOS & MacOS setting\n\t // https://webkit.org/blog/7551/responsive-design-for-motion/\n\t reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n\t};\n\n\t// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n\t// https://www.youtube.com/watch?v=NPM6172J22g\n\n\tvar supportsPassiveListeners = function () {\n\t // Test via a getter in the options object to see if the passive property is accessed\n\t var supported = false;\n\n\t try {\n\t var options = Object.defineProperty({}, 'passive', {\n\t get: function get() {\n\t supported = true;\n\t return null;\n\t }\n\t });\n\t window.addEventListener('test', null, options);\n\t window.removeEventListener('test', null, options);\n\t } catch (e) {// Do nothing\n\t }\n\n\t return supported;\n\t}(); // Toggle event listener\n\n\n\tfunction toggleListener(element, event, callback) {\n\t var _this = this;\n\n\t var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\t var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n\t var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n\t // Bail if no element, event, or callback\n\t if (!element || !('addEventListener' in element) || is$2.empty(event) || !is$2.function(callback)) {\n\t return;\n\t } // Allow multiple events\n\n\n\t var events = event.split(' '); // Build options\n\t // Default to just the capture boolean for browsers with no passive listener support\n\n\t var options = capture; // If passive events listeners are supported\n\n\t if (supportsPassiveListeners) {\n\t options = {\n\t // Whether the listener can be passive (i.e. default never prevented)\n\t passive: passive,\n\t // Whether the listener is a capturing listener or not\n\t capture: capture\n\t };\n\t } // If a single node is passed, bind the event listener\n\n\n\t events.forEach(function (type) {\n\t if (_this && _this.eventListeners && toggle) {\n\t // Cache event listener\n\t _this.eventListeners.push({\n\t element: element,\n\t type: type,\n\t callback: callback,\n\t options: options\n\t });\n\t }\n\n\t element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n\t });\n\t} // Bind event handler\n\n\tfunction on(element) {\n\t var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var callback = arguments.length > 2 ? arguments[2] : undefined;\n\t var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\t var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\t toggleListener.call(this, element, events, callback, true, passive, capture);\n\t} // Unbind event handler\n\n\tfunction off(element) {\n\t var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var callback = arguments.length > 2 ? arguments[2] : undefined;\n\t var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\t var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\t toggleListener.call(this, element, events, callback, false, passive, capture);\n\t} // Bind once-only event handler\n\n\tfunction once(element) {\n\t var _this2 = this;\n\n\t var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var callback = arguments.length > 2 ? arguments[2] : undefined;\n\t var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\t var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n\t var onceCallback = function onceCallback() {\n\t off(element, events, onceCallback, passive, capture);\n\n\t for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\n\t callback.apply(_this2, args);\n\t };\n\n\t toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n\t} // Trigger event\n\n\tfunction triggerEvent(element) {\n\t var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\t var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n\t // Bail if no element\n\t if (!is$2.element(element) || is$2.empty(type)) {\n\t return;\n\t } // Create and dispatch the event\n\n\n\t var event = new CustomEvent(type, {\n\t bubbles: bubbles,\n\t detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n\t plyr: this\n\t })\n\t }); // Dispatch the event\n\n\t element.dispatchEvent(event);\n\t} // Unbind all cached event listeners\n\n\tfunction unbindListeners() {\n\t if (this && this.eventListeners) {\n\t this.eventListeners.forEach(function (item) {\n\t var element = item.element,\n\t type = item.type,\n\t callback = item.callback,\n\t options = item.options;\n\t element.removeEventListener(type, callback, options);\n\t });\n\t this.eventListeners = [];\n\t }\n\t} // Run method when / if player is ready\n\n\tfunction ready() {\n\t var _this3 = this;\n\n\t return new Promise(function (resolve) {\n\t return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n\t }).then(function () {});\n\t}\n\n\t/**\n\t * Silence a Promise-like object.\n\t * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n\t * play promise\" rejection error messages.\n\t * @param {Object} value An object that may or may not be `Promise`-like.\n\t */\n\n\tfunction silencePromise(value) {\n\t if (is$2.promise(value)) {\n\t value.then(null, function () {});\n\t }\n\t}\n\n\tfunction validateRatio(input) {\n\t if (!is$2.array(input) && (!is$2.string(input) || !input.includes(':'))) {\n\t return false;\n\t }\n\n\t var ratio = is$2.array(input) ? input : input.split(':');\n\t return ratio.map(Number).every(is$2.number);\n\t}\n\tfunction reduceAspectRatio(ratio) {\n\t if (!is$2.array(ratio) || !ratio.every(is$2.number)) {\n\t return null;\n\t }\n\n\t var _ratio = _slicedToArray(ratio, 2),\n\t width = _ratio[0],\n\t height = _ratio[1];\n\n\t var getDivider = function getDivider(w, h) {\n\t return h === 0 ? w : getDivider(h, w % h);\n\t };\n\n\t var divider = getDivider(width, height);\n\t return [width / divider, height / divider];\n\t}\n\tfunction getAspectRatio(input) {\n\t var parse = function parse(ratio) {\n\t return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n\t }; // Try provided ratio\n\n\n\t var ratio = parse(input); // Get from config\n\n\t if (ratio === null) {\n\t ratio = parse(this.config.ratio);\n\t } // Get from embed\n\n\n\t if (ratio === null && !is$2.empty(this.embed) && is$2.array(this.embed.ratio)) {\n\t ratio = this.embed.ratio;\n\t } // Get from HTML5 video\n\n\n\t if (ratio === null && this.isHTML5) {\n\t var _this$media = this.media,\n\t videoWidth = _this$media.videoWidth,\n\t videoHeight = _this$media.videoHeight;\n\t ratio = reduceAspectRatio([videoWidth, videoHeight]);\n\t }\n\n\t return ratio;\n\t} // Set aspect ratio for responsive container\n\n\tfunction setAspectRatio(input) {\n\t if (!this.isVideo) {\n\t return {};\n\t }\n\n\t var wrapper = this.elements.wrapper;\n\t var ratio = getAspectRatio.call(this, input);\n\n\t var _ref = is$2.array(ratio) ? ratio : [0, 0],\n\t _ref2 = _slicedToArray(_ref, 2),\n\t w = _ref2[0],\n\t h = _ref2[1];\n\n\t var padding = 100 / w * h;\n\t wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n\t if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n\t var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n\t var offset = (height - padding) / (height / 50);\n\n\t if (this.fullscreen.active) {\n\t wrapper.style.paddingBottom = null;\n\t } else {\n\t this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n\t }\n\t } else if (this.isHTML5) {\n\t wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n\t }\n\n\t return {\n\t padding: padding,\n\t ratio: ratio\n\t };\n\t}\n\n\tvar html5 = {\n\t getSources: function getSources() {\n\t var _this = this;\n\n\t if (!this.isHTML5) {\n\t return [];\n\t }\n\n\t var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n\t return sources.filter(function (source) {\n\t var type = source.getAttribute('type');\n\n\t if (is$2.empty(type)) {\n\t return true;\n\t }\n\n\t return support.mime.call(_this, type);\n\t });\n\t },\n\t // Get quality levels\n\t getQualityOptions: function getQualityOptions() {\n\t // Whether we're forcing all options (e.g. for streaming)\n\t if (this.config.quality.forced) {\n\t return this.config.quality.options;\n\t } // Get sizes from <source> elements\n\n\n\t return html5.getSources.call(this).map(function (source) {\n\t return Number(source.getAttribute('size'));\n\t }).filter(Boolean);\n\t },\n\t setup: function setup() {\n\t if (!this.isHTML5) {\n\t return;\n\t }\n\n\t var player = this; // Set speed options from config\n\n\t player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n\t if (!is$2.empty(this.config.ratio)) {\n\t setAspectRatio.call(player);\n\t } // Quality\n\n\n\t Object.defineProperty(player.media, 'quality', {\n\t get: function get() {\n\t // Get sources\n\t var sources = html5.getSources.call(player);\n\t var source = sources.find(function (s) {\n\t return s.getAttribute('src') === player.source;\n\t }); // Return size, if match is found\n\n\t return source && Number(source.getAttribute('size'));\n\t },\n\t set: function set(input) {\n\t if (player.quality === input) {\n\t return;\n\t } // If we're using an an external handler...\n\n\n\t if (player.config.quality.forced && is$2.function(player.config.quality.onChange)) {\n\t player.config.quality.onChange(input);\n\t } else {\n\t // Get sources\n\t var sources = html5.getSources.call(player); // Get first match for requested size\n\n\t var source = sources.find(function (s) {\n\t return Number(s.getAttribute('size')) === input;\n\t }); // No matching source found\n\n\t if (!source) {\n\t return;\n\t } // Get current state\n\n\n\t var _player$media = player.media,\n\t currentTime = _player$media.currentTime,\n\t paused = _player$media.paused,\n\t preload = _player$media.preload,\n\t readyState = _player$media.readyState,\n\t playbackRate = _player$media.playbackRate; // Set new source\n\n\t player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n\t if (preload !== 'none' || readyState) {\n\t // Restore time\n\t player.once('loadedmetadata', function () {\n\t player.speed = playbackRate;\n\t player.currentTime = currentTime; // Resume playing\n\n\t if (!paused) {\n\t silencePromise(player.play());\n\t }\n\t }); // Load new source\n\n\t player.media.load();\n\t }\n\t } // Trigger change event\n\n\n\t triggerEvent.call(player, player.media, 'qualitychange', false, {\n\t quality: input\n\t });\n\t }\n\t });\n\t },\n\t // Cancel current network requests\n\t // See https://github.com/sampotts/plyr/issues/174\n\t cancelRequests: function cancelRequests() {\n\t if (!this.isHTML5) {\n\t return;\n\t } // Remove child sources\n\n\n\t removeElement(html5.getSources.call(this)); // Set blank video src attribute\n\t // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n\t // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n\n\t this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n\t // This will cancel existing requests\n\t // See https://github.com/sampotts/plyr/issues/174\n\n\t this.media.load(); // Debugging\n\n\t this.debug.log('Cancelled network requests');\n\t }\n\t};\n\n\tfunction dedupe(array) {\n\t if (!is$2.array(array)) {\n\t return array;\n\t }\n\n\t return array.filter(function (item, index) {\n\t return array.indexOf(item) === index;\n\t });\n\t} // Get the closest value in an array\n\n\tfunction closest$1(array, value) {\n\t if (!is$2.array(array) || !array.length) {\n\t return null;\n\t }\n\n\t return array.reduce(function (prev, curr) {\n\t return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n\t });\n\t}\n\n\tvar HAS_SPECIES_SUPPORT$6 = arrayMethodHasSpeciesSupport$1('slice');\n\tvar USES_TO_LENGTH$j = arrayMethodUsesToLength$1('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n\tvar SPECIES$d = wellKnownSymbol$1('species');\n\tvar nativeSlice$1 = [].slice;\n\tvar max$6 = Math.max;\n\n\t// `Array.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n\t// fallback for not array-like ES3 strings and DOM objects\n\t_export$1({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$6 || !USES_TO_LENGTH$j }, {\n\t slice: function slice(start, end) {\n\t var O = toIndexedObject$1(this);\n\t var length = toLength$1(O.length);\n\t var k = toAbsoluteIndex$1(start, length);\n\t var fin = toAbsoluteIndex$1(end === undefined ? length : end, length);\n\t // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n\t var Constructor, result, n;\n\t if (isArray$2(O)) {\n\t Constructor = O.constructor;\n\t // cross-realm fallback\n\t if (typeof Constructor == 'function' && (Constructor === Array || isArray$2(Constructor.prototype))) {\n\t Constructor = undefined;\n\t } else if (isObject$2(Constructor)) {\n\t Constructor = Constructor[SPECIES$d];\n\t if (Constructor === null) Constructor = undefined;\n\t }\n\t if (Constructor === Array || Constructor === undefined) {\n\t return nativeSlice$1.call(O, k, fin);\n\t }\n\t }\n\t result = new (Constructor === undefined ? Array : Constructor)(max$6(fin - k, 0));\n\t for (n = 0; k < fin; k++, n++) if (k in O) createProperty$1(result, n, O[k]);\n\t result.length = n;\n\t return result;\n\t }\n\t});\n\n\tvar defineProperty$f = objectDefineProperty$1.f;\n\tvar getOwnPropertyNames$4 = objectGetOwnPropertyNames$1.f;\n\n\n\n\n\n\tvar setInternalState$g = internalState$1.set;\n\n\n\n\tvar MATCH$5 = wellKnownSymbol$1('match');\n\tvar NativeRegExp$1 = global_1$1.RegExp;\n\tvar RegExpPrototype$3 = NativeRegExp$1.prototype;\n\tvar re1$1 = /a/g;\n\tvar re2$1 = /a/g;\n\n\t// \"new\" should create a new object, old webkit bug\n\tvar CORRECT_NEW$1 = new NativeRegExp$1(re1$1) !== re1$1;\n\n\tvar UNSUPPORTED_Y$5 = regexpStickyHelpers$1.UNSUPPORTED_Y;\n\n\tvar FORCED$c = descriptors$1 && isForced_1$1('RegExp', (!CORRECT_NEW$1 || UNSUPPORTED_Y$5 || fails$1(function () {\n\t re2$1[MATCH$5] = false;\n\t // RegExp constructor can alter flags and IsRegExp works correct with @@match\n\t return NativeRegExp$1(re1$1) != re1$1 || NativeRegExp$1(re2$1) == re2$1 || NativeRegExp$1(re1$1, 'i') != '/a/i';\n\t})));\n\n\t// `RegExp` constructor\n\t// https://tc39.github.io/ecma262/#sec-regexp-constructor\n\tif (FORCED$c) {\n\t var RegExpWrapper$1 = function RegExp(pattern, flags) {\n\t var thisIsRegExp = this instanceof RegExpWrapper$1;\n\t var patternIsRegExp = isRegexp$1(pattern);\n\t var flagsAreUndefined = flags === undefined;\n\t var sticky;\n\n\t if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper$1 && flagsAreUndefined) {\n\t return pattern;\n\t }\n\n\t if (CORRECT_NEW$1) {\n\t if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n\t } else if (pattern instanceof RegExpWrapper$1) {\n\t if (flagsAreUndefined) flags = regexpFlags$1.call(pattern);\n\t pattern = pattern.source;\n\t }\n\n\t if (UNSUPPORTED_Y$5) {\n\t sticky = !!flags && flags.indexOf('y') > -1;\n\t if (sticky) flags = flags.replace(/y/g, '');\n\t }\n\n\t var result = inheritIfRequired$1(\n\t CORRECT_NEW$1 ? new NativeRegExp$1(pattern, flags) : NativeRegExp$1(pattern, flags),\n\t thisIsRegExp ? this : RegExpPrototype$3,\n\t RegExpWrapper$1\n\t );\n\n\t if (UNSUPPORTED_Y$5 && sticky) setInternalState$g(result, { sticky: sticky });\n\n\t return result;\n\t };\n\t var proxy$1 = function (key) {\n\t key in RegExpWrapper$1 || defineProperty$f(RegExpWrapper$1, key, {\n\t configurable: true,\n\t get: function () { return NativeRegExp$1[key]; },\n\t set: function (it) { NativeRegExp$1[key] = it; }\n\t });\n\t };\n\t var keys$6 = getOwnPropertyNames$4(NativeRegExp$1);\n\t var index$1 = 0;\n\t while (keys$6.length > index$1) proxy$1(keys$6[index$1++]);\n\t RegExpPrototype$3.constructor = RegExpWrapper$1;\n\t RegExpWrapper$1.prototype = RegExpPrototype$3;\n\t redefine$1(global_1$1, 'RegExp', RegExpWrapper$1);\n\t}\n\n\t// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\n\tsetSpecies$1('RegExp');\n\n\tfunction generateId(prefix) {\n\t return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n\t} // Format string\n\n\tfunction format(input) {\n\t for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t args[_key - 1] = arguments[_key];\n\t }\n\n\t if (is$2.empty(input)) {\n\t return input;\n\t }\n\n\t return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n\t return args[i].toString();\n\t });\n\t} // Get percentage\n\n\tfunction getPercentage(current, max) {\n\t if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n\t return 0;\n\t }\n\n\t return (current / max * 100).toFixed(2);\n\t} // Replace all occurances of a string in a string\n\n\tvar replaceAll = function replaceAll() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\t return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\t}; // Convert to title case\n\n\tvar toTitleCase = function toTitleCase() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t return input.toString().replace(/\\w\\S*/g, function (text) {\n\t return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n\t });\n\t}; // Convert string to pascalCase\n\n\tfunction toPascalCase() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var string = input.toString(); // Convert kebab case\n\n\t string = replaceAll(string, '-', ' '); // Convert snake case\n\n\t string = replaceAll(string, '_', ' '); // Convert to title case\n\n\t string = toTitleCase(string); // Convert to pascal case\n\n\t return replaceAll(string, ' ', '');\n\t} // Convert string to pascalCase\n\n\tfunction toCamelCase() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var string = input.toString(); // Convert to pascal case\n\n\t string = toPascalCase(string); // Convert first character to lowercase\n\n\t return string.charAt(0).toLowerCase() + string.slice(1);\n\t} // Remove HTML from a string\n\n\tfunction stripHTML(source) {\n\t var fragment = document.createDocumentFragment();\n\t var element = document.createElement('div');\n\t fragment.appendChild(element);\n\t element.innerHTML = source;\n\t return fragment.firstChild.innerText;\n\t} // Like outerHTML, but also works for DocumentFragment\n\n\tfunction getHTML(element) {\n\t var wrapper = document.createElement('div');\n\t wrapper.appendChild(element);\n\t return wrapper.innerHTML;\n\t}\n\n\tvar resources = {\n\t pip: 'PIP',\n\t airplay: 'AirPlay',\n\t html5: 'HTML5',\n\t vimeo: 'Vimeo',\n\t youtube: 'YouTube'\n\t};\n\tvar i18n = {\n\t get: function get() {\n\t var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t if (is$2.empty(key) || is$2.empty(config)) {\n\t return '';\n\t }\n\n\t var string = getDeep(config.i18n, key);\n\n\t if (is$2.empty(string)) {\n\t if (Object.keys(resources).includes(key)) {\n\t return resources[key];\n\t }\n\n\t return '';\n\t }\n\n\t var replace = {\n\t '{seektime}': config.seekTime,\n\t '{title}': config.title\n\t };\n\t Object.entries(replace).forEach(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t k = _ref2[0],\n\t v = _ref2[1];\n\n\t string = replaceAll(string, k, v);\n\t });\n\t return string;\n\t }\n\t};\n\n\tvar Storage$1 = /*#__PURE__*/function () {\n\t function Storage(player) {\n\t _classCallCheck(this, Storage);\n\n\t this.enabled = player.config.storage.enabled;\n\t this.key = player.config.storage.key;\n\t } // Check for actual support (see if we can use it)\n\n\n\t _createClass(Storage, [{\n\t key: \"get\",\n\t value: function get(key) {\n\t if (!Storage.supported || !this.enabled) {\n\t return null;\n\t }\n\n\t var store = window.localStorage.getItem(this.key);\n\n\t if (is$2.empty(store)) {\n\t return null;\n\t }\n\n\t var json = JSON.parse(store);\n\t return is$2.string(key) && key.length ? json[key] : json;\n\t }\n\t }, {\n\t key: \"set\",\n\t value: function set(object) {\n\t // Bail if we don't have localStorage support or it's disabled\n\t if (!Storage.supported || !this.enabled) {\n\t return;\n\t } // Can only store objectst\n\n\n\t if (!is$2.object(object)) {\n\t return;\n\t } // Get current storage\n\n\n\t var storage = this.get(); // Default to empty object\n\n\t if (is$2.empty(storage)) {\n\t storage = {};\n\t } // Update the working copy of the values\n\n\n\t extend$1(storage, object); // Update storage\n\n\t window.localStorage.setItem(this.key, JSON.stringify(storage));\n\t }\n\t }], [{\n\t key: \"supported\",\n\t get: function get() {\n\t try {\n\t if (!('localStorage' in window)) {\n\t return false;\n\t }\n\n\t var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)\n\t // see: https://github.com/sampotts/plyr/issues/131\n\n\t window.localStorage.setItem(test, test);\n\t window.localStorage.removeItem(test);\n\t return true;\n\t } catch (e) {\n\t return false;\n\t }\n\t }\n\t }]);\n\n\t return Storage;\n\t}();\n\n\t// ==========================================================================\n\t// Fetch wrapper\n\t// Using XHR to avoid issues with older browsers\n\t// ==========================================================================\n\tfunction fetch(url) {\n\t var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n\t return new Promise(function (resolve, reject) {\n\t try {\n\t var request = new XMLHttpRequest(); // Check for CORS support\n\n\t if (!('withCredentials' in request)) {\n\t return;\n\t }\n\n\t request.addEventListener('load', function () {\n\t if (responseType === 'text') {\n\t try {\n\t resolve(JSON.parse(request.responseText));\n\t } catch (e) {\n\t resolve(request.responseText);\n\t }\n\t } else {\n\t resolve(request.response);\n\t }\n\t });\n\t request.addEventListener('error', function () {\n\t throw new Error(request.status);\n\t });\n\t request.open('GET', url, true); // Set the required response type\n\n\t request.responseType = responseType;\n\t request.send();\n\t } catch (e) {\n\t reject(e);\n\t }\n\t });\n\t}\n\n\t// ==========================================================================\n\n\tfunction loadSprite(url, id) {\n\t if (!is$2.string(url)) {\n\t return;\n\t }\n\n\t var prefix = 'cache';\n\t var hasId = is$2.string(id);\n\t var isCached = false;\n\n\t var exists = function exists() {\n\t return document.getElementById(id) !== null;\n\t };\n\n\t var update = function update(container, data) {\n\t // eslint-disable-next-line no-param-reassign\n\t container.innerHTML = data; // Check again incase of race condition\n\n\t if (hasId && exists()) {\n\t return;\n\t } // Inject the SVG to the body\n\n\n\t document.body.insertAdjacentElement('afterbegin', container);\n\t }; // Only load once if ID set\n\n\n\t if (!hasId || !exists()) {\n\t var useStorage = Storage$1.supported; // Create container\n\n\t var container = document.createElement('div');\n\t container.setAttribute('hidden', '');\n\n\t if (hasId) {\n\t container.setAttribute('id', id);\n\t } // Check in cache\n\n\n\t if (useStorage) {\n\t var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n\t isCached = cached !== null;\n\n\t if (isCached) {\n\t var data = JSON.parse(cached);\n\t update(container, data.content);\n\t }\n\t } // Get the sprite\n\n\n\t fetch(url).then(function (result) {\n\t if (is$2.empty(result)) {\n\t return;\n\t }\n\n\t if (useStorage) {\n\t window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n\t content: result\n\t }));\n\t }\n\n\t update(container, result);\n\t }).catch(function () {});\n\t }\n\t}\n\n\tvar ceil$2 = Math.ceil;\n\tvar floor$b = Math.floor;\n\n\t// `Math.trunc` method\n\t// https://tc39.github.io/ecma262/#sec-math.trunc\n\t_export$1({ target: 'Math', stat: true }, {\n\t trunc: function trunc(it) {\n\t return (it > 0 ? floor$b : ceil$2)(it);\n\t }\n\t});\n\n\tvar getHours = function getHours(value) {\n\t return Math.trunc(value / 60 / 60 % 60, 10);\n\t};\n\tvar getMinutes = function getMinutes(value) {\n\t return Math.trunc(value / 60 % 60, 10);\n\t};\n\tvar getSeconds = function getSeconds(value) {\n\t return Math.trunc(value % 60, 10);\n\t}; // Format time to UI friendly string\n\n\tfunction formatTime() {\n\t var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t // Bail if the value isn't a number\n\t if (!is$2.number(time)) {\n\t return formatTime(undefined, displayHours, inverted);\n\t } // Format time component to add leading zero\n\n\n\t var format = function format(value) {\n\t return \"0\".concat(value).slice(-2);\n\t }; // Breakdown to hours, mins, secs\n\n\n\t var hours = getHours(time);\n\t var mins = getMinutes(time);\n\t var secs = getSeconds(time); // Do we need to display hours?\n\n\t if (displayHours || hours > 0) {\n\t hours = \"\".concat(hours, \":\");\n\t } else {\n\t hours = '';\n\t } // Render\n\n\n\t return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n\t}\n\n\tvar controls = {\n\t // Get icon URL\n\t getIconUrl: function getIconUrl() {\n\t var url = new URL(this.config.iconUrl, window.location);\n\t var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n\t return {\n\t url: this.config.iconUrl,\n\t cors: cors\n\t };\n\t },\n\t // Find the UI controls\n\t findElements: function findElements() {\n\t try {\n\t this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\n\t this.elements.buttons = {\n\t play: getElements.call(this, this.config.selectors.buttons.play),\n\t pause: getElement.call(this, this.config.selectors.buttons.pause),\n\t restart: getElement.call(this, this.config.selectors.buttons.restart),\n\t rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n\t fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n\t mute: getElement.call(this, this.config.selectors.buttons.mute),\n\t pip: getElement.call(this, this.config.selectors.buttons.pip),\n\t airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n\t settings: getElement.call(this, this.config.selectors.buttons.settings),\n\t captions: getElement.call(this, this.config.selectors.buttons.captions),\n\t fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n\t }; // Progress\n\n\t this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\n\t this.elements.inputs = {\n\t seek: getElement.call(this, this.config.selectors.inputs.seek),\n\t volume: getElement.call(this, this.config.selectors.inputs.volume)\n\t }; // Display\n\n\t this.elements.display = {\n\t buffer: getElement.call(this, this.config.selectors.display.buffer),\n\t currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n\t duration: getElement.call(this, this.config.selectors.display.duration)\n\t }; // Seek tooltip\n\n\t if (is$2.element(this.elements.progress)) {\n\t this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\n\t }\n\n\t return true;\n\t } catch (error) {\n\t // Log it\n\t this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls\n\n\t this.toggleNativeControls(true);\n\t return false;\n\t }\n\t },\n\t // Create <svg> icon\n\t createIcon: function createIcon(type, attributes) {\n\t var namespace = 'http://www.w3.org/2000/svg';\n\t var iconUrl = controls.getIconUrl.call(this);\n\t var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n\t var icon = document.createElementNS(namespace, 'svg');\n\t setAttributes$1(icon, extend$1(attributes, {\n\t 'aria-hidden': 'true',\n\t focusable: 'false'\n\t })); // Create the <use> to reference sprite\n\n\t var use = document.createElementNS(namespace, 'use');\n\t var path = \"\".concat(iconPath, \"-\").concat(type); // Set `href` attributes\n\t // https://github.com/sampotts/plyr/issues/460\n\t // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n\n\t if ('href' in use) {\n\t use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n\t } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n\t use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n\t icon.appendChild(use);\n\t return icon;\n\t },\n\t // Create hidden text label\n\t createLabel: function createLabel(key) {\n\t var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t var text = i18n.get(key, this.config);\n\n\t var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n\t class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n\t });\n\n\t return createElement$1('span', attributes, text);\n\t },\n\t // Create a badge\n\t createBadge: function createBadge(text) {\n\t if (is$2.empty(text)) {\n\t return null;\n\t }\n\n\t var badge = createElement$1('span', {\n\t class: this.config.classNames.menu.value\n\t });\n\t badge.appendChild(createElement$1('span', {\n\t class: this.config.classNames.menu.badge\n\t }, text));\n\t return badge;\n\t },\n\t // Create a <button>\n\t createButton: function createButton(buttonType, attr) {\n\t var _this = this;\n\n\t var attributes = extend$1({}, attr);\n\t var type = toCamelCase(buttonType);\n\t var props = {\n\t element: 'button',\n\t toggle: false,\n\t label: null,\n\t icon: null,\n\t labelPressed: null,\n\t iconPressed: null\n\t };\n\t ['element', 'icon', 'label'].forEach(function (key) {\n\t if (Object.keys(attributes).includes(key)) {\n\t props[key] = attributes[key];\n\t delete attributes[key];\n\t }\n\t }); // Default to 'button' type to prevent form submission\n\n\t if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n\t attributes.type = 'button';\n\t } // Set class name\n\n\n\t if (Object.keys(attributes).includes('class')) {\n\t if (!attributes.class.split(' ').some(function (c) {\n\t return c === _this.config.classNames.control;\n\t })) {\n\t extend$1(attributes, {\n\t class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n\t });\n\t }\n\t } else {\n\t attributes.class = this.config.classNames.control;\n\t } // Large play button\n\n\n\t switch (buttonType) {\n\t case 'play':\n\t props.toggle = true;\n\t props.label = 'play';\n\t props.labelPressed = 'pause';\n\t props.icon = 'play';\n\t props.iconPressed = 'pause';\n\t break;\n\n\t case 'mute':\n\t props.toggle = true;\n\t props.label = 'mute';\n\t props.labelPressed = 'unmute';\n\t props.icon = 'volume';\n\t props.iconPressed = 'muted';\n\t break;\n\n\t case 'captions':\n\t props.toggle = true;\n\t props.label = 'enableCaptions';\n\t props.labelPressed = 'disableCaptions';\n\t props.icon = 'captions-off';\n\t props.iconPressed = 'captions-on';\n\t break;\n\n\t case 'fullscreen':\n\t props.toggle = true;\n\t props.label = 'enterFullscreen';\n\t props.labelPressed = 'exitFullscreen';\n\t props.icon = 'enter-fullscreen';\n\t props.iconPressed = 'exit-fullscreen';\n\t break;\n\n\t case 'play-large':\n\t attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n\t type = 'play';\n\t props.label = 'play';\n\t props.icon = 'play';\n\t break;\n\n\t default:\n\t if (is$2.empty(props.label)) {\n\t props.label = type;\n\t }\n\n\t if (is$2.empty(props.icon)) {\n\t props.icon = buttonType;\n\t }\n\n\t }\n\n\t var button = createElement$1(props.element); // Setup toggle icon and labels\n\n\t if (props.toggle) {\n\t // Icon\n\t button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n\t class: 'icon--pressed'\n\t }));\n\t button.appendChild(controls.createIcon.call(this, props.icon, {\n\t class: 'icon--not-pressed'\n\t })); // Label/Tooltip\n\n\t button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n\t class: 'label--pressed'\n\t }));\n\t button.appendChild(controls.createLabel.call(this, props.label, {\n\t class: 'label--not-pressed'\n\t }));\n\t } else {\n\t button.appendChild(controls.createIcon.call(this, props.icon));\n\t button.appendChild(controls.createLabel.call(this, props.label));\n\t } // Merge and set attributes\n\n\n\t extend$1(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\t setAttributes$1(button, attributes); // We have multiple play buttons\n\n\t if (type === 'play') {\n\t if (!is$2.array(this.elements.buttons[type])) {\n\t this.elements.buttons[type] = [];\n\t }\n\n\t this.elements.buttons[type].push(button);\n\t } else {\n\t this.elements.buttons[type] = button;\n\t }\n\n\t return button;\n\t },\n\t // Create an <input type='range'>\n\t createRange: function createRange(type, attributes) {\n\t // Seek input\n\t var input = createElement$1('input', extend$1(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n\t type: 'range',\n\t min: 0,\n\t max: 100,\n\t step: 0.01,\n\t value: 0,\n\t autocomplete: 'off',\n\t // A11y fixes for https://github.com/sampotts/plyr/issues/905\n\t role: 'slider',\n\t 'aria-label': i18n.get(type, this.config),\n\t 'aria-valuemin': 0,\n\t 'aria-valuemax': 100,\n\t 'aria-valuenow': 0\n\t }, attributes));\n\t this.elements.inputs[type] = input; // Set the fill for webkit now\n\n\t controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n\t RangeTouch.setup(input);\n\t return input;\n\t },\n\t // Create a <progress>\n\t createProgress: function createProgress(type, attributes) {\n\t var progress = createElement$1('progress', extend$1(getAttributesFromSelector(this.config.selectors.display[type]), {\n\t min: 0,\n\t max: 100,\n\t value: 0,\n\t role: 'progressbar',\n\t 'aria-hidden': true\n\t }, attributes)); // Create the label inside\n\n\t if (type !== 'volume') {\n\t progress.appendChild(createElement$1('span', null, '0'));\n\t var suffixKey = {\n\t played: 'played',\n\t buffer: 'buffered'\n\t }[type];\n\t var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\t progress.innerText = \"% \".concat(suffix.toLowerCase());\n\t }\n\n\t this.elements.display[type] = progress;\n\t return progress;\n\t },\n\t // Create time display\n\t createTime: function createTime(type, attrs) {\n\t var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\t var container = createElement$1('div', extend$1(attributes, {\n\t class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n\t 'aria-label': i18n.get(type, this.config)\n\t }), '00:00'); // Reference for updates\n\n\t this.elements.display[type] = container;\n\t return container;\n\t },\n\t // Bind keyboard shortcuts for a menu item\n\t // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n\t bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {\n\t var _this2 = this;\n\n\t // Navigate through menus via arrow keys and space\n\t on.call(this, menuItem, 'keydown keyup', function (event) {\n\t // We only care about space and ⬆️ ⬇️️ ➡️\n\t if (![32, 38, 39, 40].includes(event.which)) {\n\t return;\n\t } // Prevent play / seek\n\n\n\t event.preventDefault();\n\t event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n\t if (event.type === 'keydown') {\n\t return;\n\t }\n\n\t var isRadioButton = matches$2(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n\t if (!isRadioButton && [32, 39].includes(event.which)) {\n\t controls.showMenuPanel.call(_this2, type, true);\n\t } else {\n\t var target;\n\n\t if (event.which !== 32) {\n\t if (event.which === 40 || isRadioButton && event.which === 39) {\n\t target = menuItem.nextElementSibling;\n\n\t if (!is$2.element(target)) {\n\t target = menuItem.parentNode.firstElementChild;\n\t }\n\t } else {\n\t target = menuItem.previousElementSibling;\n\n\t if (!is$2.element(target)) {\n\t target = menuItem.parentNode.lastElementChild;\n\t }\n\t }\n\n\t setFocus.call(_this2, target, true);\n\t }\n\t }\n\t }, false); // Enter will fire a `click` event but we still need to manage focus\n\t // So we bind to keyup which fires after and set focus here\n\n\t on.call(this, menuItem, 'keyup', function (event) {\n\t if (event.which !== 13) {\n\t return;\n\t }\n\n\t controls.focusFirstMenuItem.call(_this2, null, true);\n\t });\n\t },\n\t // Create a settings menu item\n\t createMenuItem: function createMenuItem(_ref) {\n\t var _this3 = this;\n\n\t var value = _ref.value,\n\t list = _ref.list,\n\t type = _ref.type,\n\t title = _ref.title,\n\t _ref$badge = _ref.badge,\n\t badge = _ref$badge === void 0 ? null : _ref$badge,\n\t _ref$checked = _ref.checked,\n\t checked = _ref$checked === void 0 ? false : _ref$checked;\n\t var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\t var menuItem = createElement$1('button', extend$1(attributes, {\n\t type: 'button',\n\t role: 'menuitemradio',\n\t class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n\t 'aria-checked': checked,\n\t value: value\n\t }));\n\t var flex = createElement$1('span'); // We have to set as HTML incase of special characters\n\n\t flex.innerHTML = title;\n\n\t if (is$2.element(badge)) {\n\t flex.appendChild(badge);\n\t }\n\n\t menuItem.appendChild(flex); // Replicate radio button behaviour\n\n\t Object.defineProperty(menuItem, 'checked', {\n\t enumerable: true,\n\t get: function get() {\n\t return menuItem.getAttribute('aria-checked') === 'true';\n\t },\n\t set: function set(check) {\n\t // Ensure exclusivity\n\t if (check) {\n\t Array.from(menuItem.parentNode.children).filter(function (node) {\n\t return matches$2(node, '[role=\"menuitemradio\"]');\n\t }).forEach(function (node) {\n\t return node.setAttribute('aria-checked', 'false');\n\t });\n\t }\n\n\t menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n\t }\n\t });\n\t this.listeners.bind(menuItem, 'click keyup', function (event) {\n\t if (is$2.keyboardEvent(event) && event.which !== 32) {\n\t return;\n\t }\n\n\t event.preventDefault();\n\t event.stopPropagation();\n\t menuItem.checked = true;\n\n\t switch (type) {\n\t case 'language':\n\t _this3.currentTrack = Number(value);\n\t break;\n\n\t case 'quality':\n\t _this3.quality = value;\n\t break;\n\n\t case 'speed':\n\t _this3.speed = parseFloat(value);\n\t break;\n\t }\n\n\t controls.showMenuPanel.call(_this3, 'home', is$2.keyboardEvent(event));\n\t }, type, false);\n\t controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\t list.appendChild(menuItem);\n\t },\n\t // Format a time for display\n\t formatTime: function formatTime$1() {\n\t var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t // Bail if the value isn't a number\n\t if (!is$2.number(time)) {\n\t return time;\n\t } // Always display hours if duration is over an hour\n\n\n\t var forceHours = getHours(this.duration) > 0;\n\t return formatTime(time, forceHours, inverted);\n\t },\n\t // Update the displayed time\n\t updateTimeDisplay: function updateTimeDisplay() {\n\t var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\t var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t // Bail if there's no element to display or the value isn't a number\n\t if (!is$2.element(target) || !is$2.number(time)) {\n\t return;\n\t } // eslint-disable-next-line no-param-reassign\n\n\n\t target.innerText = controls.formatTime(time, inverted);\n\t },\n\t // Update volume UI and storage\n\t updateVolume: function updateVolume() {\n\t if (!this.supported.ui) {\n\t return;\n\t } // Update range\n\n\n\t if (is$2.element(this.elements.inputs.volume)) {\n\t controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n\t } // Update mute state\n\n\n\t if (is$2.element(this.elements.buttons.mute)) {\n\t this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n\t }\n\t },\n\t // Update seek value and lower fill\n\t setRange: function setRange(target) {\n\t var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n\t if (!is$2.element(target)) {\n\t return;\n\t } // eslint-disable-next-line\n\n\n\t target.value = value; // Webkit range fill\n\n\t controls.updateRangeFill.call(this, target);\n\t },\n\t // Update <progress> elements\n\t updateProgress: function updateProgress(event) {\n\t var _this4 = this;\n\n\t if (!this.supported.ui || !is$2.event(event)) {\n\t return;\n\t }\n\n\t var value = 0;\n\n\t var setProgress = function setProgress(target, input) {\n\t var val = is$2.number(input) ? input : 0;\n\t var progress = is$2.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n\t if (is$2.element(progress)) {\n\t progress.value = val; // Update text label inside\n\n\t var label = progress.getElementsByTagName('span')[0];\n\n\t if (is$2.element(label)) {\n\t label.childNodes[0].nodeValue = val;\n\t }\n\t }\n\t };\n\n\t if (event) {\n\t switch (event.type) {\n\t // Video playing\n\t case 'timeupdate':\n\t case 'seeking':\n\t case 'seeked':\n\t value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event\n\n\t if (event.type === 'timeupdate') {\n\t controls.setRange.call(this, this.elements.inputs.seek, value);\n\t }\n\n\t break;\n\t // Check buffer status\n\n\t case 'playing':\n\t case 'progress':\n\t setProgress(this.elements.display.buffer, this.buffered * 100);\n\t break;\n\t }\n\t }\n\t },\n\t // Webkit polyfill for lower fill range\n\t updateRangeFill: function updateRangeFill(target) {\n\t // Get range from event if event passed\n\t var range = is$2.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n\t if (!is$2.element(range) || range.getAttribute('type') !== 'range') {\n\t return;\n\t } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n\t if (matches$2(range, this.config.selectors.inputs.seek)) {\n\t range.setAttribute('aria-valuenow', this.currentTime);\n\t var currentTime = controls.formatTime(this.currentTime);\n\t var duration = controls.formatTime(this.duration);\n\t var format = i18n.get('seekLabel', this.config);\n\t range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n\t } else if (matches$2(range, this.config.selectors.inputs.volume)) {\n\t var percent = range.value * 100;\n\t range.setAttribute('aria-valuenow', percent);\n\t range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n\t } else {\n\t range.setAttribute('aria-valuenow', range.value);\n\t } // WebKit only\n\n\n\t if (!browser.isWebkit) {\n\t return;\n\t } // Set CSS custom property\n\n\n\t range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n\t },\n\t // Update hover tooltip for seeking\n\t updateSeekTooltip: function updateSeekTooltip(event) {\n\t var _this5 = this;\n\n\t // Bail if setting not true\n\t if (!this.config.tooltips.seek || !is$2.element(this.elements.inputs.seek) || !is$2.element(this.elements.display.seekTooltip) || this.duration === 0) {\n\t return;\n\t }\n\n\t var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n\t var toggle = function toggle(show) {\n\t return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n\t }; // Hide on touch\n\n\n\t if (this.touch) {\n\t toggle(false);\n\t return;\n\t } // Determine percentage, if already visible\n\n\n\t var percent = 0;\n\t var clientRect = this.elements.progress.getBoundingClientRect();\n\n\t if (is$2.event(event)) {\n\t percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n\t } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n\t percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n\t } else {\n\t return;\n\t } // Set bounds\n\n\n\t if (percent < 0) {\n\t percent = 0;\n\t } else if (percent > 100) {\n\t percent = 100;\n\t } // Display the time a click would seek to\n\n\n\t controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n\t this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n\t // If the event is a moues in/out and percentage is inside bounds\n\n\t if (is$2.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n\t toggle(event.type === 'mouseenter');\n\t }\n\t },\n\t // Handle time change event\n\t timeUpdate: function timeUpdate(event) {\n\t // Only invert if only one time element is displayed and used for both duration and currentTime\n\t var invert = !is$2.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n\t controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n\t if (event && event.type === 'timeupdate' && this.media.seeking) {\n\t return;\n\t } // Playing progress\n\n\n\t controls.updateProgress.call(this, event);\n\t },\n\t // Show the duration on metadataloaded or durationchange events\n\t durationUpdate: function durationUpdate() {\n\t // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n\t if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n\t return;\n\t } // 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\t // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n\t // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n\t // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n\n\n\t if (this.duration >= Math.pow(2, 32)) {\n\t toggleHidden(this.elements.display.currentTime, true);\n\t toggleHidden(this.elements.progress, true);\n\t return;\n\t } // Update ARIA values\n\n\n\t if (is$2.element(this.elements.inputs.seek)) {\n\t this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n\t } // If there's a spot to display duration\n\n\n\t var hasDuration = is$2.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n\t if (!hasDuration && this.config.displayDuration && this.paused) {\n\t controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n\t } // If there's a duration element, update content\n\n\n\t if (hasDuration) {\n\t controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n\t } // Update the tooltip (if visible)\n\n\n\t controls.updateSeekTooltip.call(this);\n\t },\n\t // Hide/show a tab\n\t toggleMenuButton: function toggleMenuButton(setting, toggle) {\n\t toggleHidden(this.elements.settings.buttons[setting], !toggle);\n\t },\n\t // Update the selected setting\n\t updateSetting: function updateSetting(setting, container, input) {\n\t var pane = this.elements.settings.panels[setting];\n\t var value = null;\n\t var list = container;\n\n\t if (setting === 'captions') {\n\t value = this.currentTrack;\n\t } else {\n\t value = !is$2.empty(input) ? input : this[setting]; // Get default\n\n\t if (is$2.empty(value)) {\n\t value = this.config[setting].default;\n\t } // Unsupported value\n\n\n\t if (!is$2.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n\t this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n\t return;\n\t } // Disabled value\n\n\n\t if (!this.config[setting].options.includes(value)) {\n\t this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n\t return;\n\t }\n\t } // Get the list if we need to\n\n\n\t if (!is$2.element(list)) {\n\t list = pane && pane.querySelector('[role=\"menu\"]');\n\t } // If there's no list it means it's not been rendered...\n\n\n\t if (!is$2.element(list)) {\n\t return;\n\t } // Update the label\n\n\n\t var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n\t label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n\t var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n\t if (is$2.element(target)) {\n\t target.checked = true;\n\t }\n\t },\n\t // Translate a value into a nice label\n\t getLabel: function getLabel(setting, value) {\n\t switch (setting) {\n\t case 'speed':\n\t return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n\t case 'quality':\n\t if (is$2.number(value)) {\n\t var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n\t if (!label.length) {\n\t return \"\".concat(value, \"p\");\n\t }\n\n\t return label;\n\t }\n\n\t return toTitleCase(value);\n\n\t case 'captions':\n\t return captions.getLabel.call(this);\n\n\t default:\n\t return null;\n\t }\n\t },\n\t // Set the quality menu\n\t setQualityMenu: function setQualityMenu(options) {\n\t var _this6 = this;\n\n\t // Menu required\n\t if (!is$2.element(this.elements.settings.panels.quality)) {\n\t return;\n\t }\n\n\t var type = 'quality';\n\t var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n\t if (is$2.array(options)) {\n\t this.options.quality = dedupe(options).filter(function (quality) {\n\t return _this6.config.quality.options.includes(quality);\n\t });\n\t } // Toggle the pane and tab\n\n\n\t var toggle = !is$2.empty(this.options.quality) && this.options.quality.length > 1;\n\t controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n\t emptyElement(list); // Check if we need to toggle the parent\n\n\t controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n\t if (!toggle) {\n\t return;\n\t } // Get the badge HTML for HD, 4K etc\n\n\n\t var getBadge = function getBadge(quality) {\n\t var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n\t if (!label.length) {\n\t return null;\n\t }\n\n\t return controls.createBadge.call(_this6, label);\n\t }; // Sort options by the config and then render options\n\n\n\t this.options.quality.sort(function (a, b) {\n\t var sorting = _this6.config.quality.options;\n\t return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n\t }).forEach(function (quality) {\n\t controls.createMenuItem.call(_this6, {\n\t value: quality,\n\t list: list,\n\t type: type,\n\t title: controls.getLabel.call(_this6, 'quality', quality),\n\t badge: getBadge(quality)\n\t });\n\t });\n\t controls.updateSetting.call(this, type, list);\n\t },\n\t // Set the looping options\n\n\t /* setLoopMenu() {\n\t // Menu required\n\t if (!is.element(this.elements.settings.panels.loop)) {\n\t return;\n\t }\n\t const options = ['start', 'end', 'all', 'reset'];\n\t const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\t // Show the pane and tab\n\t toggleHidden(this.elements.settings.buttons.loop, false);\n\t toggleHidden(this.elements.settings.panels.loop, false);\n\t // Toggle the pane and tab\n\t const toggle = !is.empty(this.loop.options);\n\t controls.toggleMenuButton.call(this, 'loop', toggle);\n\t // Empty the menu\n\t emptyElement(list);\n\t options.forEach(option => {\n\t const item = createElement('li');\n\t const button = createElement(\n\t 'button',\n\t extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n\t type: 'button',\n\t class: this.config.classNames.control,\n\t 'data-plyr-loop-action': option,\n\t }),\n\t i18n.get(option, this.config)\n\t );\n\t if (['start', 'end'].includes(option)) {\n\t const badge = controls.createBadge.call(this, '00:00');\n\t button.appendChild(badge);\n\t }\n\t item.appendChild(button);\n\t list.appendChild(item);\n\t });\n\t }, */\n\t // Get current selected caption language\n\t // TODO: rework this to user the getter in the API?\n\t // Set a list of available captions languages\n\t setCaptionsMenu: function setCaptionsMenu() {\n\t var _this7 = this;\n\n\t // Menu required\n\t if (!is$2.element(this.elements.settings.panels.captions)) {\n\t return;\n\t } // TODO: Captions or language? Currently it's mixed\n\n\n\t var type = 'captions';\n\t var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n\t var tracks = captions.getTracks.call(this);\n\t var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n\t controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n\t emptyElement(list); // Check if we need to toggle the parent\n\n\t controls.checkMenu.call(this); // If there's no captions, bail\n\n\t if (!toggle) {\n\t return;\n\t } // Generate options data\n\n\n\t var options = tracks.map(function (track, value) {\n\t return {\n\t value: value,\n\t checked: _this7.captions.toggled && _this7.currentTrack === value,\n\t title: captions.getLabel.call(_this7, track),\n\t badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n\t list: list,\n\t type: 'language'\n\t };\n\t }); // Add the \"Disabled\" option to turn off captions\n\n\t options.unshift({\n\t value: -1,\n\t checked: !this.captions.toggled,\n\t title: i18n.get('disabled', this.config),\n\t list: list,\n\t type: 'language'\n\t }); // Generate options\n\n\t options.forEach(controls.createMenuItem.bind(this));\n\t controls.updateSetting.call(this, type, list);\n\t },\n\t // Set a list of available captions languages\n\t setSpeedMenu: function setSpeedMenu() {\n\t var _this8 = this;\n\n\t // Menu required\n\t if (!is$2.element(this.elements.settings.panels.speed)) {\n\t return;\n\t }\n\n\t var type = 'speed';\n\t var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n\t this.options.speed = this.options.speed.filter(function (o) {\n\t return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n\t }); // Toggle the pane and tab\n\n\t var toggle = !is$2.empty(this.options.speed) && this.options.speed.length > 1;\n\t controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n\t emptyElement(list); // Check if we need to toggle the parent\n\n\t controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n\t if (!toggle) {\n\t return;\n\t } // Create items\n\n\n\t this.options.speed.forEach(function (speed) {\n\t controls.createMenuItem.call(_this8, {\n\t value: speed,\n\t list: list,\n\t type: type,\n\t title: controls.getLabel.call(_this8, 'speed', speed)\n\t });\n\t });\n\t controls.updateSetting.call(this, type, list);\n\t },\n\t // Check if we need to hide/show the settings menu\n\t checkMenu: function checkMenu() {\n\t var buttons = this.elements.settings.buttons;\n\t var visible = !is$2.empty(buttons) && Object.values(buttons).some(function (button) {\n\t return !button.hidden;\n\t });\n\t toggleHidden(this.elements.settings.menu, !visible);\n\t },\n\t // Focus the first menu item in a given (or visible) menu\n\t focusFirstMenuItem: function focusFirstMenuItem(pane) {\n\t var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t if (this.elements.settings.popup.hidden) {\n\t return;\n\t }\n\n\t var target = pane;\n\n\t if (!is$2.element(target)) {\n\t target = Object.values(this.elements.settings.panels).find(function (p) {\n\t return !p.hidden;\n\t });\n\t }\n\n\t var firstItem = target.querySelector('[role^=\"menuitem\"]');\n\t setFocus.call(this, firstItem, tabFocus);\n\t },\n\t // Show/hide menu\n\t toggleMenu: function toggleMenu(input) {\n\t var popup = this.elements.settings.popup;\n\t var button = this.elements.buttons.settings; // Menu and button are required\n\n\t if (!is$2.element(popup) || !is$2.element(button)) {\n\t return;\n\t } // True toggle by default\n\n\n\t var hidden = popup.hidden;\n\t var show = hidden;\n\n\t if (is$2.boolean(input)) {\n\t show = input;\n\t } else if (is$2.keyboardEvent(input) && input.which === 27) {\n\t show = false;\n\t } else if (is$2.event(input)) {\n\t // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n\t // Element in the shadowDOM. The path, if available, is complete.\n\t var target = is$2.function(input.composedPath) ? input.composedPath()[0] : input.target;\n\t var isMenuItem = popup.contains(target); // If the click was inside the menu or if the click\n\t // wasn't the button or menu item and we're trying to\n\t // show the menu (a doc click shouldn't show the menu)\n\n\t if (isMenuItem || !isMenuItem && input.target !== button && show) {\n\t return;\n\t }\n\t } // Set button attributes\n\n\n\t button.setAttribute('aria-expanded', show); // Show the actual popup\n\n\t toggleHidden(popup, !show); // Add class hook\n\n\t toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n\t if (show && is$2.keyboardEvent(input)) {\n\t controls.focusFirstMenuItem.call(this, null, true);\n\t } else if (!show && !hidden) {\n\t // If closing, re-focus the button\n\t setFocus.call(this, button, is$2.keyboardEvent(input));\n\t }\n\t },\n\t // Get the natural size of a menu panel\n\t getMenuSize: function getMenuSize(tab) {\n\t var clone = tab.cloneNode(true);\n\t clone.style.position = 'absolute';\n\t clone.style.opacity = 0;\n\t clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n\t tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n\t var width = clone.scrollWidth;\n\t var height = clone.scrollHeight; // Remove from the DOM\n\n\t removeElement(clone);\n\t return {\n\t width: width,\n\t height: height\n\t };\n\t },\n\t // Show a panel in the menu\n\t showMenuPanel: function showMenuPanel() {\n\t var _this9 = this;\n\n\t var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n\t if (!is$2.element(target)) {\n\t return;\n\t } // Hide all other panels\n\n\n\t var container = target.parentNode;\n\t var current = Array.from(container.children).find(function (node) {\n\t return !node.hidden;\n\t }); // If we can do fancy animations, we'll animate the height/width\n\n\t if (support.transitions && !support.reducedMotion) {\n\t // Set the current width as a base\n\t container.style.width = \"\".concat(current.scrollWidth, \"px\");\n\t container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n\t var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n\t var restore = function restore(event) {\n\t // We're only bothered about height and width on the container\n\t if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n\t return;\n\t } // Revert back to auto\n\n\n\t container.style.width = '';\n\t container.style.height = ''; // Only listen once\n\n\t off.call(_this9, container, transitionEndEvent, restore);\n\t }; // Listen for the transition finishing and restore auto height/width\n\n\n\t on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n\t container.style.width = \"\".concat(size.width, \"px\");\n\t container.style.height = \"\".concat(size.height, \"px\");\n\t } // Set attributes on current tab\n\n\n\t toggleHidden(current, true); // Set attributes on target\n\n\t toggleHidden(target, false); // Focus the first item\n\n\t controls.focusFirstMenuItem.call(this, target, tabFocus);\n\t },\n\t // Set the download URL\n\t setDownloadUrl: function setDownloadUrl() {\n\t var button = this.elements.buttons.download; // Bail if no button\n\n\t if (!is$2.element(button)) {\n\t return;\n\t } // Set attribute\n\n\n\t button.setAttribute('href', this.download);\n\t },\n\t // Build the default HTML\n\t create: function create(data) {\n\t var _this10 = this;\n\n\t var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n\t createButton = controls.createButton,\n\t createProgress = controls.createProgress,\n\t createRange = controls.createRange,\n\t createTime = controls.createTime,\n\t setQualityMenu = controls.setQualityMenu,\n\t setSpeedMenu = controls.setSpeedMenu,\n\t showMenuPanel = controls.showMenuPanel;\n\t this.elements.controls = null; // Larger overlaid play button\n\n\t if (is$2.array(this.config.controls) && this.config.controls.includes('play-large')) {\n\t this.elements.container.appendChild(createButton.call(this, 'play-large'));\n\t } // Create the container\n\n\n\t var container = createElement$1('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\t this.elements.controls = container; // Default item attributes\n\n\t var defaultAttributes = {\n\t class: 'plyr__controls__item'\n\t }; // Loop through controls in order\n\n\t dedupe(is$2.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n\t // Restart button\n\t if (control === 'restart') {\n\t container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n\t } // Rewind button\n\n\n\t if (control === 'rewind') {\n\t container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n\t } // Play/Pause button\n\n\n\t if (control === 'play') {\n\t container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n\t } // Fast forward button\n\n\n\t if (control === 'fast-forward') {\n\t container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n\t } // Progress\n\n\n\t if (control === 'progress') {\n\t var progressContainer = createElement$1('div', {\n\t class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n\t });\n\t var progress = createElement$1('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n\t progress.appendChild(createRange.call(_this10, 'seek', {\n\t id: \"plyr-seek-\".concat(data.id)\n\t })); // Buffer progress\n\n\t progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n\t // Seek tooltip\n\n\t if (_this10.config.tooltips.seek) {\n\t var tooltip = createElement$1('span', {\n\t class: _this10.config.classNames.tooltip\n\t }, '00:00');\n\t progress.appendChild(tooltip);\n\t _this10.elements.display.seekTooltip = tooltip;\n\t }\n\n\t _this10.elements.progress = progress;\n\t progressContainer.appendChild(_this10.elements.progress);\n\t container.appendChild(progressContainer);\n\t } // Media current time display\n\n\n\t if (control === 'current-time') {\n\t container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n\t } // Media duration display\n\n\n\t if (control === 'duration') {\n\t container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n\t } // Volume controls\n\n\n\t if (control === 'mute' || control === 'volume') {\n\t var volume = _this10.elements.volume; // Create the volume container if needed\n\n\t if (!is$2.element(volume) || !container.contains(volume)) {\n\t volume = createElement$1('div', extend$1({}, defaultAttributes, {\n\t class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n\t }));\n\t _this10.elements.volume = volume;\n\t container.appendChild(volume);\n\t } // Toggle mute button\n\n\n\t if (control === 'mute') {\n\t volume.appendChild(createButton.call(_this10, 'mute'));\n\t } // Volume range control\n\t // Ignored on iOS as it's handled globally\n\t // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n\t if (control === 'volume' && !browser.isIos) {\n\t // Set the attributes\n\t var attributes = {\n\t max: 1,\n\t step: 0.05,\n\t value: _this10.config.volume\n\t }; // Create the volume range slider\n\n\t volume.appendChild(createRange.call(_this10, 'volume', extend$1(attributes, {\n\t id: \"plyr-volume-\".concat(data.id)\n\t })));\n\t }\n\t } // Toggle captions button\n\n\n\t if (control === 'captions') {\n\t container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n\t } // Settings button / menu\n\n\n\t if (control === 'settings' && !is$2.empty(_this10.config.settings)) {\n\t var wrapper = createElement$1('div', extend$1({}, defaultAttributes, {\n\t class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n\t hidden: ''\n\t }));\n\t wrapper.appendChild(createButton.call(_this10, 'settings', {\n\t 'aria-haspopup': true,\n\t 'aria-controls': \"plyr-settings-\".concat(data.id),\n\t 'aria-expanded': false\n\t }));\n\t var popup = createElement$1('div', {\n\t class: 'plyr__menu__container',\n\t id: \"plyr-settings-\".concat(data.id),\n\t hidden: ''\n\t });\n\t var inner = createElement$1('div');\n\t var home = createElement$1('div', {\n\t id: \"plyr-settings-\".concat(data.id, \"-home\")\n\t }); // Create the menu\n\n\t var menu = createElement$1('div', {\n\t role: 'menu'\n\t });\n\t home.appendChild(menu);\n\t inner.appendChild(home);\n\t _this10.elements.settings.panels.home = home; // Build the menu items\n\n\t _this10.config.settings.forEach(function (type) {\n\t // TODO: bundle this with the createMenuItem helper and bindings\n\t var menuItem = createElement$1('button', extend$1(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n\t type: 'button',\n\t class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n\t role: 'menuitem',\n\t 'aria-haspopup': true,\n\t hidden: ''\n\t })); // Bind menu shortcuts for keyboard users\n\n\t bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n\t on.call(_this10, menuItem, 'click', function () {\n\t showMenuPanel.call(_this10, type, false);\n\t });\n\t var flex = createElement$1('span', null, i18n.get(type, _this10.config));\n\t var value = createElement$1('span', {\n\t class: _this10.config.classNames.menu.value\n\t }); // Speed contains HTML entities\n\n\t value.innerHTML = data[type];\n\t flex.appendChild(value);\n\t menuItem.appendChild(flex);\n\t menu.appendChild(menuItem); // Build the panes\n\n\t var pane = createElement$1('div', {\n\t id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n\t hidden: ''\n\t }); // Back button\n\n\t var backButton = createElement$1('button', {\n\t type: 'button',\n\t class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n\t }); // Visible label\n\n\t backButton.appendChild(createElement$1('span', {\n\t 'aria-hidden': true\n\t }, i18n.get(type, _this10.config))); // Screen reader label\n\n\t backButton.appendChild(createElement$1('span', {\n\t class: _this10.config.classNames.hidden\n\t }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n\t on.call(_this10, pane, 'keydown', function (event) {\n\t // We only care about <-\n\t if (event.which !== 37) {\n\t return;\n\t } // Prevent seek\n\n\n\t event.preventDefault();\n\t event.stopPropagation(); // Show the respective menu\n\n\t showMenuPanel.call(_this10, 'home', true);\n\t }, false); // Go back via button click\n\n\t on.call(_this10, backButton, 'click', function () {\n\t showMenuPanel.call(_this10, 'home', false);\n\t }); // Add to pane\n\n\t pane.appendChild(backButton); // Menu\n\n\t pane.appendChild(createElement$1('div', {\n\t role: 'menu'\n\t }));\n\t inner.appendChild(pane);\n\t _this10.elements.settings.buttons[type] = menuItem;\n\t _this10.elements.settings.panels[type] = pane;\n\t });\n\n\t popup.appendChild(inner);\n\t wrapper.appendChild(popup);\n\t container.appendChild(wrapper);\n\t _this10.elements.settings.popup = popup;\n\t _this10.elements.settings.menu = wrapper;\n\t } // Picture in picture button\n\n\n\t if (control === 'pip' && support.pip) {\n\t container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n\t } // Airplay button\n\n\n\t if (control === 'airplay' && support.airplay) {\n\t container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n\t } // Download button\n\n\n\t if (control === 'download') {\n\t var _attributes = extend$1({}, defaultAttributes, {\n\t element: 'a',\n\t href: _this10.download,\n\t target: '_blank'\n\t }); // Set download attribute for HTML5 only\n\n\n\t if (_this10.isHTML5) {\n\t _attributes.download = '';\n\t }\n\n\t var download = _this10.config.urls.download;\n\n\t if (!is$2.url(download) && _this10.isEmbed) {\n\t extend$1(_attributes, {\n\t icon: \"logo-\".concat(_this10.provider),\n\t label: _this10.provider\n\t });\n\t }\n\n\t container.appendChild(createButton.call(_this10, 'download', _attributes));\n\t } // Toggle fullscreen button\n\n\n\t if (control === 'fullscreen') {\n\t container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n\t }\n\t }); // Set available quality levels\n\n\t if (this.isHTML5) {\n\t setQualityMenu.call(this, html5.getQualityOptions.call(this));\n\t }\n\n\t setSpeedMenu.call(this);\n\t return container;\n\t },\n\t // Insert controls\n\t inject: function inject() {\n\t var _this11 = this;\n\n\t // Sprite\n\t if (this.config.loadSprite) {\n\t var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n\t if (icon.cors) {\n\t loadSprite(icon.url, 'sprite-plyr');\n\t }\n\t } // Create a unique ID\n\n\n\t this.id = Math.floor(Math.random() * 10000); // Null by default\n\n\t var container = null;\n\t this.elements.controls = null; // Set template properties\n\n\t var props = {\n\t id: this.id,\n\t seektime: this.config.seekTime,\n\t title: this.config.title\n\t };\n\t var update = true; // If function, run it and use output\n\n\t if (is$2.function(this.config.controls)) {\n\t this.config.controls = this.config.controls.call(this, props);\n\t } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n\t if (!this.config.controls) {\n\t this.config.controls = [];\n\t }\n\n\t if (is$2.element(this.config.controls) || is$2.string(this.config.controls)) {\n\t // HTMLElement or Non-empty string passed as the option\n\t container = this.config.controls;\n\t } else {\n\t // Create controls\n\t container = controls.create.call(this, {\n\t id: this.id,\n\t seektime: this.config.seekTime,\n\t speed: this.speed,\n\t quality: this.quality,\n\t captions: captions.getLabel.call(this) // TODO: Looping\n\t // loop: 'None',\n\n\t });\n\t update = false;\n\t } // Replace props with their value\n\n\n\t var replace = function replace(input) {\n\t var result = input;\n\t Object.entries(props).forEach(function (_ref2) {\n\t var _ref3 = _slicedToArray(_ref2, 2),\n\t key = _ref3[0],\n\t value = _ref3[1];\n\n\t result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n\t });\n\t return result;\n\t }; // Update markup\n\n\n\t if (update) {\n\t if (is$2.string(this.config.controls)) {\n\t container = replace(container);\n\t }\n\t } // Controls container\n\n\n\t var target; // Inject to custom location\n\n\t if (is$2.string(this.config.selectors.controls.container)) {\n\t target = document.querySelector(this.config.selectors.controls.container);\n\t } // Inject into the container by default\n\n\n\t if (!is$2.element(target)) {\n\t target = this.elements.container;\n\t } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n\t var insertMethod = is$2.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n\t target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n\t if (!is$2.element(this.elements.controls)) {\n\t controls.findElements.call(this);\n\t } // Add pressed property to buttons\n\n\n\t if (!is$2.empty(this.elements.buttons)) {\n\t var addProperty = function addProperty(button) {\n\t var className = _this11.config.classNames.controlPressed;\n\t Object.defineProperty(button, 'pressed', {\n\t enumerable: true,\n\t get: function get() {\n\t return hasClass(button, className);\n\t },\n\t set: function set() {\n\t var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t toggleClass(button, className, pressed);\n\t }\n\t });\n\t }; // Toggle classname when pressed property is set\n\n\n\t Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n\t if (is$2.array(button) || is$2.nodeList(button)) {\n\t Array.from(button).filter(Boolean).forEach(addProperty);\n\t } else {\n\t addProperty(button);\n\t }\n\t });\n\t } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n\t if (browser.isEdge) {\n\t repaint(target);\n\t } // Setup tooltips\n\n\n\t if (this.config.tooltips.controls) {\n\t var _this$config = this.config,\n\t classNames = _this$config.classNames,\n\t selectors = _this$config.selectors;\n\t var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n\t var labels = getElements.call(this, selector);\n\t Array.from(labels).forEach(function (label) {\n\t toggleClass(label, _this11.config.classNames.hidden, false);\n\t toggleClass(label, _this11.config.classNames.tooltip, true);\n\t });\n\t }\n\t }\n\t};\n\n\t/**\n\t * Parse a string to a URL object\n\t * @param {String} input - the URL to be parsed\n\t * @param {Boolean} safe - failsafe parsing\n\t */\n\n\tfunction parseUrl$1(input) {\n\t var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t var url = input;\n\n\t if (safe) {\n\t var parser = document.createElement('a');\n\t parser.href = url;\n\t url = parser.href;\n\t }\n\n\t try {\n\t return new URL(url);\n\t } catch (e) {\n\t return null;\n\t }\n\t} // Convert object to URLSearchParams\n\n\tfunction buildUrlParams(input) {\n\t var params = new URLSearchParams();\n\n\t if (is$2.object(input)) {\n\t Object.entries(input).forEach(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t key = _ref2[0],\n\t value = _ref2[1];\n\n\t params.set(key, value);\n\t });\n\t }\n\n\t return params;\n\t}\n\n\tvar captions = {\n\t // Setup captions\n\t setup: function setup() {\n\t // Requires UI support\n\t if (!this.supported.ui) {\n\t return;\n\t } // Only Vimeo and HTML5 video supported at this point\n\n\n\t if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n\t // Clear menu and hide\n\t if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n\t controls.setCaptionsMenu.call(this);\n\t }\n\n\t return;\n\t } // Inject the container\n\n\n\t if (!is$2.element(this.elements.captions)) {\n\t this.elements.captions = createElement$1('div', getAttributesFromSelector(this.config.selectors.captions));\n\t insertAfter(this.elements.captions, this.elements.wrapper);\n\t } // Fix IE captions if CORS is used\n\t // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n\t if (browser.isIE && window.URL) {\n\t var elements = this.media.querySelectorAll('track');\n\t Array.from(elements).forEach(function (track) {\n\t var src = track.getAttribute('src');\n\t var url = parseUrl$1(src);\n\n\t if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n\t fetch(src, 'blob').then(function (blob) {\n\t track.setAttribute('src', window.URL.createObjectURL(blob));\n\t }).catch(function () {\n\t removeElement(track);\n\t });\n\t }\n\t });\n\t } // Get and set initial data\n\t // The \"preferred\" options are not realized unless / until the wanted language has a match\n\t // * languages: Array of user's browser languages.\n\t // * language: The language preferred by user settings or config\n\t // * active: The state preferred by user settings or config\n\t // * toggled: The real captions state\n\n\n\t var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n\t var languages = dedupe(browserLanguages.map(function (language) {\n\t return language.split('-')[0];\n\t }));\n\t var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n\t if (language === 'auto') {\n\t var _languages = _slicedToArray(languages, 1);\n\n\t language = _languages[0];\n\t }\n\n\t var active = this.storage.get('captions');\n\n\t if (!is$2.boolean(active)) {\n\t active = this.config.captions.active;\n\t }\n\n\t Object.assign(this.captions, {\n\t toggled: false,\n\t active: active,\n\t language: language,\n\t languages: languages\n\t }); // Watch changes to textTracks and update captions menu\n\n\t if (this.isHTML5) {\n\t var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n\t on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n\t } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n\t setTimeout(captions.update.bind(this), 0);\n\t },\n\t // Update available language options in settings based on tracks\n\t update: function update() {\n\t var _this = this;\n\n\t var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n\t var _this$captions = this.captions,\n\t active = _this$captions.active,\n\t language = _this$captions.language,\n\t meta = _this$captions.meta,\n\t currentTrackNode = _this$captions.currentTrackNode;\n\t var languageExists = Boolean(tracks.find(function (track) {\n\t return track.language === language;\n\t })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n\t if (this.isHTML5 && this.isVideo) {\n\t tracks.filter(function (track) {\n\t return !meta.get(track);\n\t }).forEach(function (track) {\n\t _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n\t meta.set(track, {\n\t default: track.mode === 'showing'\n\t }); // Turn off native caption rendering to avoid double captions\n\t // Note: mode='hidden' forces a track to download. To ensure every track\n\t // isn't downloaded at once, only 'showing' tracks should be reassigned\n\t // eslint-disable-next-line no-param-reassign\n\n\t if (track.mode === 'showing') {\n\t // eslint-disable-next-line no-param-reassign\n\t track.mode = 'hidden';\n\t } // Add event listener for cue changes\n\n\n\t on.call(_this, track, 'cuechange', function () {\n\t return captions.updateCues.call(_this);\n\t });\n\t });\n\t } // Update language first time it matches, or if the previous matching track was removed\n\n\n\t if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n\t captions.setLanguage.call(this, language);\n\t captions.toggle.call(this, active && languageExists);\n\t } // Enable or disable captions based on track length\n\n\n\t toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$2.empty(tracks)); // Update available languages in list\n\n\t if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n\t controls.setCaptionsMenu.call(this);\n\t }\n\t },\n\t // Toggle captions display\n\t // Used internally for the toggleCaptions method, with the passive option forced to false\n\t toggle: function toggle(input) {\n\t var _this2 = this;\n\n\t var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t // If there's no full support\n\t if (!this.supported.ui) {\n\t return;\n\t }\n\n\t var toggled = this.captions.toggled; // Current state\n\n\t var activeClass = this.config.classNames.captions.active; // Get the next state\n\t // If the method is called without parameter, toggle based on current value\n\n\t var active = is$2.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n\t if (active !== toggled) {\n\t // When passive, don't override user preferences\n\t if (!passive) {\n\t this.captions.active = active;\n\t this.storage.set({\n\t captions: active\n\t });\n\t } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n\t if (!this.language && active && !passive) {\n\t var tracks = captions.getTracks.call(this);\n\t 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\n\n\t this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n\t captions.set.call(this, tracks.indexOf(track));\n\t return;\n\t } // Toggle button if it's enabled\n\n\n\t if (this.elements.buttons.captions) {\n\t this.elements.buttons.captions.pressed = active;\n\t } // Add class hook\n\n\n\t toggleClass(this.elements.container, activeClass, active);\n\t this.captions.toggled = active; // Update settings menu\n\n\t controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n\t triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n\t } // Wait for the call stack to clear before setting mode='hidden'\n\t // on the active track - forcing the browser to download it\n\n\n\t setTimeout(function () {\n\t if (active && _this2.captions.toggled) {\n\t _this2.captions.currentTrackNode.mode = 'hidden';\n\t }\n\t });\n\t },\n\t // Set captions by track index\n\t // Used internally for the currentTrack setter with the passive option forced to false\n\t set: function set(index) {\n\t var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n\t if (index === -1) {\n\t captions.toggle.call(this, false, passive);\n\t return;\n\t }\n\n\t if (!is$2.number(index)) {\n\t this.debug.warn('Invalid caption argument', index);\n\t return;\n\t }\n\n\t if (!(index in tracks)) {\n\t this.debug.warn('Track not found', index);\n\t return;\n\t }\n\n\t if (this.captions.currentTrack !== index) {\n\t this.captions.currentTrack = index;\n\t var track = tracks[index];\n\n\t var _ref = track || {},\n\t language = _ref.language; // Store reference to node for invalidation on remove\n\n\n\t this.captions.currentTrackNode = track; // Update settings menu\n\n\t controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n\t if (!passive) {\n\t this.captions.language = language;\n\t this.storage.set({\n\t language: language\n\t });\n\t } // Handle Vimeo captions\n\n\n\t if (this.isVimeo) {\n\t this.embed.enableTextTrack(language);\n\t } // Trigger event\n\n\n\t triggerEvent.call(this, this.media, 'languagechange');\n\t } // Show captions\n\n\n\t captions.toggle.call(this, true, passive);\n\n\t if (this.isHTML5 && this.isVideo) {\n\t // If we change the active track while a cue is already displayed we need to update it\n\t captions.updateCues.call(this);\n\t }\n\t },\n\t // Set captions by language\n\t // Used internally for the language setter with the passive option forced to false\n\t setLanguage: function setLanguage(input) {\n\t var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t if (!is$2.string(input)) {\n\t this.debug.warn('Invalid language argument', input);\n\t return;\n\t } // Normalize\n\n\n\t var language = input.toLowerCase();\n\t this.captions.language = language; // Set currentTrack\n\n\t var tracks = captions.getTracks.call(this);\n\t var track = captions.findTrack.call(this, [language]);\n\t captions.set.call(this, tracks.indexOf(track), passive);\n\t },\n\t // Get current valid caption tracks\n\t // If update is false it will also ignore tracks without metadata\n\t // This is used to \"freeze\" the language options when captions.update is false\n\t getTracks: function getTracks() {\n\t var _this3 = this;\n\n\t var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t // Handle media or textTracks missing or null\n\t var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n\t // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n\n\t return tracks.filter(function (track) {\n\t return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n\t }).filter(function (track) {\n\t return ['captions', 'subtitles'].includes(track.kind);\n\t });\n\t },\n\t // Match tracks based on languages and get the first\n\t findTrack: function findTrack(languages) {\n\t var _this4 = this;\n\n\t var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var tracks = captions.getTracks.call(this);\n\n\t var sortIsDefault = function sortIsDefault(track) {\n\t return Number((_this4.captions.meta.get(track) || {}).default);\n\t };\n\n\t var sorted = Array.from(tracks).sort(function (a, b) {\n\t return sortIsDefault(b) - sortIsDefault(a);\n\t });\n\t var track;\n\t languages.every(function (language) {\n\t track = sorted.find(function (t) {\n\t return t.language === language;\n\t });\n\t return !track; // Break iteration if there is a match\n\t }); // If no match is found but is required, get first\n\n\t return track || (force ? sorted[0] : undefined);\n\t },\n\t // Get the current track\n\t getCurrentTrack: function getCurrentTrack() {\n\t return captions.getTracks.call(this)[this.currentTrack];\n\t },\n\t // Get UI label for track\n\t getLabel: function getLabel(track) {\n\t var currentTrack = track;\n\n\t if (!is$2.track(currentTrack) && support.textTracks && this.captions.toggled) {\n\t currentTrack = captions.getCurrentTrack.call(this);\n\t }\n\n\t if (is$2.track(currentTrack)) {\n\t if (!is$2.empty(currentTrack.label)) {\n\t return currentTrack.label;\n\t }\n\n\t if (!is$2.empty(currentTrack.language)) {\n\t return track.language.toUpperCase();\n\t }\n\n\t return i18n.get('enabled', this.config);\n\t }\n\n\t return i18n.get('disabled', this.config);\n\t },\n\t // Update captions using current track's active cues\n\t // Also optional array argument in case there isn't any track (ex: vimeo)\n\t updateCues: function updateCues(input) {\n\t // Requires UI\n\t if (!this.supported.ui) {\n\t return;\n\t }\n\n\t if (!is$2.element(this.elements.captions)) {\n\t this.debug.warn('No captions element to render to');\n\t return;\n\t } // Only accept array or empty input\n\n\n\t if (!is$2.nullOrUndefined(input) && !Array.isArray(input)) {\n\t this.debug.warn('updateCues: Invalid input', input);\n\t return;\n\t }\n\n\t var cues = input; // Get cues from track\n\n\t if (!cues) {\n\t var track = captions.getCurrentTrack.call(this);\n\t cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n\t return cue.getCueAsHTML();\n\t }).map(getHTML);\n\t } // Set new caption text\n\n\n\t var content = cues.map(function (cueText) {\n\t return cueText.trim();\n\t }).join('\\n');\n\t var changed = content !== this.elements.captions.innerHTML;\n\n\t if (changed) {\n\t // Empty the container and create a new child element\n\t emptyElement(this.elements.captions);\n\t var caption = createElement$1('span', getAttributesFromSelector(this.config.selectors.caption));\n\t caption.innerHTML = content;\n\t this.elements.captions.appendChild(caption); // Trigger event\n\n\t triggerEvent.call(this, this.media, 'cuechange');\n\t }\n\t }\n\t};\n\n\t// ==========================================================================\n\t// Plyr default config\n\t// ==========================================================================\n\tvar defaults$2 = {\n\t // Disable\n\t enabled: true,\n\t // Custom media title\n\t title: '',\n\t // Logging to console\n\t debug: false,\n\t // Auto play (if supported)\n\t autoplay: false,\n\t // Only allow one media playing at once (vimeo only)\n\t autopause: true,\n\t // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n\t // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n\t playsinline: true,\n\t // Default time to skip when rewind/fast forward\n\t seekTime: 10,\n\t // Default volume\n\t volume: 1,\n\t muted: false,\n\t // Pass a custom duration\n\t duration: null,\n\t // Display the media duration on load in the current time position\n\t // If you have opted to display both duration and currentTime, this is ignored\n\t displayDuration: true,\n\t // Invert the current time to be a countdown\n\t invertTime: true,\n\t // Clicking the currentTime inverts it's value to show time left rather than elapsed\n\t toggleInvert: true,\n\t // Force an aspect ratio\n\t // The format must be `'w:h'` (e.g. `'16:9'`)\n\t ratio: null,\n\t // Click video container to play/pause\n\t clickToPlay: true,\n\t // Auto hide the controls\n\t hideControls: true,\n\t // Reset to start when playback ended\n\t resetOnEnd: false,\n\t // Disable the standard context menu\n\t disableContextMenu: true,\n\t // Sprite (for icons)\n\t loadSprite: true,\n\t iconPrefix: 'plyr',\n\t iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',\n\t // Blank video (used to prevent errors on source change)\n\t blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\t // Quality default\n\t quality: {\n\t default: 576,\n\t // The options to display in the UI, if available for the source media\n\t options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n\t forced: false,\n\t onChange: null\n\t },\n\t // Set loops\n\t loop: {\n\t active: false // start: null,\n\t // end: null,\n\n\t },\n\t // Speed default and options to display\n\t speed: {\n\t selected: 1,\n\t // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n\t options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n\t },\n\t // Keyboard shortcut settings\n\t keyboard: {\n\t focused: true,\n\t global: false\n\t },\n\t // Display tooltips\n\t tooltips: {\n\t controls: false,\n\t seek: true\n\t },\n\t // Captions settings\n\t captions: {\n\t active: false,\n\t language: 'auto',\n\t // Listen to new tracks added after Plyr is initialized.\n\t // This is needed for streaming captions, but may result in unselectable options\n\t update: false\n\t },\n\t // Fullscreen settings\n\t fullscreen: {\n\t enabled: true,\n\t // Allow fullscreen?\n\t fallback: true,\n\t // Fallback using full viewport/window\n\t iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n\t // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n\t // Non-ancestors of the player element will be ignored\n\t // container: null, // defaults to the player element\n\n\t },\n\t // Local storage\n\t storage: {\n\t enabled: true,\n\t key: 'plyr'\n\t },\n\t // Default controls\n\t controls: ['play-large', // 'restart',\n\t // 'rewind',\n\t 'play', // 'fast-forward',\n\t 'progress', 'current-time', // 'duration',\n\t 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n\t 'fullscreen'],\n\t settings: ['captions', 'quality', 'speed'],\n\t // Localisation\n\t i18n: {\n\t restart: 'Restart',\n\t rewind: 'Rewind {seektime}s',\n\t play: 'Play',\n\t pause: 'Pause',\n\t fastForward: 'Forward {seektime}s',\n\t seek: 'Seek',\n\t seekLabel: '{currentTime} of {duration}',\n\t played: 'Played',\n\t buffered: 'Buffered',\n\t currentTime: 'Current time',\n\t duration: 'Duration',\n\t volume: 'Volume',\n\t mute: 'Mute',\n\t unmute: 'Unmute',\n\t enableCaptions: 'Enable captions',\n\t disableCaptions: 'Disable captions',\n\t download: 'Download',\n\t enterFullscreen: 'Enter fullscreen',\n\t exitFullscreen: 'Exit fullscreen',\n\t frameTitle: 'Player for {title}',\n\t captions: 'Captions',\n\t settings: 'Settings',\n\t pip: 'PIP',\n\t menuBack: 'Go back to previous menu',\n\t speed: 'Speed',\n\t normal: 'Normal',\n\t quality: 'Quality',\n\t loop: 'Loop',\n\t start: 'Start',\n\t end: 'End',\n\t all: 'All',\n\t reset: 'Reset',\n\t disabled: 'Disabled',\n\t enabled: 'Enabled',\n\t advertisement: 'Ad',\n\t qualityBadge: {\n\t 2160: '4K',\n\t 1440: 'HD',\n\t 1080: 'HD',\n\t 720: 'HD',\n\t 576: 'SD',\n\t 480: 'SD'\n\t }\n\t },\n\t // URLs\n\t urls: {\n\t download: null,\n\t vimeo: {\n\t sdk: 'https://player.vimeo.com/api/player.js',\n\t iframe: 'https://player.vimeo.com/video/{0}?{1}',\n\t api: 'https://vimeo.com/api/oembed.json?url={0}'\n\t },\n\t youtube: {\n\t sdk: 'https://www.youtube.com/iframe_api',\n\t api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n\t },\n\t googleIMA: {\n\t sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n\t }\n\t },\n\t // Custom control listeners\n\t listeners: {\n\t seek: null,\n\t play: null,\n\t pause: null,\n\t restart: null,\n\t rewind: null,\n\t fastForward: null,\n\t mute: null,\n\t volume: null,\n\t captions: null,\n\t download: null,\n\t fullscreen: null,\n\t pip: null,\n\t airplay: null,\n\t speed: null,\n\t quality: null,\n\t loop: null,\n\t language: null\n\t },\n\t // Events to watch and bubble\n\t events: [// Events to watch on HTML5 media elements and bubble\n\t // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n\t 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n\t 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n\t 'statechange', // Quality\n\t 'qualitychange', // Ads\n\t 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n\t // Selectors\n\t // Change these to match your template if using custom HTML\n\t selectors: {\n\t editable: 'input, textarea, select, [contenteditable]',\n\t container: '.plyr',\n\t controls: {\n\t container: null,\n\t wrapper: '.plyr__controls'\n\t },\n\t labels: '[data-plyr]',\n\t buttons: {\n\t play: '[data-plyr=\"play\"]',\n\t pause: '[data-plyr=\"pause\"]',\n\t restart: '[data-plyr=\"restart\"]',\n\t rewind: '[data-plyr=\"rewind\"]',\n\t fastForward: '[data-plyr=\"fast-forward\"]',\n\t mute: '[data-plyr=\"mute\"]',\n\t captions: '[data-plyr=\"captions\"]',\n\t download: '[data-plyr=\"download\"]',\n\t fullscreen: '[data-plyr=\"fullscreen\"]',\n\t pip: '[data-plyr=\"pip\"]',\n\t airplay: '[data-plyr=\"airplay\"]',\n\t settings: '[data-plyr=\"settings\"]',\n\t loop: '[data-plyr=\"loop\"]'\n\t },\n\t inputs: {\n\t seek: '[data-plyr=\"seek\"]',\n\t volume: '[data-plyr=\"volume\"]',\n\t speed: '[data-plyr=\"speed\"]',\n\t language: '[data-plyr=\"language\"]',\n\t quality: '[data-plyr=\"quality\"]'\n\t },\n\t display: {\n\t currentTime: '.plyr__time--current',\n\t duration: '.plyr__time--duration',\n\t buffer: '.plyr__progress__buffer',\n\t loop: '.plyr__progress__loop',\n\t // Used later\n\t volume: '.plyr__volume--display'\n\t },\n\t progress: '.plyr__progress',\n\t captions: '.plyr__captions',\n\t caption: '.plyr__caption'\n\t },\n\t // Class hooks added to the player in different states\n\t classNames: {\n\t type: 'plyr--{0}',\n\t provider: 'plyr--{0}',\n\t video: 'plyr__video-wrapper',\n\t embed: 'plyr__video-embed',\n\t videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n\t embedContainer: 'plyr__video-embed__container',\n\t poster: 'plyr__poster',\n\t posterEnabled: 'plyr__poster-enabled',\n\t ads: 'plyr__ads',\n\t control: 'plyr__control',\n\t controlPressed: 'plyr__control--pressed',\n\t playing: 'plyr--playing',\n\t paused: 'plyr--paused',\n\t stopped: 'plyr--stopped',\n\t loading: 'plyr--loading',\n\t hover: 'plyr--hover',\n\t tooltip: 'plyr__tooltip',\n\t cues: 'plyr__cues',\n\t hidden: 'plyr__sr-only',\n\t hideControls: 'plyr--hide-controls',\n\t isIos: 'plyr--is-ios',\n\t isTouch: 'plyr--is-touch',\n\t uiSupported: 'plyr--full-ui',\n\t noTransition: 'plyr--no-transition',\n\t display: {\n\t time: 'plyr__time'\n\t },\n\t menu: {\n\t value: 'plyr__menu__value',\n\t badge: 'plyr__badge',\n\t open: 'plyr--menu-open'\n\t },\n\t captions: {\n\t enabled: 'plyr--captions-enabled',\n\t active: 'plyr--captions-active'\n\t },\n\t fullscreen: {\n\t enabled: 'plyr--fullscreen-enabled',\n\t fallback: 'plyr--fullscreen-fallback'\n\t },\n\t pip: {\n\t supported: 'plyr--pip-supported',\n\t active: 'plyr--pip-active'\n\t },\n\t airplay: {\n\t supported: 'plyr--airplay-supported',\n\t active: 'plyr--airplay-active'\n\t },\n\t tabFocus: 'plyr__tab-focus',\n\t previewThumbnails: {\n\t // Tooltip thumbs\n\t thumbContainer: 'plyr__preview-thumb',\n\t thumbContainerShown: 'plyr__preview-thumb--is-shown',\n\t imageContainer: 'plyr__preview-thumb__image-container',\n\t timeContainer: 'plyr__preview-thumb__time-container',\n\t // Scrubbing\n\t scrubbingContainer: 'plyr__preview-scrubbing',\n\t scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n\t }\n\t },\n\t // Embed attributes\n\t attributes: {\n\t embed: {\n\t provider: 'data-plyr-provider',\n\t id: 'data-plyr-embed-id'\n\t }\n\t },\n\t // Advertisements plugin\n\t // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n\t ads: {\n\t enabled: false,\n\t publisherId: '',\n\t tagUrl: ''\n\t },\n\t // Preview Thumbnails plugin\n\t previewThumbnails: {\n\t enabled: false,\n\t src: ''\n\t },\n\t // Vimeo plugin\n\t vimeo: {\n\t byline: false,\n\t portrait: false,\n\t title: false,\n\t speed: true,\n\t transparent: false,\n\t // Custom settings from Plyr\n\t customControls: true,\n\t referrerPolicy: null,\n\t // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n\t // Whether the owner of the video has a Pro or Business account\n\t // (which allows us to properly hide controls without CSS hacks, etc)\n\t premium: false\n\t },\n\t // YouTube plugin\n\t youtube: {\n\t rel: 0,\n\t // No related vids\n\t showinfo: 0,\n\t // Hide info\n\t iv_load_policy: 3,\n\t // Hide annotations\n\t modestbranding: 1,\n\t // Hide logos as much as possible (they still show one in the corner when paused)\n\t // Custom settings from Plyr\n\t customControls: true,\n\t noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n\t }\n\t};\n\n\t// ==========================================================================\n\t// Plyr states\n\t// ==========================================================================\n\tvar pip = {\n\t active: 'picture-in-picture',\n\t inactive: 'inline'\n\t};\n\n\t// ==========================================================================\n\t// Plyr supported types and providers\n\t// ==========================================================================\n\tvar providers = {\n\t html5: 'html5',\n\t youtube: 'youtube',\n\t vimeo: 'vimeo'\n\t};\n\tvar types = {\n\t audio: 'audio',\n\t video: 'video'\n\t};\n\t/**\n\t * Get provider by URL\n\t * @param {String} url\n\t */\n\n\tfunction getProviderByUrl(url) {\n\t // YouTube\n\t if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n\t return providers.youtube;\n\t } // Vimeo\n\n\n\t if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n\t return providers.vimeo;\n\t }\n\n\t return null;\n\t}\n\n\t// ==========================================================================\n\t// Console wrapper\n\t// ==========================================================================\n\tvar noop$1 = function noop() {};\n\n\tvar Console$1 = /*#__PURE__*/function () {\n\t function Console() {\n\t var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t _classCallCheck(this, Console);\n\n\t this.enabled = window.console && enabled;\n\n\t if (this.enabled) {\n\t this.log('Debugging enabled');\n\t }\n\t }\n\n\t _createClass(Console, [{\n\t key: \"log\",\n\t get: function get() {\n\t // eslint-disable-next-line no-console\n\t return this.enabled ? Function.prototype.bind.call(console.log, console) : noop$1;\n\t }\n\t }, {\n\t key: \"warn\",\n\t get: function get() {\n\t // eslint-disable-next-line no-console\n\t return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop$1;\n\t }\n\t }, {\n\t key: \"error\",\n\t get: function get() {\n\t // eslint-disable-next-line no-console\n\t return this.enabled ? Function.prototype.bind.call(console.error, console) : noop$1;\n\t }\n\t }]);\n\n\t return Console;\n\t}();\n\n\tvar Fullscreen = /*#__PURE__*/function () {\n\t function Fullscreen(player) {\n\t var _this = this;\n\n\t _classCallCheck(this, Fullscreen);\n\n\t // Keep reference to parent\n\t this.player = player; // Get prefix\n\n\t this.prefix = Fullscreen.prefix;\n\t this.property = Fullscreen.property; // Scroll position\n\n\t this.scrollPosition = {\n\t x: 0,\n\t y: 0\n\t }; // Force the use of 'full window/browser' rather than fullscreen\n\n\t this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n\t // Checks container is an ancestor, defaults to null\n\n\t this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n\t // Handle event (incase user presses escape etc)\n\n\t on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n\t // TODO: Filter for target??\n\t _this.onChange();\n\t }); // Fullscreen toggle on double click\n\n\t on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n\t // Ignore double click in controls\n\t if (is$2.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n\t return;\n\t }\n\n\t _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n\t }); // Tap focus when in fullscreen\n\n\t on.call(this, this.player.elements.container, 'keydown', function (event) {\n\t return _this.trapFocus(event);\n\t }); // Update the UI\n\n\t this.update();\n\t } // Determine if native supported\n\n\n\t _createClass(Fullscreen, [{\n\t key: \"onChange\",\n\t value: function onChange() {\n\t if (!this.enabled) {\n\t return;\n\t } // Update toggle button\n\n\n\t var button = this.player.elements.buttons.fullscreen;\n\n\t if (is$2.element(button)) {\n\t button.pressed = this.active;\n\t } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n\t var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event\n\n\t triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\t }\n\t }, {\n\t key: \"toggleFallback\",\n\t value: function toggleFallback() {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t // Store or restore scroll position\n\t if (toggle) {\n\t this.scrollPosition = {\n\t x: window.scrollX || 0,\n\t y: window.scrollY || 0\n\t };\n\t } else {\n\t window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);\n\t } // Toggle scroll\n\n\n\t document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n\t toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n\t if (browser.isIos) {\n\t var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n\t var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n\t if (!viewport) {\n\t viewport = document.createElement('meta');\n\t viewport.setAttribute('name', 'viewport');\n\t } // Check if the property already exists\n\n\n\t var hasProperty = is$2.string(viewport.content) && viewport.content.includes(property);\n\n\t if (toggle) {\n\t this.cleanupViewport = !hasProperty;\n\n\t if (!hasProperty) {\n\t viewport.content += \",\".concat(property);\n\t }\n\t } else if (this.cleanupViewport) {\n\t viewport.content = viewport.content.split(',').filter(function (part) {\n\t return part.trim() !== property;\n\t }).join(',');\n\t }\n\t } // Toggle button and fire events\n\n\n\t this.onChange();\n\t } // Trap focus inside container\n\n\t }, {\n\t key: \"trapFocus\",\n\t value: function trapFocus(event) {\n\t // Bail if iOS, not active, not the tab key\n\t if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n\t return;\n\t } // Get the current focused element\n\n\n\t var focused = document.activeElement;\n\t var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n\t var _focusable = _slicedToArray(focusable, 1),\n\t first = _focusable[0];\n\n\t var last = focusable[focusable.length - 1];\n\n\t if (focused === last && !event.shiftKey) {\n\t // Move focus to first element that can be tabbed if Shift isn't used\n\t first.focus();\n\t event.preventDefault();\n\t } else if (focused === first && event.shiftKey) {\n\t // Move focus to last element that can be tabbed if Shift is used\n\t last.focus();\n\t event.preventDefault();\n\t }\n\t } // Update UI\n\n\t }, {\n\t key: \"update\",\n\t value: function update() {\n\t if (this.enabled) {\n\t var mode;\n\n\t if (this.forceFallback) {\n\t mode = 'Fallback (forced)';\n\t } else if (Fullscreen.native) {\n\t mode = 'Native';\n\t } else {\n\t mode = 'Fallback';\n\t }\n\n\t this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n\t } else {\n\t this.player.debug.log('Fullscreen not supported and fallback disabled');\n\t } // Add styling hook to show button\n\n\n\t toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n\t } // Make an element fullscreen\n\n\t }, {\n\t key: \"enter\",\n\t value: function enter() {\n\t if (!this.enabled) {\n\t return;\n\t } // iOS native fullscreen doesn't need the request step\n\n\n\t if (browser.isIos && this.player.config.fullscreen.iosNative) {\n\t this.target.webkitEnterFullscreen();\n\t } else if (!Fullscreen.native || this.forceFallback) {\n\t this.toggleFallback(true);\n\t } else if (!this.prefix) {\n\t this.target.requestFullscreen({\n\t navigationUI: 'hide'\n\t });\n\t } else if (!is$2.empty(this.prefix)) {\n\t this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n\t }\n\t } // Bail from fullscreen\n\n\t }, {\n\t key: \"exit\",\n\t value: function exit() {\n\t if (!this.enabled) {\n\t return;\n\t } // iOS native fullscreen\n\n\n\t if (browser.isIos && this.player.config.fullscreen.iosNative) {\n\t this.target.webkitExitFullscreen();\n\t silencePromise(this.player.play());\n\t } else if (!Fullscreen.native || this.forceFallback) {\n\t this.toggleFallback(false);\n\t } else if (!this.prefix) {\n\t (document.cancelFullScreen || document.exitFullscreen).call(document);\n\t } else if (!is$2.empty(this.prefix)) {\n\t var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n\t document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n\t }\n\t } // Toggle state\n\n\t }, {\n\t key: \"toggle\",\n\t value: function toggle() {\n\t if (!this.active) {\n\t this.enter();\n\t } else {\n\t this.exit();\n\t }\n\t }\n\t }, {\n\t key: \"usingNative\",\n\t // If we're actually using native\n\t get: function get() {\n\t return Fullscreen.native && !this.forceFallback;\n\t } // Get the prefix for handlers\n\n\t }, {\n\t key: \"enabled\",\n\t // Determine if fullscreen is enabled\n\t get: function get() {\n\t return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n\t } // Get active state\n\n\t }, {\n\t key: \"active\",\n\t get: function get() {\n\t if (!this.enabled) {\n\t return false;\n\t } // Fallback using classname\n\n\n\t if (!Fullscreen.native || this.forceFallback) {\n\t return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n\t }\n\n\t var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n\t return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n\t } // Get target element\n\n\t }, {\n\t key: \"target\",\n\t get: function get() {\n\t return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n\t }\n\t }], [{\n\t key: \"native\",\n\t get: function get() {\n\t return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n\t }\n\t }, {\n\t key: \"prefix\",\n\t get: function get() {\n\t // No prefix\n\t if (is$2.function(document.exitFullscreen)) {\n\t return '';\n\t } // Check for fullscreen support by vendor prefix\n\n\n\t var value = '';\n\t var prefixes = ['webkit', 'moz', 'ms'];\n\t prefixes.some(function (pre) {\n\t if (is$2.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$2.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n\t value = pre;\n\t return true;\n\t }\n\n\t return false;\n\t });\n\t return value;\n\t }\n\t }, {\n\t key: \"property\",\n\t get: function get() {\n\t return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n\t }\n\t }]);\n\n\t return Fullscreen;\n\t}();\n\n\t// `Math.sign` method implementation\n\t// https://tc39.github.io/ecma262/#sec-math.sign\n\tvar mathSign = Math.sign || function sign(x) {\n\t // eslint-disable-next-line no-self-compare\n\t return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n\t};\n\n\t// `Math.sign` method\n\t// https://tc39.github.io/ecma262/#sec-math.sign\n\t_export$1({ target: 'Math', stat: true }, {\n\t sign: mathSign\n\t});\n\n\t// ==========================================================================\n\t// Load image avoiding xhr/fetch CORS issues\n\t// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n\t// By default it checks if it is at least 1px, but you can add a second argument to change this\n\t// ==========================================================================\n\tfunction loadImage(src) {\n\t var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\t return new Promise(function (resolve, reject) {\n\t var image = new Image();\n\n\t var handler = function handler() {\n\t delete image.onload;\n\t delete image.onerror;\n\t (image.naturalWidth >= minWidth ? resolve : reject)(image);\n\t };\n\n\t Object.assign(image, {\n\t onload: handler,\n\t onerror: handler,\n\t src: src\n\t });\n\t });\n\t}\n\n\tvar ui = {\n\t addStyleHook: function addStyleHook() {\n\t toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n\t toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n\t },\n\t // Toggle native HTML5 media controls\n\t toggleNativeControls: function toggleNativeControls() {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t if (toggle && this.isHTML5) {\n\t this.media.setAttribute('controls', '');\n\t } else {\n\t this.media.removeAttribute('controls');\n\t }\n\t },\n\t // Setup the UI\n\t build: function build() {\n\t var _this = this;\n\n\t // Re-attach media element listeners\n\t // TODO: Use event bubbling?\n\t this.listeners.media(); // Don't setup interface if no support\n\n\t if (!this.supported.ui) {\n\t this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n\t ui.toggleNativeControls.call(this, true); // Bail\n\n\t return;\n\t } // Inject custom controls if not present\n\n\n\t if (!is$2.element(this.elements.controls)) {\n\t // Inject custom controls\n\t controls.inject.call(this); // Re-attach control listeners\n\n\t this.listeners.controls();\n\t } // Remove native controls\n\n\n\t ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n\t if (this.isHTML5) {\n\t captions.setup.call(this);\n\t } // Reset volume\n\n\n\t this.volume = null; // Reset mute state\n\n\t this.muted = null; // Reset loop state\n\n\t this.loop = null; // Reset quality setting\n\n\t this.quality = null; // Reset speed\n\n\t this.speed = null; // Reset volume display\n\n\t controls.updateVolume.call(this); // Reset time display\n\n\t controls.timeUpdate.call(this); // Update the UI\n\n\t ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n\t toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n\t toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n\t toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n\t toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n\t this.ready = true; // Ready event at end of execution stack\n\n\t setTimeout(function () {\n\t triggerEvent.call(_this, _this.media, 'ready');\n\t }, 0); // Set the title\n\n\t ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n\t if (this.poster) {\n\t ui.setPoster.call(this, this.poster, false).catch(function () {});\n\t } // Manually set the duration if user has overridden it.\n\t // The event listeners for it doesn't get called if preload is disabled (#701)\n\n\n\t if (this.config.duration) {\n\t controls.durationUpdate.call(this);\n\t }\n\t },\n\t // Setup aria attribute for play and iframe title\n\t setTitle: function setTitle() {\n\t // Find the current text\n\t var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n\t if (is$2.string(this.config.title) && !is$2.empty(this.config.title)) {\n\t label += \", \".concat(this.config.title);\n\t } // If there's a play button, set label\n\n\n\t Array.from(this.elements.buttons.play || []).forEach(function (button) {\n\t button.setAttribute('aria-label', label);\n\t }); // Set iframe title\n\t // https://github.com/sampotts/plyr/issues/124\n\n\t if (this.isEmbed) {\n\t var iframe = getElement.call(this, 'iframe');\n\n\t if (!is$2.element(iframe)) {\n\t return;\n\t } // Default to media type\n\n\n\t var title = !is$2.empty(this.config.title) ? this.config.title : 'video';\n\t var format = i18n.get('frameTitle', this.config);\n\t iframe.setAttribute('title', format.replace('{title}', title));\n\t }\n\t },\n\t // Toggle poster\n\t togglePoster: function togglePoster(enable) {\n\t toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n\t },\n\t // Set the poster image (async)\n\t // Used internally for the poster setter, with the passive option forced to false\n\t setPoster: function setPoster(poster) {\n\t var _this2 = this;\n\n\t var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t // Don't override if call is passive\n\t if (passive && this.poster) {\n\t return Promise.reject(new Error('Poster already set'));\n\t } // Set property synchronously to respect the call order\n\n\n\t this.media.setAttribute('data-poster', poster); // Show the poster\n\n\t this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n\t return ready.call(this) // Load image\n\t .then(function () {\n\t return loadImage(poster);\n\t }).catch(function (err) {\n\t // Hide poster on error unless it's been set by another call\n\t if (poster === _this2.poster) {\n\t ui.togglePoster.call(_this2, false);\n\t } // Rethrow\n\n\n\t throw err;\n\t }).then(function () {\n\t // Prevent race conditions\n\t if (poster !== _this2.poster) {\n\t throw new Error('setPoster cancelled by later call to setPoster');\n\t }\n\t }).then(function () {\n\t Object.assign(_this2.elements.poster.style, {\n\t backgroundImage: \"url('\".concat(poster, \"')\"),\n\t // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n\t backgroundSize: ''\n\t });\n\t ui.togglePoster.call(_this2, true);\n\t return poster;\n\t });\n\t },\n\t // Check playing state\n\t checkPlaying: function checkPlaying(event) {\n\t var _this3 = this;\n\n\t // Class hooks\n\t toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n\t toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n\t toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state\n\n\t Array.from(this.elements.buttons.play || []).forEach(function (target) {\n\t Object.assign(target, {\n\t pressed: _this3.playing\n\t });\n\t target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n\t }); // Only update controls on non timeupdate events\n\n\t if (is$2.event(event) && event.type === 'timeupdate') {\n\t return;\n\t } // Toggle controls\n\n\n\t ui.toggleControls.call(this);\n\t },\n\t // Check if media is loading\n\t checkLoading: function checkLoading(event) {\n\t var _this4 = this;\n\n\t this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n\t clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n\t this.timers.loading = setTimeout(function () {\n\t // Update progress bar loading class state\n\t toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n\t ui.toggleControls.call(_this4);\n\t }, this.loading ? 250 : 0);\n\t },\n\t // Toggle controls based on state and `force` argument\n\t toggleControls: function toggleControls(force) {\n\t var controlsElement = this.elements.controls;\n\n\t if (controlsElement && this.config.hideControls) {\n\t // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n\t var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n\t this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n\t }\n\t },\n\t // Migrate any custom properties from the media to the parent\n\t migrateStyles: function migrateStyles() {\n\t var _this5 = this;\n\n\t // Loop through values (as they are the keys when the object is spread 🤔)\n\t Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n\t .filter(function (key) {\n\t return !is$2.empty(key) && is$2.string(key) && key.startsWith('--plyr');\n\t }).forEach(function (key) {\n\t // Set on the container\n\t _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n\t _this5.media.style.removeProperty(key);\n\t }); // Remove attribute if empty\n\n\t if (is$2.empty(this.media.style)) {\n\t this.media.removeAttribute('style');\n\t }\n\t }\n\t};\n\n\tvar Listeners = /*#__PURE__*/function () {\n\t function Listeners(player) {\n\t _classCallCheck(this, Listeners);\n\n\t this.player = player;\n\t this.lastKey = null;\n\t this.focusTimer = null;\n\t this.lastKeyDown = null;\n\t this.handleKey = this.handleKey.bind(this);\n\t this.toggleMenu = this.toggleMenu.bind(this);\n\t this.setTabFocus = this.setTabFocus.bind(this);\n\t this.firstTouch = this.firstTouch.bind(this);\n\t } // Handle key presses\n\n\n\t _createClass(Listeners, [{\n\t key: \"handleKey\",\n\t value: function handleKey(event) {\n\t var player = this.player;\n\t var elements = player.elements;\n\t var code = event.keyCode ? event.keyCode : event.which;\n\t var pressed = event.type === 'keydown';\n\t var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n\t if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n\t return;\n\t } // If the event is bubbled from the media element\n\t // Firefox doesn't get the keycode for whatever reason\n\n\n\t if (!is$2.number(code)) {\n\t return;\n\t } // Seek by the number keys\n\n\n\t var seekByKey = function seekByKey() {\n\t // Divide the max duration into 10th's and times by the number value\n\t player.currentTime = player.duration / 10 * (code - 48);\n\t }; // Handle the key on keydown\n\t // Reset on keyup\n\n\n\t if (pressed) {\n\t // Check focused element\n\t // and if the focused element is not editable (e.g. text input)\n\t // and any that accept key input http://webaim.org/techniques/keyboard/\n\t var focused = document.activeElement;\n\n\t if (is$2.element(focused)) {\n\t var editable = player.config.selectors.editable;\n\t var seek = elements.inputs.seek;\n\n\t if (focused !== seek && matches$2(focused, editable)) {\n\t return;\n\t }\n\n\t if (event.which === 32 && matches$2(focused, 'button, [role^=\"menuitem\"]')) {\n\t return;\n\t }\n\t } // Which keycodes should we prevent default\n\n\n\t 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)\n\n\t if (preventDefault.includes(code)) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\n\t switch (code) {\n\t case 48:\n\t case 49:\n\t case 50:\n\t case 51:\n\t case 52:\n\t case 53:\n\t case 54:\n\t case 55:\n\t case 56:\n\t case 57:\n\t // 0-9\n\t if (!repeat) {\n\t seekByKey();\n\t }\n\n\t break;\n\n\t case 32:\n\t case 75:\n\t // Space and K key\n\t if (!repeat) {\n\t silencePromise(player.togglePlay());\n\t }\n\n\t break;\n\n\t case 38:\n\t // Arrow up\n\t player.increaseVolume(0.1);\n\t break;\n\n\t case 40:\n\t // Arrow down\n\t player.decreaseVolume(0.1);\n\t break;\n\n\t case 77:\n\t // M key\n\t if (!repeat) {\n\t player.muted = !player.muted;\n\t }\n\n\t break;\n\n\t case 39:\n\t // Arrow forward\n\t player.forward();\n\t break;\n\n\t case 37:\n\t // Arrow back\n\t player.rewind();\n\t break;\n\n\t case 70:\n\t // F key\n\t player.fullscreen.toggle();\n\t break;\n\n\t case 67:\n\t // C key\n\t if (!repeat) {\n\t player.toggleCaptions();\n\t }\n\n\t break;\n\n\t case 76:\n\t // L key\n\t player.loop = !player.loop;\n\t break;\n\t } // Escape is handle natively when in full screen\n\t // So we only need to worry about non native\n\n\n\t if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n\t player.fullscreen.toggle();\n\t } // Store last code for next cycle\n\n\n\t this.lastKey = code;\n\t } else {\n\t this.lastKey = null;\n\t }\n\t } // Toggle menu\n\n\t }, {\n\t key: \"toggleMenu\",\n\t value: function toggleMenu(event) {\n\t controls.toggleMenu.call(this.player, event);\n\t } // Device is touch enabled\n\n\t }, {\n\t key: \"firstTouch\",\n\t value: function firstTouch() {\n\t var player = this.player;\n\t var elements = player.elements;\n\t player.touch = true; // Add touch class\n\n\t toggleClass(elements.container, player.config.classNames.isTouch, true);\n\t }\n\t }, {\n\t key: \"setTabFocus\",\n\t value: function setTabFocus(event) {\n\t var player = this.player;\n\t var elements = player.elements;\n\t clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n\t if (event.type === 'keydown' && event.which !== 9) {\n\t return;\n\t } // Store reference to event timeStamp\n\n\n\t if (event.type === 'keydown') {\n\t this.lastKeyDown = event.timeStamp;\n\t } // Remove current classes\n\n\n\t var removeCurrent = function removeCurrent() {\n\t var className = player.config.classNames.tabFocus;\n\t var current = getElements.call(player, \".\".concat(className));\n\t toggleClass(current, className, false);\n\t }; // Determine if a key was pressed to trigger this event\n\n\n\t var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n\t if (event.type === 'focus' && !wasKeyDown) {\n\t return;\n\t } // Remove all current\n\n\n\t removeCurrent(); // Delay the adding of classname until the focus has changed\n\t // This event fires before the focusin event\n\n\t if (event.type !== 'focusout') {\n\t this.focusTimer = setTimeout(function () {\n\t var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n\t if (!elements.container.contains(focused)) {\n\t return;\n\t }\n\n\t toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n\t }, 10);\n\t }\n\t } // Global window & document listeners\n\n\t }, {\n\t key: \"global\",\n\t value: function global() {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\t var player = this.player; // Keyboard shortcuts\n\n\t if (player.config.keyboard.global) {\n\t toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n\t } // Click anywhere closes menu\n\n\n\t toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n\t once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n\t toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);\n\t } // Container listeners\n\n\t }, {\n\t key: \"container\",\n\t value: function container() {\n\t var player = this.player;\n\t var config = player.config,\n\t elements = player.elements,\n\t timers = player.timers; // Keyboard shortcuts\n\n\t if (!config.keyboard.global && config.keyboard.focused) {\n\t on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n\t } // Toggle controls on mouse events and entering fullscreen\n\n\n\t on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n\t var controlsElement = elements.controls; // Remove button states for fullscreen\n\n\t if (controlsElement && event.type === 'enterfullscreen') {\n\t controlsElement.pressed = false;\n\t controlsElement.hover = false;\n\t } // Show, then hide after a timeout unless another control event occurs\n\n\n\t var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\t var delay = 0;\n\n\t if (show) {\n\t ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n\t delay = player.touch ? 3000 : 2000;\n\t } // Clear timer\n\n\n\t clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n\t timers.controls = setTimeout(function () {\n\t return ui.toggleControls.call(player, false);\n\t }, delay);\n\t }); // Set a gutter for Vimeo\n\n\t var setGutter = function setGutter(ratio, padding, toggle) {\n\t if (!player.isVimeo || player.config.vimeo.premium) {\n\t return;\n\t }\n\n\t var target = player.elements.wrapper.firstChild;\n\n\t var _ratio = _slicedToArray(ratio, 2),\n\t y = _ratio[1];\n\n\t var _getAspectRatio$call = getAspectRatio.call(player),\n\t _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n\t videoX = _getAspectRatio$call2[0],\n\t videoY = _getAspectRatio$call2[1];\n\n\t target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n\t target.style.margin = toggle ? '0 auto' : null;\n\t }; // Resize on fullscreen change\n\n\n\t var setPlayerSize = function setPlayerSize(measure) {\n\t // If we don't need to measure the viewport\n\t if (!measure) {\n\t return setAspectRatio.call(player);\n\t }\n\n\t var rect = elements.container.getBoundingClientRect();\n\t var width = rect.width,\n\t height = rect.height;\n\t return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n\t };\n\n\t var resized = function resized() {\n\t clearTimeout(timers.resized);\n\t timers.resized = setTimeout(setPlayerSize, 50);\n\t };\n\n\t on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n\t var _player$fullscreen = player.fullscreen,\n\t target = _player$fullscreen.target,\n\t usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n\t if (target !== elements.container) {\n\t return;\n\t } // If it's not an embed and no ratio specified\n\n\n\t if (!player.isEmbed && is$2.empty(player.config.ratio)) {\n\t return;\n\t }\n\n\t var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n\t var _setPlayerSize = setPlayerSize(isEnter),\n\t padding = _setPlayerSize.padding,\n\t ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n\t setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n\t if (isEnter) {\n\t setTimeout(function () {\n\t return repaint(elements.container);\n\t }, 100);\n\t } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n\t if (!usingNative) {\n\t if (isEnter) {\n\t on.call(player, window, 'resize', resized);\n\t } else {\n\t off.call(player, window, 'resize', resized);\n\t }\n\t }\n\t });\n\t } // Listen for media events\n\n\t }, {\n\t key: \"media\",\n\t value: function media() {\n\t var _this = this;\n\n\t var player = this.player;\n\t var elements = player.elements; // Time change on media\n\n\t on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n\t return controls.timeUpdate.call(player, event);\n\t }); // Display duration\n\n\t on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n\t return controls.durationUpdate.call(player, event);\n\t }); // Handle the media finishing\n\n\t on.call(player, player.media, 'ended', function () {\n\t // Show poster on end\n\t if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n\t // Restart\n\t player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n\t player.pause();\n\t }\n\t }); // Check for buffer progress\n\n\t on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n\t return controls.updateProgress.call(player, event);\n\t }); // Handle volume changes\n\n\t on.call(player, player.media, 'volumechange', function (event) {\n\t return controls.updateVolume.call(player, event);\n\t }); // Handle play/pause\n\n\t on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n\t return ui.checkPlaying.call(player, event);\n\t }); // Loading state\n\n\t on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n\t return ui.checkLoading.call(player, event);\n\t }); // Click video\n\n\t if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n\t // Re-fetch the wrapper\n\t var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n\t if (!is$2.element(wrapper)) {\n\t return;\n\t } // On click play, pause or restart\n\n\n\t on.call(player, elements.container, 'click', function (event) {\n\t var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n\t if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n\t return;\n\t } // Touch devices will just show controls (if hidden)\n\n\n\t if (player.touch && player.config.hideControls) {\n\t return;\n\t }\n\n\t if (player.ended) {\n\t _this.proxy(event, player.restart, 'restart');\n\n\t _this.proxy(event, function () {\n\t silencePromise(player.play());\n\t }, 'play');\n\t } else {\n\t _this.proxy(event, function () {\n\t silencePromise(player.togglePlay());\n\t }, 'play');\n\t }\n\t });\n\t } // Disable right click\n\n\n\t if (player.supported.ui && player.config.disableContextMenu) {\n\t on.call(player, elements.wrapper, 'contextmenu', function (event) {\n\t event.preventDefault();\n\t }, false);\n\t } // Volume change\n\n\n\t on.call(player, player.media, 'volumechange', function () {\n\t // Save to storage\n\t player.storage.set({\n\t volume: player.volume,\n\t muted: player.muted\n\t });\n\t }); // Speed change\n\n\t on.call(player, player.media, 'ratechange', function () {\n\t // Update UI\n\t controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n\t player.storage.set({\n\t speed: player.speed\n\t });\n\t }); // Quality change\n\n\t on.call(player, player.media, 'qualitychange', function (event) {\n\t // Update UI\n\t controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n\t }); // Update download link when ready and if quality changes\n\n\t on.call(player, player.media, 'ready qualitychange', function () {\n\t controls.setDownloadUrl.call(player);\n\t }); // Proxy events to container\n\t // Bubble up key events for Edge\n\n\t var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\t on.call(player, player.media, proxyEvents, function (event) {\n\t var _event$detail = event.detail,\n\t detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n\t if (event.type === 'error') {\n\t detail = player.media.error;\n\t }\n\n\t triggerEvent.call(player, elements.container, event.type, true, detail);\n\t });\n\t } // Run default and custom handlers\n\n\t }, {\n\t key: \"proxy\",\n\t value: function proxy(event, defaultHandler, customHandlerKey) {\n\t var player = this.player;\n\t var customHandler = player.config.listeners[customHandlerKey];\n\t var hasCustomHandler = is$2.function(customHandler);\n\t var returned = true; // Execute custom handler\n\n\t if (hasCustomHandler) {\n\t returned = customHandler.call(player, event);\n\t } // Only call default handler if not prevented in custom handler\n\n\n\t if (returned !== false && is$2.function(defaultHandler)) {\n\t defaultHandler.call(player, event);\n\t }\n\t } // Trigger custom and default handlers\n\n\t }, {\n\t key: \"bind\",\n\t value: function bind(element, type, defaultHandler, customHandlerKey) {\n\t var _this2 = this;\n\n\t var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n\t var player = this.player;\n\t var customHandler = player.config.listeners[customHandlerKey];\n\t var hasCustomHandler = is$2.function(customHandler);\n\t on.call(player, element, type, function (event) {\n\t return _this2.proxy(event, defaultHandler, customHandlerKey);\n\t }, passive && !hasCustomHandler);\n\t } // Listen for control events\n\n\t }, {\n\t key: \"controls\",\n\t value: function controls$1() {\n\t var _this3 = this;\n\n\t var player = this.player;\n\t var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n\t var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n\t if (elements.buttons.play) {\n\t Array.from(elements.buttons.play).forEach(function (button) {\n\t _this3.bind(button, 'click', function () {\n\t silencePromise(player.togglePlay());\n\t }, 'play');\n\t });\n\t } // Pause\n\n\n\t this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n\t this.bind(elements.buttons.rewind, 'click', function () {\n\t // Record seek time so we can prevent hiding controls for a few seconds after rewind\n\t player.lastSeekTime = Date.now();\n\t player.rewind();\n\t }, 'rewind'); // Rewind\n\n\t this.bind(elements.buttons.fastForward, 'click', function () {\n\t // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n\t player.lastSeekTime = Date.now();\n\t player.forward();\n\t }, 'fastForward'); // Mute toggle\n\n\t this.bind(elements.buttons.mute, 'click', function () {\n\t player.muted = !player.muted;\n\t }, 'mute'); // Captions toggle\n\n\t this.bind(elements.buttons.captions, 'click', function () {\n\t return player.toggleCaptions();\n\t }); // Download\n\n\t this.bind(elements.buttons.download, 'click', function () {\n\t triggerEvent.call(player, player.media, 'download');\n\t }, 'download'); // Fullscreen toggle\n\n\t this.bind(elements.buttons.fullscreen, 'click', function () {\n\t player.fullscreen.toggle();\n\t }, 'fullscreen'); // Picture-in-Picture\n\n\t this.bind(elements.buttons.pip, 'click', function () {\n\t player.pip = 'toggle';\n\t }, 'pip'); // Airplay\n\n\t this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n\t this.bind(elements.buttons.settings, 'click', function (event) {\n\t // Prevent the document click listener closing the menu\n\t event.stopPropagation();\n\t event.preventDefault();\n\n\t controls.toggleMenu.call(player, event);\n\t }, null, false); // Can't be passive as we're preventing default\n\t // Settings menu - keyboard toggle\n\t // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n\n\t this.bind(elements.buttons.settings, 'keyup', function (event) {\n\t var code = event.which; // We only care about space and return\n\n\t if (![13, 32].includes(code)) {\n\t return;\n\t } // Because return triggers a click anyway, all we need to do is set focus\n\n\n\t if (code === 13) {\n\t controls.focusFirstMenuItem.call(player, null, true);\n\n\t return;\n\t } // Prevent scroll\n\n\n\t event.preventDefault(); // Prevent playing video (Firefox)\n\n\t event.stopPropagation(); // Toggle menu\n\n\t controls.toggleMenu.call(player, event);\n\t }, null, false // Can't be passive as we're preventing default\n\t ); // Escape closes menu\n\n\t this.bind(elements.settings.menu, 'keydown', function (event) {\n\t if (event.which === 27) {\n\t controls.toggleMenu.call(player, event);\n\t }\n\t }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n\t this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n\t var rect = elements.progress.getBoundingClientRect();\n\t var percent = 100 / rect.width * (event.pageX - rect.left);\n\t event.currentTarget.setAttribute('seek-value', percent);\n\t }); // Pause while seeking\n\n\t this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n\t var seek = event.currentTarget;\n\t var code = event.keyCode ? event.keyCode : event.which;\n\t var attribute = 'play-on-seeked';\n\n\t if (is$2.keyboardEvent(event) && code !== 39 && code !== 37) {\n\t return;\n\t } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n\t player.lastSeekTime = Date.now(); // Was playing before?\n\n\t var play = seek.hasAttribute(attribute); // Done seeking\n\n\t var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n\t if (play && done) {\n\t seek.removeAttribute(attribute);\n\t silencePromise(player.play());\n\t } else if (!done && player.playing) {\n\t seek.setAttribute(attribute, '');\n\t player.pause();\n\t }\n\t }); // Fix range inputs on iOS\n\t // Super weird iOS bug where after you interact with an <input type=\"range\">,\n\t // it takes over further interactions on the page. This is a hack\n\n\t if (browser.isIos) {\n\t var inputs = getElements.call(player, 'input[type=\"range\"]');\n\t Array.from(inputs).forEach(function (input) {\n\t return _this3.bind(input, inputEvent, function (event) {\n\t return repaint(event.target);\n\t });\n\t });\n\t } // Seek\n\n\n\t this.bind(elements.inputs.seek, inputEvent, function (event) {\n\t var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n\t var seekTo = seek.getAttribute('seek-value');\n\n\t if (is$2.empty(seekTo)) {\n\t seekTo = seek.value;\n\t }\n\n\t seek.removeAttribute('seek-value');\n\t player.currentTime = seekTo / seek.max * player.duration;\n\t }, 'seek'); // Seek tooltip\n\n\t this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n\t return controls.updateSeekTooltip.call(player, event);\n\t }); // Preview thumbnails plugin\n\t // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n\t this.bind(elements.progress, 'mousemove touchmove', function (event) {\n\t var previewThumbnails = player.previewThumbnails;\n\n\t if (previewThumbnails && previewThumbnails.loaded) {\n\t previewThumbnails.startMove(event);\n\t }\n\t }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n\t this.bind(elements.progress, 'mouseleave touchend click', function () {\n\t var previewThumbnails = player.previewThumbnails;\n\n\t if (previewThumbnails && previewThumbnails.loaded) {\n\t previewThumbnails.endMove(false, true);\n\t }\n\t }); // Show scrubbing preview\n\n\t this.bind(elements.progress, 'mousedown touchstart', function (event) {\n\t var previewThumbnails = player.previewThumbnails;\n\n\t if (previewThumbnails && previewThumbnails.loaded) {\n\t previewThumbnails.startScrubbing(event);\n\t }\n\t });\n\t this.bind(elements.progress, 'mouseup touchend', function (event) {\n\t var previewThumbnails = player.previewThumbnails;\n\n\t if (previewThumbnails && previewThumbnails.loaded) {\n\t previewThumbnails.endScrubbing(event);\n\t }\n\t }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n\t if (browser.isWebkit) {\n\t Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n\t _this3.bind(element, 'input', function (event) {\n\t return controls.updateRangeFill.call(player, event.target);\n\t });\n\t });\n\t } // Current time invert\n\t // Only if one time element is used for both currentTime and duration\n\n\n\t if (player.config.toggleInvert && !is$2.element(elements.display.duration)) {\n\t this.bind(elements.display.currentTime, 'click', function () {\n\t // Do nothing if we're at the start\n\t if (player.currentTime === 0) {\n\t return;\n\t }\n\n\t player.config.invertTime = !player.config.invertTime;\n\n\t controls.timeUpdate.call(player);\n\t });\n\t } // Volume\n\n\n\t this.bind(elements.inputs.volume, inputEvent, function (event) {\n\t player.volume = event.target.value;\n\t }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n\t this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n\t elements.controls.hover = !player.touch && event.type === 'mouseenter';\n\t }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n\t if (elements.fullscreen) {\n\t Array.from(elements.fullscreen.children).filter(function (c) {\n\t return !c.contains(elements.container);\n\t }).forEach(function (child) {\n\t _this3.bind(child, 'mouseenter mouseleave', function (event) {\n\t elements.controls.hover = !player.touch && event.type === 'mouseenter';\n\t });\n\t });\n\t } // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n\n\n\t this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n\t elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n\t }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n\t this.bind(elements.controls, 'focusin', function () {\n\t var config = player.config,\n\t timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n\t toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n\t ui.toggleControls.call(player, true); // Restore transition\n\n\t setTimeout(function () {\n\t toggleClass(elements.controls, config.classNames.noTransition, false);\n\t }, 0); // Delay a little more for mouse users\n\n\t var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n\t clearTimeout(timers.controls); // Hide again after delay\n\n\t timers.controls = setTimeout(function () {\n\t return ui.toggleControls.call(player, false);\n\t }, delay);\n\t }); // Mouse wheel for volume\n\n\t this.bind(elements.inputs.volume, 'wheel', function (event) {\n\t // Detect \"natural\" scroll - suppored on OS X Safari only\n\t // Other browsers on OS X will be inverted until support improves\n\t var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n\t var _map = [event.deltaX, -event.deltaY].map(function (value) {\n\t return inverted ? -value : value;\n\t }),\n\t _map2 = _slicedToArray(_map, 2),\n\t x = _map2[0],\n\t y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n\t var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n\t player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n\t var volume = player.media.volume;\n\n\t if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n\t event.preventDefault();\n\t }\n\t }, 'volume', false);\n\t }\n\t }]);\n\n\t return Listeners;\n\t}();\n\n\tvar HAS_SPECIES_SUPPORT$7 = arrayMethodHasSpeciesSupport$1('splice');\n\tvar USES_TO_LENGTH$k = arrayMethodUsesToLength$1('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n\tvar max$7 = Math.max;\n\tvar min$c = Math.min;\n\tvar MAX_SAFE_INTEGER$3 = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED$1 = 'Maximum allowed length exceeded';\n\n\t// `Array.prototype.splice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n\t// with adding support of @@species\n\t_export$1({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$7 || !USES_TO_LENGTH$k }, {\n\t splice: function splice(start, deleteCount /* , ...items */) {\n\t var O = toObject$1(this);\n\t var len = toLength$1(O.length);\n\t var actualStart = toAbsoluteIndex$1(start, len);\n\t var argumentsLength = arguments.length;\n\t var insertCount, actualDeleteCount, A, k, from, to;\n\t if (argumentsLength === 0) {\n\t insertCount = actualDeleteCount = 0;\n\t } else if (argumentsLength === 1) {\n\t insertCount = 0;\n\t actualDeleteCount = len - actualStart;\n\t } else {\n\t insertCount = argumentsLength - 2;\n\t actualDeleteCount = min$c(max$7(toInteger$1(deleteCount), 0), len - actualStart);\n\t }\n\t if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$3) {\n\t throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED$1);\n\t }\n\t A = arraySpeciesCreate$1(O, actualDeleteCount);\n\t for (k = 0; k < actualDeleteCount; k++) {\n\t from = actualStart + k;\n\t if (from in O) createProperty$1(A, k, O[from]);\n\t }\n\t A.length = actualDeleteCount;\n\t if (insertCount < actualDeleteCount) {\n\t for (k = actualStart; k < len - actualDeleteCount; k++) {\n\t from = k + actualDeleteCount;\n\t to = k + insertCount;\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t }\n\t for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n\t } else if (insertCount > actualDeleteCount) {\n\t for (k = len - actualDeleteCount; k > actualStart; k--) {\n\t from = k + actualDeleteCount - 1;\n\t to = k + insertCount - 1;\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t }\n\t }\n\t for (k = 0; k < insertCount; k++) {\n\t O[k + actualStart] = arguments[k + 2];\n\t }\n\t O.length = len - actualDeleteCount + insertCount;\n\t return A;\n\t }\n\t});\n\n\tvar loadjs_umd = createCommonjsModule(function (module, exports) {\n\t (function (root, factory) {\n\t {\n\t module.exports = factory();\n\t }\n\t })(commonjsGlobal, function () {\n\t /**\n\t * Global dependencies.\n\t * @global {Object} document - DOM\n\t */\n\t var devnull = function devnull() {},\n\t bundleIdCache = {},\n\t bundleResultCache = {},\n\t bundleCallbackQueue = {};\n\t /**\n\t * Subscribe to bundle load event.\n\t * @param {string[]} bundleIds - Bundle ids\n\t * @param {Function} callbackFn - The callback function\n\t */\n\n\n\t function subscribe(bundleIds, callbackFn) {\n\t // listify\n\t bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\t var depsNotFound = [],\n\t i = bundleIds.length,\n\t numWaiting = i,\n\t fn,\n\t bundleId,\n\t r,\n\t q; // define callback function\n\n\t fn = function fn(bundleId, pathsNotFound) {\n\t if (pathsNotFound.length) depsNotFound.push(bundleId);\n\t numWaiting--;\n\t if (!numWaiting) callbackFn(depsNotFound);\n\t }; // register callback\n\n\n\t while (i--) {\n\t bundleId = bundleIds[i]; // execute callback if in result cache\n\n\t r = bundleResultCache[bundleId];\n\n\t if (r) {\n\t fn(bundleId, r);\n\t continue;\n\t } // add to callback queue\n\n\n\t q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n\t q.push(fn);\n\t }\n\t }\n\t /**\n\t * Publish bundle load event.\n\t * @param {string} bundleId - Bundle id\n\t * @param {string[]} pathsNotFound - List of files not found\n\t */\n\n\n\t function publish(bundleId, pathsNotFound) {\n\t // exit if id isn't defined\n\t if (!bundleId) return;\n\t var q = bundleCallbackQueue[bundleId]; // cache result\n\n\t bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n\t if (!q) return; // empty callback queue\n\n\t while (q.length) {\n\t q[0](bundleId, pathsNotFound);\n\t q.splice(0, 1);\n\t }\n\t }\n\t /**\n\t * Execute callbacks.\n\t * @param {Object or Function} args - The callback args\n\t * @param {string[]} depsNotFound - List of dependencies not found\n\t */\n\n\n\t function executeCallbacks(args, depsNotFound) {\n\t // accept function as argument\n\t if (args.call) args = {\n\t success: args\n\t }; // success and error callbacks\n\n\t if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n\t }\n\t /**\n\t * Load individual file.\n\t * @param {string} path - The file path\n\t * @param {Function} callbackFn - The callback function\n\t */\n\n\n\t function loadFile(path, callbackFn, args, numTries) {\n\t var doc = document,\n\t async = args.async,\n\t maxTries = (args.numRetries || 0) + 1,\n\t beforeCallbackFn = args.before || devnull,\n\t pathname = path.replace(/[\\?|#].*$/, ''),\n\t pathStripped = path.replace(/^(css|img)!/, ''),\n\t isLegacyIECss,\n\t e;\n\t numTries = numTries || 0;\n\n\t if (/(^css!|\\.css$)/.test(pathname)) {\n\t // css\n\t e = doc.createElement('link');\n\t e.rel = 'stylesheet';\n\t e.href = pathStripped; // tag IE9+\n\n\t isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n\t if (isLegacyIECss && e.relList) {\n\t isLegacyIECss = 0;\n\t e.rel = 'preload';\n\t e.as = 'style';\n\t }\n\t } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\n\t // image\n\t e = doc.createElement('img');\n\t e.src = pathStripped;\n\t } else {\n\t // javascript\n\t e = doc.createElement('script');\n\t e.src = path;\n\t e.async = async === undefined ? true : async;\n\t }\n\n\t e.onload = e.onerror = e.onbeforeload = function (ev) {\n\t var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror\n\t // support in IE9-11\n\n\t if (isLegacyIECss) {\n\t try {\n\t if (!e.sheet.cssText.length) result = 'e';\n\t } catch (x) {\n\t // sheets objects created from load errors don't allow access to\n\t // `cssText` (unless error is Code:18 SecurityError)\n\t if (x.code != 18) result = 'e';\n\t }\n\t } // handle retries in case of load failure\n\n\n\t if (result == 'e') {\n\t // increment counter\n\t numTries += 1; // exit function and try again\n\n\t if (numTries < maxTries) {\n\t return loadFile(path, callbackFn, args, numTries);\n\t }\n\t } else if (e.rel == 'preload' && e.as == 'style') {\n\t // activate preloaded stylesheets\n\t return e.rel = 'stylesheet'; // jshint ignore:line\n\t } // execute callback\n\n\n\t callbackFn(path, result, ev.defaultPrevented);\n\t }; // add to document (unless callback returns `false`)\n\n\n\t if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n\t }\n\t /**\n\t * Load multiple files.\n\t * @param {string[]} paths - The file paths\n\t * @param {Function} callbackFn - The callback function\n\t */\n\n\n\t function loadFiles(paths, callbackFn, args) {\n\t // listify paths\n\t paths = paths.push ? paths : [paths];\n\t var numWaiting = paths.length,\n\t x = numWaiting,\n\t pathsNotFound = [],\n\t fn,\n\t i; // define callback function\n\n\t fn = function fn(path, result, defaultPrevented) {\n\t // handle error\n\t if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n\t // will be blocked (ex. Ghostery/ABP on Safari)\n\n\t if (result == 'b') {\n\t if (defaultPrevented) pathsNotFound.push(path);else return;\n\t }\n\n\t numWaiting--;\n\t if (!numWaiting) callbackFn(pathsNotFound);\n\t }; // load scripts\n\n\n\t for (i = 0; i < x; i++) {\n\t loadFile(paths[i], fn, args);\n\t }\n\t }\n\t /**\n\t * Initiate script load and register bundle.\n\t * @param {(string|string[])} paths - The file paths\n\t * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n\t * callback or (3) object literal with success/error arguments, numRetries,\n\t * etc.\n\t * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n\t * literal with success/error arguments, numRetries, etc.\n\t */\n\n\n\t function loadjs(paths, arg1, arg2) {\n\t var bundleId, args; // bundleId (if string)\n\n\t if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n\t args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n\t if (bundleId) {\n\t if (bundleId in bundleIdCache) {\n\t throw \"LoadJS\";\n\t } else {\n\t bundleIdCache[bundleId] = true;\n\t }\n\t }\n\n\t function loadFn(resolve, reject) {\n\t loadFiles(paths, function (pathsNotFound) {\n\t // execute callbacks\n\t executeCallbacks(args, pathsNotFound); // resolve Promise\n\n\t if (resolve) {\n\t executeCallbacks({\n\t success: resolve,\n\t error: reject\n\t }, pathsNotFound);\n\t } // publish bundle load event\n\n\n\t publish(bundleId, pathsNotFound);\n\t }, args);\n\t }\n\n\t if (args.returnPromise) return new Promise(loadFn);else loadFn();\n\t }\n\t /**\n\t * Execute callbacks when dependencies have been satisfied.\n\t * @param {(string|string[])} deps - List of bundle ids\n\t * @param {Object} args - success/error arguments\n\t */\n\n\n\t loadjs.ready = function ready(deps, args) {\n\t // subscribe to bundle load event\n\t subscribe(deps, function (depsNotFound) {\n\t // execute callbacks\n\t executeCallbacks(args, depsNotFound);\n\t });\n\t return loadjs;\n\t };\n\t /**\n\t * Manually satisfy bundle dependencies.\n\t * @param {string} bundleId - The bundle id\n\t */\n\n\n\t loadjs.done = function done(bundleId) {\n\t publish(bundleId, []);\n\t };\n\t /**\n\t * Reset loadjs dependencies statuses\n\t */\n\n\n\t loadjs.reset = function reset() {\n\t bundleIdCache = {};\n\t bundleResultCache = {};\n\t bundleCallbackQueue = {};\n\t };\n\t /**\n\t * Determine if bundle has already been defined\n\t * @param String} bundleId - The bundle id\n\t */\n\n\n\t loadjs.isDefined = function isDefined(bundleId) {\n\t return bundleId in bundleIdCache;\n\t }; // export\n\n\n\t return loadjs;\n\t });\n\t});\n\n\tfunction loadScript(url) {\n\t return new Promise(function (resolve, reject) {\n\t loadjs_umd(url, {\n\t success: resolve,\n\t error: reject\n\t });\n\t });\n\t}\n\n\tfunction parseId(url) {\n\t if (is$2.empty(url)) {\n\t return null;\n\t }\n\n\t if (is$2.number(Number(url))) {\n\t return url;\n\t }\n\n\t var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n\t return url.match(regex) ? RegExp.$2 : url;\n\t} // Set playback state and trigger change (only on actual change)\n\n\n\tfunction assurePlaybackState(play) {\n\t if (play && !this.embed.hasPlayed) {\n\t this.embed.hasPlayed = true;\n\t }\n\n\t if (this.media.paused === play) {\n\t this.media.paused = !play;\n\t triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n\t }\n\t}\n\n\tvar vimeo = {\n\t setup: function setup() {\n\t var player = this; // Add embed class for responsive\n\n\t toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n\t player.options.speed = player.config.speed.options; // Set intial ratio\n\n\t setAspectRatio.call(player); // Load the SDK if not already\n\n\t if (!is$2.object(window.Vimeo)) {\n\t loadScript(player.config.urls.vimeo.sdk).then(function () {\n\t vimeo.ready.call(player);\n\t }).catch(function (error) {\n\t player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n\t });\n\t } else {\n\t vimeo.ready.call(player);\n\t }\n\t },\n\t // API Ready\n\t ready: function ready() {\n\t var _this = this;\n\n\t var player = this;\n\t var config = player.config.vimeo;\n\n\t var premium = config.premium,\n\t referrerPolicy = config.referrerPolicy,\n\t frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n\t if (premium) {\n\t Object.assign(frameParams, {\n\t controls: false,\n\t sidedock: false\n\t });\n\t } // Get Vimeo params for the iframe\n\n\n\t var params = buildUrlParams(_objectSpread2({\n\t loop: player.config.loop.active,\n\t autoplay: player.autoplay,\n\t muted: player.muted,\n\t gesture: 'media',\n\t playsinline: !this.config.fullscreen.iosNative\n\t }, frameParams)); // Get the source URL or ID\n\n\t var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n\t if (is$2.empty(source)) {\n\t source = player.media.getAttribute(player.config.attributes.embed.id);\n\t }\n\n\t var id = parseId(source); // Build an iframe\n\n\t var iframe = createElement$1('iframe');\n\t var src = format(player.config.urls.vimeo.iframe, id, params);\n\t iframe.setAttribute('src', src);\n\t iframe.setAttribute('allowfullscreen', '');\n\t iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required\n\n\t if (!is$2.empty(referrerPolicy)) {\n\t iframe.setAttribute('referrerPolicy', referrerPolicy);\n\t } // Inject the package\n\n\n\t if (premium || !config.customControls) {\n\t iframe.setAttribute('data-poster', player.poster);\n\t player.media = replaceElement(iframe, player.media);\n\t } else {\n\t var wrapper = createElement$1('div', {\n\t class: player.config.classNames.embedContainer,\n\t 'data-poster': player.poster\n\t });\n\t wrapper.appendChild(iframe);\n\t player.media = replaceElement(wrapper, player.media);\n\t } // Get poster image\n\n\n\t if (!config.customControls) {\n\t fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n\t if (is$2.empty(response) || !response.thumbnail_url) {\n\t return;\n\t } // Set and show poster\n\n\n\t ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n\t });\n\t } // Setup instance\n\t // https://github.com/vimeo/player.js\n\n\n\t player.embed = new window.Vimeo.Player(iframe, {\n\t autopause: player.config.autopause,\n\t muted: player.muted\n\t });\n\t player.media.paused = true;\n\t player.media.currentTime = 0; // Disable native text track rendering\n\n\t if (player.supported.ui) {\n\t player.embed.disableTextTrack();\n\t } // Create a faux HTML5 API using the Vimeo API\n\n\n\t player.media.play = function () {\n\t assurePlaybackState.call(player, true);\n\t return player.embed.play();\n\t };\n\n\t player.media.pause = function () {\n\t assurePlaybackState.call(player, false);\n\t return player.embed.pause();\n\t };\n\n\t player.media.stop = function () {\n\t player.pause();\n\t player.currentTime = 0;\n\t }; // Seeking\n\n\n\t var currentTime = player.media.currentTime;\n\t Object.defineProperty(player.media, 'currentTime', {\n\t get: function get() {\n\t return currentTime;\n\t },\n\t set: function set(time) {\n\t // Vimeo will automatically play on seek if the video hasn't been played before\n\t // Get current paused state and volume etc\n\t var embed = player.embed,\n\t media = player.media,\n\t paused = player.paused,\n\t volume = player.volume;\n\t var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n\t media.seeking = true;\n\t triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n\t Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n\t .then(function () {\n\t return embed.setCurrentTime(time);\n\t }) // Restore paused\n\t .then(function () {\n\t return restorePause && embed.pause();\n\t }) // Restore volume\n\t .then(function () {\n\t return restorePause && embed.setVolume(volume);\n\t }).catch(function () {// Do nothing\n\t });\n\t }\n\t }); // Playback speed\n\n\t var speed = player.config.speed.selected;\n\t Object.defineProperty(player.media, 'playbackRate', {\n\t get: function get() {\n\t return speed;\n\t },\n\t set: function set(input) {\n\t player.embed.setPlaybackRate(input).then(function () {\n\t speed = input;\n\t triggerEvent.call(player, player.media, 'ratechange');\n\t }).catch(function () {\n\t // Cannot set Playback Rate, Video is probably not on Pro account\n\t player.options.speed = [1];\n\t });\n\t }\n\t }); // Volume\n\n\t var volume = player.config.volume;\n\t Object.defineProperty(player.media, 'volume', {\n\t get: function get() {\n\t return volume;\n\t },\n\t set: function set(input) {\n\t player.embed.setVolume(input).then(function () {\n\t volume = input;\n\t triggerEvent.call(player, player.media, 'volumechange');\n\t });\n\t }\n\t }); // Muted\n\n\t var muted = player.config.muted;\n\t Object.defineProperty(player.media, 'muted', {\n\t get: function get() {\n\t return muted;\n\t },\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : false;\n\t player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n\t muted = toggle;\n\t triggerEvent.call(player, player.media, 'volumechange');\n\t });\n\t }\n\t }); // Loop\n\n\t var loop = player.config.loop;\n\t Object.defineProperty(player.media, 'loop', {\n\t get: function get() {\n\t return loop;\n\t },\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : player.config.loop.active;\n\t player.embed.setLoop(toggle).then(function () {\n\t loop = toggle;\n\t });\n\t }\n\t }); // Source\n\n\t var currentSrc;\n\t player.embed.getVideoUrl().then(function (value) {\n\t currentSrc = value;\n\t controls.setDownloadUrl.call(player);\n\t }).catch(function (error) {\n\t _this.debug.warn(error);\n\t });\n\t Object.defineProperty(player.media, 'currentSrc', {\n\t get: function get() {\n\t return currentSrc;\n\t }\n\t }); // Ended\n\n\t Object.defineProperty(player.media, 'ended', {\n\t get: function get() {\n\t return player.currentTime === player.duration;\n\t }\n\t }); // Set aspect ratio based on video size\n\n\t Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n\t var _dimensions = _slicedToArray(dimensions, 2),\n\t width = _dimensions[0],\n\t height = _dimensions[1];\n\n\t player.embed.ratio = [width, height];\n\t setAspectRatio.call(_this);\n\t }); // Set autopause\n\n\t player.embed.setAutopause(player.config.autopause).then(function (state) {\n\t player.config.autopause = state;\n\t }); // Get title\n\n\t player.embed.getVideoTitle().then(function (title) {\n\t player.config.title = title;\n\t ui.setTitle.call(_this);\n\t }); // Get current time\n\n\t player.embed.getCurrentTime().then(function (value) {\n\t currentTime = value;\n\t triggerEvent.call(player, player.media, 'timeupdate');\n\t }); // Get duration\n\n\t player.embed.getDuration().then(function (value) {\n\t player.media.duration = value;\n\t triggerEvent.call(player, player.media, 'durationchange');\n\t }); // Get captions\n\n\t player.embed.getTextTracks().then(function (tracks) {\n\t player.media.textTracks = tracks;\n\t captions.setup.call(player);\n\t });\n\t player.embed.on('cuechange', function (_ref) {\n\t var _ref$cues = _ref.cues,\n\t cues = _ref$cues === void 0 ? [] : _ref$cues;\n\t var strippedCues = cues.map(function (cue) {\n\t return stripHTML(cue.text);\n\t });\n\t captions.updateCues.call(player, strippedCues);\n\t });\n\t player.embed.on('loaded', function () {\n\t // Assure state and events are updated on autoplay\n\t player.embed.getPaused().then(function (paused) {\n\t assurePlaybackState.call(player, !paused);\n\n\t if (!paused) {\n\t triggerEvent.call(player, player.media, 'playing');\n\t }\n\t });\n\n\t if (is$2.element(player.embed.element) && player.supported.ui) {\n\t var frame = player.embed.element; // Fix keyboard focus issues\n\t // https://github.com/sampotts/plyr/issues/317\n\n\t frame.setAttribute('tabindex', -1);\n\t }\n\t });\n\t player.embed.on('bufferstart', function () {\n\t triggerEvent.call(player, player.media, 'waiting');\n\t });\n\t player.embed.on('bufferend', function () {\n\t triggerEvent.call(player, player.media, 'playing');\n\t });\n\t player.embed.on('play', function () {\n\t assurePlaybackState.call(player, true);\n\t triggerEvent.call(player, player.media, 'playing');\n\t });\n\t player.embed.on('pause', function () {\n\t assurePlaybackState.call(player, false);\n\t });\n\t player.embed.on('timeupdate', function (data) {\n\t player.media.seeking = false;\n\t currentTime = data.seconds;\n\t triggerEvent.call(player, player.media, 'timeupdate');\n\t });\n\t player.embed.on('progress', function (data) {\n\t player.media.buffered = data.percent;\n\t triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n\t if (parseInt(data.percent, 10) === 1) {\n\t triggerEvent.call(player, player.media, 'canplaythrough');\n\t } // Get duration as if we do it before load, it gives an incorrect value\n\t // https://github.com/sampotts/plyr/issues/891\n\n\n\t player.embed.getDuration().then(function (value) {\n\t if (value !== player.media.duration) {\n\t player.media.duration = value;\n\t triggerEvent.call(player, player.media, 'durationchange');\n\t }\n\t });\n\t });\n\t player.embed.on('seeked', function () {\n\t player.media.seeking = false;\n\t triggerEvent.call(player, player.media, 'seeked');\n\t });\n\t player.embed.on('ended', function () {\n\t player.media.paused = true;\n\t triggerEvent.call(player, player.media, 'ended');\n\t });\n\t player.embed.on('error', function (detail) {\n\t player.media.error = detail;\n\t triggerEvent.call(player, player.media, 'error');\n\t }); // Rebuild UI\n\n\t if (config.customControls) {\n\t setTimeout(function () {\n\t return ui.build.call(player);\n\t }, 0);\n\t }\n\t }\n\t};\n\n\tfunction parseId$1(url) {\n\t if (is$2.empty(url)) {\n\t return null;\n\t }\n\n\t var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n\t return url.match(regex) ? RegExp.$2 : url;\n\t} // Set playback state and trigger change (only on actual change)\n\n\n\tfunction assurePlaybackState$1(play) {\n\t if (play && !this.embed.hasPlayed) {\n\t this.embed.hasPlayed = true;\n\t }\n\n\t if (this.media.paused === play) {\n\t this.media.paused = !play;\n\t triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n\t }\n\t}\n\n\tfunction getHost$2(config) {\n\t if (config.noCookie) {\n\t return 'https://www.youtube-nocookie.com';\n\t }\n\n\t if (window.location.protocol === 'http:') {\n\t return 'http://www.youtube.com';\n\t } // Use YouTube's default\n\n\n\t return undefined;\n\t}\n\n\tvar youtube = {\n\t setup: function setup() {\n\t var _this = this;\n\n\t // Add embed class for responsive\n\t toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n\t if (is$2.object(window.YT) && is$2.function(window.YT.Player)) {\n\t youtube.ready.call(this);\n\t } else {\n\t // Reference current global callback\n\t var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n\t window.onYouTubeIframeAPIReady = function () {\n\t // Call global callback if set\n\t if (is$2.function(callback)) {\n\t callback();\n\t }\n\n\t youtube.ready.call(_this);\n\t }; // Load the SDK\n\n\n\t loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n\t _this.debug.warn('YouTube API failed to load', error);\n\t });\n\t }\n\t },\n\t // Get the media title\n\t getTitle: function getTitle(videoId) {\n\t var _this2 = this;\n\n\t var url = format(this.config.urls.youtube.api, videoId);\n\t fetch(url).then(function (data) {\n\t if (is$2.object(data)) {\n\t var title = data.title,\n\t height = data.height,\n\t width = data.width; // Set title\n\n\t _this2.config.title = title;\n\t ui.setTitle.call(_this2); // Set aspect ratio\n\n\t _this2.embed.ratio = [width, height];\n\t }\n\n\t setAspectRatio.call(_this2);\n\t }).catch(function () {\n\t // Set aspect ratio\n\t setAspectRatio.call(_this2);\n\t });\n\t },\n\t // API ready\n\t ready: function ready() {\n\t var player = this;\n\t var config = player.config.youtube; // Ignore already setup (race condition)\n\n\t var currentId = player.media && player.media.getAttribute('id');\n\n\t if (!is$2.empty(currentId) && currentId.startsWith('youtube-')) {\n\t return;\n\t } // Get the source URL or ID\n\n\n\t var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n\t if (is$2.empty(source)) {\n\t source = player.media.getAttribute(this.config.attributes.embed.id);\n\t } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n\t var videoId = parseId$1(source);\n\t var id = generateId(player.provider); // Replace media element\n\n\t var container = createElement$1('div', {\n\t id: id,\n\t 'data-poster': config.customControls ? player.poster : undefined\n\t });\n\t player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n\t if (config.customControls) {\n\t var posterSrc = function posterSrc(s) {\n\t return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n\t }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n\t loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n\t .catch(function () {\n\t return loadImage(posterSrc('sd'), 121);\n\t }) // 480p padded 4:3\n\t .catch(function () {\n\t return loadImage(posterSrc('hq'));\n\t }) // 360p padded 4:3. Always exists\n\t .then(function (image) {\n\t return ui.setPoster.call(player, image.src);\n\t }).then(function (src) {\n\t // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n\t if (!src.includes('maxres')) {\n\t player.elements.poster.style.backgroundSize = 'cover';\n\t }\n\t }).catch(function () {});\n\t } // Setup instance\n\t // https://developers.google.com/youtube/iframe_api_reference\n\n\n\t player.embed = new window.YT.Player(player.media, {\n\t videoId: videoId,\n\t host: getHost$2(config),\n\t playerVars: extend$1({}, {\n\t // Autoplay\n\t autoplay: player.config.autoplay ? 1 : 0,\n\t // iframe interface language\n\t hl: player.config.hl,\n\t // Only show controls if not fully supported or opted out\n\t controls: player.supported.ui && config.customControls ? 0 : 1,\n\t // Disable keyboard as we handle it\n\t disablekb: 1,\n\t // Allow iOS inline playback\n\t playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n\t // Captions are flaky on YouTube\n\t cc_load_policy: player.captions.active ? 1 : 0,\n\t cc_lang_pref: player.config.captions.language,\n\t // Tracking for stats\n\t widget_referrer: window ? window.location.href : null\n\t }, config),\n\t events: {\n\t onError: function onError(event) {\n\t // YouTube may fire onError twice, so only handle it once\n\t if (!player.media.error) {\n\t var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n\t var message = {\n\t 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\t 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n\t 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\t 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n\t 150: 'The owner of the requested video does not allow it to be played in embedded players.'\n\t }[code] || 'An unknown error occured';\n\t player.media.error = {\n\t code: code,\n\t message: message\n\t };\n\t triggerEvent.call(player, player.media, 'error');\n\t }\n\t },\n\t onPlaybackRateChange: function onPlaybackRateChange(event) {\n\t // Get the instance\n\t var instance = event.target; // Get current speed\n\n\t player.media.playbackRate = instance.getPlaybackRate();\n\t triggerEvent.call(player, player.media, 'ratechange');\n\t },\n\t onReady: function onReady(event) {\n\t // Bail if onReady has already been called. See issue #1108\n\t if (is$2.function(player.media.play)) {\n\t return;\n\t } // Get the instance\n\n\n\t var instance = event.target; // Get the title\n\n\t youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n\t player.media.play = function () {\n\t assurePlaybackState$1.call(player, true);\n\t instance.playVideo();\n\t };\n\n\t player.media.pause = function () {\n\t assurePlaybackState$1.call(player, false);\n\t instance.pauseVideo();\n\t };\n\n\t player.media.stop = function () {\n\t instance.stopVideo();\n\t };\n\n\t player.media.duration = instance.getDuration();\n\t player.media.paused = true; // Seeking\n\n\t player.media.currentTime = 0;\n\t Object.defineProperty(player.media, 'currentTime', {\n\t get: function get() {\n\t return Number(instance.getCurrentTime());\n\t },\n\t set: function set(time) {\n\t // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n\t if (player.paused && !player.embed.hasPlayed) {\n\t player.embed.mute();\n\t } // Set seeking state and trigger event\n\n\n\t player.media.seeking = true;\n\t triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n\t instance.seekTo(time);\n\t }\n\t }); // Playback speed\n\n\t Object.defineProperty(player.media, 'playbackRate', {\n\t get: function get() {\n\t return instance.getPlaybackRate();\n\t },\n\t set: function set(input) {\n\t instance.setPlaybackRate(input);\n\t }\n\t }); // Volume\n\n\t var volume = player.config.volume;\n\t Object.defineProperty(player.media, 'volume', {\n\t get: function get() {\n\t return volume;\n\t },\n\t set: function set(input) {\n\t volume = input;\n\t instance.setVolume(volume * 100);\n\t triggerEvent.call(player, player.media, 'volumechange');\n\t }\n\t }); // Muted\n\n\t var muted = player.config.muted;\n\t Object.defineProperty(player.media, 'muted', {\n\t get: function get() {\n\t return muted;\n\t },\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : muted;\n\t muted = toggle;\n\t instance[toggle ? 'mute' : 'unMute']();\n\t instance.setVolume(volume * 100);\n\t triggerEvent.call(player, player.media, 'volumechange');\n\t }\n\t }); // Source\n\n\t Object.defineProperty(player.media, 'currentSrc', {\n\t get: function get() {\n\t return instance.getVideoUrl();\n\t }\n\t }); // Ended\n\n\t Object.defineProperty(player.media, 'ended', {\n\t get: function get() {\n\t return player.currentTime === player.duration;\n\t }\n\t }); // Get available speeds\n\n\t var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n\t player.options.speed = speeds.filter(function (s) {\n\t return player.config.speed.options.includes(s);\n\t }); // Set the tabindex to avoid focus entering iframe\n\n\t if (player.supported.ui && config.customControls) {\n\t player.media.setAttribute('tabindex', -1);\n\t }\n\n\t triggerEvent.call(player, player.media, 'timeupdate');\n\t triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n\t clearInterval(player.timers.buffering); // Setup buffering\n\n\t player.timers.buffering = setInterval(function () {\n\t // Get loaded % from YouTube\n\t player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n\t if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n\t triggerEvent.call(player, player.media, 'progress');\n\t } // Set last buffer point\n\n\n\t player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n\t if (player.media.buffered === 1) {\n\t clearInterval(player.timers.buffering); // Trigger event\n\n\t triggerEvent.call(player, player.media, 'canplaythrough');\n\t }\n\t }, 200); // Rebuild UI\n\n\t if (config.customControls) {\n\t setTimeout(function () {\n\t return ui.build.call(player);\n\t }, 50);\n\t }\n\t },\n\t onStateChange: function onStateChange(event) {\n\t // Get the instance\n\t var instance = event.target; // Reset timer\n\n\t clearInterval(player.timers.playing);\n\t var seeked = player.media.seeking && [1, 2].includes(event.data);\n\n\t if (seeked) {\n\t // Unset seeking and fire seeked event\n\t player.media.seeking = false;\n\t triggerEvent.call(player, player.media, 'seeked');\n\t } // Handle events\n\t // -1 Unstarted\n\t // 0 Ended\n\t // 1 Playing\n\t // 2 Paused\n\t // 3 Buffering\n\t // 5 Video cued\n\n\n\t switch (event.data) {\n\t case -1:\n\t // Update scrubber\n\t triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n\t player.media.buffered = instance.getVideoLoadedFraction();\n\t triggerEvent.call(player, player.media, 'progress');\n\t break;\n\n\t case 0:\n\t assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\n\t if (player.media.loop) {\n\t // YouTube needs a call to `stopVideo` before playing again\n\t instance.stopVideo();\n\t instance.playVideo();\n\t } else {\n\t triggerEvent.call(player, player.media, 'ended');\n\t }\n\n\t break;\n\n\t case 1:\n\t // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n\t if (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n\t player.media.pause();\n\t } else {\n\t assurePlaybackState$1.call(player, true);\n\t triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n\t player.timers.playing = setInterval(function () {\n\t triggerEvent.call(player, player.media, 'timeupdate');\n\t }, 50); // Check duration again due to YouTube bug\n\t // https://github.com/sampotts/plyr/issues/374\n\t // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n\n\t if (player.media.duration !== instance.getDuration()) {\n\t player.media.duration = instance.getDuration();\n\t triggerEvent.call(player, player.media, 'durationchange');\n\t }\n\t }\n\n\t break;\n\n\t case 2:\n\t // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n\t if (!player.muted) {\n\t player.embed.unMute();\n\t }\n\n\t assurePlaybackState$1.call(player, false);\n\t break;\n\n\t case 3:\n\t // Trigger waiting event to add loading classes to container as the video buffers.\n\t triggerEvent.call(player, player.media, 'waiting');\n\t break;\n\t }\n\n\t triggerEvent.call(player, player.elements.container, 'statechange', false, {\n\t code: event.data\n\t });\n\t }\n\t }\n\t });\n\t }\n\t};\n\n\tvar media = {\n\t // Setup media\n\t setup: function setup() {\n\t // If there's no media, bail\n\t if (!this.media) {\n\t this.debug.warn('No media element found!');\n\t return;\n\t } // Add type class\n\n\n\t toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n\t toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n\t // This will require changes if audio embeds are added\n\n\t if (this.isEmbed) {\n\t toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n\t } // Inject the player wrapper\n\n\n\t if (this.isVideo) {\n\t // Create the wrapper div\n\t this.elements.wrapper = createElement$1('div', {\n\t class: this.config.classNames.video\n\t }); // Wrap the video in a container\n\n\t wrap$4(this.media, this.elements.wrapper); // Poster image container\n\n\t this.elements.poster = createElement$1('div', {\n\t class: this.config.classNames.poster,\n\t hidden: ''\n\t });\n\t this.elements.wrapper.appendChild(this.elements.poster);\n\t }\n\n\t if (this.isHTML5) {\n\t html5.setup.call(this);\n\t } else if (this.isYouTube) {\n\t youtube.setup.call(this);\n\t } else if (this.isVimeo) {\n\t vimeo.setup.call(this);\n\t }\n\t }\n\t};\n\n\tvar destroy = function destroy(instance) {\n\t // Destroy our adsManager\n\t if (instance.manager) {\n\t instance.manager.destroy();\n\t } // Destroy our adsManager\n\n\n\t if (instance.elements.displayContainer) {\n\t instance.elements.displayContainer.destroy();\n\t }\n\n\t instance.elements.container.remove();\n\t};\n\n\tvar Ads = /*#__PURE__*/function () {\n\t /**\n\t * Ads constructor.\n\t * @param {Object} player\n\t * @return {Ads}\n\t */\n\t function Ads(player) {\n\t var _this = this;\n\n\t _classCallCheck(this, Ads);\n\n\t this.player = player;\n\t this.config = player.config.ads;\n\t this.playing = false;\n\t this.initialized = false;\n\t this.elements = {\n\t container: null,\n\t displayContainer: null\n\t };\n\t this.manager = null;\n\t this.loader = null;\n\t this.cuePoints = null;\n\t this.events = {};\n\t this.safetyTimer = null;\n\t this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready\n\n\t this.managerPromise = new Promise(function (resolve, reject) {\n\t // The ad is loaded and ready\n\t _this.on('loaded', resolve); // Ads failed\n\n\n\t _this.on('error', reject);\n\t });\n\t this.load();\n\t }\n\n\t _createClass(Ads, [{\n\t key: \"load\",\n\n\t /**\n\t * Load the IMA SDK\n\t */\n\t value: function load() {\n\t var _this2 = this;\n\n\t if (!this.enabled) {\n\t return;\n\t } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n\t if (!is$2.object(window.google) || !is$2.object(window.google.ima)) {\n\t loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n\t _this2.ready();\n\t }).catch(function () {\n\t // Script failed to load or is blocked\n\t _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n\t });\n\t } else {\n\t this.ready();\n\t }\n\t }\n\t /**\n\t * Get the ads instance ready\n\t */\n\n\t }, {\n\t key: \"ready\",\n\t value: function ready() {\n\t var _this3 = this;\n\n\t // Double check we're enabled\n\t if (!this.enabled) {\n\t destroy(this);\n\t } // Start ticking our safety timer. If the whole advertisement\n\t // thing doesn't resolve within our set time; we bail\n\n\n\t this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n\t this.managerPromise.then(function () {\n\t _this3.clearSafetyTimer('onAdsManagerLoaded()');\n\t }); // Set listeners on the Plyr instance\n\n\t this.listeners(); // Setup the IMA SDK\n\n\t this.setupIMA();\n\t } // Build the tag URL\n\n\t }, {\n\t key: \"setupIMA\",\n\n\t /**\n\t * In order for the SDK to display ads for our video, we need to tell it where to put them,\n\t * so here we define our ad container. This div is set up to render on top of the video player.\n\t * Using the code below, we tell the SDK to render ads within that div. We also provide a\n\t * handle to the content video player - the SDK will poll the current time of our player to\n\t * properly place mid-rolls. After we create the ad display container, we initialize it. On\n\t * mobile devices, this initialization is done as the result of a user action.\n\t */\n\t value: function setupIMA() {\n\t var _this4 = this;\n\n\t // Create the container for our advertisements\n\t this.elements.container = createElement$1('div', {\n\t class: this.player.config.classNames.ads\n\t });\n\t this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2\n\n\t google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n\t google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n\t google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n\t this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Create ads loader\n\n\t this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n\t this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n\t return _this4.onAdsManagerLoaded(event);\n\t }, false);\n\t this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n\t return _this4.onAdError(error);\n\t }, false); // Request video ads to be pre-loaded\n\n\t this.requestAds();\n\t }\n\t /**\n\t * Request advertisements\n\t */\n\n\t }, {\n\t key: \"requestAds\",\n\t value: function requestAds() {\n\t var container = this.player.elements.container;\n\n\t try {\n\t // Request video ads\n\t var request = new google.ima.AdsRequest();\n\t request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n\t // to select the correct creative if multiple are returned\n\n\t request.linearAdSlotWidth = container.offsetWidth;\n\t request.linearAdSlotHeight = container.offsetHeight;\n\t request.nonLinearAdSlotWidth = container.offsetWidth;\n\t request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n\t request.forceNonLinearFullSlot = false; // Mute based on current state\n\n\t request.setAdWillPlayMuted(!this.player.muted);\n\t this.loader.requestAds(request);\n\t } catch (e) {\n\t this.onAdError(e);\n\t }\n\t }\n\t /**\n\t * Update the ad countdown\n\t * @param {Boolean} start\n\t */\n\n\t }, {\n\t key: \"pollCountdown\",\n\t value: function pollCountdown() {\n\t var _this5 = this;\n\n\t var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t if (!start) {\n\t clearInterval(this.countdownTimer);\n\t this.elements.container.removeAttribute('data-badge-text');\n\t return;\n\t }\n\n\t var update = function update() {\n\t var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n\t var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n\t _this5.elements.container.setAttribute('data-badge-text', label);\n\t };\n\n\t this.countdownTimer = setInterval(update, 100);\n\t }\n\t /**\n\t * This method is called whenever the ads are ready inside the AdDisplayContainer\n\t * @param {Event} adsManagerLoadedEvent\n\t */\n\n\t }, {\n\t key: \"onAdsManagerLoaded\",\n\t value: function onAdsManagerLoaded(event) {\n\t var _this6 = this;\n\n\t // Load could occur after a source change (race condition)\n\t if (!this.enabled) {\n\t return;\n\t } // Get the ads manager\n\n\n\t var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n\t settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n\t settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration\n\t // so it can determine when to start the mid- and post-roll\n\n\t this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n\t this.cuePoints = this.manager.getCuePoints(); // Add listeners to the required events\n\t // Advertisement error events\n\n\t this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n\t return _this6.onAdError(error);\n\t }); // Advertisement regular events\n\n\t Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n\t _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n\t return _this6.onAdEvent(e);\n\t });\n\t }); // Resolve our adsManager\n\n\t this.trigger('loaded');\n\t }\n\t }, {\n\t key: \"addCuePoints\",\n\t value: function addCuePoints() {\n\t var _this7 = this;\n\n\t // Add advertisement cue's within the time line if available\n\t if (!is$2.empty(this.cuePoints)) {\n\t this.cuePoints.forEach(function (cuePoint) {\n\t if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n\t var seekElement = _this7.player.elements.progress;\n\n\t if (is$2.element(seekElement)) {\n\t var cuePercentage = 100 / _this7.player.duration * cuePoint;\n\t var cue = createElement$1('span', {\n\t class: _this7.player.config.classNames.cues\n\t });\n\t cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n\t seekElement.appendChild(cue);\n\t }\n\t }\n\t });\n\t }\n\t }\n\t /**\n\t * This is where all the event handling takes place. Retrieve the ad from the event. Some\n\t * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated\n\t * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type\n\t * @param {Event} event\n\t */\n\n\t }, {\n\t key: \"onAdEvent\",\n\t value: function onAdEvent(event) {\n\t var _this8 = this;\n\n\t var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n\t // don't have ad object associated\n\n\t var ad = event.getAd();\n\t var adData = event.getAdData(); // Proxy event\n\n\t var dispatchEvent = function dispatchEvent(type) {\n\t triggerEvent.call(_this8.player, _this8.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n\t }; // Bubble the event\n\n\n\t dispatchEvent(event.type);\n\n\t switch (event.type) {\n\t case google.ima.AdEvent.Type.LOADED:\n\t // This is the first event sent for an ad - it is possible to determine whether the\n\t // ad is a video ad or an overlay\n\t this.trigger('loaded'); // Start countdown\n\n\t this.pollCountdown(true);\n\n\t if (!ad.isLinear()) {\n\t // Position AdDisplayContainer correctly for overlay\n\t ad.width = container.offsetWidth;\n\t ad.height = container.offsetHeight;\n\t } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n\t // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n\t break;\n\n\t case google.ima.AdEvent.Type.STARTED:\n\t // Set volume to match player\n\t this.manager.setVolume(this.player.volume);\n\t break;\n\n\t case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n\t // All ads for the current videos are done. We can now request new advertisements\n\t // in case the video is re-played\n\t // TODO: Example for what happens when a next video in a playlist would be loaded.\n\t // So here we load a new video when all ads are done.\n\t // Then we load new ads within a new adsManager. When the video\n\t // Is started - after - the ads are loaded, then we get ads.\n\t // You can also easily test cancelling and reloading by running\n\t // player.ads.cancel() and player.ads.play from the console I guess.\n\t // this.player.source = {\n\t // type: 'video',\n\t // title: 'View From A Blue Moon',\n\t // sources: [{\n\t // src:\n\t // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n\t // 'video/mp4', }], poster:\n\t // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n\t // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n\t // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n\t // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n\t // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n\t // };\n\t // TODO: So there is still this thing where a video should only be allowed to start\n\t // playing when the IMA SDK is ready or has failed\n\t if (this.player.ended) {\n\t this.loadAds();\n\t } else {\n\t // The SDK won't allow new ads to be called without receiving a contentComplete()\n\t this.loader.contentComplete();\n\t }\n\n\t break;\n\n\t case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n\t // This event indicates the ad has started - the video player can adjust the UI,\n\t // for example display a pause button and remaining time. Fired when content should\n\t // be paused. This usually happens right before an ad is about to cover the content\n\t this.pauseContent();\n\t break;\n\n\t case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n\t // This event indicates the ad has finished - the video player can perform\n\t // appropriate UI actions, such as removing the timer for remaining time detection.\n\t // Fired when content should be resumed. This usually happens when an ad finishes\n\t // or collapses\n\t this.pollCountdown();\n\t this.resumeContent();\n\t break;\n\n\t case google.ima.AdEvent.Type.LOG:\n\t if (adData.adError) {\n\t this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n\t }\n\n\t break;\n\t }\n\t }\n\t /**\n\t * Any ad error handling comes through here\n\t * @param {Event} event\n\t */\n\n\t }, {\n\t key: \"onAdError\",\n\t value: function onAdError(event) {\n\t this.cancel();\n\t this.player.debug.warn('Ads error', event);\n\t }\n\t /**\n\t * Setup hooks for Plyr and window events. This ensures\n\t * the mid- and post-roll launch at the correct time. And\n\t * resize the advertisement when the player resizes\n\t */\n\n\t }, {\n\t key: \"listeners\",\n\t value: function listeners() {\n\t var _this9 = this;\n\n\t var container = this.player.elements.container;\n\t var time;\n\t this.player.on('canplay', function () {\n\t _this9.addCuePoints();\n\t });\n\t this.player.on('ended', function () {\n\t _this9.loader.contentComplete();\n\t });\n\t this.player.on('timeupdate', function () {\n\t time = _this9.player.currentTime;\n\t });\n\t this.player.on('seeked', function () {\n\t var seekedTime = _this9.player.currentTime;\n\n\t if (is$2.empty(_this9.cuePoints)) {\n\t return;\n\t }\n\n\t _this9.cuePoints.forEach(function (cuePoint, index) {\n\t if (time < cuePoint && cuePoint < seekedTime) {\n\t _this9.manager.discardAdBreak();\n\n\t _this9.cuePoints.splice(index, 1);\n\t }\n\t });\n\t }); // Listen to the resizing of the window. And resize ad accordingly\n\t // TODO: eventually implement ResizeObserver\n\n\t window.addEventListener('resize', function () {\n\t if (_this9.manager) {\n\t _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\t }\n\t });\n\t }\n\t /**\n\t * Initialize the adsManager and start playing advertisements\n\t */\n\n\t }, {\n\t key: \"play\",\n\t value: function play() {\n\t var _this10 = this;\n\n\t var container = this.player.elements.container;\n\n\t if (!this.managerPromise) {\n\t this.resumeContent();\n\t } // Play the requested advertisement whenever the adsManager is ready\n\n\n\t this.managerPromise.then(function () {\n\t // Set volume to match player\n\t _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\n\t _this10.elements.displayContainer.initialize();\n\n\t try {\n\t if (!_this10.initialized) {\n\t // Initialize the ads manager. Ad rules playlist will start at this time\n\t _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will\n\t // start at this time; the call will be ignored for ad rules\n\n\n\t _this10.manager.start();\n\t }\n\n\t _this10.initialized = true;\n\t } catch (adError) {\n\t // An error may be thrown if there was a problem with the\n\t // VAST response\n\t _this10.onAdError(adError);\n\t }\n\t }).catch(function () {});\n\t }\n\t /**\n\t * Resume our video\n\t */\n\n\t }, {\n\t key: \"resumeContent\",\n\t value: function resumeContent() {\n\t // Hide the advertisement container\n\t this.elements.container.style.zIndex = ''; // Ad is stopped\n\n\t this.playing = false; // Play video\n\n\t silencePromise(this.player.media.play());\n\t }\n\t /**\n\t * Pause our video\n\t */\n\n\t }, {\n\t key: \"pauseContent\",\n\t value: function pauseContent() {\n\t // Show the advertisement container\n\t this.elements.container.style.zIndex = 3; // Ad is playing\n\n\t this.playing = true; // Pause our video.\n\n\t this.player.media.pause();\n\t }\n\t /**\n\t * Destroy the adsManager so we can grab new ads after this. If we don't then we're not\n\t * allowed to call new ads based on google policies, as they interpret this as an accidental\n\t * video requests. https://developers.google.com/interactive-\n\t * media-ads/docs/sdks/android/faq#8\n\t */\n\n\t }, {\n\t key: \"cancel\",\n\t value: function cancel() {\n\t // Pause our video\n\t if (this.initialized) {\n\t this.resumeContent();\n\t } // Tell our instance that we're done for now\n\n\n\t this.trigger('error'); // Re-create our adsManager\n\n\t this.loadAds();\n\t }\n\t /**\n\t * Re-create our adsManager\n\t */\n\n\t }, {\n\t key: \"loadAds\",\n\t value: function loadAds() {\n\t var _this11 = this;\n\n\t // Tell our adsManager to go bye bye\n\t this.managerPromise.then(function () {\n\t // Destroy our adsManager\n\t if (_this11.manager) {\n\t _this11.manager.destroy();\n\t } // Re-set our adsManager promises\n\n\n\t _this11.managerPromise = new Promise(function (resolve) {\n\t _this11.on('loaded', resolve);\n\n\t _this11.player.debug.log(_this11.manager);\n\t }); // Now that the manager has been destroyed set it to also be un-initialized\n\n\t _this11.initialized = false; // Now request some new advertisements\n\n\t _this11.requestAds();\n\t }).catch(function () {});\n\t }\n\t /**\n\t * Handles callbacks after an ad event was invoked\n\t * @param {String} event - Event type\n\t */\n\n\t }, {\n\t key: \"trigger\",\n\t value: function trigger(event) {\n\t var _this12 = this;\n\n\t for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t args[_key - 1] = arguments[_key];\n\t }\n\n\t var handlers = this.events[event];\n\n\t if (is$2.array(handlers)) {\n\t handlers.forEach(function (handler) {\n\t if (is$2.function(handler)) {\n\t handler.apply(_this12, args);\n\t }\n\t });\n\t }\n\t }\n\t /**\n\t * Add event listeners\n\t * @param {String} event - Event type\n\t * @param {Function} callback - Callback for when event occurs\n\t * @return {Ads}\n\t */\n\n\t }, {\n\t key: \"on\",\n\t value: function on(event, callback) {\n\t if (!is$2.array(this.events[event])) {\n\t this.events[event] = [];\n\t }\n\n\t this.events[event].push(callback);\n\t return this;\n\t }\n\t /**\n\t * Setup a safety timer for when the ad network doesn't respond for whatever reason.\n\t * The advertisement has 12 seconds to get its things together. We stop this timer when the\n\t * advertisement is playing, or when a user action is required to start, then we clear the\n\t * timer on ad ready\n\t * @param {Number} time\n\t * @param {String} from\n\t */\n\n\t }, {\n\t key: \"startSafetyTimer\",\n\t value: function startSafetyTimer(time, from) {\n\t var _this13 = this;\n\n\t this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n\t this.safetyTimer = setTimeout(function () {\n\t _this13.cancel();\n\n\t _this13.clearSafetyTimer('startSafetyTimer()');\n\t }, time);\n\t }\n\t /**\n\t * Clear our safety timer(s)\n\t * @param {String} from\n\t */\n\n\t }, {\n\t key: \"clearSafetyTimer\",\n\t value: function clearSafetyTimer(from) {\n\t if (!is$2.nullOrUndefined(this.safetyTimer)) {\n\t this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n\t clearTimeout(this.safetyTimer);\n\t this.safetyTimer = null;\n\t }\n\t }\n\t }, {\n\t key: \"enabled\",\n\t get: function get() {\n\t var config = this.config;\n\t return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$2.empty(config.publisherId) || is$2.url(config.tagUrl));\n\t }\n\t }, {\n\t key: \"tagUrl\",\n\t get: function get() {\n\t var config = this.config;\n\n\t if (is$2.url(config.tagUrl)) {\n\t return config.tagUrl;\n\t }\n\n\t var params = {\n\t AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n\t AV_CHANNELID: '5a0458dc28a06145e4519d21',\n\t AV_URL: window.location.hostname,\n\t cb: Date.now(),\n\t AV_WIDTH: 640,\n\t AV_HEIGHT: 480,\n\t AV_CDIM2: config.publisherId\n\t };\n\t var base = 'https://go.aniview.com/api/adserver6/vast/';\n\t return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n\t }\n\t }]);\n\n\t return Ads;\n\t}();\n\n\tvar $findIndex$1 = arrayIteration$1.findIndex;\n\n\n\n\tvar FIND_INDEX = 'findIndex';\n\tvar SKIPS_HOLES$2 = true;\n\n\tvar USES_TO_LENGTH$l = arrayMethodUsesToLength$1(FIND_INDEX);\n\n\t// Shouldn't skip holes\n\tif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES$2 = false; });\n\n\t// `Array.prototype.findIndex` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n\t_export$1({ target: 'Array', proto: true, forced: SKIPS_HOLES$2 || !USES_TO_LENGTH$l }, {\n\t findIndex: function findIndex(callbackfn /* , that = undefined */) {\n\t return $findIndex$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables$1(FIND_INDEX);\n\n\tvar min$d = Math.min;\n\tvar nativeLastIndexOf$1 = [].lastIndexOf;\n\tvar NEGATIVE_ZERO$3 = !!nativeLastIndexOf$1 && 1 / [1].lastIndexOf(1, -0) < 0;\n\tvar STRICT_METHOD$b = arrayMethodIsStrict$1('lastIndexOf');\n\t// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\n\tvar USES_TO_LENGTH$m = arrayMethodUsesToLength$1('indexOf', { ACCESSORS: true, 1: 0 });\n\tvar FORCED$d = NEGATIVE_ZERO$3 || !STRICT_METHOD$b || !USES_TO_LENGTH$m;\n\n\t// `Array.prototype.lastIndexOf` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n\tvar arrayLastIndexOf$1 = FORCED$d ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n\t // convert -0 to +0\n\t if (NEGATIVE_ZERO$3) return nativeLastIndexOf$1.apply(this, arguments) || 0;\n\t var O = toIndexedObject$1(this);\n\t var length = toLength$1(O.length);\n\t var index = length - 1;\n\t if (arguments.length > 1) index = min$d(index, toInteger$1(arguments[1]));\n\t if (index < 0) index = length + index;\n\t for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n\t return -1;\n\t} : nativeLastIndexOf$1;\n\n\t// `Array.prototype.lastIndexOf` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n\t_export$1({ target: 'Array', proto: true, forced: arrayLastIndexOf$1 !== [].lastIndexOf }, {\n\t lastIndexOf: arrayLastIndexOf$1\n\t});\n\n\tvar parseVtt = function parseVtt(vttDataString) {\n\t var processedList = [];\n\t var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\t frames.forEach(function (frame) {\n\t var result = {};\n\t var lines = frame.split(/\\r\\n|\\n|\\r/);\n\t lines.forEach(function (line) {\n\t if (!is$2.number(result.startTime)) {\n\t // The line with start and end times on it is the first line of interest\n\t var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n\t if (matchTimes) {\n\t result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n\t result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n\t }\n\t } else if (!is$2.empty(line.trim()) && is$2.empty(result.text)) {\n\t // If we already have the startTime, then we're definitely up to the text line(s)\n\t var lineSplit = line.trim().split('#xywh=');\n\n\t var _lineSplit = _slicedToArray(lineSplit, 1);\n\n\t result.text = _lineSplit[0];\n\n\t // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n\t if (lineSplit[1]) {\n\t var _lineSplit$1$split = lineSplit[1].split(',');\n\n\t var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n\t result.x = _lineSplit$1$split2[0];\n\t result.y = _lineSplit$1$split2[1];\n\t result.w = _lineSplit$1$split2[2];\n\t result.h = _lineSplit$1$split2[3];\n\t }\n\t }\n\t });\n\n\t if (result.text) {\n\t processedList.push(result);\n\t }\n\t });\n\t return processedList;\n\t};\n\t/**\n\t * Preview thumbnails for seek hover and scrubbing\n\t * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n\t * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n\t *\n\t * Notes:\n\t * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n\t * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n\t * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n\t */\n\n\n\tvar fitRatio = function fitRatio(ratio, outer) {\n\t var targetRatio = outer.width / outer.height;\n\t var result = {};\n\n\t if (ratio > targetRatio) {\n\t result.width = outer.width;\n\t result.height = 1 / ratio * outer.width;\n\t } else {\n\t result.height = outer.height;\n\t result.width = ratio * outer.height;\n\t }\n\n\t return result;\n\t};\n\n\tvar PreviewThumbnails = /*#__PURE__*/function () {\n\t /**\n\t * PreviewThumbnails constructor.\n\t * @param {Plyr} player\n\t * @return {PreviewThumbnails}\n\t */\n\t function PreviewThumbnails(player) {\n\t _classCallCheck(this, PreviewThumbnails);\n\n\t this.player = player;\n\t this.thumbnails = [];\n\t this.loaded = false;\n\t this.lastMouseMoveTime = Date.now();\n\t this.mouseDown = false;\n\t this.loadedImages = [];\n\t this.elements = {\n\t thumb: {},\n\t scrubbing: {}\n\t };\n\t this.load();\n\t }\n\n\t _createClass(PreviewThumbnails, [{\n\t key: \"load\",\n\t value: function load() {\n\t var _this = this;\n\n\t // Toggle the regular seek tooltip\n\t if (this.player.elements.display.seekTooltip) {\n\t this.player.elements.display.seekTooltip.hidden = this.enabled;\n\t }\n\n\t if (!this.enabled) {\n\t return;\n\t }\n\n\t this.getThumbnails().then(function () {\n\t if (!_this.enabled) {\n\t return;\n\t } // Render DOM elements\n\n\n\t _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n\t _this.determineContainerAutoSizing();\n\n\t _this.loaded = true;\n\t });\n\t } // Download VTT files and parse them\n\n\t }, {\n\t key: \"getThumbnails\",\n\t value: function getThumbnails() {\n\t var _this2 = this;\n\n\t return new Promise(function (resolve) {\n\t var src = _this2.player.config.previewThumbnails.src;\n\n\t if (is$2.empty(src)) {\n\t throw new Error('Missing previewThumbnails.src config attribute');\n\t } // Resolve promise\n\n\n\t var sortAndResolve = function sortAndResolve() {\n\t // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n\t _this2.thumbnails.sort(function (x, y) {\n\t return x.height - y.height;\n\t });\n\n\t _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n\t resolve();\n\t }; // Via callback()\n\n\n\t if (is$2.function(src)) {\n\t src(function (thumbnails) {\n\t _this2.thumbnails = thumbnails;\n\t sortAndResolve();\n\t });\n\t } // VTT urls\n\t else {\n\t // If string, convert into single-element list\n\t var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n\t var promises = urls.map(function (u) {\n\t return _this2.getThumbnail(u);\n\t }); // Resolve\n\n\t Promise.all(promises).then(sortAndResolve);\n\t }\n\t });\n\t } // Process individual VTT file\n\n\t }, {\n\t key: \"getThumbnail\",\n\t value: function getThumbnail(url) {\n\t var _this3 = this;\n\n\t return new Promise(function (resolve) {\n\t fetch(url).then(function (response) {\n\t var thumbnail = {\n\t frames: parseVtt(response),\n\t height: null,\n\t urlPrefix: ''\n\t }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n\t // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n\t // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n\t if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n\t thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n\t } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n\t var tempImage = new Image();\n\n\t tempImage.onload = function () {\n\t thumbnail.height = tempImage.naturalHeight;\n\t thumbnail.width = tempImage.naturalWidth;\n\n\t _this3.thumbnails.push(thumbnail);\n\n\t resolve();\n\t };\n\n\t tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n\t });\n\t });\n\t }\n\t }, {\n\t key: \"startMove\",\n\t value: function startMove(event) {\n\t if (!this.loaded) {\n\t return;\n\t }\n\n\t if (!is$2.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n\t return;\n\t } // Wait until media has a duration\n\n\n\t if (!this.player.media.duration) {\n\t return;\n\t }\n\n\t if (event.type === 'touchmove') {\n\t // Calculate seek hover position as approx video seconds\n\t this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n\t } else {\n\t // Calculate seek hover position as approx video seconds\n\t var clientRect = this.player.elements.progress.getBoundingClientRect();\n\t var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n\t this.seekTime = this.player.media.duration * (percentage / 100);\n\n\t if (this.seekTime < 0) {\n\t // The mousemove fires for 10+px out to the left\n\t this.seekTime = 0;\n\t }\n\n\t if (this.seekTime > this.player.media.duration - 1) {\n\t // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n\t this.seekTime = this.player.media.duration - 1;\n\t }\n\n\t this.mousePosX = event.pageX; // Set time text inside image container\n\n\t this.elements.thumb.time.innerText = formatTime(this.seekTime);\n\t } // Download and show image\n\n\n\t this.showImageAtCurrentTime();\n\t }\n\t }, {\n\t key: \"endMove\",\n\t value: function endMove() {\n\t this.toggleThumbContainer(false, true);\n\t }\n\t }, {\n\t key: \"startScrubbing\",\n\t value: function startScrubbing(event) {\n\t // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n\t if (is$2.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n\t this.mouseDown = true; // Wait until media has a duration\n\n\t if (this.player.media.duration) {\n\t this.toggleScrubbingContainer(true);\n\t this.toggleThumbContainer(false, true); // Download and show image\n\n\t this.showImageAtCurrentTime();\n\t }\n\t }\n\t }\n\t }, {\n\t key: \"endScrubbing\",\n\t value: function endScrubbing() {\n\t var _this4 = this;\n\n\t this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n\t if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n\t // The video was already seeked/loaded at the chosen time - hide immediately\n\t this.toggleScrubbingContainer(false);\n\t } else {\n\t // The video hasn't seeked yet. Wait for that\n\t once.call(this.player, this.player.media, 'timeupdate', function () {\n\t // Re-check mousedown - we might have already started scrubbing again\n\t if (!_this4.mouseDown) {\n\t _this4.toggleScrubbingContainer(false);\n\t }\n\t });\n\t }\n\t }\n\t /**\n\t * Setup hooks for Plyr and window events\n\t */\n\n\t }, {\n\t key: \"listeners\",\n\t value: function listeners() {\n\t var _this5 = this;\n\n\t // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n\t this.player.on('play', function () {\n\t _this5.toggleThumbContainer(false, true);\n\t });\n\t this.player.on('seeked', function () {\n\t _this5.toggleThumbContainer(false);\n\t });\n\t this.player.on('timeupdate', function () {\n\t _this5.lastTime = _this5.player.media.currentTime;\n\t });\n\t }\n\t /**\n\t * Create HTML elements for image containers\n\t */\n\n\t }, {\n\t key: \"render\",\n\t value: function render() {\n\t // Create HTML element: plyr__preview-thumbnail-container\n\t this.elements.thumb.container = createElement$1('div', {\n\t class: this.player.config.classNames.previewThumbnails.thumbContainer\n\t }); // Wrapper for the image for styling\n\n\t this.elements.thumb.imageContainer = createElement$1('div', {\n\t class: this.player.config.classNames.previewThumbnails.imageContainer\n\t });\n\t this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n\t var timeContainer = createElement$1('div', {\n\t class: this.player.config.classNames.previewThumbnails.timeContainer\n\t });\n\t this.elements.thumb.time = createElement$1('span', {}, '00:00');\n\t timeContainer.appendChild(this.elements.thumb.time);\n\t this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n\t if (is$2.element(this.player.elements.progress)) {\n\t this.player.elements.progress.appendChild(this.elements.thumb.container);\n\t } // Create HTML element: plyr__preview-scrubbing-container\n\n\n\t this.elements.scrubbing.container = createElement$1('div', {\n\t class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n\t });\n\t this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n\t }\n\t }, {\n\t key: \"destroy\",\n\t value: function destroy() {\n\t if (this.elements.thumb.container) {\n\t this.elements.thumb.container.remove();\n\t }\n\n\t if (this.elements.scrubbing.container) {\n\t this.elements.scrubbing.container.remove();\n\t }\n\t }\n\t }, {\n\t key: \"showImageAtCurrentTime\",\n\t value: function showImageAtCurrentTime() {\n\t var _this6 = this;\n\n\t if (this.mouseDown) {\n\t this.setScrubbingContainerSize();\n\t } else {\n\t this.setThumbContainerSizeAndPos();\n\t } // Find the desired thumbnail index\n\t // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n\t var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n\t return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n\t });\n\t var hasThumb = thumbNum >= 0;\n\t var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n\t if (!this.mouseDown) {\n\t this.toggleThumbContainer(hasThumb);\n\t } // No matching thumb found\n\n\n\t if (!hasThumb) {\n\t return;\n\t } // Check to see if we've already downloaded higher quality versions of this image\n\n\n\t this.thumbnails.forEach(function (thumbnail, index) {\n\t if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n\t qualityIndex = index;\n\t }\n\t }); // Only proceed if either thumbnum or thumbfilename has changed\n\n\t if (thumbNum !== this.showingThumb) {\n\t this.showingThumb = thumbNum;\n\t this.loadImage(qualityIndex);\n\t }\n\t } // Show the image that's currently specified in this.showingThumb\n\n\t }, {\n\t key: \"loadImage\",\n\t value: function loadImage() {\n\t var _this7 = this;\n\n\t var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var thumbNum = this.showingThumb;\n\t var thumbnail = this.thumbnails[qualityIndex];\n\t var urlPrefix = thumbnail.urlPrefix;\n\t var frame = thumbnail.frames[thumbNum];\n\t var thumbFilename = thumbnail.frames[thumbNum].text;\n\t var thumbUrl = urlPrefix + thumbFilename;\n\n\t if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n\t // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n\t // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n\t if (this.loadingImage && this.usingSprites) {\n\t this.loadingImage.onload = null;\n\t } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n\t // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n\t // images causes a flicker. Putting a new image over the top does not\n\n\n\t var previewImage = new Image();\n\t previewImage.src = thumbUrl;\n\t previewImage.dataset.index = thumbNum;\n\t previewImage.dataset.filename = thumbFilename;\n\t this.showingThumbFilename = thumbFilename;\n\t this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n\t previewImage.onload = function () {\n\t return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n\t };\n\n\t this.loadingImage = previewImage;\n\t this.removeOldImages(previewImage);\n\t } else {\n\t // Update the existing image\n\t this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n\t this.currentImageElement.dataset.index = thumbNum;\n\t this.removeOldImages(this.currentImageElement);\n\t }\n\t }\n\t }, {\n\t key: \"showImage\",\n\t value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n\t var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\t this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n\t this.setImageSizeAndOffset(previewImage, frame);\n\n\t if (newImage) {\n\t this.currentImageContainer.appendChild(previewImage);\n\t this.currentImageElement = previewImage;\n\n\t if (!this.loadedImages.includes(thumbFilename)) {\n\t this.loadedImages.push(thumbFilename);\n\t }\n\t } // Preload images before and after the current one\n\t // Show higher quality of the same frame\n\t // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n\t this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n\t } // Remove all preview images that aren't the designated current image\n\n\t }, {\n\t key: \"removeOldImages\",\n\t value: function removeOldImages(currentImage) {\n\t var _this8 = this;\n\n\t // Get a list of all images, convert it from a DOM list to an array\n\t Array.from(this.currentImageContainer.children).forEach(function (image) {\n\t if (image.tagName.toLowerCase() !== 'img') {\n\t return;\n\t }\n\n\t var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n\t if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n\t // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n\t // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n\t // eslint-disable-next-line no-param-reassign\n\t image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n\t var currentImageContainer = _this8.currentImageContainer;\n\t setTimeout(function () {\n\t currentImageContainer.removeChild(image);\n\n\t _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n\t }, removeDelay);\n\t }\n\t });\n\t } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n\t // This will only preload the lowest quality\n\n\t }, {\n\t key: \"preloadNearby\",\n\t value: function preloadNearby(thumbNum) {\n\t var _this9 = this;\n\n\t var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t return new Promise(function (resolve) {\n\t setTimeout(function () {\n\t var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n\t if (_this9.showingThumbFilename === oldThumbFilename) {\n\t // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n\t var thumbnailsClone;\n\n\t if (forward) {\n\t thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n\t } else {\n\t thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n\t }\n\n\t var foundOne = false;\n\t thumbnailsClone.forEach(function (frame) {\n\t var newThumbFilename = frame.text;\n\n\t if (newThumbFilename !== oldThumbFilename) {\n\t // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n\t if (!_this9.loadedImages.includes(newThumbFilename)) {\n\t foundOne = true;\n\n\t _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n\t var urlPrefix = _this9.thumbnails[0].urlPrefix;\n\t var thumbURL = urlPrefix + newThumbFilename;\n\t var previewImage = new Image();\n\t previewImage.src = thumbURL;\n\n\t previewImage.onload = function () {\n\t _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n\t if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n\t resolve();\n\t };\n\t }\n\t }\n\t }); // If there are none to preload then we want to resolve immediately\n\n\t if (!foundOne) {\n\t resolve();\n\t }\n\t }\n\t }, 300);\n\t });\n\t } // If user has been hovering current image for half a second, look for a higher quality one\n\n\t }, {\n\t key: \"getHigherQuality\",\n\t value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n\t var _this10 = this;\n\n\t if (currentQualityIndex < this.thumbnails.length - 1) {\n\t // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n\t var previewImageHeight = previewImage.naturalHeight;\n\n\t if (this.usingSprites) {\n\t previewImageHeight = frame.h;\n\t }\n\n\t if (previewImageHeight < this.thumbContainerHeight) {\n\t // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n\t setTimeout(function () {\n\t // Make sure the mouse hasn't already moved on and started hovering at another image\n\t if (_this10.showingThumbFilename === thumbFilename) {\n\t _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n\t _this10.loadImage(currentQualityIndex + 1);\n\t }\n\t }, 300);\n\t }\n\t }\n\t }\n\t }, {\n\t key: \"toggleThumbContainer\",\n\t value: function toggleThumbContainer() {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n\t this.elements.thumb.container.classList.toggle(className, toggle);\n\n\t if (!toggle && clearShowing) {\n\t this.showingThumb = null;\n\t this.showingThumbFilename = null;\n\t }\n\t }\n\t }, {\n\t key: \"toggleScrubbingContainer\",\n\t value: function toggleScrubbingContainer() {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n\t this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n\t if (!toggle) {\n\t this.showingThumb = null;\n\t this.showingThumbFilename = null;\n\t }\n\t }\n\t }, {\n\t key: \"determineContainerAutoSizing\",\n\t value: function determineContainerAutoSizing() {\n\t if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n\t // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n\t this.sizeSpecifiedInCSS = true;\n\t }\n\t } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n\t }, {\n\t key: \"setThumbContainerSizeAndPos\",\n\t value: function setThumbContainerSizeAndPos() {\n\t if (!this.sizeSpecifiedInCSS) {\n\t var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n\t this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n\t this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n\t } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {\n\t var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n\n\t this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n\t } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {\n\t var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n\t this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n\t }\n\n\t this.setThumbContainerPos();\n\t }\n\t }, {\n\t key: \"setThumbContainerPos\",\n\t value: function setThumbContainerPos() {\n\t var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n\t var plyrRect = this.player.elements.container.getBoundingClientRect();\n\t var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n\t var minVal = plyrRect.left - seekbarRect.left + 10;\n\t var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n\t var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n\t if (previewPos < minVal) {\n\t previewPos = minVal;\n\t }\n\n\t if (previewPos > maxVal) {\n\t previewPos = maxVal;\n\t }\n\n\t container.style.left = \"\".concat(previewPos, \"px\");\n\t } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n\t }, {\n\t key: \"setScrubbingContainerSize\",\n\t value: function setScrubbingContainerSize() {\n\t var _fitRatio = fitRatio(this.thumbAspectRatio, {\n\t width: this.player.media.clientWidth,\n\t height: this.player.media.clientHeight\n\t }),\n\t width = _fitRatio.width,\n\t height = _fitRatio.height;\n\n\t this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n\t this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n\t } // Sprites need to be offset to the correct location\n\n\t }, {\n\t key: \"setImageSizeAndOffset\",\n\t value: function setImageSizeAndOffset(previewImage, frame) {\n\t if (!this.usingSprites) {\n\t return;\n\t } // Find difference between height and preview container height\n\n\n\t var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n\t previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n\t previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n\t previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n\t previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n\t }\n\t }, {\n\t key: \"enabled\",\n\t get: function get() {\n\t return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n\t }\n\t }, {\n\t key: \"currentImageContainer\",\n\t get: function get() {\n\t if (this.mouseDown) {\n\t return this.elements.scrubbing.container;\n\t }\n\n\t return this.elements.thumb.imageContainer;\n\t }\n\t }, {\n\t key: \"usingSprites\",\n\t get: function get() {\n\t return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n\t }\n\t }, {\n\t key: \"thumbAspectRatio\",\n\t get: function get() {\n\t if (this.usingSprites) {\n\t return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n\t }\n\n\t return this.thumbnails[0].width / this.thumbnails[0].height;\n\t }\n\t }, {\n\t key: \"thumbContainerHeight\",\n\t get: function get() {\n\t if (this.mouseDown) {\n\t var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n\t width: this.player.media.clientWidth,\n\t height: this.player.media.clientHeight\n\t }),\n\t height = _fitRatio2.height;\n\n\t return height;\n\t } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n\t if (this.sizeSpecifiedInCSS) {\n\t return this.elements.thumb.imageContainer.clientHeight;\n\t }\n\n\t return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n\t }\n\t }, {\n\t key: \"currentImageElement\",\n\t get: function get() {\n\t if (this.mouseDown) {\n\t return this.currentScrubbingImageElement;\n\t }\n\n\t return this.currentThumbnailImageElement;\n\t },\n\t set: function set(element) {\n\t if (this.mouseDown) {\n\t this.currentScrubbingImageElement = element;\n\t } else {\n\t this.currentThumbnailImageElement = element;\n\t }\n\t }\n\t }]);\n\n\t return PreviewThumbnails;\n\t}();\n\n\tvar source = {\n\t // Add elements to HTML5 media (source, tracks, etc)\n\t insertElements: function insertElements(type, attributes) {\n\t var _this = this;\n\n\t if (is$2.string(attributes)) {\n\t insertElement(type, this.media, {\n\t src: attributes\n\t });\n\t } else if (is$2.array(attributes)) {\n\t attributes.forEach(function (attribute) {\n\t insertElement(type, _this.media, attribute);\n\t });\n\t }\n\t },\n\t // Update source\n\t // Sources are not checked for support so be careful\n\t change: function change(input) {\n\t var _this2 = this;\n\n\t if (!getDeep(input, 'sources.length')) {\n\t this.debug.warn('Invalid source format');\n\t return;\n\t } // Cancel current network requests\n\n\n\t html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n\t this.destroy.call(this, function () {\n\t // Reset quality options\n\t _this2.options.quality = []; // Remove elements\n\n\t removeElement(_this2.media);\n\t _this2.media = null; // Reset class name\n\n\t if (is$2.element(_this2.elements.container)) {\n\t _this2.elements.container.removeAttribute('class');\n\t } // Set the type and provider\n\n\n\t var sources = input.sources,\n\t type = input.type;\n\n\t var _sources = _slicedToArray(sources, 1),\n\t _sources$ = _sources[0],\n\t _sources$$provider = _sources$.provider,\n\t provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n\t src = _sources$.src;\n\n\t var tagName = provider === 'html5' ? type : 'div';\n\t var attributes = provider === 'html5' ? {} : {\n\t src: src\n\t };\n\t Object.assign(_this2, {\n\t provider: provider,\n\t type: type,\n\t // Check for support\n\t supported: support.check(type, provider, _this2.config.playsinline),\n\t // Create new element\n\t media: createElement$1(tagName, attributes)\n\t }); // Inject the new element\n\n\t _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n\t if (is$2.boolean(input.autoplay)) {\n\t _this2.config.autoplay = input.autoplay;\n\t } // Set attributes for audio and video\n\n\n\t if (_this2.isHTML5) {\n\t if (_this2.config.crossorigin) {\n\t _this2.media.setAttribute('crossorigin', '');\n\t }\n\n\t if (_this2.config.autoplay) {\n\t _this2.media.setAttribute('autoplay', '');\n\t }\n\n\t if (!is$2.empty(input.poster)) {\n\t _this2.poster = input.poster;\n\t }\n\n\t if (_this2.config.loop.active) {\n\t _this2.media.setAttribute('loop', '');\n\t }\n\n\t if (_this2.config.muted) {\n\t _this2.media.setAttribute('muted', '');\n\t }\n\n\t if (_this2.config.playsinline) {\n\t _this2.media.setAttribute('playsinline', '');\n\t }\n\t } // Restore class hook\n\n\n\t ui.addStyleHook.call(_this2); // Set new sources for html5\n\n\t if (_this2.isHTML5) {\n\t source.insertElements.call(_this2, 'source', sources);\n\t } // Set video title\n\n\n\t _this2.config.title = input.title; // Set up from scratch\n\n\t media.setup.call(_this2); // HTML5 stuff\n\n\t if (_this2.isHTML5) {\n\t // Setup captions\n\t if (Object.keys(input).includes('tracks')) {\n\t source.insertElements.call(_this2, 'track', input.tracks);\n\t }\n\t } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n\t if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n\t // Setup interface\n\t ui.build.call(_this2);\n\t } // Load HTML5 sources\n\n\n\t if (_this2.isHTML5) {\n\t _this2.media.load();\n\t } // Update previewThumbnails config & reload plugin\n\n\n\t if (!is$2.empty(input.previewThumbnails)) {\n\t Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n\t if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n\t _this2.previewThumbnails.destroy();\n\n\t _this2.previewThumbnails = null;\n\t } // Create new instance if it is still enabled\n\n\n\t if (_this2.config.previewThumbnails.enabled) {\n\t _this2.previewThumbnails = new PreviewThumbnails(_this2);\n\t }\n\t } // Update the fullscreen support\n\n\n\t _this2.fullscreen.update();\n\t }, true);\n\t }\n\t};\n\n\t/**\n\t * Returns a number whose value is limited to the given range.\n\t *\n\t * Example: limit the output of this computation to between 0 and 255\n\t * (x * 255).clamp(0, 255)\n\t *\n\t * @param {Number} input\n\t * @param {Number} min The lower boundary of the output range\n\t * @param {Number} max The upper boundary of the output range\n\t * @returns A number in the range [min, max]\n\t * @type Number\n\t */\n\tfunction clamp() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\t var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n\t return Math.min(Math.max(input, min), max);\n\t}\n\n\t// TODO: Use a WeakMap for private globals\n\t// const globals = new WeakMap();\n\t// Plyr instance\n\n\tvar Plyr = /*#__PURE__*/function () {\n\t function Plyr(target, options) {\n\t var _this = this;\n\n\t _classCallCheck(this, Plyr);\n\n\t this.timers = {}; // State\n\n\t this.ready = false;\n\t this.loading = false;\n\t this.failed = false; // Touch device\n\n\t this.touch = support.touch; // Set the media element\n\n\t this.media = target; // String selector passed\n\n\t if (is$2.string(this.media)) {\n\t this.media = document.querySelectorAll(this.media);\n\t } // jQuery, NodeList or Array passed, use first element\n\n\n\t if (window.jQuery && this.media instanceof jQuery || is$2.nodeList(this.media) || is$2.array(this.media)) {\n\t // eslint-disable-next-line\n\t this.media = this.media[0];\n\t } // Set config\n\n\n\t this.config = extend$1({}, defaults$2, Plyr.defaults, options || {}, function () {\n\t try {\n\t return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n\t } catch (e) {\n\t return {};\n\t }\n\t }()); // Elements cache\n\n\t this.elements = {\n\t container: null,\n\t fullscreen: null,\n\t captions: null,\n\t buttons: {},\n\t display: {},\n\t progress: {},\n\t inputs: {},\n\t settings: {\n\t popup: null,\n\t menu: null,\n\t panels: {},\n\t buttons: {}\n\t }\n\t }; // Captions\n\n\t this.captions = {\n\t active: null,\n\t currentTrack: -1,\n\t meta: new WeakMap()\n\t }; // Fullscreen\n\n\t this.fullscreen = {\n\t active: false\n\t }; // Options\n\n\t this.options = {\n\t speed: [],\n\t quality: []\n\t }; // Debugging\n\t // TODO: move to globals\n\n\t this.debug = new Console$1(this.config.debug); // Log config options and support\n\n\t this.debug.log('Config', this.config);\n\t this.debug.log('Support', support); // We need an element to setup\n\n\t if (is$2.nullOrUndefined(this.media) || !is$2.element(this.media)) {\n\t this.debug.error('Setup failed: no suitable element passed');\n\t return;\n\t } // Bail if the element is initialized\n\n\n\t if (this.media.plyr) {\n\t this.debug.warn('Target already setup');\n\t return;\n\t } // Bail if not enabled\n\n\n\t if (!this.config.enabled) {\n\t this.debug.error('Setup failed: disabled by config');\n\t return;\n\t } // Bail if disabled or no basic support\n\t // You may want to disable certain UAs etc\n\n\n\t if (!support.check().api) {\n\t this.debug.error('Setup failed: no support');\n\t return;\n\t } // Cache original element state for .destroy()\n\n\n\t var clone = this.media.cloneNode(true);\n\t clone.autoplay = false;\n\t this.elements.original = clone; // Set media type based on tag or data attribute\n\t // Supported: video, audio, vimeo, youtube\n\n\t var type = this.media.tagName.toLowerCase(); // Embed properties\n\n\t var iframe = null;\n\t var url = null; // Different setup based on type\n\n\t switch (type) {\n\t case 'div':\n\t // Find the frame\n\t iframe = this.media.querySelector('iframe'); // <iframe> type\n\n\t if (is$2.element(iframe)) {\n\t // Detect provider\n\t url = parseUrl$1(iframe.getAttribute('src'));\n\t this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n\t this.elements.container = this.media;\n\t this.media = iframe; // Reset classname\n\n\t this.elements.container.className = ''; // Get attributes from URL and set config\n\n\t if (url.search.length) {\n\t var truthy = ['1', 'true'];\n\n\t if (truthy.includes(url.searchParams.get('autoplay'))) {\n\t this.config.autoplay = true;\n\t }\n\n\t if (truthy.includes(url.searchParams.get('loop'))) {\n\t this.config.loop.active = true;\n\t } // TODO: replace fullscreen.iosNative with this playsinline config option\n\t // YouTube requires the playsinline in the URL\n\n\n\t if (this.isYouTube) {\n\t this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n\t this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n\t } else {\n\t this.config.playsinline = true;\n\t }\n\t }\n\t } else {\n\t // <div> with attributes\n\t this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute\n\n\t this.media.removeAttribute(this.config.attributes.embed.provider);\n\t } // Unsupported or missing provider\n\n\n\t if (is$2.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n\t this.debug.error('Setup failed: Invalid provider');\n\t return;\n\t } // Audio will come later for external providers\n\n\n\t this.type = types.video;\n\t break;\n\n\t case 'video':\n\t case 'audio':\n\t this.type = type;\n\t this.provider = providers.html5; // Get config from attributes\n\n\t if (this.media.hasAttribute('crossorigin')) {\n\t this.config.crossorigin = true;\n\t }\n\n\t if (this.media.hasAttribute('autoplay')) {\n\t this.config.autoplay = true;\n\t }\n\n\t if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n\t this.config.playsinline = true;\n\t }\n\n\t if (this.media.hasAttribute('muted')) {\n\t this.config.muted = true;\n\t }\n\n\t if (this.media.hasAttribute('loop')) {\n\t this.config.loop.active = true;\n\t }\n\n\t break;\n\n\t default:\n\t this.debug.error('Setup failed: unsupported type');\n\t return;\n\t } // Check for support again but with type\n\n\n\t this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n\t if (!this.supported.api) {\n\t this.debug.error('Setup failed: no support');\n\t return;\n\t }\n\n\t this.eventListeners = []; // Create listeners\n\n\t this.listeners = new Listeners(this); // Setup local storage for user settings\n\n\t this.storage = new Storage$1(this); // Store reference\n\n\t this.media.plyr = this; // Wrap media\n\n\t if (!is$2.element(this.elements.container)) {\n\t this.elements.container = createElement$1('div', {\n\t tabindex: 0\n\t });\n\t wrap$4(this.media, this.elements.container);\n\t } // Migrate custom properties from media to container (so they work 😉)\n\n\n\t ui.migrateStyles.call(this); // Add style hook\n\n\t ui.addStyleHook.call(this); // Setup media\n\n\t media.setup.call(this); // Listen for events if debugging\n\n\t if (this.config.debug) {\n\t on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n\t _this.debug.log(\"event: \".concat(event.type));\n\t });\n\t } // Setup fullscreen\n\n\n\t this.fullscreen = new Fullscreen(this); // Setup interface\n\t // If embed but not fully supported, build interface now to avoid flash of controls\n\n\t if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n\t ui.build.call(this);\n\t } // Container listeners\n\n\n\t this.listeners.container(); // Global listeners\n\n\t this.listeners.global(); // Setup ads if provided\n\n\t if (this.config.ads.enabled) {\n\t this.ads = new Ads(this);\n\t } // Autoplay if required\n\n\n\t if (this.isHTML5 && this.config.autoplay) {\n\t this.once('canplay', function () {\n\t return silencePromise(_this.play());\n\t });\n\t } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n\t this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n\t if (this.config.previewThumbnails.enabled) {\n\t this.previewThumbnails = new PreviewThumbnails(this);\n\t }\n\t } // ---------------------------------------\n\t // API\n\t // ---------------------------------------\n\n\t /**\n\t * Types and provider helpers\n\t */\n\n\n\t _createClass(Plyr, [{\n\t key: \"play\",\n\n\t /**\n\t * Play the media, or play the advertisement (if they are not blocked)\n\t */\n\t value: function play() {\n\t var _this2 = this;\n\n\t if (!is$2.function(this.media.play)) {\n\t return null;\n\t } // Intecept play with ads\n\n\n\t if (this.ads && this.ads.enabled) {\n\t this.ads.managerPromise.then(function () {\n\t return _this2.ads.play();\n\t }).catch(function () {\n\t return silencePromise(_this2.media.play());\n\t });\n\t } // Return the promise (for HTML5)\n\n\n\t return this.media.play();\n\t }\n\t /**\n\t * Pause the media\n\t */\n\n\t }, {\n\t key: \"pause\",\n\t value: function pause() {\n\t if (!this.playing || !is$2.function(this.media.pause)) {\n\t return null;\n\t }\n\n\t return this.media.pause();\n\t }\n\t /**\n\t * Get playing state\n\t */\n\n\t }, {\n\t key: \"togglePlay\",\n\n\t /**\n\t * Toggle playback based on current status\n\t * @param {Boolean} input\n\t */\n\t value: function togglePlay(input) {\n\t // Toggle based on current state if nothing passed\n\t var toggle = is$2.boolean(input) ? input : !this.playing;\n\n\t if (toggle) {\n\t return this.play();\n\t }\n\n\t return this.pause();\n\t }\n\t /**\n\t * Stop playback\n\t */\n\n\t }, {\n\t key: \"stop\",\n\t value: function stop() {\n\t if (this.isHTML5) {\n\t this.pause();\n\t this.restart();\n\t } else if (is$2.function(this.media.stop)) {\n\t this.media.stop();\n\t }\n\t }\n\t /**\n\t * Restart playback\n\t */\n\n\t }, {\n\t key: \"restart\",\n\t value: function restart() {\n\t this.currentTime = 0;\n\t }\n\t /**\n\t * Rewind\n\t * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n\t */\n\n\t }, {\n\t key: \"rewind\",\n\t value: function rewind(seekTime) {\n\t this.currentTime -= is$2.number(seekTime) ? seekTime : this.config.seekTime;\n\t }\n\t /**\n\t * Fast forward\n\t * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n\t */\n\n\t }, {\n\t key: \"forward\",\n\t value: function forward(seekTime) {\n\t this.currentTime += is$2.number(seekTime) ? seekTime : this.config.seekTime;\n\t }\n\t /**\n\t * Seek to a time\n\t * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n\t */\n\n\t }, {\n\t key: \"increaseVolume\",\n\n\t /**\n\t * Increase volume\n\t * @param {Boolean} step - How much to decrease by (between 0 and 1)\n\t */\n\t value: function increaseVolume(step) {\n\t var volume = this.media.muted ? 0 : this.volume;\n\t this.volume = volume + (is$2.number(step) ? step : 0);\n\t }\n\t /**\n\t * Decrease volume\n\t * @param {Boolean} step - How much to decrease by (between 0 and 1)\n\t */\n\n\t }, {\n\t key: \"decreaseVolume\",\n\t value: function decreaseVolume(step) {\n\t this.increaseVolume(-step);\n\t }\n\t /**\n\t * Set muted state\n\t * @param {Boolean} mute\n\t */\n\n\t }, {\n\t key: \"toggleCaptions\",\n\n\t /**\n\t * Toggle captions\n\t * @param {Boolean} input - Whether to enable captions\n\t */\n\t value: function toggleCaptions(input) {\n\t captions.toggle.call(this, input, false);\n\t }\n\t /**\n\t * Set the caption track by index\n\t * @param {Number} - Caption index\n\t */\n\n\t }, {\n\t key: \"airplay\",\n\n\t /**\n\t * Trigger the airplay dialog\n\t * TODO: update player with state, support, enabled\n\t */\n\t value: function airplay() {\n\t // Show dialog if supported\n\t if (support.airplay) {\n\t this.media.webkitShowPlaybackTargetPicker();\n\t }\n\t }\n\t /**\n\t * Toggle the player controls\n\t * @param {Boolean} [toggle] - Whether to show the controls\n\t */\n\n\t }, {\n\t key: \"toggleControls\",\n\t value: function toggleControls(toggle) {\n\t // Don't toggle if missing UI support or if it's audio\n\t if (this.supported.ui && !this.isAudio) {\n\t // Get state before change\n\t var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n\t var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n\t var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n\t if (hiding && is$2.array(this.config.controls) && this.config.controls.includes('settings') && !is$2.empty(this.config.settings)) {\n\t controls.toggleMenu.call(this, false);\n\t } // Trigger event on change\n\n\n\t if (hiding !== isHidden) {\n\t var eventName = hiding ? 'controlshidden' : 'controlsshown';\n\t triggerEvent.call(this, this.media, eventName);\n\t }\n\n\t return !hiding;\n\t }\n\n\t return false;\n\t }\n\t /**\n\t * Add event listeners\n\t * @param {String} event - Event type\n\t * @param {Function} callback - Callback for when event occurs\n\t */\n\n\t }, {\n\t key: \"on\",\n\t value: function on$1(event, callback) {\n\t on.call(this, this.elements.container, event, callback);\n\t }\n\t /**\n\t * Add event listeners once\n\t * @param {String} event - Event type\n\t * @param {Function} callback - Callback for when event occurs\n\t */\n\n\t }, {\n\t key: \"once\",\n\t value: function once$1(event, callback) {\n\t once.call(this, this.elements.container, event, callback);\n\t }\n\t /**\n\t * Remove event listeners\n\t * @param {String} event - Event type\n\t * @param {Function} callback - Callback for when event occurs\n\t */\n\n\t }, {\n\t key: \"off\",\n\t value: function off$1(event, callback) {\n\t off(this.elements.container, event, callback);\n\t }\n\t /**\n\t * Destroy an instance\n\t * Event listeners are removed when elements are removed\n\t * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory\n\t * @param {Function} callback - Callback for when destroy is complete\n\t * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)\n\t */\n\n\t }, {\n\t key: \"destroy\",\n\t value: function destroy(callback) {\n\t var _this3 = this;\n\n\t var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t if (!this.ready) {\n\t return;\n\t }\n\n\t var done = function done() {\n\t // Reset overflow (incase destroyed while in fullscreen)\n\t document.body.style.overflow = ''; // GC for embed\n\n\t _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n\t if (soft) {\n\t if (Object.keys(_this3.elements).length) {\n\t // Remove elements\n\t removeElement(_this3.elements.buttons.play);\n\t removeElement(_this3.elements.captions);\n\t removeElement(_this3.elements.controls);\n\t removeElement(_this3.elements.wrapper); // Clear for GC\n\n\t _this3.elements.buttons.play = null;\n\t _this3.elements.captions = null;\n\t _this3.elements.controls = null;\n\t _this3.elements.wrapper = null;\n\t } // Callback\n\n\n\t if (is$2.function(callback)) {\n\t callback();\n\t }\n\t } else {\n\t // Unbind listeners\n\t unbindListeners.call(_this3); // Cancel current network requests\n\n\t html5.cancelRequests.call(_this3); // Replace the container with the original element provided\n\n\t replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n\t triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n\t if (is$2.function(callback)) {\n\t callback.call(_this3.elements.original);\n\t } // Reset state\n\n\n\t _this3.ready = false; // Clear for garbage collection\n\n\t setTimeout(function () {\n\t _this3.elements = null;\n\t _this3.media = null;\n\t }, 200);\n\t }\n\t }; // Stop playback\n\n\n\t this.stop(); // Clear timeouts\n\n\t clearTimeout(this.timers.loading);\n\t clearTimeout(this.timers.controls);\n\t clearTimeout(this.timers.resized); // Provider specific stuff\n\n\t if (this.isHTML5) {\n\t // Restore native video controls\n\t ui.toggleNativeControls.call(this, true); // Clean up\n\n\t done();\n\t } else if (this.isYouTube) {\n\t // Clear timers\n\t clearInterval(this.timers.buffering);\n\t clearInterval(this.timers.playing); // Destroy YouTube API\n\n\t if (this.embed !== null && is$2.function(this.embed.destroy)) {\n\t this.embed.destroy();\n\t } // Clean up\n\n\n\t done();\n\t } else if (this.isVimeo) {\n\t // Destroy Vimeo API\n\t // then clean up (wait, to prevent postmessage errors)\n\t if (this.embed !== null) {\n\t this.embed.unload().then(done);\n\t } // Vimeo does not always return\n\n\n\t setTimeout(done, 200);\n\t }\n\t }\n\t /**\n\t * Check for support for a mime type (HTML5 only)\n\t * @param {String} type - Mime type\n\t */\n\n\t }, {\n\t key: \"supports\",\n\t value: function supports(type) {\n\t return support.mime.call(this, type);\n\t }\n\t /**\n\t * Check for support\n\t * @param {String} type - Player type (audio/video)\n\t * @param {String} provider - Provider (html5/youtube/vimeo)\n\t * @param {Boolean} inline - Where player has `playsinline` sttribute\n\t */\n\n\t }, {\n\t key: \"isHTML5\",\n\t get: function get() {\n\t return this.provider === providers.html5;\n\t }\n\t }, {\n\t key: \"isEmbed\",\n\t get: function get() {\n\t return this.isYouTube || this.isVimeo;\n\t }\n\t }, {\n\t key: \"isYouTube\",\n\t get: function get() {\n\t return this.provider === providers.youtube;\n\t }\n\t }, {\n\t key: \"isVimeo\",\n\t get: function get() {\n\t return this.provider === providers.vimeo;\n\t }\n\t }, {\n\t key: \"isVideo\",\n\t get: function get() {\n\t return this.type === types.video;\n\t }\n\t }, {\n\t key: \"isAudio\",\n\t get: function get() {\n\t return this.type === types.audio;\n\t }\n\t }, {\n\t key: \"playing\",\n\t get: function get() {\n\t return Boolean(this.ready && !this.paused && !this.ended);\n\t }\n\t /**\n\t * Get paused state\n\t */\n\n\t }, {\n\t key: \"paused\",\n\t get: function get() {\n\t return Boolean(this.media.paused);\n\t }\n\t /**\n\t * Get stopped state\n\t */\n\n\t }, {\n\t key: \"stopped\",\n\t get: function get() {\n\t return Boolean(this.paused && this.currentTime === 0);\n\t }\n\t /**\n\t * Get ended state\n\t */\n\n\t }, {\n\t key: \"ended\",\n\t get: function get() {\n\t return Boolean(this.media.ended);\n\t }\n\t }, {\n\t key: \"currentTime\",\n\t set: function set(input) {\n\t // Bail if media duration isn't available yet\n\t if (!this.duration) {\n\t return;\n\t } // Validate input\n\n\n\t var inputIsValid = is$2.number(input) && input > 0; // Set\n\n\t this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n\t this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n\t }\n\t /**\n\t * Get current time\n\t */\n\t ,\n\t get: function get() {\n\t return Number(this.media.currentTime);\n\t }\n\t /**\n\t * Get buffered\n\t */\n\n\t }, {\n\t key: \"buffered\",\n\t get: function get() {\n\t var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n\t if (is$2.number(buffered)) {\n\t return buffered;\n\t } // HTML5\n\t // TODO: Handle buffered chunks of the media\n\t // (i.e. seek to another section buffers only that section)\n\n\n\t if (buffered && buffered.length && this.duration > 0) {\n\t return buffered.end(0) / this.duration;\n\t }\n\n\t return 0;\n\t }\n\t /**\n\t * Get seeking status\n\t */\n\n\t }, {\n\t key: \"seeking\",\n\t get: function get() {\n\t return Boolean(this.media.seeking);\n\t }\n\t /**\n\t * Get the duration of the current media\n\t */\n\n\t }, {\n\t key: \"duration\",\n\t get: function get() {\n\t // Faux duration set via config\n\t var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n\t var realDuration = (this.media || {}).duration;\n\t var duration = !is$2.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n\t return fauxDuration || duration;\n\t }\n\t /**\n\t * Set the player volume\n\t * @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\t */\n\n\t }, {\n\t key: \"volume\",\n\t set: function set(value) {\n\t var volume = value;\n\t var max = 1;\n\t var min = 0;\n\n\t if (is$2.string(volume)) {\n\t volume = Number(volume);\n\t } // Load volume from storage if no value specified\n\n\n\t if (!is$2.number(volume)) {\n\t volume = this.storage.get('volume');\n\t } // Use config if all else fails\n\n\n\t if (!is$2.number(volume)) {\n\t volume = this.config.volume;\n\t } // Maximum is volumeMax\n\n\n\t if (volume > max) {\n\t volume = max;\n\t } // Minimum is volumeMin\n\n\n\t if (volume < min) {\n\t volume = min;\n\t } // Update config\n\n\n\t this.config.volume = volume; // Set the player volume\n\n\t this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n\t if (!is$2.empty(value) && this.muted && volume > 0) {\n\t this.muted = false;\n\t }\n\t }\n\t /**\n\t * Get the current player volume\n\t */\n\t ,\n\t get: function get() {\n\t return Number(this.media.volume);\n\t }\n\t }, {\n\t key: \"muted\",\n\t set: function set(mute) {\n\t var toggle = mute; // Load muted state from storage\n\n\t if (!is$2.boolean(toggle)) {\n\t toggle = this.storage.get('muted');\n\t } // Use config if all else fails\n\n\n\t if (!is$2.boolean(toggle)) {\n\t toggle = this.config.muted;\n\t } // Update config\n\n\n\t this.config.muted = toggle; // Set mute on the player\n\n\t this.media.muted = toggle;\n\t }\n\t /**\n\t * Get current muted state\n\t */\n\t ,\n\t get: function get() {\n\t return Boolean(this.media.muted);\n\t }\n\t /**\n\t * Check if the media has audio\n\t */\n\n\t }, {\n\t key: \"hasAudio\",\n\t get: function get() {\n\t // Assume yes for all non HTML5 (as we can't tell...)\n\t if (!this.isHTML5) {\n\t return true;\n\t }\n\n\t if (this.isAudio) {\n\t return true;\n\t } // Get audio tracks\n\n\n\t return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n\t }\n\t /**\n\t * Set playback speed\n\t * @param {Number} speed - the speed of playback (0.5-2.0)\n\t */\n\n\t }, {\n\t key: \"speed\",\n\t set: function set(input) {\n\t var _this4 = this;\n\n\t var speed = null;\n\n\t if (is$2.number(input)) {\n\t speed = input;\n\t }\n\n\t if (!is$2.number(speed)) {\n\t speed = this.storage.get('speed');\n\t }\n\n\t if (!is$2.number(speed)) {\n\t speed = this.config.speed.selected;\n\t } // Clamp to min/max\n\n\n\t var min = this.minimumSpeed,\n\t max = this.maximumSpeed;\n\t speed = clamp(speed, min, max); // Update config\n\n\t this.config.speed.selected = speed; // Set media speed\n\n\t setTimeout(function () {\n\t _this4.media.playbackRate = speed;\n\t }, 0);\n\t }\n\t /**\n\t * Get current playback speed\n\t */\n\t ,\n\t get: function get() {\n\t return Number(this.media.playbackRate);\n\t }\n\t /**\n\t * Get the minimum allowed speed\n\t */\n\n\t }, {\n\t key: \"minimumSpeed\",\n\t get: function get() {\n\t if (this.isYouTube) {\n\t // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n\t return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n\t }\n\n\t if (this.isVimeo) {\n\t // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n\t return 0.5;\n\t } // https://stackoverflow.com/a/32320020/1191319\n\n\n\t return 0.0625;\n\t }\n\t /**\n\t * Get the maximum allowed speed\n\t */\n\n\t }, {\n\t key: \"maximumSpeed\",\n\t get: function get() {\n\t if (this.isYouTube) {\n\t // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n\t return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n\t }\n\n\t if (this.isVimeo) {\n\t // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n\t return 2;\n\t } // https://stackoverflow.com/a/32320020/1191319\n\n\n\t return 16;\n\t }\n\t /**\n\t * Set playback quality\n\t * Currently HTML5 & YouTube only\n\t * @param {Number} input - Quality level\n\t */\n\n\t }, {\n\t key: \"quality\",\n\t set: function set(input) {\n\t var config = this.config.quality;\n\t var options = this.options.quality;\n\n\t if (!options.length) {\n\t return;\n\t }\n\n\t var quality = [!is$2.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$2.number);\n\t var updateStorage = true;\n\n\t if (!options.includes(quality)) {\n\t var value = closest$1(options, quality);\n\t this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n\t quality = value; // Don't update storage if quality is not supported\n\n\t updateStorage = false;\n\t } // Update config\n\n\n\t config.selected = quality; // Set quality\n\n\t this.media.quality = quality; // Save to storage\n\n\t if (updateStorage) {\n\t this.storage.set({\n\t quality: quality\n\t });\n\t }\n\t }\n\t /**\n\t * Get current quality level\n\t */\n\t ,\n\t get: function get() {\n\t return this.media.quality;\n\t }\n\t /**\n\t * Toggle loop\n\t * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n\t * @param {Boolean} input - Whether to loop or not\n\t */\n\n\t }, {\n\t key: \"loop\",\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : this.config.loop.active;\n\t this.config.loop.active = toggle;\n\t this.media.loop = toggle; // Set default to be a true toggle\n\n\t /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\t switch (type) {\n\t case 'start':\n\t if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n\t this.config.loop.end = null;\n\t }\n\t this.config.loop.start = this.currentTime;\n\t // this.config.loop.indicator.start = this.elements.display.played.value;\n\t break;\n\t case 'end':\n\t if (this.config.loop.start >= this.currentTime) {\n\t return this;\n\t }\n\t this.config.loop.end = this.currentTime;\n\t // this.config.loop.indicator.end = this.elements.display.played.value;\n\t break;\n\t case 'all':\n\t this.config.loop.start = 0;\n\t this.config.loop.end = this.duration - 2;\n\t this.config.loop.indicator.start = 0;\n\t this.config.loop.indicator.end = 100;\n\t break;\n\t case 'toggle':\n\t if (this.config.loop.active) {\n\t this.config.loop.start = 0;\n\t this.config.loop.end = null;\n\t } else {\n\t this.config.loop.start = 0;\n\t this.config.loop.end = this.duration - 2;\n\t }\n\t break;\n\t default:\n\t this.config.loop.start = 0;\n\t this.config.loop.end = null;\n\t break;\n\t } */\n\t }\n\t /**\n\t * Get current loop state\n\t */\n\t ,\n\t get: function get() {\n\t return Boolean(this.media.loop);\n\t }\n\t /**\n\t * Set new media source\n\t * @param {Object} input - The new source object (see docs)\n\t */\n\n\t }, {\n\t key: \"source\",\n\t set: function set(input) {\n\t source.change.call(this, input);\n\t }\n\t /**\n\t * Get current source\n\t */\n\t ,\n\t get: function get() {\n\t return this.media.currentSrc;\n\t }\n\t /**\n\t * Get a download URL (either source or custom)\n\t */\n\n\t }, {\n\t key: \"download\",\n\t get: function get() {\n\t var download = this.config.urls.download;\n\t return is$2.url(download) ? download : this.source;\n\t }\n\t /**\n\t * Set the download URL\n\t */\n\t ,\n\t set: function set(input) {\n\t if (!is$2.url(input)) {\n\t return;\n\t }\n\n\t this.config.urls.download = input;\n\t controls.setDownloadUrl.call(this);\n\t }\n\t /**\n\t * Set the poster image for a video\n\t * @param {String} input - the URL for the new poster image\n\t */\n\n\t }, {\n\t key: \"poster\",\n\t set: function set(input) {\n\t if (!this.isVideo) {\n\t this.debug.warn('Poster can only be set for video');\n\t return;\n\t }\n\n\t ui.setPoster.call(this, input, false).catch(function () {});\n\t }\n\t /**\n\t * Get the current poster image\n\t */\n\t ,\n\t get: function get() {\n\t if (!this.isVideo) {\n\t return null;\n\t }\n\n\t return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n\t }\n\t /**\n\t * Get the current aspect ratio in use\n\t */\n\n\t }, {\n\t key: \"ratio\",\n\t get: function get() {\n\t if (!this.isVideo) {\n\t return null;\n\t }\n\n\t var ratio = reduceAspectRatio(getAspectRatio.call(this));\n\t return is$2.array(ratio) ? ratio.join(':') : ratio;\n\t }\n\t /**\n\t * Set video aspect ratio\n\t */\n\t ,\n\t set: function set(input) {\n\t if (!this.isVideo) {\n\t this.debug.warn('Aspect ratio can only be set for video');\n\t return;\n\t }\n\n\t if (!is$2.string(input) || !validateRatio(input)) {\n\t this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n\t return;\n\t }\n\n\t this.config.ratio = input;\n\t setAspectRatio.call(this);\n\t }\n\t /**\n\t * Set the autoplay state\n\t * @param {Boolean} input - Whether to autoplay or not\n\t */\n\n\t }, {\n\t key: \"autoplay\",\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : this.config.autoplay;\n\t this.config.autoplay = toggle;\n\t }\n\t /**\n\t * Get the current autoplay state\n\t */\n\t ,\n\t get: function get() {\n\t return Boolean(this.config.autoplay);\n\t }\n\t }, {\n\t key: \"currentTrack\",\n\t set: function set(input) {\n\t captions.set.call(this, input, false);\n\t }\n\t /**\n\t * Get the current caption track index (-1 if disabled)\n\t */\n\t ,\n\t get: function get() {\n\t var _this$captions = this.captions,\n\t toggled = _this$captions.toggled,\n\t currentTrack = _this$captions.currentTrack;\n\t return toggled ? currentTrack : -1;\n\t }\n\t /**\n\t * Set the wanted language for captions\n\t * Since tracks can be added later it won't update the actual caption track until there is a matching track\n\t * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n\t */\n\n\t }, {\n\t key: \"language\",\n\t set: function set(input) {\n\t captions.setLanguage.call(this, input, false);\n\t }\n\t /**\n\t * Get the current track's language\n\t */\n\t ,\n\t get: function get() {\n\t return (captions.getCurrentTrack.call(this) || {}).language;\n\t }\n\t /**\n\t * Toggle picture-in-picture playback on WebKit/MacOS\n\t * TODO: update player with state, support, enabled\n\t * TODO: detect outside changes\n\t */\n\n\t }, {\n\t key: \"pip\",\n\t set: function set(input) {\n\t // Bail if no support\n\t if (!support.pip) {\n\t return;\n\t } // Toggle based on current state if not passed\n\n\n\t var toggle = is$2.boolean(input) ? input : !this.pip; // Toggle based on current state\n\t // Safari\n\n\t if (is$2.function(this.media.webkitSetPresentationMode)) {\n\t this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n\t } // Chrome\n\n\n\t if (is$2.function(this.media.requestPictureInPicture)) {\n\t if (!this.pip && toggle) {\n\t this.media.requestPictureInPicture();\n\t } else if (this.pip && !toggle) {\n\t document.exitPictureInPicture();\n\t }\n\t }\n\t }\n\t /**\n\t * Get the current picture-in-picture state\n\t */\n\t ,\n\t get: function get() {\n\t if (!support.pip) {\n\t return null;\n\t } // Safari\n\n\n\t if (!is$2.empty(this.media.webkitPresentationMode)) {\n\t return this.media.webkitPresentationMode === pip.active;\n\t } // Chrome\n\n\n\t return this.media === document.pictureInPictureElement;\n\t }\n\t }], [{\n\t key: \"supported\",\n\t value: function supported(type, provider, inline) {\n\t return support.check(type, provider, inline);\n\t }\n\t /**\n\t * Load an SVG sprite into the page\n\t * @param {String} url - URL for the SVG sprite\n\t * @param {String} [id] - Unique ID\n\t */\n\n\t }, {\n\t key: \"loadSprite\",\n\t value: function loadSprite$1(url, id) {\n\t return loadSprite(url, id);\n\t }\n\t /**\n\t * Setup multiple instances\n\t * @param {*} selector\n\t * @param {Object} options\n\t */\n\n\t }, {\n\t key: \"setup\",\n\t value: function setup(selector) {\n\t var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t var targets = null;\n\n\t if (is$2.string(selector)) {\n\t targets = Array.from(document.querySelectorAll(selector));\n\t } else if (is$2.nodeList(selector)) {\n\t targets = Array.from(selector);\n\t } else if (is$2.array(selector)) {\n\t targets = selector.filter(is$2.element);\n\t }\n\n\t if (is$2.empty(targets)) {\n\t return null;\n\t }\n\n\t return targets.map(function (t) {\n\t return new Plyr(t, options);\n\t });\n\t }\n\t }]);\n\n\t return Plyr;\n\t}();\n\n\tPlyr.defaults = cloneDeep(defaults$2);\n\n\tvar sources = {\n\t video: {\n\t type: 'video',\n\t title: 'View From A Blue Moon',\n\t sources: [{\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n\t type: 'video/mp4',\n\t size: 576\n\t }, {\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n\t type: 'video/mp4',\n\t size: 720\n\t }, {\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n\t type: 'video/mp4',\n\t size: 1080\n\t }, {\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n\t type: 'video/mp4',\n\t size: 1440\n\t }],\n\t poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n\t tracks: [{\n\t kind: 'captions',\n\t label: 'English',\n\t srclang: 'en',\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n\t default: true\n\t }, {\n\t kind: 'captions',\n\t label: 'French',\n\t srclang: 'fr',\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt'\n\t }],\n\t previewThumbnails: {\n\t src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt']\n\t }\n\t },\n\t audio: {\n\t type: 'audio',\n\t title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n\t sources: [{\n\t src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n\t type: 'audio/mp3'\n\t }, {\n\t src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n\t type: 'audio/ogg'\n\t }]\n\t },\n\t youtube: {\n\t type: 'video',\n\t sources: [{\n\t src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n\t provider: 'youtube'\n\t }]\n\t },\n\t vimeo: {\n\t type: 'video',\n\t sources: [{\n\t src: 'https://vimeo.com/40648169',\n\t provider: 'vimeo'\n\t }]\n\t }\n\t};\n\n\t// Toggle class on an element\n\tvar toggleClass$1 = function toggleClass(element) {\n\t var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var toggle = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\t return element && element.classList[toggle ? 'add' : 'remove'](className);\n\t};\n\n\t(function () {\n\t var production = 'plyr.io'; // Sentry for demo site (https://plyr.io) only\n\n\t if (window.location.host === production) {\n\t init({\n\t dsn: 'https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555',\n\t whitelistUrls: [production].map(function (d) {\n\t return new RegExp(\"https://(([a-z0-9])+(.))*\".concat(d));\n\t })\n\t });\n\t }\n\n\t document.addEventListener('DOMContentLoaded', function () {\n\t var selector = '#player'; // Setup share buttons\n\n\t Shr.setup('.js-shr', {\n\t count: {\n\t className: 'button__count'\n\t },\n\t wrapper: {\n\t className: 'button--with-count'\n\t }\n\t }); // Setup the player\n\n\t var player = new Plyr(selector, {\n\t debug: true,\n\t title: 'View From A Blue Moon',\n\t iconUrl: 'dist/demo.svg',\n\t keyboard: {\n\t global: true\n\t },\n\t tooltips: {\n\t controls: true\n\t },\n\t captions: {\n\t active: true\n\t },\n\t ads: {\n\t enabled: window.location.host.includes(production),\n\t publisherId: '918848828995742'\n\t },\n\t previewThumbnails: {\n\t enabled: true,\n\t src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt']\n\t },\n\t vimeo: {\n\t // Prevent Vimeo blocking plyr.io demo site\n\t referrerPolicy: 'no-referrer'\n\t }\n\t }); // Expose for tinkering in the console\n\n\t window.player = player; // Setup type toggle\n\n\t var buttons = document.querySelectorAll('[data-source]');\n\t var types = Object.keys(sources);\n\t var historySupport = Boolean(window.history && window.history.pushState);\n\t var currentType = window.location.hash.substring(1);\n\t var hasInitialType = currentType.length;\n\n\t function render(type) {\n\t // Remove active classes\n\t Array.from(buttons).forEach(function (button) {\n\t return toggleClass$1(button.parentElement, 'active', false);\n\t }); // Set active on parent\n\n\t toggleClass$1(document.querySelector(\"[data-source=\\\"\".concat(type, \"\\\"]\")), 'active', true); // Show cite\n\n\t Array.from(document.querySelectorAll('.plyr__cite')).forEach(function (cite) {\n\t // eslint-disable-next-line no-param-reassign\n\t cite.hidden = true;\n\t });\n\t document.querySelector(\".plyr__cite--\".concat(type)).hidden = false;\n\t } // Set a new source\n\n\n\t function setSource(type, init) {\n\t // 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\t if (!types.includes(type) || !init && type === currentType || !currentType.length && type === 'video') {\n\t return;\n\t } // Set the new source\n\n\n\t player.source = sources[type]; // Set the current type for next time\n\n\t currentType = type;\n\t render(type);\n\t } // Bind to each button\n\n\n\t Array.from(buttons).forEach(function (button) {\n\t button.addEventListener('click', function () {\n\t var type = button.getAttribute('data-source');\n\t setSource(type);\n\n\t if (historySupport) {\n\t window.history.pushState({\n\t type: type\n\t }, '', \"#\".concat(type));\n\t }\n\t });\n\t }); // List for backwards/forwards\n\n\t window.addEventListener('popstate', function (event) {\n\t if (event.state && Object.keys(event.state).includes('type')) {\n\t setSource(event.state.type);\n\t }\n\t }); // If there's no current type set, assume video\n\n\t if (!hasInitialType) {\n\t currentType = 'video';\n\t } // Replace current history state\n\n\n\t if (historySupport && types.includes(currentType)) {\n\t window.history.replaceState({\n\t type: currentType\n\t }, '', hasInitialType ? \"#\".concat(currentType) : '');\n\t } // If it's not video, load the source\n\n\n\t if (currentType !== 'video') {\n\t setSource(currentType, true);\n\t }\n\n\t render(currentType);\n\t });\n\t})();\n\n}());\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\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 toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\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 (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.6.5',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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 requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","var anObject = require('../internals/an-object');\n\n// call something on iterator step with safe closing on error\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 (error) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n throw error;\n }\n};\n","module.exports = {};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (e) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (f) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? 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 ? ObjectPrototype : null;\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","// Setup tab focus\nconst container = document.getElementById('container');\nconst tabClassName = 'tab-focus';\n\n// Remove class on blur\ndocument.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\ndocument.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","// 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 params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\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","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\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 nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","// `Symbol.prototype.description` getter\n// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar isObject = require('../internals/is-object');\nvar defineProperty = require('../internals/object-define-property').f;\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = global.Symbol;\n\nif (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\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","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.appent` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\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(String(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 var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === '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 } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\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(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\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] = [String(value)];\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\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (new URLSearchParams('?a=1').toString() === 'a=1') && (typeof URLSearchParams.prototype.set === 'function');\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.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 if (typeof proto._fromString !== 'function') {\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 if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\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\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 global.URL('b', 'http://a');\r\n u.pathname = 'c d';\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 global.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","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.asyncIterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.asynciterator\ndefineWellKnownSymbol('asyncIterator');\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n }\n});\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (classof(process) == 'process') {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(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 (\n global.addEventListener &&\n typeof postMessage == 'function' &&\n !global.importScripts &&\n !fails(post) &&\n location.protocol !== 'file:'\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) {\n var boundFunction = bind(fn, that, AS_ENTRIES ? 2 : 1);\n var iterator, iterFn, index, length, result, next, step;\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = AS_ENTRIES\n ? boundFunction(anObject(step = iterable[index])[0], step[1])\n : boundFunction(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES);\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n\niterate.stop = function (result) {\n return new Result(true, result);\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar classof = require('../internals/classof-raw');\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar IS_NODE = classof(process) == 'process';\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n } else if (MutationObserver && !IS_IOS) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\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 promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, 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\nmodule.exports = queueMicrotask || 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","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar classof = require('../internals/classof-raw');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar IS_NODE = classof(process) == 'process';\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && typeof PromiseRejectionEvent != 'function') return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (promise, state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can 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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(promise, state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (handler = global['on' + name]) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (promise, state) {\n task.call(global, function () {\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (promise, state) {\n task.call(global, function () {\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, promise, state, unwrap) {\n return function (value) {\n fn(promise, state, value, unwrap);\n };\n};\n\nvar internalReject = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(promise, state, true);\n};\n\nvar internalResolve = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, promise, wrapper, state),\n bind(internalReject, promise, wrapper, state)\n );\n } catch (error) {\n internalReject(promise, wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(promise, state, false);\n }\n } catch (error) {\n internalReject(promise, { done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n } catch (error) {\n internalReject(this, state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(this, state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, promise, state);\n this.reject = bind(internalReject, promise, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\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 $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\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 var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (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\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/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","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/** JSDoc */\nexport var Severity;\n(function (Severity) {\n /** JSDoc */\n Severity[\"Fatal\"] = \"fatal\";\n /** JSDoc */\n Severity[\"Error\"] = \"error\";\n /** JSDoc */\n Severity[\"Warning\"] = \"warning\";\n /** JSDoc */\n Severity[\"Log\"] = \"log\";\n /** JSDoc */\n Severity[\"Info\"] = \"info\";\n /** JSDoc */\n Severity[\"Debug\"] = \"debug\";\n /** JSDoc */\n Severity[\"Critical\"] = \"critical\";\n})(Severity || (Severity = {}));\n// tslint:disable:completed-docs\n// tslint:disable:no-unnecessary-qualifier no-namespace\n(function (Severity) {\n /**\n * Converts a string-based level into a {@link Severity}.\n *\n * @param level string representation of Severity\n * @returns Severity\n */\n function fromString(level) {\n switch (level) {\n case 'debug':\n return Severity.Debug;\n case 'info':\n return Severity.Info;\n case 'warn':\n case 'warning':\n return Severity.Warning;\n case 'error':\n return Severity.Error;\n case 'fatal':\n return Severity.Fatal;\n case 'critical':\n return Severity.Critical;\n case 'log':\n default:\n return Severity.Log;\n }\n }\n Severity.fromString = fromString;\n})(Severity || (Severity = {}));\n//# sourceMappingURL=severity.js.map","/** The status of an event. */\nexport var Status;\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent to Sentry successfully. */\n Status[\"Success\"] = \"success\";\n /** The client is currently rate limited and will try again later. */\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The event could not be processed. */\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error ocurred during submission. */\n Status[\"Failed\"] = \"failed\";\n})(Status || (Status = {}));\n// tslint:disable:completed-docs\n// tslint:disable:no-unnecessary-qualifier no-namespace\n(function (Status) {\n /**\n * Converts a HTTP status code into a {@link Status}.\n *\n * @param code The HTTP response status code.\n * @returns The send status or {@link Status.Unknown}.\n */\n function fromHttpCode(code) {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n if (code === 429) {\n return Status.RateLimit;\n }\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n if (code >= 500) {\n return Status.Failed;\n }\n return Status.Unknown;\n }\n Status.fromHttpCode = fromHttpCode;\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","var DESCRIPTORS = require('../internals/descriptors');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar FunctionPrototype = Function.prototype;\nvar FunctionPrototypeToString = FunctionPrototype.toString;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// Function instances `.name` property\n// https://tc39.github.io/ecma262/#sec-function-instances-name\nif (DESCRIPTORS && !(NAME in FunctionPrototype)) {\n defineProperty(FunctionPrototype, NAME, {\n configurable: true,\n get: function () {\n try {\n return FunctionPrototypeToString.call(this).match(nameRE)[1];\n } catch (error) {\n return '';\n }\n }\n });\n}\n","export var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties); // tslint:disable-line:no-unbound-method\n/**\n * setPrototypeOf polyfill using __proto__\n */\nfunction setProtoOf(obj, proto) {\n // @ts-ignore\n obj.__proto__ = proto;\n return obj;\n}\n/**\n * setPrototypeOf polyfill using mixin\n */\nfunction mixinProperties(obj, proto) {\n for (var prop in proto) {\n if (!obj.hasOwnProperty(prop)) {\n // @ts-ignore\n obj[prop] = proto[prop];\n }\n }\n return obj;\n}\n//# sourceMappingURL=polyfill.js.map","import * as tslib_1 from \"tslib\";\nimport { setPrototypeOf } from './polyfill';\n/** An error emitted by Sentry SDKs and related utilities. */\nvar SentryError = /** @class */ (function (_super) {\n tslib_1.__extends(SentryError, _super);\n function SentryError(message) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, message) || this;\n _this.message = message;\n // tslint:disable:no-unsafe-any\n _this.name = _newTarget.prototype.constructor.name;\n setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return SentryError;\n}(Error));\nexport { SentryError };\n//# sourceMappingURL=error.js.map","/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat) {\n switch (Object.prototype.toString.call(wat)) {\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 isInstanceOf(wat, Error);\n }\n}\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat) {\n return Object.prototype.toString.call(wat) === '[object ErrorEvent]';\n}\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat) {\n return Object.prototype.toString.call(wat) === '[object DOMError]';\n}\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat) {\n return Object.prototype.toString.call(wat) === '[object DOMException]';\n}\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat) {\n return Object.prototype.toString.call(wat) === '[object String]';\n}\n/**\n * Checks whether given value's is a primitive (undefined, null, number, boolean, string)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat) {\n return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat) {\n return Object.prototype.toString.call(wat) === '[object Object]';\n}\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat) {\n // tslint:disable-next-line:strict-type-predicates\n return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat) {\n // tslint:disable-next-line:strict-type-predicates\n return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat) {\n return Object.prototype.toString.call(wat) === '[object RegExp]';\n}\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat) {\n // tslint:disable:no-unsafe-any\n return Boolean(wat && wat.then && typeof wat.then === 'function');\n // tslint:enable:no-unsafe-any\n}\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat) {\n // tslint:disable-next-line:no-unsafe-any\n return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat, base) {\n try {\n // tslint:disable-next-line:no-unsafe-any\n return wat instanceof base;\n }\n catch (_e) {\n return false;\n }\n}\n//# sourceMappingURL=is.js.map","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","module.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n","'use strict';\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar uid = require('../internals/uid');\n\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = global.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar isPrototypeOf = ObjectPrototype.isPrototypeOf;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQIRED = false;\nvar NAME;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar isView = function isView(it) {\n var klass = classof(it);\n return klass === 'DataView' || has(TypedArrayConstructorsList, klass);\n};\n\nvar isTypedArray = function (it) {\n return isObject(it) && has(TypedArrayConstructorsList, classof(it));\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (setPrototypeOf) {\n if (isPrototypeOf.call(TypedArray, C)) return C;\n } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n return C;\n }\n } throw TypeError('Target is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n delete TypedArrayConstructor.prototype[KEY];\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n redefine(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n delete TypedArrayConstructor[KEY];\n }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n redefine(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n if (!global[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow\n TypedArray = function TypedArray() {\n throw TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQIRED = true;\n defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n } });\n for (NAME in TypedArrayConstructorsList) if (global[NAME]) {\n createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n","/* eslint-disable no-new */\nvar global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar NATIVE_ARRAY_BUFFER_VIEWS = require('../internals/array-buffer-view-core').NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = global.ArrayBuffer;\nvar Int8Array = global.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n","var toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\n\n// `ToIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-toindex\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 or index');\n return length;\n};\n","// IEEE754 conversions based on https://github.com/feross/ieee754\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = 1 / 0;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = new Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare\n if (number != number || number === Infinity) {\n // eslint-disable-next-line no-self-compare\n mantissa = number != number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n if (number * (c = pow(2, -exponent)) < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent = exponent + eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n buffer[--index] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa = mantissa + pow(2, mantissaLength);\n exponent = exponent - eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.fill` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 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","'use strict';\nvar global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefineAll = require('../internals/redefine-all');\nvar fails = require('../internals/fails');\nvar anInstance = require('../internals/an-instance');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar IEEE754 = require('../internals/ieee754');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar arrayFill = require('../internals/array-fill');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar $DataView = global[DATA_VIEW];\nvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar RangeError = global.RangeError;\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(number, 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key) {\n defineProperty(Constructor[PROTOTYPE], key, { get: function () { return getInternalState(this)[key]; } });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = bytes.slice(start, start + count);\n return isLittleEndian ? pack : pack.reverse();\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = conversion(+value);\n for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n setInternalState(this, {\n bytes: arrayFill.call(new Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) this.byteLength = 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 = getInternalState(buffer).byteLength;\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 setInternalState(this, {\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength');\n addGetter($DataView, 'buffer');\n addGetter($DataView, 'byteLength');\n addGetter($DataView, 'byteOffset');\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.length > 1 ? arguments[1] : undefined);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n }\n });\n} else {\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new NativeArrayBuffer(); // eslint-disable-line no-new\n new NativeArrayBuffer(1.5); // eslint-disable-line no-new\n new NativeArrayBuffer(NaN); // eslint-disable-line no-new\n return NativeArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new NativeArrayBuffer(toIndex(length));\n };\n var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE];\n for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) {\n createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n }\n }\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf($DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var nativeSetInt8 = $DataViewPrototype.setInt8;\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n","var toPositiveInteger = require('../internals/to-positive-integer');\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n","var toInteger = require('../internals/to-integer');\n\nmodule.exports = function (it) {\n var result = toInteger(it);\n if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n return result;\n};\n","var toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar bind = require('../internals/function-bind-context');\nvar aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, step, iterator, next;\n if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n O = [];\n while (!(step = next.call(iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2], 2);\n }\n length = toLength(O.length);\n result = new (aTypedArrayConstructor(this))(length);\n for (i = 0; length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayBufferModule = require('../internals/array-buffer');\nvar anInstance = require('../internals/an-instance');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar toOffset = require('../internals/to-offset');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar typedArrayFrom = require('../internals/typed-array-from');\nvar forEach = require('../internals/array-iteration').forEach;\nvar setSpecies = require('../internals/set-species');\nvar definePropertyModule = require('../internals/object-define-property');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar InternalStateModule = require('../internals/internal-state');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar round = Math.round;\nvar RangeError = global.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\nvar addGetter = function (it, key) {\n nativeDefineProperty(it, key, { get: function () {\n return getInternalState(this)[key];\n } });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n return isTypedArrayIndex(target, key = toPrimitive(key, true))\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n && isObject(descriptor)\n && has(descriptor, 'value')\n && !has(descriptor, 'get')\n && !has(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!has(descriptor, 'writable') || descriptor.writable)\n && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = global[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(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\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return fromList(TypedArrayConstructor, data);\n } else {\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({\n global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint16Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint16', function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\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 = 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","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $copyWithin = require('../internals/array-copy-within');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.copyWithin` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.copywithin\nexportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end */) {\n return $copyWithin.call(aTypedArray(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $every = require('../internals/array-iteration').every;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every\nexportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) {\n return $every(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $fill = require('../internals/array-fill');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.fill` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.fill\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('fill', function fill(value /* , start, end */) {\n return $fill.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $filter = require('../internals/array-iteration').filter;\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.filter\nexportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) {\n var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $find = require('../internals/array-iteration').find;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find\nexportTypedArrayMethod('find', function find(predicate /* , thisArg */) {\n return $find(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $findIndex = require('../internals/array-iteration').findIndex;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findindex\nexportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */) {\n return $findIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.foreach\nexportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) {\n $forEach(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $includes = require('../internals/array-includes').includes;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.includes\nexportTypedArrayMethod('includes', function includes(searchElement /* , fromIndex */) {\n return $includes(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $indexOf = require('../internals/array-includes').indexOf;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.indexof\nexportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex */) {\n return $indexOf(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar global = require('../internals/global');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayIterators = require('../modules/es.array.iterator');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar Uint8Array = global.Uint8Array;\nvar arrayValues = ArrayIterators.values;\nvar arrayKeys = ArrayIterators.keys;\nvar arrayEntries = ArrayIterators.entries;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR];\n\nvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\nvar typedArrayValues = function values() {\n return arrayValues.call(aTypedArray(this));\n};\n\n// `%TypedArray%.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.entries\nexportTypedArrayMethod('entries', function entries() {\n return arrayEntries.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.keys\nexportTypedArrayMethod('keys', function keys() {\n return arrayKeys.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.values\nexportTypedArrayMethod('values', typedArrayValues, !CORRECT_ITER_NAME);\n// `%TypedArray%.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype-@@iterator\nexportTypedArrayMethod(ITERATOR, typedArrayValues, !CORRECT_ITER_NAME);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $join = [].join;\n\n// `%TypedArray%.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.join\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('join', function join(separator) {\n return $join.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $lastIndexOf = require('../internals/array-last-index-of');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.lastindexof\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n return $lastIndexOf.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $map = require('../internals/array-iteration').map;\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.map\nexportTypedArrayMethod('map', function map(mapfn /* , thisArg */) {\n return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n return new (aTypedArrayConstructor(speciesConstructor(O, O.constructor)))(length);\n });\n});\n","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $reduce = require('../internals/array-reduce').left;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduce\nexportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */) {\n return $reduce(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $reduceRight = require('../internals/array-reduce').right;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduceRicht` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright\nexportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar floor = Math.floor;\n\n// `%TypedArray%.prototype.reverse` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reverse\nexportTypedArrayMethod('reverse', function reverse() {\n var that = this;\n var length = aTypedArray(that).length;\n var middle = 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","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toOffset = require('../internals/to-offset');\nvar toObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line no-undef\n new Int8Array(1).set({});\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 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}, FORCED);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar speciesConstructor = require('../internals/species-constructor');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $slice = [].slice;\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line no-undef\n new Int8Array(1).slice();\n});\n\n// `%TypedArray%.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.slice\nexportTypedArrayMethod('slice', function slice(start, end) {\n var list = $slice.call(aTypedArray(this), start, end);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n}, FORCED);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $some = require('../internals/array-iteration').some;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.some\nexportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) {\n return $some(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $sort = [].sort;\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n return $sort.call(aTypedArray(this), comparefn);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n","'use strict';\nvar global = require('../internals/global');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar fails = require('../internals/fails');\n\nvar Int8Array = global.Int8Array;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $toLocaleString = [].toLocaleString;\nvar $slice = [].slice;\n\n// iOS Safari 6.x fails here\nvar TO_LOCALE_STRING_BUG = !!Int8Array && fails(function () {\n $toLocaleString.call(new Int8Array(1));\n});\n\nvar FORCED = fails(function () {\n return [1, 2].toLocaleString() != new Int8Array([1, 2]).toLocaleString();\n}) || !fails(function () {\n Int8Array.prototype.toLocaleString.call([1, 2]);\n});\n\n// `%TypedArray%.prototype.toLocaleString` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tolocalestring\nexportTypedArrayMethod('toLocaleString', function toLocaleString() {\n return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);\n}, FORCED);\n","'use strict';\nvar exportTypedArrayMethod = require('../internals/array-buffer-view-core').exportTypedArrayMethod;\nvar fails = require('../internals/fails');\nvar global = require('../internals/global');\n\nvar Uint8Array = global.Uint8Array;\nvar Uint8ArrayPrototype = Uint8Array && Uint8Array.prototype || {};\nvar arrayToString = [].toString;\nvar arrayJoin = [].join;\n\nif (fails(function () { arrayToString.call({}); })) {\n arrayToString = function toString() {\n return arrayJoin.call(this);\n };\n}\n\nvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n// `%TypedArray%.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tostring\nexportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n","import { isRegExp, isString } from './is';\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function truncate(str, max) {\n if (max === void 0) { max = 0; }\n // tslint:disable-next-line:strict-type-predicates\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + \"...\";\n}\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line, colno) {\n var newLine = line;\n var ll = newLine.length;\n if (ll <= 150) {\n return newLine;\n }\n if (colno > ll) {\n colno = ll; // tslint:disable-line:no-parameter-reassignment\n }\n var start = Math.max(colno - 60, 0);\n if (start < 5) {\n start = 0;\n }\n var end = Math.min(start + 140, ll);\n if (end > ll - 5) {\n end = ll;\n }\n if (end === ll) {\n start = Math.max(end - 140, 0);\n }\n newLine = newLine.slice(start, end);\n if (start > 0) {\n newLine = \"'{snip} \" + newLine;\n }\n if (end < ll) {\n newLine += ' {snip}';\n }\n return newLine;\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 Joined values\n */\nexport function safeJoin(input, delimiter) {\n if (!Array.isArray(input)) {\n return '';\n }\n var output = [];\n // tslint:disable-next-line:prefer-for-of\n for (var i = 0; i < input.length; i++) {\n var value = input[i];\n try {\n output.push(String(value));\n }\n catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n return output.join(delimiter);\n}\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\nexport function isMatchingPattern(value, pattern) {\n if (!isString(value)) {\n return false;\n }\n if (isRegExp(pattern)) {\n return pattern.test(value);\n }\n if (typeof pattern === 'string') {\n return value.indexOf(pattern) !== -1;\n }\n return false;\n}\n//# sourceMappingURL=string.js.map","import { isString } from './is';\nimport { snipLine } from './string';\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\nexport function dynamicRequire(mod, request) {\n // tslint:disable-next-line: no-unsafe-any\n return mod.require(request);\n}\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv() {\n // tslint:disable:strict-type-predicates\n return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n}\nvar fallbackGlobalObject = {};\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\nexport function getGlobalObject() {\n return (isNodeEnv()\n ? global\n : typeof window !== 'undefined'\n ? window\n : typeof self !== 'undefined'\n ? self\n : fallbackGlobalObject);\n}\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nexport function uuid4() {\n var global = getGlobalObject();\n var crypto = global.crypto || global.msCrypto;\n if (!(crypto === void 0) && crypto.getRandomValues) {\n // Use window.crypto API if available\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n // set 4 in byte 7\n // tslint:disable-next-line:no-bitwise\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n // tslint:disable-next-line:no-bitwise\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\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 return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]));\n }\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 // tslint:disable-next-line:no-bitwise\n var r = (Math.random() * 16) | 0;\n // tslint:disable-next-line:no-bitwise\n var v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n/**\n * Parses string form of URL into an object\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\n * @returns parsed URL object\n */\nexport function parseUrl(url) {\n if (!url) {\n return {};\n }\n var match = url.match(/^(([^:\\/?#]+):)?(\\/\\/([^\\/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n if (!match) {\n return {};\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 host: match[4],\n path: match[5],\n protocol: match[2],\n relative: match[5] + query + fragment,\n };\n}\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event) {\n if (event.message) {\n return event.message;\n }\n if (event.exception && event.exception.values && event.exception.values[0]) {\n var exception = event.exception.values[0];\n if (exception.type && exception.value) {\n return exception.type + \": \" + exception.value;\n }\n return exception.type || exception.value || event.event_id || '<unknown>';\n }\n return event.event_id || '<unknown>';\n}\n/** JSDoc */\nexport function consoleSandbox(callback) {\n var global = getGlobalObject();\n var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n if (!('console' in global)) {\n return callback();\n }\n var originalConsole = global.console;\n var wrappedLevels = {};\n // Restore all wrapped console methods\n levels.forEach(function (level) {\n if (level in global.console && originalConsole[level].__sentry_original__) {\n wrappedLevels[level] = originalConsole[level];\n originalConsole[level] = originalConsole[level].__sentry_original__;\n }\n });\n // Perform callback manipulations\n var result = callback();\n // Revert restoration to wrapped state\n Object.keys(wrappedLevels).forEach(function (level) {\n originalConsole[level] = wrappedLevels[level];\n });\n return result;\n}\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event, value, type) {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].value = event.exception.values[0].value || value || '';\n event.exception.values[0].type = event.exception.values[0].type || type || 'Error';\n}\n/**\n * Adds exception mechanism to a given event.\n * @param event The event to modify.\n * @param mechanism Mechanism of the mechanism.\n * @hidden\n */\nexport function addExceptionMechanism(event, mechanism) {\n if (mechanism === void 0) { mechanism = {}; }\n // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?\n try {\n // @ts-ignore\n // tslint:disable:no-non-null-assertion\n event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};\n Object.keys(mechanism).forEach(function (key) {\n // @ts-ignore\n event.exception.values[0].mechanism[key] = mechanism[key];\n });\n }\n catch (_oO) {\n // no-empty\n }\n}\n/**\n * A safe form of location.href\n */\nexport function getLocationHref() {\n try {\n return document.location.href;\n }\n catch (oO) {\n return '';\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 * @returns generated DOM path\n */\nexport function htmlTreeAsString(elem) {\n // try/catch both:\n // - accessing event.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 try {\n var currentElem = elem;\n var MAX_TRAVERSE_HEIGHT = 5;\n var MAX_OUTPUT_LEN = 80;\n var out = [];\n var height = 0;\n var len = 0;\n var separator = ' > ';\n var sepLength = separator.length;\n var nextStr = void 0;\n while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = _htmlElementAsString(currentElem);\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 (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {\n break;\n }\n out.push(nextStr);\n len += nextStr.length;\n currentElem = currentElem.parentNode;\n }\n return out.reverse().join(separator);\n }\n catch (_oO) {\n return '<unknown>';\n }\n}\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el) {\n var elem = el;\n var out = [];\n var className;\n var classes;\n var key;\n var attr;\n var i;\n if (!elem || !elem.tagName) {\n return '';\n }\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push(\"#\" + elem.id);\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}\nvar INITIAL_TIME = Date.now();\nvar prevNow = 0;\nvar performanceFallback = {\n now: function () {\n var now = Date.now() - INITIAL_TIME;\n if (now < prevNow) {\n now = prevNow;\n }\n prevNow = now;\n return now;\n },\n timeOrigin: INITIAL_TIME,\n};\nexport var crossPlatformPerformance = (function () {\n if (isNodeEnv()) {\n try {\n var perfHooks = dynamicRequire(module, 'perf_hooks');\n return perfHooks.performance;\n }\n catch (_) {\n return performanceFallback;\n }\n }\n if (getGlobalObject().performance) {\n // Polyfill for performance.timeOrigin.\n //\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n // tslint:disable-next-line:strict-type-predicates\n if (performance.timeOrigin === undefined) {\n // As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a\n // valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME.\n // @ts-ignore\n // tslint:disable-next-line:deprecation\n performance.timeOrigin = (performance.timing && performance.timing.navigationStart) || INITIAL_TIME;\n }\n }\n return getGlobalObject().performance || performanceFallback;\n})();\n/**\n * Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock.\n */\nexport function timestampWithMs() {\n return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000;\n}\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nvar SEMVER_REGEXP = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input) {\n var match = input.match(SEMVER_REGEXP) || [];\n var major = parseInt(match[1], 10);\n var minor = parseInt(match[2], 10);\n var patch = parseInt(match[3], 10);\n return {\n buildmetadata: match[5],\n major: isNaN(major) ? undefined : major,\n minor: isNaN(minor) ? undefined : minor,\n patch: isNaN(patch) ? undefined : patch,\n prerelease: match[4],\n };\n}\nvar defaultRetryAfter = 60 * 1000; // 60 seconds\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param now current unix timestamp\n * @param header string representation of 'Retry-After' header\n */\nexport function parseRetryAfterHeader(now, header) {\n if (!header) {\n return defaultRetryAfter;\n }\n var headerDelay = parseInt(\"\" + header, 10);\n if (!isNaN(headerDelay)) {\n return headerDelay * 1000;\n }\n var headerDate = Date.parse(\"\" + header);\n if (!isNaN(headerDate)) {\n return headerDate - now;\n }\n return defaultRetryAfter;\n}\nvar defaultFunctionName = '<anonymous>';\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn) {\n try {\n if (!fn || typeof fn !== 'function') {\n return defaultFunctionName;\n }\n return fn.name || defaultFunctionName;\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 return defaultFunctionName;\n }\n}\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines, frame, linesOfContext) {\n if (linesOfContext === void 0) { linesOfContext = 5; }\n var lineno = frame.lineno || 0;\n var maxLines = lines.length;\n var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);\n frame.pre_context = lines\n .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n .map(function (line) { return snipLine(line, 0); });\n frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n frame.post_context = lines\n .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n .map(function (line) { return snipLine(line, 0); });\n}\n//# sourceMappingURL=misc.js.map","import { consoleSandbox, getGlobalObject } from './misc';\n// TODO: Implement different loggers for different environments\nvar global = getGlobalObject();\n/** Prefix for logging strings */\nvar PREFIX = 'Sentry Logger ';\n/** JSDoc */\nvar Logger = /** @class */ (function () {\n /** JSDoc */\n function Logger() {\n this._enabled = false;\n }\n /** JSDoc */\n Logger.prototype.disable = function () {\n this._enabled = false;\n };\n /** JSDoc */\n Logger.prototype.enable = function () {\n this._enabled = true;\n };\n /** JSDoc */\n Logger.prototype.log = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!this._enabled) {\n return;\n }\n consoleSandbox(function () {\n global.console.log(PREFIX + \"[Log]: \" + args.join(' ')); // tslint:disable-line:no-console\n });\n };\n /** JSDoc */\n Logger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!this._enabled) {\n return;\n }\n consoleSandbox(function () {\n global.console.warn(PREFIX + \"[Warn]: \" + args.join(' ')); // tslint:disable-line:no-console\n });\n };\n /** JSDoc */\n Logger.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!this._enabled) {\n return;\n }\n consoleSandbox(function () {\n global.console.error(PREFIX + \"[Error]: \" + args.join(' ')); // tslint:disable-line:no-console\n });\n };\n return Logger;\n}());\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nglobal.__SENTRY__ = global.__SENTRY__ || {};\nvar logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger());\nexport { logger };\n//# sourceMappingURL=logger.js.map","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n});\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","'use strict';\nvar redefineAll = require('../internals/redefine-all');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar $has = require('../internals/has');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && $has(data, state.id) && delete data[state.id];\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && $has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\n\n// `WeakSet` constructor\n// https://tc39.github.io/ecma262/#sec-weakset-constructor\ncollection('WeakSet', function (init) {\n return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionWeak);\n","// tslint:disable:no-unsafe-any\n/**\n * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n */\nvar Memo = /** @class */ (function () {\n function Memo() {\n // tslint:disable-next-line\n this._hasWeakSet = typeof WeakSet === 'function';\n this._inner = this._hasWeakSet ? new WeakSet() : [];\n }\n /**\n * Sets obj to remember.\n * @param obj Object to remember\n */\n Memo.prototype.memoize = function (obj) {\n if (this._hasWeakSet) {\n if (this._inner.has(obj)) {\n return true;\n }\n this._inner.add(obj);\n return false;\n }\n // tslint:disable-next-line:prefer-for-of\n for (var i = 0; i < this._inner.length; i++) {\n var value = this._inner[i];\n if (value === obj) {\n return true;\n }\n }\n this._inner.push(obj);\n return false;\n };\n /**\n * Removes object from internal storage.\n * @param obj Object to forget\n */\n Memo.prototype.unmemoize = function (obj) {\n if (this._hasWeakSet) {\n this._inner.delete(obj);\n }\n else {\n for (var i = 0; i < this._inner.length; i++) {\n if (this._inner[i] === obj) {\n this._inner.splice(i, 1);\n break;\n }\n }\n }\n };\n return Memo;\n}());\nexport { Memo };\n//# sourceMappingURL=memo.js.map","import * as tslib_1 from \"tslib\";\nimport { isElement, isError, isEvent, isInstanceOf, isPlainObject, isPrimitive, isSyntheticEvent } from './is';\nimport { Memo } from './memo';\nimport { getFunctionName, htmlTreeAsString } from './misc';\nimport { truncate } from './string';\n/**\n * Wrap a given object method with a higher-order function\n *\n * @param source An object that contains a method to be wrapped.\n * @param name A name of method to be wrapped.\n * @param replacement A function that should be used to wrap a given method.\n * @returns void\n */\nexport function fill(source, name, replacement) {\n if (!(name in source)) {\n return;\n }\n var original = source[name];\n var wrapped = replacement(original);\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n // tslint:disable-next-line:strict-type-predicates\n if (typeof wrapped === 'function') {\n try {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __sentry_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n catch (_Oo) {\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n }\n source[name] = wrapped;\n}\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nexport function urlEncode(object) {\n return Object.keys(object)\n .map(\n // tslint:disable-next-line:no-unsafe-any\n function (key) { return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]); })\n .join('&');\n}\n/**\n * Transforms any object into an object literal with all it's attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order to be usable by the serializer\n */\nfunction getWalkSource(value) {\n if (isError(value)) {\n var error = value;\n var err = {\n message: error.message,\n name: error.name,\n stack: error.stack,\n };\n for (var i in error) {\n if (Object.prototype.hasOwnProperty.call(error, i)) {\n err[i] = error[i];\n }\n }\n return err;\n }\n if (isEvent(value)) {\n var event_1 = value;\n var source = {};\n source.type = event_1.type;\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n source.target = isElement(event_1.target)\n ? htmlTreeAsString(event_1.target)\n : Object.prototype.toString.call(event_1.target);\n }\n catch (_oO) {\n source.target = '<unknown>';\n }\n try {\n source.currentTarget = isElement(event_1.currentTarget)\n ? htmlTreeAsString(event_1.currentTarget)\n : Object.prototype.toString.call(event_1.currentTarget);\n }\n catch (_oO) {\n source.currentTarget = '<unknown>';\n }\n // tslint:disable-next-line:strict-type-predicates\n if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n source.detail = event_1.detail;\n }\n for (var i in event_1) {\n if (Object.prototype.hasOwnProperty.call(event_1, i)) {\n source[i] = event_1;\n }\n }\n return source;\n }\n return value;\n}\n/** Calculates bytes size of input string */\nfunction utf8Length(value) {\n // tslint:disable-next-line:no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n/** Calculates bytes size of input object */\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n/** JSDoc */\nexport function normalizeToSize(object, \n// Default Node.js REPL depth\ndepth, \n// 100kB, as 200kB is max payload size, so half sounds reasonable\nmaxSize) {\n if (depth === void 0) { depth = 3; }\n if (maxSize === void 0) { maxSize = 100 * 1024; }\n var serialized = normalize(object, depth);\n if (jsonSize(serialized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n return serialized;\n}\n/** Transforms any input value into a string form, either primitive value or a type of the input */\nfunction serializeValue(value) {\n var type = Object.prototype.toString.call(value);\n // Node.js REPL notation\n if (typeof value === 'string') {\n return value;\n }\n if (type === '[object Object]') {\n return '[Object]';\n }\n if (type === '[object Array]') {\n return '[Array]';\n }\n var normalized = normalizeValue(value);\n return isPrimitive(normalized) ? normalized : type;\n}\n/**\n * normalizeValue()\n *\n * Takes unserializable input and make it serializable friendly\n *\n * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n * - serializes Error objects\n * - filter global objects\n */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction normalizeValue(value, key) {\n if (key === 'domain' && value && typeof value === 'object' && value._events) {\n return '[Domain]';\n }\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n if (typeof global !== 'undefined' && value === global) {\n return '[Global]';\n }\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n }\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n }\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n // tslint:disable-next-line:no-tautology-expression\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n if (value === void 0) {\n return '[undefined]';\n }\n if (typeof value === 'function') {\n return \"[Function: \" + getFunctionName(value) + \"]\";\n }\n return value;\n}\n/**\n * Walks an object to perform a normalization on it\n *\n * @param key of object that's walked in current iteration\n * @param value object to be walked\n * @param depth Optional number indicating how deep should walking be performed\n * @param memo Optional Memo class handling decycling\n */\nexport function walk(key, value, depth, memo) {\n if (depth === void 0) { depth = +Infinity; }\n if (memo === void 0) { memo = new Memo(); }\n // If we reach the maximum depth, serialize whatever has left\n if (depth === 0) {\n return serializeValue(value);\n }\n // If value implements `toJSON` method, call it and return early\n // tslint:disable:no-unsafe-any\n if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n return value.toJSON();\n }\n // tslint:enable:no-unsafe-any\n // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n var normalized = normalizeValue(value, key);\n if (isPrimitive(normalized)) {\n return normalized;\n }\n // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n var source = getWalkSource(value);\n // Create an accumulator that will act as a parent for all future itterations of that branch\n var acc = Array.isArray(value) ? [] : {};\n // If we already walked that branch, bail out, as it's circular reference\n if (memo.memoize(value)) {\n return '[Circular ~]';\n }\n // Walk all keys of the source\n for (var innerKey in source) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n continue;\n }\n // Recursively walk through all the child nodes\n acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n }\n // Once walked through all the branches, remove the parent from memo storage\n memo.unmemoize(value);\n // Return accumulated values\n return acc;\n}\n/**\n * normalize()\n *\n * - Creates a copy to prevent original input mutation\n * - Skip non-enumerablers\n * - Calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n * - Translates known global objects/Classes to a string representations\n * - Takes care of Error objects serialization\n * - Optionally limit depth of final output\n */\nexport function normalize(input, depth) {\n try {\n // tslint:disable-next-line:no-unsafe-any\n return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));\n }\n catch (_oO) {\n return '**non-serializable**';\n }\n}\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\nexport function extractExceptionKeysForMessage(exception, maxLength) {\n if (maxLength === void 0) { maxLength = 40; }\n // tslint:disable:strict-type-predicates\n var keys = Object.keys(getWalkSource(exception));\n keys.sort();\n if (!keys.length) {\n return '[object has no keys]';\n }\n if (keys[0].length >= maxLength) {\n return truncate(keys[0], maxLength);\n }\n for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n var serialized = keys.slice(0, includedKeys).join(', ');\n if (serialized.length > maxLength) {\n continue;\n }\n if (includedKeys === keys.length) {\n return serialized;\n }\n return truncate(serialized, maxLength);\n }\n return '';\n}\n/**\n * Given any object, return the new object with removed keys that value was `undefined`.\n * Works recursively on objects and arrays.\n */\nexport function dropUndefinedKeys(val) {\n var e_1, _a;\n if (isPlainObject(val)) {\n var obj = val;\n var rv = {};\n try {\n for (var _b = tslib_1.__values(Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n if (typeof obj[key] !== 'undefined') {\n rv[key] = dropUndefinedKeys(obj[key]);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return rv;\n }\n if (Array.isArray(val)) {\n return val.map(dropUndefinedKeys);\n }\n return val;\n}\n//# sourceMappingURL=object.js.map","'use strict';\nvar $ = require('../internals/export');\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\n$({ target: 'URL', proto: true, enumerable: true }, {\n toJSON: function toJSON() {\n return URL.prototype.toString.call(this);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar fails = require('../internals/fails');\nvar getBuiltIn = require('../internals/get-built-in');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\nvar redefine = require('../internals/redefine');\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromise && fails(function () {\n NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n\n// patch native Promise.prototype for native async functions\nif (!IS_PURE && typeof NativePromise == 'function' && !NativePromise.prototype['finally']) {\n redefine(NativePromise.prototype, 'finally', getBuiltIn('Promise').prototype['finally']);\n}\n","import { isThenable } from './is';\n/** SyncPromise internal states */\nvar States;\n(function (States) {\n /** Pending */\n States[\"PENDING\"] = \"PENDING\";\n /** Resolved / OK */\n States[\"RESOLVED\"] = \"RESOLVED\";\n /** Rejected / Error */\n States[\"REJECTED\"] = \"REJECTED\";\n})(States || (States = {}));\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nvar SyncPromise = /** @class */ (function () {\n function SyncPromise(executor) {\n var _this = this;\n this._state = States.PENDING;\n this._handlers = [];\n /** JSDoc */\n this._resolve = function (value) {\n _this._setResult(States.RESOLVED, value);\n };\n /** JSDoc */\n this._reject = function (reason) {\n _this._setResult(States.REJECTED, reason);\n };\n /** JSDoc */\n this._setResult = function (state, value) {\n if (_this._state !== States.PENDING) {\n return;\n }\n if (isThenable(value)) {\n value.then(_this._resolve, _this._reject);\n return;\n }\n _this._state = state;\n _this._value = value;\n _this._executeHandlers();\n };\n // TODO: FIXME\n /** JSDoc */\n this._attachHandler = function (handler) {\n _this._handlers = _this._handlers.concat(handler);\n _this._executeHandlers();\n };\n /** JSDoc */\n this._executeHandlers = function () {\n if (_this._state === States.PENDING) {\n return;\n }\n var cachedHandlers = _this._handlers.slice();\n _this._handlers = [];\n cachedHandlers.forEach(function (handler) {\n if (handler.done) {\n return;\n }\n if (_this._state === States.RESOLVED) {\n if (handler.onfulfilled) {\n handler.onfulfilled(_this._value);\n }\n }\n if (_this._state === States.REJECTED) {\n if (handler.onrejected) {\n handler.onrejected(_this._value);\n }\n }\n handler.done = true;\n });\n };\n try {\n executor(this._resolve, this._reject);\n }\n catch (e) {\n this._reject(e);\n }\n }\n /** JSDoc */\n SyncPromise.prototype.toString = function () {\n return '[object SyncPromise]';\n };\n /** JSDoc */\n SyncPromise.resolve = function (value) {\n return new SyncPromise(function (resolve) {\n resolve(value);\n });\n };\n /** JSDoc */\n SyncPromise.reject = function (reason) {\n return new SyncPromise(function (_, reject) {\n reject(reason);\n });\n };\n /** JSDoc */\n SyncPromise.all = function (collection) {\n return new SyncPromise(function (resolve, reject) {\n if (!Array.isArray(collection)) {\n reject(new TypeError(\"Promise.all requires an array as input.\"));\n return;\n }\n if (collection.length === 0) {\n resolve([]);\n return;\n }\n var counter = collection.length;\n var resolvedCollection = [];\n collection.forEach(function (item, index) {\n SyncPromise.resolve(item)\n .then(function (value) {\n resolvedCollection[index] = value;\n counter -= 1;\n if (counter !== 0) {\n return;\n }\n resolve(resolvedCollection);\n })\n .then(null, reject);\n });\n });\n };\n /** JSDoc */\n SyncPromise.prototype.then = function (onfulfilled, onrejected) {\n var _this = this;\n return new SyncPromise(function (resolve, reject) {\n _this._attachHandler({\n done: false,\n onfulfilled: function (result) {\n if (!onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result);\n return;\n }\n try {\n resolve(onfulfilled(result));\n return;\n }\n catch (e) {\n reject(e);\n return;\n }\n },\n onrejected: function (reason) {\n if (!onrejected) {\n reject(reason);\n return;\n }\n try {\n resolve(onrejected(reason));\n return;\n }\n catch (e) {\n reject(e);\n return;\n }\n },\n });\n });\n };\n /** JSDoc */\n SyncPromise.prototype.catch = function (onrejected) {\n return this.then(function (val) { return val; }, onrejected);\n };\n /** JSDoc */\n SyncPromise.prototype.finally = function (onfinally) {\n var _this = this;\n return new SyncPromise(function (resolve, reject) {\n var val;\n var isRejected;\n return _this.then(function (value) {\n isRejected = false;\n val = value;\n if (onfinally) {\n onfinally();\n }\n }, function (reason) {\n isRejected = true;\n val = reason;\n if (onfinally) {\n onfinally();\n }\n }).then(function () {\n if (isRejected) {\n reject(val);\n return;\n }\n resolve(val);\n });\n });\n };\n return SyncPromise;\n}());\nexport { SyncPromise };\n//# sourceMappingURL=syncpromise.js.map","import { SentryError } from './error';\nimport { SyncPromise } from './syncpromise';\n/** A simple queue that holds promises. */\nvar PromiseBuffer = /** @class */ (function () {\n function PromiseBuffer(_limit) {\n this._limit = _limit;\n /** Internal set of queued Promises */\n this._buffer = [];\n }\n /**\n * Says if the buffer is ready to take more requests\n */\n PromiseBuffer.prototype.isReady = function () {\n return this._limit === undefined || this.length() < this._limit;\n };\n /**\n * Add a promise to the queue.\n *\n * @param task Can be any PromiseLike<T>\n * @returns The original promise.\n */\n PromiseBuffer.prototype.add = function (task) {\n var _this = this;\n if (!this.isReady()) {\n return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n }\n if (this._buffer.indexOf(task) === -1) {\n this._buffer.push(task);\n }\n task\n .then(function () { return _this.remove(task); })\n .then(null, function () {\n return _this.remove(task).then(null, function () {\n // We have to add this catch here otherwise we have an unhandledPromiseRejection\n // because it's a new Promise chain.\n });\n });\n return task;\n };\n /**\n * Remove a promise to the queue.\n *\n * @param task Can be any PromiseLike<T>\n * @returns Removed promise.\n */\n PromiseBuffer.prototype.remove = function (task) {\n var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n return removedTask;\n };\n /**\n * This function returns the number of unresolved promises in the queue.\n */\n PromiseBuffer.prototype.length = function () {\n return this._buffer.length;\n };\n /**\n * This will drain the whole queue, returns true if queue is empty or drained.\n * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.\n *\n * @param timeout Number in ms to wait until it resolves with false.\n */\n PromiseBuffer.prototype.drain = function (timeout) {\n var _this = this;\n return new SyncPromise(function (resolve) {\n var capturedSetTimeout = setTimeout(function () {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n SyncPromise.all(_this._buffer)\n .then(function () {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n })\n .then(null, function () {\n resolve(true);\n });\n });\n };\n return PromiseBuffer;\n}());\nexport { PromiseBuffer };\n//# sourceMappingURL=promisebuffer.js.map","import { logger } from './logger';\nimport { getGlobalObject } from './misc';\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent() {\n try {\n // tslint:disable:no-unused-expression\n new ErrorEvent('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError() {\n try {\n // It really needs 1 argument, not 0.\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-ignore\n // tslint:disable:no-unused-expression\n new DOMError('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException() {\n try {\n // tslint:disable:no-unused-expression\n new DOMException('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch() {\n if (!('fetch' in getGlobalObject())) {\n return false;\n }\n try {\n // tslint:disable-next-line:no-unused-expression\n new Headers();\n // tslint:disable-next-line:no-unused-expression\n new Request('');\n // tslint:disable-next-line:no-unused-expression\n new Response();\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\nfunction isNativeFetch(func) {\n return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch() {\n if (!supportsFetch()) {\n return false;\n }\n var global = getGlobalObject();\n // Fast path to avoid DOM I/O\n // tslint:disable-next-line:no-unbound-method\n if (isNativeFetch(global.fetch)) {\n return true;\n }\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n var result = false;\n var doc = global.document;\n // tslint:disable-next-line:no-unbound-method deprecation\n if (doc && typeof doc.createElement === \"function\") {\n try {\n var sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n // tslint:disable-next-line:no-unbound-method\n result = isNativeFetch(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n }\n catch (err) {\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n return result;\n}\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver() {\n // tslint:disable-next-line: no-unsafe-any\n return 'ReportingObserver' in getGlobalObject();\n}\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy() {\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 if (!supportsFetch()) {\n return false;\n }\n try {\n // tslint:disable:no-unused-expression\n new Request('_', {\n referrerPolicy: 'origin',\n });\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory() {\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 global = getGlobalObject();\n var chrome = global.chrome;\n // tslint:disable-next-line:no-unsafe-any\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n return !isChromePackagedApp && hasHistoryApi;\n}\n//# sourceMappingURL=supports.js.map","/* tslint:disable:only-arrow-functions no-unsafe-any */\nimport * as tslib_1 from \"tslib\";\nimport { isInstanceOf, isString } from './is';\nimport { logger } from './logger';\nimport { getFunctionName, getGlobalObject } from './misc';\nimport { fill } from './object';\nimport { supportsHistory, supportsNativeFetch } from './supports';\nvar global = getGlobalObject();\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n * - Console API\n * - Fetch API\n * - XHR API\n * - History API\n * - DOM API (click/typing)\n * - Error API\n * - UnhandledRejection API\n */\nvar handlers = {};\nvar instrumented = {};\n/** Instruments given API */\nfunction instrument(type) {\n if (instrumented[type]) {\n return;\n }\n instrumented[type] = true;\n switch (type) {\n case 'console':\n instrumentConsole();\n break;\n case 'dom':\n instrumentDOM();\n break;\n case 'xhr':\n instrumentXHR();\n break;\n case 'fetch':\n instrumentFetch();\n break;\n case 'history':\n instrumentHistory();\n break;\n case 'error':\n instrumentError();\n break;\n case 'unhandledrejection':\n instrumentUnhandledRejection();\n break;\n default:\n logger.warn('unknown instrumentation type:', type);\n }\n}\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(handler) {\n // tslint:disable-next-line:strict-type-predicates\n if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {\n return;\n }\n handlers[handler.type] = handlers[handler.type] || [];\n handlers[handler.type].push(handler.callback);\n instrument(handler.type);\n}\n/** JSDoc */\nfunction triggerHandlers(type, data) {\n var e_1, _a;\n if (!type || !handlers[type]) {\n return;\n }\n try {\n for (var _b = tslib_1.__values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n var handler = _c.value;\n try {\n handler(data);\n }\n catch (e) {\n logger.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + getFunctionName(handler) + \"\\nError: \" + e);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n}\n/** JSDoc */\nfunction instrumentConsole() {\n if (!('console' in global)) {\n return;\n }\n ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {\n if (!(level in global.console)) {\n return;\n }\n fill(global.console, level, function (originalConsoleLevel) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n triggerHandlers('console', { args: args, level: level });\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n }\n };\n });\n });\n}\n/** JSDoc */\nfunction instrumentFetch() {\n if (!supportsNativeFetch()) {\n return;\n }\n fill(global, 'fetch', function (originalFetch) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var commonHandlerData = {\n args: args,\n fetchData: {\n method: getFetchMethod(args),\n url: getFetchUrl(args),\n },\n startTimestamp: Date.now(),\n };\n triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData));\n return originalFetch.apply(global, args).then(function (response) {\n triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now(), response: response }));\n return response;\n }, function (error) {\n triggerHandlers('fetch', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now(), error: error }));\n throw error;\n });\n };\n });\n}\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs) {\n if (fetchArgs === void 0) { fetchArgs = []; }\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n return String(fetchArgs[0].method).toUpperCase();\n }\n if (fetchArgs[1] && fetchArgs[1].method) {\n return String(fetchArgs[1].method).toUpperCase();\n }\n return 'GET';\n}\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs) {\n if (fetchArgs === void 0) { fetchArgs = []; }\n if (typeof fetchArgs[0] === 'string') {\n return fetchArgs[0];\n }\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n return fetchArgs[0].url;\n }\n return String(fetchArgs[0]);\n}\n/** JSDoc */\nfunction instrumentXHR() {\n if (!('XMLHttpRequest' in global)) {\n return;\n }\n var xhrproto = XMLHttpRequest.prototype;\n fill(xhrproto, 'open', function (originalOpen) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var url = args[1];\n this.__sentry_xhr__ = {\n method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n url: args[1],\n };\n // if Sentry key appears in URL, don't capture it as a request\n if (isString(url) && this.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {\n this.__sentry_own_request__ = true;\n }\n return originalOpen.apply(this, args);\n };\n });\n fill(xhrproto, 'send', function (originalSend) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var xhr = this; // tslint:disable-line:no-this-assignment\n var commonHandlerData = {\n args: args,\n startTimestamp: Date.now(),\n xhr: xhr,\n };\n triggerHandlers('xhr', tslib_1.__assign({}, commonHandlerData));\n xhr.addEventListener('readystatechange', function () {\n if (xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n if (xhr.__sentry_xhr__) {\n xhr.__sentry_xhr__.status_code = xhr.status;\n }\n }\n catch (e) {\n /* do nothing */\n }\n triggerHandlers('xhr', tslib_1.__assign({}, commonHandlerData, { endTimestamp: Date.now() }));\n }\n });\n return originalSend.apply(this, args);\n };\n });\n}\nvar lastHref;\n/** JSDoc */\nfunction instrumentHistory() {\n if (!supportsHistory()) {\n return;\n }\n var oldOnPopState = global.onpopstate;\n global.onpopstate = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var to = global.location.href;\n // keep track of the current URL state, as we always receive only the updated state\n var from = lastHref;\n lastHref = to;\n triggerHandlers('history', {\n from: from,\n to: to,\n });\n if (oldOnPopState) {\n return oldOnPopState.apply(this, args);\n }\n };\n /** @hidden */\n function historyReplacementFunction(originalHistoryFunction) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var url = args.length > 2 ? args[2] : undefined;\n if (url) {\n // coerce to string (this is what pushState does)\n var from = lastHref;\n var to = String(url);\n // keep track of the current URL state, as we always receive only the updated state\n lastHref = to;\n triggerHandlers('history', {\n from: from,\n to: to,\n });\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n fill(global.history, 'pushState', historyReplacementFunction);\n fill(global.history, 'replaceState', historyReplacementFunction);\n}\n/** JSDoc */\nfunction instrumentDOM() {\n if (!('document' in global)) {\n return;\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 global.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);\n global.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false);\n // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.\n ['EventTarget', 'Node'].forEach(function (target) {\n var proto = global[target] && global[target].prototype;\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n fill(proto, 'addEventListener', function (original) {\n return function (eventName, fn, options) {\n if (fn && fn.handleEvent) {\n if (eventName === 'click') {\n fill(fn, 'handleEvent', function (innerOriginal) {\n return function (event) {\n domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);\n return innerOriginal.call(this, event);\n };\n });\n }\n if (eventName === 'keypress') {\n fill(fn, 'handleEvent', function (innerOriginal) {\n return function (event) {\n keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);\n return innerOriginal.call(this, event);\n };\n });\n }\n }\n else {\n if (eventName === 'click') {\n domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);\n }\n if (eventName === 'keypress') {\n keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);\n }\n }\n return original.call(this, eventName, fn, options);\n };\n });\n fill(proto, 'removeEventListener', function (original) {\n return function (eventName, fn, options) {\n var callback = fn;\n try {\n callback = callback && (callback.__sentry_wrapped__ || callback);\n }\n catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return original.call(this, eventName, callback, options);\n };\n });\n });\n}\nvar debounceDuration = 1000;\nvar debounceTimer = 0;\nvar keypressTimeout;\nvar lastCapturedEvent;\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param name the event name (e.g. \"click\")\n * @param handler function that will be triggered\n * @param debounce decides whether it should wait till another event loop\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction domEventHandler(name, handler, debounce) {\n if (debounce === void 0) { debounce = false; }\n return function (event) {\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 keypressTimeout = undefined;\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 (!event || lastCapturedEvent === event) {\n return;\n }\n lastCapturedEvent = event;\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n if (debounce) {\n debounceTimer = setTimeout(function () {\n handler({ event: event, name: name });\n });\n }\n else {\n handler({ event: event, name: name });\n }\n };\n}\n/**\n * Wraps addEventListener to capture keypress UI events\n * @param handler function that will be triggered\n * @returns wrapped keypress events handler\n * @hidden\n */\nfunction keypressEventHandler(handler) {\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 (event) {\n var target;\n try {\n target = event.target;\n }\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 // 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 (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)) {\n return;\n }\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n if (!keypressTimeout) {\n domEventHandler('input', handler)(event);\n }\n clearTimeout(keypressTimeout);\n keypressTimeout = setTimeout(function () {\n keypressTimeout = undefined;\n }, debounceDuration);\n };\n}\nvar _oldOnErrorHandler = null;\n/** JSDoc */\nfunction instrumentError() {\n _oldOnErrorHandler = global.onerror;\n global.onerror = function (msg, url, line, column, error) {\n triggerHandlers('error', {\n column: column,\n error: error,\n line: line,\n msg: msg,\n url: url,\n });\n if (_oldOnErrorHandler) {\n return _oldOnErrorHandler.apply(this, arguments);\n }\n return false;\n };\n}\nvar _oldOnUnhandledRejectionHandler = null;\n/** JSDoc */\nfunction instrumentUnhandledRejection() {\n _oldOnUnhandledRejectionHandler = global.onunhandledrejection;\n global.onunhandledrejection = function (e) {\n triggerHandlers('unhandledrejection', e);\n if (_oldOnUnhandledRejectionHandler) {\n return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n return true;\n };\n}\n//# sourceMappingURL=instrument.js.map","import * as tslib_1 from \"tslib\";\nimport { SentryError } from './error';\n/** Regular expression used to parse a Dsn. */\nvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w\\.-]+)(?::(\\d+))?\\/(.+)/;\n/** Error message */\nvar ERROR_MESSAGE = 'Invalid Dsn';\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nvar Dsn = /** @class */ (function () {\n /** Creates a new Dsn component */\n function Dsn(from) {\n if (typeof from === 'string') {\n this._fromString(from);\n }\n else {\n this._fromComponents(from);\n }\n this._validate();\n }\n /**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\n Dsn.prototype.toString = function (withPassword) {\n if (withPassword === void 0) { withPassword = false; }\n // tslint:disable-next-line:no-this-assignment\n var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;\n return (protocol + \"://\" + user + (withPassword && pass ? \":\" + pass : '') +\n (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId));\n };\n /** Parses a string into this Dsn. */\n Dsn.prototype._fromString = function (str) {\n var match = DSN_REGEX.exec(str);\n if (!match) {\n throw new SentryError(ERROR_MESSAGE);\n }\n var _a = tslib_1.__read(match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];\n var path = '';\n var projectId = lastPath;\n var split = projectId.split('/');\n if (split.length > 1) {\n path = split.slice(0, -1).join('/');\n projectId = split.pop();\n }\n this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });\n };\n /** Maps Dsn components into this instance. */\n Dsn.prototype._fromComponents = function (components) {\n this.protocol = components.protocol;\n this.user = components.user;\n this.pass = components.pass || '';\n this.host = components.host;\n this.port = components.port || '';\n this.path = components.path || '';\n this.projectId = components.projectId;\n };\n /** Validates this Dsn and throws on error. */\n Dsn.prototype._validate = function () {\n var _this = this;\n ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {\n if (!_this[component]) {\n throw new SentryError(ERROR_MESSAGE);\n }\n });\n if (this.protocol !== 'http' && this.protocol !== 'https') {\n throw new SentryError(ERROR_MESSAGE);\n }\n if (this.port && isNaN(parseInt(this.port, 10))) {\n throw new SentryError(ERROR_MESSAGE);\n }\n };\n return Dsn;\n}());\nexport { Dsn };\n//# sourceMappingURL=dsn.js.map","import * as tslib_1 from \"tslib\";\nimport { getGlobalObject, isThenable, SyncPromise, timestampWithMs } from '@sentry/utils';\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nvar Scope = /** @class */ (function () {\n function Scope() {\n /** Flag if notifiying is happening. */\n this._notifyingListeners = false;\n /** Callback for client to receive scope changes. */\n this._scopeListeners = [];\n /** Callback list that will be called after {@link applyToEvent}. */\n this._eventProcessors = [];\n /** Array of breadcrumbs. */\n this._breadcrumbs = [];\n /** User */\n this._user = {};\n /** Tags */\n this._tags = {};\n /** Extra */\n this._extra = {};\n /** Contexts */\n this._context = {};\n }\n /**\n * Add internal on change listener. Used for sub SDKs that need to store the scope.\n * @hidden\n */\n Scope.prototype.addScopeListener = function (callback) {\n this._scopeListeners.push(callback);\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.addEventProcessor = function (callback) {\n this._eventProcessors.push(callback);\n return this;\n };\n /**\n * This will be called on every set call.\n */\n Scope.prototype._notifyScopeListeners = function () {\n var _this = this;\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n setTimeout(function () {\n _this._scopeListeners.forEach(function (callback) {\n callback(_this);\n });\n _this._notifyingListeners = false;\n });\n }\n };\n /**\n * This will be called after {@link applyToEvent} is finished.\n */\n Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {\n var _this = this;\n if (index === void 0) { index = 0; }\n return new SyncPromise(function (resolve, reject) {\n var processor = processors[index];\n // tslint:disable-next-line:strict-type-predicates\n if (event === null || typeof processor !== 'function') {\n resolve(event);\n }\n else {\n var result = processor(tslib_1.__assign({}, event), hint);\n if (isThenable(result)) {\n result\n .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })\n .then(null, reject);\n }\n else {\n _this._notifyEventProcessors(processors, result, hint, index + 1)\n .then(resolve)\n .then(null, reject);\n }\n }\n });\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setUser = function (user) {\n this._user = user || {};\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setTags = function (tags) {\n this._tags = tslib_1.__assign({}, this._tags, tags);\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setTag = function (key, value) {\n var _a;\n this._tags = tslib_1.__assign({}, this._tags, (_a = {}, _a[key] = value, _a));\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setExtras = function (extras) {\n this._extra = tslib_1.__assign({}, this._extra, extras);\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setExtra = function (key, extra) {\n var _a;\n this._extra = tslib_1.__assign({}, this._extra, (_a = {}, _a[key] = extra, _a));\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setFingerprint = function (fingerprint) {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setLevel = function (level) {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setTransaction = function (transaction) {\n this._transaction = transaction;\n if (this._span) {\n this._span.transaction = transaction;\n }\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setContext = function (key, context) {\n var _a;\n this._context = tslib_1.__assign({}, this._context, (_a = {}, _a[key] = context, _a));\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setSpan = function (span) {\n this._span = span;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * Internal getter for Span, used in Hub.\n * @hidden\n */\n Scope.prototype.getSpan = function () {\n return this._span;\n };\n /**\n * Inherit values from the parent scope.\n * @param scope to clone.\n */\n Scope.clone = function (scope) {\n var newScope = new Scope();\n if (scope) {\n newScope._breadcrumbs = tslib_1.__spread(scope._breadcrumbs);\n newScope._tags = tslib_1.__assign({}, scope._tags);\n newScope._extra = tslib_1.__assign({}, scope._extra);\n newScope._context = tslib_1.__assign({}, scope._context);\n newScope._user = scope._user;\n newScope._level = scope._level;\n newScope._span = scope._span;\n newScope._transaction = scope._transaction;\n newScope._fingerprint = scope._fingerprint;\n newScope._eventProcessors = tslib_1.__spread(scope._eventProcessors);\n }\n return newScope;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.clear = function () {\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._context = {};\n this._level = undefined;\n this._transaction = undefined;\n this._fingerprint = undefined;\n this._span = undefined;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {\n var mergedBreadcrumb = tslib_1.__assign({ timestamp: timestampWithMs() }, breadcrumb);\n this._breadcrumbs =\n maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0\n ? tslib_1.__spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs)\n : tslib_1.__spread(this._breadcrumbs, [mergedBreadcrumb]);\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.clearBreadcrumbs = function () {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n };\n /**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\n Scope.prototype._applyFingerprint = function (event) {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint\n ? Array.isArray(event.fingerprint)\n ? event.fingerprint\n : [event.fingerprint]\n : [];\n // If we have something on the scope, then merge it with event\n if (this._fingerprint) {\n event.fingerprint = event.fingerprint.concat(this._fingerprint);\n }\n // If we have no data at all, remove empty array default\n if (event.fingerprint && !event.fingerprint.length) {\n delete event.fingerprint;\n }\n };\n /**\n * Applies the current context and fingerprint to the event.\n * Note that breadcrumbs will be added by the client.\n * Also if the event has already breadcrumbs on it, we do not merge them.\n * @param event Event\n * @param hint May contain additional informartion about the original exception.\n * @hidden\n */\n Scope.prototype.applyToEvent = function (event, hint) {\n if (this._extra && Object.keys(this._extra).length) {\n event.extra = tslib_1.__assign({}, this._extra, event.extra);\n }\n if (this._tags && Object.keys(this._tags).length) {\n event.tags = tslib_1.__assign({}, this._tags, event.tags);\n }\n if (this._user && Object.keys(this._user).length) {\n event.user = tslib_1.__assign({}, this._user, event.user);\n }\n if (this._context && Object.keys(this._context).length) {\n event.contexts = tslib_1.__assign({}, this._context, event.contexts);\n }\n if (this._level) {\n event.level = this._level;\n }\n if (this._transaction) {\n event.transaction = this._transaction;\n }\n if (this._span) {\n event.contexts = tslib_1.__assign({ trace: this._span.getTraceContext() }, event.contexts);\n }\n this._applyFingerprint(event);\n event.breadcrumbs = tslib_1.__spread((event.breadcrumbs || []), this._breadcrumbs);\n event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n return this._notifyEventProcessors(tslib_1.__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint);\n };\n return Scope;\n}());\nexport { Scope };\n/**\n * Retruns the global event processors.\n */\nfunction getGlobalEventProcessors() {\n var global = getGlobalObject();\n global.__SENTRY__ = global.__SENTRY__ || {};\n global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n return global.__SENTRY__.globalEventProcessors;\n}\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nexport function addGlobalEventProcessor(callback) {\n getGlobalEventProcessors().push(callback);\n}\n//# sourceMappingURL=scope.js.map","import * as tslib_1 from \"tslib\";\nimport { consoleSandbox, getGlobalObject, isNodeEnv, logger, timestampWithMs, uuid4 } from '@sentry/utils';\nimport { Scope } from './scope';\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be incresed when the global interface\n * changes a and new methods are introduced.\n *\n * @hidden\n */\nexport var API_VERSION = 3;\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nvar DEFAULT_BREADCRUMBS = 100;\n/**\n * Absolute maximum number of breadcrumbs added to an event. The\n * `maxBreadcrumbs` option cannot be higher than this value.\n */\nvar MAX_BREADCRUMBS = 100;\n/**\n * @inheritDoc\n */\nvar Hub = /** @class */ (function () {\n /**\n * Creates a new instance of the hub, will push one {@link Layer} into the\n * internal stack on creation.\n *\n * @param client bound to the hub.\n * @param scope bound to the hub.\n * @param version number, higher number means higher priority.\n */\n function Hub(client, scope, _version) {\n if (scope === void 0) { scope = new Scope(); }\n if (_version === void 0) { _version = API_VERSION; }\n this._version = _version;\n /** Is a {@link Layer}[] containing the client and scope */\n this._stack = [];\n this._stack.push({ client: client, scope: scope });\n }\n /**\n * Internal helper function to call a method on the top client if it exists.\n *\n * @param method The method to call on the client.\n * @param args Arguments to pass to the client function.\n */\n Hub.prototype._invokeClient = function (method) {\n var _a;\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var top = this.getStackTop();\n if (top && top.client && top.client[method]) {\n (_a = top.client)[method].apply(_a, tslib_1.__spread(args, [top.scope]));\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.isOlderThan = function (version) {\n return this._version < version;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.bindClient = function (client) {\n var top = this.getStackTop();\n top.client = client;\n if (client && client.setupIntegrations) {\n client.setupIntegrations();\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.pushScope = function () {\n // We want to clone the content of prev scope\n var stack = this.getStack();\n var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;\n var scope = Scope.clone(parentScope);\n this.getStack().push({\n client: this.getClient(),\n scope: scope,\n });\n return scope;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.popScope = function () {\n return this.getStack().pop() !== undefined;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.withScope = function (callback) {\n var scope = this.pushScope();\n try {\n callback(scope);\n }\n finally {\n this.popScope();\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.getClient = function () {\n return this.getStackTop().client;\n };\n /** Returns the scope of the top stack. */\n Hub.prototype.getScope = function () {\n return this.getStackTop().scope;\n };\n /** Returns the scope stack for domains or the process. */\n Hub.prototype.getStack = function () {\n return this._stack;\n };\n /** Returns the topmost scope layer in the order domain > local > process. */\n Hub.prototype.getStackTop = function () {\n return this._stack[this._stack.length - 1];\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.captureException = function (exception, hint) {\n var eventId = (this._lastEventId = uuid4());\n var finalHint = hint;\n // If there's no explicit hint provided, mimick the same thing that would happen\n // in the minimal itself to create a consistent behavior.\n // We don't do this in the client, as it's the lowest level API, and doing this,\n // would prevent user from having full control over direct calls.\n if (!hint) {\n var syntheticException = void 0;\n try {\n throw new Error('Sentry syntheticException');\n }\n catch (exception) {\n syntheticException = exception;\n }\n finalHint = {\n originalException: exception,\n syntheticException: syntheticException,\n };\n }\n this._invokeClient('captureException', exception, tslib_1.__assign({}, finalHint, { event_id: eventId }));\n return eventId;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.captureMessage = function (message, level, hint) {\n var eventId = (this._lastEventId = uuid4());\n var finalHint = hint;\n // If there's no explicit hint provided, mimick the same thing that would happen\n // in the minimal itself to create a consistent behavior.\n // We don't do this in the client, as it's the lowest level API, and doing this,\n // would prevent user from having full control over direct calls.\n if (!hint) {\n var syntheticException = void 0;\n try {\n throw new Error(message);\n }\n catch (exception) {\n syntheticException = exception;\n }\n finalHint = {\n originalException: message,\n syntheticException: syntheticException,\n };\n }\n this._invokeClient('captureMessage', message, level, tslib_1.__assign({}, finalHint, { event_id: eventId }));\n return eventId;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.captureEvent = function (event, hint) {\n var eventId = (this._lastEventId = uuid4());\n this._invokeClient('captureEvent', event, tslib_1.__assign({}, hint, { event_id: eventId }));\n return eventId;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.lastEventId = function () {\n return this._lastEventId;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {\n var top = this.getStackTop();\n if (!top.scope || !top.client) {\n return;\n }\n var _a = (top.client.getOptions && top.client.getOptions()) || {}, _b = _a.beforeBreadcrumb, beforeBreadcrumb = _b === void 0 ? null : _b, _c = _a.maxBreadcrumbs, maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;\n if (maxBreadcrumbs <= 0) {\n return;\n }\n var timestamp = timestampWithMs();\n var mergedBreadcrumb = tslib_1.__assign({ timestamp: timestamp }, breadcrumb);\n var finalBreadcrumb = beforeBreadcrumb\n ? consoleSandbox(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })\n : mergedBreadcrumb;\n if (finalBreadcrumb === null) {\n return;\n }\n top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setUser = function (user) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setUser(user);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setTags = function (tags) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setTags(tags);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setExtras = function (extras) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setExtras(extras);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setTag = function (key, value) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setTag(key, value);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setExtra = function (key, extra) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setExtra(key, extra);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setContext = function (name, context) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setContext(name, context);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.configureScope = function (callback) {\n var top = this.getStackTop();\n if (top.scope && top.client) {\n callback(top.scope);\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.run = function (callback) {\n var oldHub = makeMain(this);\n try {\n callback(this);\n }\n finally {\n makeMain(oldHub);\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.getIntegration = function (integration) {\n var client = this.getClient();\n if (!client) {\n return null;\n }\n try {\n return client.getIntegration(integration);\n }\n catch (_oO) {\n logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Hub\");\n return null;\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.startSpan = function (spanOrSpanContext, forceNoChild) {\n if (forceNoChild === void 0) { forceNoChild = false; }\n return this._callExtensionMethod('startSpan', spanOrSpanContext, forceNoChild);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.traceHeaders = function () {\n return this._callExtensionMethod('traceHeaders');\n };\n /**\n * Calls global extension method and binding current instance to the function call\n */\n // @ts-ignore\n Hub.prototype._callExtensionMethod = function (method) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var carrier = getMainCarrier();\n var sentry = carrier.__SENTRY__;\n // tslint:disable-next-line: strict-type-predicates\n if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n return sentry.extensions[method].apply(this, args);\n }\n logger.warn(\"Extension method \" + method + \" couldn't be found, doing nothing.\");\n };\n return Hub;\n}());\nexport { Hub };\n/** Returns the global shim registry. */\nexport function getMainCarrier() {\n var carrier = getGlobalObject();\n carrier.__SENTRY__ = carrier.__SENTRY__ || {\n extensions: {},\n hub: undefined,\n };\n return carrier;\n}\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\nexport function makeMain(hub) {\n var registry = getMainCarrier();\n var oldHub = getHubFromCarrier(registry);\n setHubOnCarrier(registry, hub);\n return oldHub;\n}\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\nexport function getCurrentHub() {\n // Get main carrier (global for every environment)\n var registry = getMainCarrier();\n // If there's no hub, or its an old API, assign a new one\n if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n setHubOnCarrier(registry, new Hub());\n }\n // Prefer domains over global if they are there (applicable only to Node environment)\n if (isNodeEnv()) {\n return getHubFromActiveDomain(registry);\n }\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n}\n/**\n * Try to read the hub from an active domain, fallback to the registry if one doesnt exist\n * @returns discovered hub\n */\nfunction getHubFromActiveDomain(registry) {\n try {\n var property = 'domain';\n var carrier = getMainCarrier();\n var sentry = carrier.__SENTRY__;\n // tslint:disable-next-line: strict-type-predicates\n if (!sentry || !sentry.extensions || !sentry.extensions[property]) {\n return getHubFromCarrier(registry);\n }\n var domain = sentry.extensions[property];\n var activeDomain = domain.active;\n // If there no active domain, just return global hub\n if (!activeDomain) {\n return getHubFromCarrier(registry);\n }\n // If there's no hub on current domain, or its an old API, assign a new one\n if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n var registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n }\n // Return hub that lives on a domain\n return getHubFromCarrier(activeDomain);\n }\n catch (_Oo) {\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n }\n}\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier) {\n if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n return true;\n }\n return false;\n}\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\nexport function getHubFromCarrier(carrier) {\n if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n return carrier.__SENTRY__.hub;\n }\n carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n carrier.__SENTRY__.hub = new Hub();\n return carrier.__SENTRY__.hub;\n}\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n */\nexport function setHubOnCarrier(carrier, hub) {\n if (!carrier) {\n return false;\n }\n carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n carrier.__SENTRY__.hub = hub;\n return true;\n}\n//# sourceMappingURL=hub.js.map","import * as tslib_1 from \"tslib\";\nimport { getCurrentHub } from '@sentry/hub';\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\nfunction callOnHub(method) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var hub = getCurrentHub();\n if (hub && hub[method]) {\n // tslint:disable-next-line:no-unsafe-any\n return hub[method].apply(hub, tslib_1.__spread(args));\n }\n throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n}\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\nexport function captureException(exception) {\n var syntheticException;\n try {\n throw new Error('Sentry syntheticException');\n }\n catch (exception) {\n syntheticException = exception;\n }\n return callOnHub('captureException', exception, {\n originalException: exception,\n syntheticException: syntheticException,\n });\n}\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param level Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(message, level) {\n var syntheticException;\n try {\n throw new Error(message);\n }\n catch (exception) {\n syntheticException = exception;\n }\n return callOnHub('captureMessage', message, level, {\n originalException: message,\n syntheticException: syntheticException,\n });\n}\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event) {\n return callOnHub('captureEvent', event);\n}\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback) {\n callOnHub('configureScope', callback);\n}\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb) {\n callOnHub('addBreadcrumb', breadcrumb);\n}\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normailzed.\n */\nexport function setContext(name, context) {\n callOnHub('setContext', name, context);\n}\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras) {\n callOnHub('setExtras', extras);\n}\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags) {\n callOnHub('setTags', tags);\n}\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normailzed.\n */\nexport function setExtra(key, extra) {\n callOnHub('setExtra', key, extra);\n}\n/**\n * Set key:value that will be sent as tags data with the event.\n * @param key String key of tag\n * @param value String value of tag\n */\nexport function setTag(key, value) {\n callOnHub('setTag', key, value);\n}\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user) {\n callOnHub('setUser', user);\n}\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n * pushScope();\n * callback();\n * popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback) {\n callOnHub('withScope', callback);\n}\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n * @hidden\n */\nexport function _callOnClient(method) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n callOnHub.apply(void 0, tslib_1.__spread(['_invokeClient', method], args));\n}\n//# sourceMappingURL=index.js.map","import { Dsn, urlEncode } from '@sentry/utils';\nvar SENTRY_API_VERSION = '7';\n/** Helper class to provide urls to different Sentry endpoints. */\nvar API = /** @class */ (function () {\n /** Create a new instance of API */\n function API(dsn) {\n this.dsn = dsn;\n this._dsnObject = new Dsn(dsn);\n }\n /** Returns the Dsn object. */\n API.prototype.getDsn = function () {\n return this._dsnObject;\n };\n /** Returns a string with auth headers in the url to the store endpoint. */\n API.prototype.getStoreEndpoint = function () {\n return \"\" + this._getBaseUrl() + this.getStoreEndpointPath();\n };\n /** Returns the store endpoint with auth added in url encoded. */\n API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n var dsn = this._dsnObject;\n var auth = {\n sentry_key: dsn.user,\n sentry_version: SENTRY_API_VERSION,\n };\n // Auth is intentionally sent as part of query string (NOT as custom HTTP header)\n // to avoid preflight CORS requests\n return this.getStoreEndpoint() + \"?\" + urlEncode(auth);\n };\n /** Returns the base path of the url including the port. */\n API.prototype._getBaseUrl = function () {\n var dsn = this._dsnObject;\n var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n var port = dsn.port ? \":\" + dsn.port : '';\n return protocol + \"//\" + dsn.host + port;\n };\n /** Returns only the path component for the store endpoint. */\n API.prototype.getStoreEndpointPath = function () {\n var dsn = this._dsnObject;\n return (dsn.path ? \"/\" + dsn.path : '') + \"/api/\" + dsn.projectId + \"/store/\";\n };\n /** Returns an object that can be used in request headers. */\n API.prototype.getRequestHeaders = function (clientName, clientVersion) {\n var dsn = this._dsnObject;\n var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n header.push(\"sentry_key=\" + dsn.user);\n if (dsn.pass) {\n header.push(\"sentry_secret=\" + dsn.pass);\n }\n return {\n 'Content-Type': 'application/json',\n 'X-Sentry-Auth': header.join(', '),\n };\n };\n /** Returns the url to the report dialog endpoint. */\n API.prototype.getReportDialogEndpoint = function (dialogOptions) {\n if (dialogOptions === void 0) { dialogOptions = {}; }\n var dsn = this._dsnObject;\n var endpoint = \"\" + this._getBaseUrl() + (dsn.path ? \"/\" + dsn.path : '') + \"/api/embed/error-page/\";\n var encodedOptions = [];\n encodedOptions.push(\"dsn=\" + dsn.toString());\n for (var key in dialogOptions) {\n if (key === 'user') {\n if (!dialogOptions.user) {\n continue;\n }\n if (dialogOptions.user.name) {\n encodedOptions.push(\"name=\" + encodeURIComponent(dialogOptions.user.name));\n }\n if (dialogOptions.user.email) {\n encodedOptions.push(\"email=\" + encodeURIComponent(dialogOptions.user.email));\n }\n }\n else {\n encodedOptions.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]));\n }\n }\n if (encodedOptions.length) {\n return endpoint + \"?\" + encodedOptions.join('&');\n }\n return endpoint;\n };\n return API;\n}());\nexport { API };\n//# sourceMappingURL=api.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\nexport var installedIntegrations = [];\n/** Gets integration to install */\nexport function getIntegrationsToSetup(options) {\n var defaultIntegrations = (options.defaultIntegrations && tslib_1.__spread(options.defaultIntegrations)) || [];\n var userIntegrations = options.integrations;\n var integrations = [];\n if (Array.isArray(userIntegrations)) {\n var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; });\n var pickedIntegrationsNames_1 = [];\n // Leave only unique default integrations, that were not overridden with provided user integrations\n defaultIntegrations.forEach(function (defaultIntegration) {\n if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 &&\n pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {\n integrations.push(defaultIntegration);\n pickedIntegrationsNames_1.push(defaultIntegration.name);\n }\n });\n // Don't add same user integration twice\n userIntegrations.forEach(function (userIntegration) {\n if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {\n integrations.push(userIntegration);\n pickedIntegrationsNames_1.push(userIntegration.name);\n }\n });\n }\n else if (typeof userIntegrations === 'function') {\n integrations = userIntegrations(defaultIntegrations);\n integrations = Array.isArray(integrations) ? integrations : [integrations];\n }\n else {\n integrations = tslib_1.__spread(defaultIntegrations);\n }\n // Make sure that if present, `Debug` integration will always run last\n var integrationsNames = integrations.map(function (i) { return i.name; });\n var alwaysLastToRun = 'Debug';\n if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n integrations.push.apply(integrations, tslib_1.__spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n }\n return integrations;\n}\n/** Setup given integration */\nexport function setupIntegration(integration) {\n if (installedIntegrations.indexOf(integration.name) !== -1) {\n return;\n }\n integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n installedIntegrations.push(integration.name);\n logger.log(\"Integration installed: \" + integration.name);\n}\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(options) {\n var integrations = {};\n getIntegrationsToSetup(options).forEach(function (integration) {\n integrations[integration.name] = integration;\n setupIntegration(integration);\n });\n return integrations;\n}\n//# sourceMappingURL=integration.js.map","import * as tslib_1 from \"tslib\";\nimport { Dsn, isPrimitive, isThenable, logger, normalize, SyncPromise, truncate, uuid4 } from '@sentry/utils';\nimport { setupIntegrations } from './integration';\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient.prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {\n * public constructor(options: NodeOptions) {\n * super(NodeBackend, options);\n * }\n *\n * // ...\n * }\n */\nvar BaseClient = /** @class */ (function () {\n /**\n * Initializes this client instance.\n *\n * @param backendClass A constructor function to create the backend.\n * @param options Options for the client.\n */\n function BaseClient(backendClass, options) {\n /** Array of used integrations. */\n this._integrations = {};\n /** Is the client still processing a call? */\n this._processing = false;\n this._backend = new backendClass(options);\n this._options = options;\n if (options.dsn) {\n this._dsn = new Dsn(options.dsn);\n }\n }\n /**\n * @inheritDoc\n */\n BaseClient.prototype.captureException = function (exception, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n this._getBackend()\n .eventFromException(exception, hint)\n .then(function (event) { return _this._processEvent(event, hint, scope); })\n .then(function (finalEvent) {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n _this._processing = false;\n })\n .then(null, function (reason) {\n logger.error(reason);\n _this._processing = false;\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n var promisedEvent = isPrimitive(message)\n ? this._getBackend().eventFromMessage(\"\" + message, level, hint)\n : this._getBackend().eventFromException(message, hint);\n promisedEvent\n .then(function (event) { return _this._processEvent(event, hint, scope); })\n .then(function (finalEvent) {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n _this._processing = false;\n })\n .then(null, function (reason) {\n logger.error(reason);\n _this._processing = false;\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.captureEvent = function (event, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n this._processEvent(event, hint, scope)\n .then(function (finalEvent) {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n _this._processing = false;\n })\n .then(null, function (reason) {\n logger.error(reason);\n _this._processing = false;\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getDsn = function () {\n return this._dsn;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getOptions = function () {\n return this._options;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.flush = function (timeout) {\n var _this = this;\n return this._isClientProcessing(timeout).then(function (status) {\n clearInterval(status.interval);\n return _this._getBackend()\n .getTransport()\n .close(timeout)\n .then(function (transportFlushed) { return status.ready && transportFlushed; });\n });\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.close = function (timeout) {\n var _this = this;\n return this.flush(timeout).then(function (result) {\n _this.getOptions().enabled = false;\n return result;\n });\n };\n /**\n * Sets up the integrations\n */\n BaseClient.prototype.setupIntegrations = function () {\n if (this._isEnabled()) {\n this._integrations = setupIntegrations(this._options);\n }\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getIntegration = function (integration) {\n try {\n return this._integrations[integration.id] || null;\n }\n catch (_oO) {\n logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n return null;\n }\n };\n /** Waits for the client to be done with processing. */\n BaseClient.prototype._isClientProcessing = function (timeout) {\n var _this = this;\n return new SyncPromise(function (resolve) {\n var ticked = 0;\n var tick = 1;\n var interval = 0;\n clearInterval(interval);\n interval = setInterval(function () {\n if (!_this._processing) {\n resolve({\n interval: interval,\n ready: true,\n });\n }\n else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n resolve({\n interval: interval,\n ready: false,\n });\n }\n }\n }, tick);\n });\n };\n /** Returns the current backend. */\n BaseClient.prototype._getBackend = function () {\n return this._backend;\n };\n /** Determines whether this SDK is enabled and a valid Dsn is present. */\n BaseClient.prototype._isEnabled = function () {\n return this.getOptions().enabled !== false && this._dsn !== undefined;\n };\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional informartion about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n var _this = this;\n var _a = this.getOptions(), environment = _a.environment, release = _a.release, dist = _a.dist, _b = _a.maxValueLength, maxValueLength = _b === void 0 ? 250 : _b, _c = _a.normalizeDepth, normalizeDepth = _c === void 0 ? 3 : _c;\n var prepared = tslib_1.__assign({}, event);\n if (prepared.environment === undefined && environment !== undefined) {\n prepared.environment = environment;\n }\n if (prepared.release === undefined && release !== undefined) {\n prepared.release = release;\n }\n if (prepared.dist === undefined && dist !== undefined) {\n prepared.dist = dist;\n }\n if (prepared.message) {\n prepared.message = truncate(prepared.message, maxValueLength);\n }\n var exception = prepared.exception && prepared.exception.values && prepared.exception.values[0];\n if (exception && exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n var request = prepared.request;\n if (request && request.url) {\n request.url = truncate(request.url, maxValueLength);\n }\n if (prepared.event_id === undefined) {\n prepared.event_id = hint && hint.event_id ? hint.event_id : uuid4();\n }\n this._addIntegrations(prepared.sdk);\n // We prepare the result here with a resolved Event.\n var result = SyncPromise.resolve(prepared);\n // This should be the last thing called, since we want that\n // {@link Hub.addEventProcessor} gets the finished prepared event.\n if (scope) {\n // In case we have a hub we reassign it.\n result = scope.applyToEvent(prepared, hint);\n }\n return result.then(function (evt) {\n // tslint:disable-next-line:strict-type-predicates\n if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n return _this._normalizeEvent(evt, normalizeDepth);\n }\n return evt;\n });\n };\n /**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\n BaseClient.prototype._normalizeEvent = function (event, depth) {\n if (!event) {\n return null;\n }\n // tslint:disable:no-unsafe-any\n return tslib_1.__assign({}, event, (event.breadcrumbs && {\n breadcrumbs: event.breadcrumbs.map(function (b) { return (tslib_1.__assign({}, b, (b.data && {\n data: normalize(b.data, depth),\n }))); }),\n }), (event.user && {\n user: normalize(event.user, depth),\n }), (event.contexts && {\n contexts: normalize(event.contexts, depth),\n }), (event.extra && {\n extra: normalize(event.extra, depth),\n }));\n };\n /**\n * This function adds all used integrations to the SDK info in the event.\n * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.\n */\n BaseClient.prototype._addIntegrations = function (sdkInfo) {\n var integrationsArray = Object.keys(this._integrations);\n if (sdkInfo && integrationsArray.length > 0) {\n sdkInfo.integrations = integrationsArray;\n }\n };\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional informartion about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n BaseClient.prototype._processEvent = function (event, hint, scope) {\n var _this = this;\n var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;\n if (!this._isEnabled()) {\n return SyncPromise.reject('SDK not enabled, will not send event.');\n }\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n if (typeof sampleRate === 'number' && Math.random() > sampleRate) {\n return SyncPromise.reject('This event has been sampled, will not send event.');\n }\n return new SyncPromise(function (resolve, reject) {\n _this._prepareEvent(event, scope, hint)\n .then(function (prepared) {\n if (prepared === null) {\n reject('An event processor returned null, will not send event.');\n return;\n }\n var finalEvent = prepared;\n var isInternalException = hint && hint.data && hint.data.__sentry__ === true;\n if (isInternalException || !beforeSend) {\n _this._getBackend().sendEvent(finalEvent);\n resolve(finalEvent);\n return;\n }\n var beforeSendResult = beforeSend(prepared, hint);\n // tslint:disable-next-line:strict-type-predicates\n if (typeof beforeSendResult === 'undefined') {\n logger.error('`beforeSend` method has to return `null` or a valid event.');\n }\n else if (isThenable(beforeSendResult)) {\n _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);\n }\n else {\n finalEvent = beforeSendResult;\n if (finalEvent === null) {\n logger.log('`beforeSend` returned `null`, will not send event.');\n resolve(null);\n return;\n }\n // From here on we are really async\n _this._getBackend().sendEvent(finalEvent);\n resolve(finalEvent);\n }\n })\n .then(null, function (reason) {\n _this.captureException(reason, {\n data: {\n __sentry__: true,\n },\n originalException: reason,\n });\n reject(\"Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: \" + reason);\n });\n });\n };\n /**\n * Resolves before send Promise and calls resolve/reject on parent SyncPromise.\n */\n BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {\n var _this = this;\n beforeSend\n .then(function (processedEvent) {\n if (processedEvent === null) {\n reject('`beforeSend` returned `null`, will not send event.');\n return;\n }\n // From here on we are really async\n _this._getBackend().sendEvent(processedEvent);\n resolve(processedEvent);\n })\n .then(null, function (e) {\n reject(\"beforeSend rejected with \" + e);\n });\n };\n return BaseClient;\n}());\nexport { BaseClient };\n//# sourceMappingURL=baseclient.js.map","var originalFunctionToString;\n/** Patch toString calls to return proper name for wrapped functions */\nvar FunctionToString = /** @class */ (function () {\n function FunctionToString() {\n /**\n * @inheritDoc\n */\n this.name = FunctionToString.id;\n }\n /**\n * @inheritDoc\n */\n FunctionToString.prototype.setupOnce = function () {\n originalFunctionToString = Function.prototype.toString;\n Function.prototype.toString = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var context = this.__sentry_original__ || this;\n // tslint:disable-next-line:no-unsafe-any\n return originalFunctionToString.apply(context, args);\n };\n };\n /**\n * @inheritDoc\n */\n FunctionToString.id = 'FunctionToString';\n return FunctionToString;\n}());\nexport { FunctionToString };\n//# sourceMappingURL=functiontostring.js.map","import { Status } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n/** Noop transport */\nvar NoopTransport = /** @class */ (function () {\n function NoopTransport() {\n }\n /**\n * @inheritDoc\n */\n NoopTransport.prototype.sendEvent = function (_) {\n return SyncPromise.resolve({\n reason: \"NoopTransport: Event has been skipped because no Dsn is configured.\",\n status: Status.Skipped,\n });\n };\n /**\n * @inheritDoc\n */\n NoopTransport.prototype.close = function (_) {\n return SyncPromise.resolve(true);\n };\n return NoopTransport;\n}());\nexport { NoopTransport };\n//# sourceMappingURL=noop.js.map","import { logger, SentryError } from '@sentry/utils';\nimport { NoopTransport } from './transports/noop';\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\nvar BaseBackend = /** @class */ (function () {\n /** Creates a new backend instance. */\n function BaseBackend(options) {\n this._options = options;\n if (!this._options.dsn) {\n logger.warn('No DSN provided, backend will not do anything.');\n }\n this._transport = this._setupTransport();\n }\n /**\n * Sets up the transport so it can be used later to send requests.\n */\n BaseBackend.prototype._setupTransport = function () {\n return new NoopTransport();\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n throw new SentryError('Backend has to implement `eventFromException` method');\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n throw new SentryError('Backend has to implement `eventFromMessage` method');\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.sendEvent = function (event) {\n this._transport.sendEvent(event).then(null, function (reason) {\n logger.error(\"Error while sending event: \" + reason);\n });\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.getTransport = function () {\n return this._transport;\n };\n return BaseBackend;\n}());\nexport { BaseBackend };\n//# sourceMappingURL=basebackend.js.map","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { getEventDescription, isMatchingPattern, logger } from '@sentry/utils';\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.\nvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n/** Inbound filters configurable by the user */\nvar InboundFilters = /** @class */ (function () {\n function InboundFilters(_options) {\n if (_options === void 0) { _options = {}; }\n this._options = _options;\n /**\n * @inheritDoc\n */\n this.name = InboundFilters.id;\n }\n /**\n * @inheritDoc\n */\n InboundFilters.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event) {\n var hub = getCurrentHub();\n if (!hub) {\n return event;\n }\n var self = hub.getIntegration(InboundFilters);\n if (self) {\n var client = hub.getClient();\n var clientOptions = client ? client.getOptions() : {};\n var options = self._mergeOptions(clientOptions);\n if (self._shouldDropEvent(event, options)) {\n return null;\n }\n }\n return event;\n });\n };\n /** JSDoc */\n InboundFilters.prototype._shouldDropEvent = function (event, options) {\n if (this._isSentryError(event, options)) {\n logger.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + getEventDescription(event));\n return true;\n }\n if (this._isIgnoredError(event, options)) {\n logger.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + getEventDescription(event));\n return true;\n }\n if (this._isBlacklistedUrl(event, options)) {\n logger.warn(\"Event dropped due to being matched by `blacklistUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n return true;\n }\n if (!this._isWhitelistedUrl(event, options)) {\n logger.warn(\"Event dropped due to not being matched by `whitelistUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n return true;\n }\n return false;\n };\n /** JSDoc */\n InboundFilters.prototype._isSentryError = function (event, options) {\n if (options === void 0) { options = {}; }\n if (!options.ignoreInternal) {\n return false;\n }\n try {\n return ((event &&\n event.exception &&\n event.exception.values &&\n event.exception.values[0] &&\n event.exception.values[0].type === 'SentryError') ||\n false);\n }\n catch (_oO) {\n return false;\n }\n };\n /** JSDoc */\n InboundFilters.prototype._isIgnoredError = function (event, options) {\n if (options === void 0) { options = {}; }\n if (!options.ignoreErrors || !options.ignoreErrors.length) {\n return false;\n }\n return this._getPossibleEventMessages(event).some(function (message) {\n // Not sure why TypeScript complains here...\n return options.ignoreErrors.some(function (pattern) { return isMatchingPattern(message, pattern); });\n });\n };\n /** JSDoc */\n InboundFilters.prototype._isBlacklistedUrl = function (event, options) {\n if (options === void 0) { options = {}; }\n // TODO: Use Glob instead?\n if (!options.blacklistUrls || !options.blacklistUrls.length) {\n return false;\n }\n var url = this._getEventFilterUrl(event);\n return !url ? false : options.blacklistUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n };\n /** JSDoc */\n InboundFilters.prototype._isWhitelistedUrl = function (event, options) {\n if (options === void 0) { options = {}; }\n // TODO: Use Glob instead?\n if (!options.whitelistUrls || !options.whitelistUrls.length) {\n return true;\n }\n var url = this._getEventFilterUrl(event);\n return !url ? true : options.whitelistUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n };\n /** JSDoc */\n InboundFilters.prototype._mergeOptions = function (clientOptions) {\n if (clientOptions === void 0) { clientOptions = {}; }\n return {\n blacklistUrls: tslib_1.__spread((this._options.blacklistUrls || []), (clientOptions.blacklistUrls || [])),\n ignoreErrors: tslib_1.__spread((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),\n ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,\n whitelistUrls: tslib_1.__spread((this._options.whitelistUrls || []), (clientOptions.whitelistUrls || [])),\n };\n };\n /** JSDoc */\n InboundFilters.prototype._getPossibleEventMessages = function (event) {\n if (event.message) {\n return [event.message];\n }\n if (event.exception) {\n try {\n var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;\n return [\"\" + value, type + \": \" + value];\n }\n catch (oO) {\n logger.error(\"Cannot extract message for event \" + getEventDescription(event));\n return [];\n }\n }\n return [];\n };\n /** JSDoc */\n InboundFilters.prototype._getEventFilterUrl = function (event) {\n try {\n if (event.stacktrace) {\n var frames_1 = event.stacktrace.frames;\n return (frames_1 && frames_1[frames_1.length - 1].filename) || null;\n }\n if (event.exception) {\n var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;\n return (frames_2 && frames_2[frames_2.length - 1].filename) || null;\n }\n return null;\n }\n catch (oO) {\n logger.error(\"Cannot extract url for event \" + getEventDescription(event));\n return null;\n }\n };\n /**\n * @inheritDoc\n */\n InboundFilters.id = 'InboundFilters';\n return InboundFilters;\n}());\nexport { InboundFilters };\n//# sourceMappingURL=inboundfilters.js.map","// tslint:disable:object-literal-sort-keys\nimport * as tslib_1 from \"tslib\";\n// global reference to slice\nvar UNKNOWN_FUNCTION = '?';\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nvar chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nvar gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js))(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nvar geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nvar chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n/** JSDoc */\nexport function computeStackTrace(ex) {\n // tslint:disable:no-unsafe-any\n var stack = null;\n var popSize = ex && ex.framesToPop;\n try {\n // This must be tried first because Opera 10 *destroys*\n // its stacktrace property if you try to access the stack\n // property first!!\n stack = computeStackTraceFromStacktraceProp(ex);\n if (stack) {\n return popFrames(stack, popSize);\n }\n }\n catch (e) {\n // no-empty\n }\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return popFrames(stack, popSize);\n }\n }\n catch (e) {\n // no-empty\n }\n return {\n message: extractMessage(ex),\n name: ex && ex.name,\n stack: [],\n failed: true,\n };\n}\n/** JSDoc */\n// tslint:disable-next-line:cyclomatic-complexity\nfunction computeStackTraceFromStackProp(ex) {\n // tslint:disable:no-conditional-assignment\n if (!ex || !ex.stack) {\n return null;\n }\n var stack = [];\n var lines = ex.stack.split('\\n');\n var isEval;\n var submatch;\n var parts;\n var element;\n for (var i = 0; i < lines.length; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n 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 // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `\n // prefix here seems like the quickest solution for now.\n url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],\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 }\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 }\n else if ((parts = gecko.exec(lines[i]))) {\n 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[1] = parts[1] || \"eval\";\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = ''; // no column when eval\n }\n else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\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 }\n else {\n continue;\n }\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n stack.push(element);\n }\n if (!stack.length) {\n return null;\n }\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack: stack,\n };\n}\n/** JSDoc */\nfunction computeStackTraceFromStacktraceProp(ex) {\n if (!ex || !ex.stacktrace) {\n return null;\n }\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n var stacktrace = ex.stacktrace;\n var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n var opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i;\n var lines = stacktrace.split('\\n');\n var stack = [];\n var parts;\n for (var line = 0; line < lines.length; line += 2) {\n // tslint:disable:no-conditional-assignment\n var element = null;\n if ((parts = opera10Regex.exec(lines[line]))) {\n element = {\n url: parts[2],\n func: parts[3],\n args: [],\n line: +parts[1],\n column: null,\n };\n }\n else if ((parts = opera11Regex.exec(lines[line]))) {\n element = {\n url: parts[6],\n func: parts[3] || parts[4],\n args: parts[5] ? parts[5].split(',') : [],\n line: +parts[1],\n column: +parts[2],\n };\n }\n if (element) {\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n stack.push(element);\n }\n }\n if (!stack.length) {\n return null;\n }\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack: stack,\n };\n}\n/** Remove N number of frames from the stack */\nfunction popFrames(stacktrace, popSize) {\n try {\n return tslib_1.__assign({}, stacktrace, { stack: stacktrace.stack.slice(popSize) });\n }\n catch (e) {\n return stacktrace;\n }\n}\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\nfunction extractMessage(ex) {\n var message = ex && ex.message;\n if (!message) {\n return 'No error message';\n }\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n return message;\n}\n//# sourceMappingURL=tracekit.js.map","import { extractExceptionKeysForMessage, isEvent, normalizeToSize } from '@sentry/utils';\nimport { computeStackTrace } from './tracekit';\nvar STACKTRACE_LIMIT = 50;\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromStacktrace(stacktrace) {\n var frames = prepareFramesForEvent(stacktrace.stack);\n var exception = {\n type: stacktrace.name,\n value: stacktrace.message,\n };\n if (frames && frames.length) {\n exception.stacktrace = { frames: frames };\n }\n // tslint:disable-next-line:strict-type-predicates\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n return exception;\n}\n/**\n * @hidden\n */\nexport function eventFromPlainObject(exception, syntheticException, rejection) {\n var event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n value: \"Non-Error \" + (rejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + extractExceptionKeysForMessage(exception),\n },\n ],\n },\n extra: {\n __serialized__: normalizeToSize(exception),\n },\n };\n if (syntheticException) {\n var stacktrace = computeStackTrace(syntheticException);\n var frames_1 = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames: frames_1,\n };\n }\n return event;\n}\n/**\n * @hidden\n */\nexport function eventFromStacktrace(stacktrace) {\n var exception = exceptionFromStacktrace(stacktrace);\n return {\n exception: {\n values: [exception],\n },\n };\n}\n/**\n * @hidden\n */\nexport function prepareFramesForEvent(stack) {\n if (!stack || !stack.length) {\n return [];\n }\n var localStack = stack;\n var firstFrameFunction = localStack[0].func || '';\n var lastFrameFunction = localStack[localStack.length - 1].func || '';\n // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n localStack = localStack.slice(1);\n }\n // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n localStack = localStack.slice(0, -1);\n }\n // The frame where the crash happened, should be the last entry in the array\n return localStack\n .map(function (frame) { return ({\n colno: frame.column === null ? undefined : frame.column,\n filename: frame.url || localStack[0].url,\n function: frame.func || '?',\n in_app: true,\n lineno: frame.line === null ? undefined : frame.line,\n }); })\n .slice(0, STACKTRACE_LIMIT)\n .reverse();\n}\n//# sourceMappingURL=parsers.js.map","import { addExceptionMechanism, addExceptionTypeValue, isDOMError, isDOMException, isError, isErrorEvent, isEvent, isPlainObject, } from '@sentry/utils';\nimport { eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent } from './parsers';\nimport { computeStackTrace } from './tracekit';\n/** JSDoc */\nexport function eventFromUnknownInput(exception, syntheticException, options) {\n if (options === void 0) { options = {}; }\n var event;\n if (isErrorEvent(exception) && exception.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n var errorEvent = exception;\n exception = errorEvent.error; // tslint:disable-line:no-parameter-reassignment\n event = eventFromStacktrace(computeStackTrace(exception));\n return event;\n }\n if (isDOMError(exception) || isDOMException(exception)) {\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 domException = exception;\n var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n event = eventFromString(message, syntheticException, options);\n addExceptionTypeValue(event, message);\n return event;\n }\n if (isError(exception)) {\n // we have a real Error object, do nothing\n event = eventFromStacktrace(computeStackTrace(exception));\n return event;\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it is plain Object or Event, 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 var objectException = exception;\n event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(exception, syntheticException, options);\n addExceptionTypeValue(event, \"\" + exception, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n}\n// this._options.attachStacktrace\n/** JSDoc */\nexport function eventFromString(input, syntheticException, options) {\n if (options === void 0) { options = {}; }\n var event = {\n message: input,\n };\n if (options.attachStacktrace && syntheticException) {\n var stacktrace = computeStackTrace(syntheticException);\n var frames_1 = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames: frames_1,\n };\n }\n return event;\n}\n//# sourceMappingURL=eventbuilder.js.map","import { API } from '@sentry/core';\nimport { PromiseBuffer, SentryError } from '@sentry/utils';\n/** Base Transport class implementation */\nvar BaseTransport = /** @class */ (function () {\n function BaseTransport(options) {\n this.options = options;\n /** A simple buffer holding all requests. */\n this._buffer = new PromiseBuffer(30);\n this.url = new API(this.options.dsn).getStoreEndpointWithUrlEncodedAuth();\n }\n /**\n * @inheritDoc\n */\n BaseTransport.prototype.sendEvent = function (_) {\n throw new SentryError('Transport Class has to implement `sendEvent` method');\n };\n /**\n * @inheritDoc\n */\n BaseTransport.prototype.close = function (timeout) {\n return this._buffer.drain(timeout);\n };\n return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import * as tslib_1 from \"tslib\";\nimport { Status } from '@sentry/types';\nimport { getGlobalObject, logger, parseRetryAfterHeader, supportsReferrerPolicy, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\nvar global = getGlobalObject();\n/** `fetch` based transport */\nvar FetchTransport = /** @class */ (function (_super) {\n tslib_1.__extends(FetchTransport, _super);\n function FetchTransport() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n /** Locks transport after receiving 429 response */\n _this._disabledUntil = new Date(Date.now());\n return _this;\n }\n /**\n * @inheritDoc\n */\n FetchTransport.prototype.sendEvent = function (event) {\n var _this = this;\n if (new Date(Date.now()) < this._disabledUntil) {\n return Promise.reject({\n event: event,\n reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n status: 429,\n });\n }\n var defaultOptions = {\n body: JSON.stringify(event),\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 if (this.options.headers !== undefined) {\n defaultOptions.headers = this.options.headers;\n }\n return this._buffer.add(new SyncPromise(function (resolve, reject) {\n global\n .fetch(_this.url, defaultOptions)\n .then(function (response) {\n var status = Status.fromHttpCode(response.status);\n if (status === Status.Success) {\n resolve({ status: status });\n return;\n }\n if (status === Status.RateLimit) {\n var now = Date.now();\n _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, response.headers.get('Retry-After')));\n logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n }\n reject(response);\n })\n .catch(reject);\n }));\n };\n return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","import * as tslib_1 from \"tslib\";\nimport { Status } from '@sentry/types';\nimport { logger, parseRetryAfterHeader, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\n/** `XHR` based transport */\nvar XHRTransport = /** @class */ (function (_super) {\n tslib_1.__extends(XHRTransport, _super);\n function XHRTransport() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n /** Locks transport after receiving 429 response */\n _this._disabledUntil = new Date(Date.now());\n return _this;\n }\n /**\n * @inheritDoc\n */\n XHRTransport.prototype.sendEvent = function (event) {\n var _this = this;\n if (new Date(Date.now()) < this._disabledUntil) {\n return Promise.reject({\n event: event,\n reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n status: 429,\n });\n }\n return this._buffer.add(new SyncPromise(function (resolve, reject) {\n var request = new XMLHttpRequest();\n request.onreadystatechange = function () {\n if (request.readyState !== 4) {\n return;\n }\n var status = Status.fromHttpCode(request.status);\n if (status === Status.Success) {\n resolve({ status: status });\n return;\n }\n if (status === Status.RateLimit) {\n var now = Date.now();\n _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, request.getResponseHeader('Retry-After')));\n logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n }\n reject(request);\n };\n request.open('POST', _this.url);\n for (var header in _this.options.headers) {\n if (_this.options.headers.hasOwnProperty(header)) {\n request.setRequestHeader(header, _this.options.headers[header]);\n }\n }\n request.send(JSON.stringify(event));\n }));\n };\n return XHRTransport;\n}(BaseTransport));\nexport { XHRTransport };\n//# sourceMappingURL=xhr.js.map","import * as tslib_1 from \"tslib\";\nimport { BaseBackend } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, supportsFetch, SyncPromise } from '@sentry/utils';\nimport { eventFromString, eventFromUnknownInput } from './eventbuilder';\nimport { FetchTransport, XHRTransport } from './transports';\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\nvar BrowserBackend = /** @class */ (function (_super) {\n tslib_1.__extends(BrowserBackend, _super);\n function BrowserBackend() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype._setupTransport = function () {\n if (!this._options.dsn) {\n // We return the noop transport here in case there is no Dsn.\n return _super.prototype._setupTransport.call(this);\n }\n var transportOptions = tslib_1.__assign({}, this._options.transportOptions, { dsn: this._options.dsn });\n if (this._options.transport) {\n return new this._options.transport(transportOptions);\n }\n if (supportsFetch()) {\n return new FetchTransport(transportOptions);\n }\n return new XHRTransport(transportOptions);\n };\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype.eventFromException = function (exception, hint) {\n var syntheticException = (hint && hint.syntheticException) || undefined;\n var event = eventFromUnknownInput(exception, syntheticException, {\n attachStacktrace: this._options.attachStacktrace,\n });\n addExceptionMechanism(event, {\n handled: true,\n type: 'generic',\n });\n event.level = Severity.Error;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return SyncPromise.resolve(event);\n };\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n if (level === void 0) { level = Severity.Info; }\n var syntheticException = (hint && hint.syntheticException) || undefined;\n var event = eventFromString(message, syntheticException, {\n attachStacktrace: this._options.attachStacktrace,\n });\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return SyncPromise.resolve(event);\n };\n return BrowserBackend;\n}(BaseBackend));\nexport { BrowserBackend };\n//# sourceMappingURL=backend.js.map","export var SDK_NAME = 'sentry.javascript.browser';\nexport var SDK_VERSION = '5.15.5';\n//# sourceMappingURL=version.js.map","import * as tslib_1 from \"tslib\";\nimport { API, BaseClient } from '@sentry/core';\nimport { getGlobalObject, logger } from '@sentry/utils';\nimport { BrowserBackend } from './backend';\nimport { SDK_NAME, SDK_VERSION } from './version';\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nvar BrowserClient = /** @class */ (function (_super) {\n tslib_1.__extends(BrowserClient, _super);\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n function BrowserClient(options) {\n if (options === void 0) { options = {}; }\n return _super.call(this, BrowserBackend, options) || this;\n }\n /**\n * @inheritDoc\n */\n BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n event.platform = event.platform || 'javascript';\n event.sdk = tslib_1.__assign({}, event.sdk, { name: SDK_NAME, packages: tslib_1.__spread(((event.sdk && event.sdk.packages) || []), [\n {\n name: 'npm:@sentry/browser',\n version: SDK_VERSION,\n },\n ]), version: SDK_VERSION });\n return _super.prototype._prepareEvent.call(this, event, scope, hint);\n };\n /**\n * Show a report dialog to the user to send feedback to a specific event.\n *\n * @param options Set individual options for the dialog\n */\n BrowserClient.prototype.showReportDialog = function (options) {\n if (options === void 0) { options = {}; }\n // doesn't work without a document (React Native)\n var document = getGlobalObject().document;\n if (!document) {\n return;\n }\n if (!this._isEnabled()) {\n logger.error('Trying to call showReportDialog with Sentry Client is disabled');\n return;\n }\n var dsn = options.dsn || this.getDsn();\n if (!options.eventId) {\n logger.error('Missing `eventId` option in showReportDialog call');\n return;\n }\n if (!dsn) {\n logger.error('Missing `Dsn` option in showReportDialog call');\n return;\n }\n var script = document.createElement('script');\n script.async = true;\n script.src = new API(dsn).getReportDialogEndpoint(options);\n if (options.onLoad) {\n script.onload = options.onLoad;\n }\n (document.head || document.body).appendChild(script);\n };\n return BrowserClient;\n}(BaseClient));\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map","import * as tslib_1 from \"tslib\";\nimport { captureException, withScope } from '@sentry/core';\nimport { addExceptionMechanism, addExceptionTypeValue } from '@sentry/utils';\nvar ignoreOnError = 0;\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError() {\n return ignoreOnError > 0;\n}\n/**\n * @hidden\n */\nexport function ignoreNextOnError() {\n // onerror should trigger before setTimeout\n ignoreOnError += 1;\n setTimeout(function () {\n ignoreOnError -= 1;\n });\n}\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(fn, options, before) {\n if (options === void 0) { options = {}; }\n // tslint:disable-next-line:strict-type-predicates\n if (typeof fn !== 'function') {\n return fn;\n }\n try {\n // We don't wanna wrap it twice\n if (fn.__sentry__) {\n return fn;\n }\n // If this has already been wrapped in the past, return that wrapped function\n if (fn.__sentry_wrapped__) {\n return fn.__sentry_wrapped__;\n }\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 fn;\n }\n var sentryWrapped = function () {\n var args = Array.prototype.slice.call(arguments);\n // tslint:disable:no-unsafe-any\n try {\n // tslint:disable-next-line:strict-type-predicates\n if (before && typeof before === 'function') {\n before.apply(this, arguments);\n }\n var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });\n if (fn.handleEvent) {\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 the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.handleEvent.apply(this, wrappedArguments);\n }\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 the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n // tslint:enable:no-unsafe-any\n }\n catch (ex) {\n ignoreNextOnError();\n withScope(function (scope) {\n scope.addEventProcessor(function (event) {\n var processedEvent = tslib_1.__assign({}, event);\n if (options.mechanism) {\n addExceptionTypeValue(processedEvent, undefined, undefined);\n addExceptionMechanism(processedEvent, options.mechanism);\n }\n processedEvent.extra = tslib_1.__assign({}, processedEvent.extra, { arguments: args });\n return processedEvent;\n });\n captureException(ex);\n });\n throw ex;\n }\n };\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n try {\n for (var property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property] = fn[property];\n }\n }\n }\n catch (_oO) { } // tslint:disable-line:no-empty\n fn.prototype = fn.prototype || {};\n sentryWrapped.prototype = fn.prototype;\n Object.defineProperty(fn, '__sentry_wrapped__', {\n enumerable: false,\n value: sentryWrapped,\n });\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n Object.defineProperties(sentryWrapped, {\n __sentry__: {\n enumerable: false,\n value: true,\n },\n __sentry_original__: {\n enumerable: false,\n value: fn,\n },\n });\n // Restore original function name (not all browsers allow that)\n try {\n var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get: function () {\n return fn.name;\n },\n });\n }\n }\n catch (_oO) {\n /*no-empty*/\n }\n return sentryWrapped;\n}\n//# sourceMappingURL=helpers.js.map","import * as tslib_1 from \"tslib\";\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, addInstrumentationHandler, getLocationHref, isErrorEvent, isPrimitive, isString, logger, } from '@sentry/utils';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n/** Global handlers */\nvar GlobalHandlers = /** @class */ (function () {\n /** JSDoc */\n function GlobalHandlers(options) {\n /**\n * @inheritDoc\n */\n this.name = GlobalHandlers.id;\n /** JSDoc */\n this._onErrorHandlerInstalled = false;\n /** JSDoc */\n this._onUnhandledRejectionHandlerInstalled = false;\n this._options = tslib_1.__assign({ onerror: true, onunhandledrejection: true }, options);\n }\n /**\n * @inheritDoc\n */\n GlobalHandlers.prototype.setupOnce = function () {\n Error.stackTraceLimit = 50;\n if (this._options.onerror) {\n logger.log('Global Handler attached: onerror');\n this._installGlobalOnErrorHandler();\n }\n if (this._options.onunhandledrejection) {\n logger.log('Global Handler attached: onunhandledrejection');\n this._installGlobalOnUnhandledRejectionHandler();\n }\n };\n /** JSDoc */\n GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {\n var _this = this;\n if (this._onErrorHandlerInstalled) {\n return;\n }\n addInstrumentationHandler({\n callback: function (data) {\n var error = data.error;\n var currentHub = getCurrentHub();\n var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n return;\n }\n var client = currentHub.getClient();\n var event = isPrimitive(error)\n ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)\n : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: false,\n }), data.url, data.line, data.column);\n addExceptionMechanism(event, {\n handled: false,\n type: 'onerror',\n });\n currentHub.captureEvent(event, {\n originalException: error,\n });\n },\n type: 'error',\n });\n this._onErrorHandlerInstalled = true;\n };\n /** JSDoc */\n GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {\n var _this = this;\n if (this._onUnhandledRejectionHandlerInstalled) {\n return;\n }\n addInstrumentationHandler({\n callback: function (e) {\n var error = e;\n // dig the object of the rejection out of known event types\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in e) {\n error = e.reason;\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in e && 'reason' in e.detail) {\n error = e.detail.reason;\n }\n }\n catch (_oO) {\n // no-empty\n }\n var currentHub = getCurrentHub();\n var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n return true;\n }\n var client = currentHub.getClient();\n var event = isPrimitive(error)\n ? _this._eventFromIncompleteRejection(error)\n : eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: true,\n });\n event.level = Severity.Error;\n addExceptionMechanism(event, {\n handled: false,\n type: 'onunhandledrejection',\n });\n currentHub.captureEvent(event, {\n originalException: error,\n });\n return;\n },\n type: 'unhandledrejection',\n });\n this._onUnhandledRejectionHandlerInstalled = true;\n };\n /**\n * This function creates a stack from an old, error-less onerror handler.\n */\n GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {\n var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n // If 'message' is ErrorEvent, get real message from inside\n var message = isErrorEvent(msg) ? msg.message : msg;\n var name;\n if (isString(message)) {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n var event = {\n exception: {\n values: [\n {\n type: name || 'Error',\n value: message,\n },\n ],\n },\n };\n return this._enhanceEventWithInitialFrame(event, url, line, column);\n };\n /**\n * This function creates an Event from an TraceKitStackTrace that has part of it missing.\n */\n GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n value: \"Non-Error promise rejection captured with value: \" + error,\n },\n ],\n },\n };\n };\n /** JSDoc */\n GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n var filename = isString(url) && url.length > 0 ? url : getLocationHref();\n if (event.exception.values[0].stacktrace.frames.length === 0) {\n event.exception.values[0].stacktrace.frames.push({\n colno: colno,\n filename: filename,\n function: '?',\n in_app: true,\n lineno: lineno,\n });\n }\n return event;\n };\n /**\n * @inheritDoc\n */\n GlobalHandlers.id = 'GlobalHandlers';\n return GlobalHandlers;\n}());\nexport { GlobalHandlers };\n//# sourceMappingURL=globalhandlers.js.map","import { fill, getFunctionName, getGlobalObject } from '@sentry/utils';\nimport { wrap } from '../helpers';\n/** Wrap timer functions and event targets to catch errors and provide better meta data */\nvar TryCatch = /** @class */ (function () {\n function TryCatch() {\n /** JSDoc */\n this._ignoreOnError = 0;\n /**\n * @inheritDoc\n */\n this.name = TryCatch.id;\n }\n /** JSDoc */\n TryCatch.prototype._wrapTimeFunction = function (original) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: true,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n };\n /** JSDoc */\n TryCatch.prototype._wrapRAF = function (original) {\n return function (callback) {\n return original(wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n }));\n };\n };\n /** JSDoc */\n TryCatch.prototype._wrapEventTarget = function (target) {\n var global = getGlobalObject();\n var proto = global[target] && global[target].prototype;\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n fill(proto, 'addEventListener', function (original) {\n return function (eventName, fn, options) {\n try {\n // tslint:disable-next-line:no-unbound-method strict-type-predicates\n if (typeof fn.handleEvent === 'function') {\n fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target: target,\n },\n handled: true,\n type: 'instrument',\n },\n });\n }\n }\n catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n return original.call(this, eventName, wrap(fn, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target: target,\n },\n handled: true,\n type: 'instrument',\n },\n }), options);\n };\n });\n fill(proto, 'removeEventListener', function (original) {\n return function (eventName, fn, options) {\n var callback = fn;\n try {\n callback = callback && (callback.__sentry_wrapped__ || callback);\n }\n catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return original.call(this, eventName, callback, options);\n };\n });\n };\n /** JSDoc */\n TryCatch.prototype._wrapXHR = function (originalSend) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var xhr = this; // tslint:disable-line:no-this-assignment\n var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n xmlHttpRequestProps.forEach(function (prop) {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n fill(xhr, prop, function (original) {\n var wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n };\n // If Instrument integration has been called before TryCatch, get the name of original function\n if (original.__sentry_original__) {\n wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__);\n }\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n return originalSend.apply(this, args);\n };\n };\n /**\n * Wrap timer functions and event targets to catch errors\n * and provide better metadata.\n */\n TryCatch.prototype.setupOnce = function () {\n this._ignoreOnError = this._ignoreOnError;\n var global = getGlobalObject();\n fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n fill(global, 'setInterval', this._wrapTimeFunction.bind(this));\n fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n if ('XMLHttpRequest' in global) {\n fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));\n }\n [\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 ].forEach(this._wrapEventTarget.bind(this));\n };\n /**\n * @inheritDoc\n */\n TryCatch.id = 'TryCatch';\n return TryCatch;\n}());\nexport { TryCatch };\n//# sourceMappingURL=trycatch.js.map","import * as tslib_1 from \"tslib\";\nimport { API, getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addInstrumentationHandler, getEventDescription, getGlobalObject, htmlTreeAsString, logger, parseUrl, safeJoin, } from '@sentry/utils';\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nvar Breadcrumbs = /** @class */ (function () {\n /**\n * @inheritDoc\n */\n function Breadcrumbs(options) {\n /**\n * @inheritDoc\n */\n this.name = Breadcrumbs.id;\n this._options = tslib_1.__assign({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);\n }\n /**\n * Creates breadcrumbs from console API calls\n */\n Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {\n var breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: Severity.fromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = \"Assertion failed: \" + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');\n breadcrumb.data.arguments = handlerData.args.slice(1);\n }\n else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n getCurrentHub().addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n };\n /**\n * Creates breadcrumbs from DOM API calls\n */\n Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {\n var target;\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = handlerData.event.target\n ? htmlTreeAsString(handlerData.event.target)\n : htmlTreeAsString(handlerData.event);\n }\n catch (e) {\n target = '<unknown>';\n }\n if (target.length === 0) {\n return;\n }\n getCurrentHub().addBreadcrumb({\n category: \"ui.\" + handlerData.name,\n message: target,\n }, {\n event: handlerData.event,\n name: handlerData.name,\n });\n };\n /**\n * Creates breadcrumbs from XHR API calls\n */\n Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {\n if (handlerData.endTimestamp) {\n // We only capture complete, non-sentry requests\n if (handlerData.xhr.__sentry_own_request__) {\n return;\n }\n getCurrentHub().addBreadcrumb({\n category: 'xhr',\n data: handlerData.xhr.__sentry_xhr__,\n type: 'http',\n }, {\n xhr: handlerData.xhr,\n });\n return;\n }\n // We only capture issued sentry requests\n if (this._options.sentry && handlerData.xhr.__sentry_own_request__) {\n addSentryBreadcrumb(handlerData.args[0]);\n }\n };\n /**\n * Creates breadcrumbs from fetch API calls\n */\n Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {\n // We only capture complete fetch requests\n if (!handlerData.endTimestamp) {\n return;\n }\n var client = getCurrentHub().getClient();\n var dsn = client && client.getDsn();\n if (this._options.sentry && dsn) {\n var filterUrl = new API(dsn).getStoreEndpoint();\n // if Sentry key appears in URL, don't capture it as a request\n // but rather as our own 'sentry' type breadcrumb\n if (filterUrl &&\n handlerData.fetchData.url.indexOf(filterUrl) !== -1 &&\n handlerData.fetchData.method === 'POST' &&\n handlerData.args[1] &&\n handlerData.args[1].body) {\n addSentryBreadcrumb(handlerData.args[1].body);\n return;\n }\n }\n if (handlerData.error) {\n getCurrentHub().addBreadcrumb({\n category: 'fetch',\n data: tslib_1.__assign({}, handlerData.fetchData, { status_code: handlerData.response.status }),\n level: Severity.Error,\n type: 'http',\n }, {\n data: handlerData.error,\n input: handlerData.args,\n });\n }\n else {\n getCurrentHub().addBreadcrumb({\n category: 'fetch',\n data: tslib_1.__assign({}, handlerData.fetchData, { status_code: handlerData.response.status }),\n type: 'http',\n }, {\n input: handlerData.args,\n response: handlerData.response,\n });\n }\n };\n /**\n * Creates breadcrumbs from history API calls\n */\n Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {\n var global = getGlobalObject();\n var from = handlerData.from;\n var to = handlerData.to;\n var parsedLoc = parseUrl(global.location.href);\n var parsedFrom = parseUrl(from);\n var parsedTo = parseUrl(to);\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom.path) {\n parsedFrom = parsedLoc;\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 // tslint:disable-next-line:no-parameter-reassignment\n to = parsedTo.relative;\n }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n // tslint:disable-next-line:no-parameter-reassignment\n from = parsedFrom.relative;\n }\n getCurrentHub().addBreadcrumb({\n category: 'navigation',\n data: {\n from: from,\n to: to,\n },\n });\n };\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - Console API\n * - DOM API (click/typing)\n * - XMLHttpRequest API\n * - Fetch API\n * - History API\n */\n Breadcrumbs.prototype.setupOnce = function () {\n var _this = this;\n if (this._options.console) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._consoleBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'console',\n });\n }\n if (this._options.dom) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._domBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'dom',\n });\n }\n if (this._options.xhr) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._xhrBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'xhr',\n });\n }\n if (this._options.fetch) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._fetchBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'fetch',\n });\n }\n if (this._options.history) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._historyBreadcrumb.apply(_this, tslib_1.__spread(args));\n },\n type: 'history',\n });\n }\n };\n /**\n * @inheritDoc\n */\n Breadcrumbs.id = 'Breadcrumbs';\n return Breadcrumbs;\n}());\nexport { Breadcrumbs };\n/**\n * Create a breadcrumb of `sentry` from the events themselves\n */\nfunction addSentryBreadcrumb(serializedData) {\n // There's always something that can go wrong with deserialization...\n try {\n var event_1 = JSON.parse(serializedData);\n getCurrentHub().addBreadcrumb({\n category: \"sentry.\" + (event_1.type === 'transaction' ? 'transaction' : 'event'),\n event_id: event_1.event_id,\n level: event_1.level || Severity.fromString('error'),\n message: getEventDescription(event_1),\n }, {\n event: event_1,\n });\n }\n catch (_oO) {\n logger.error('Error while adding sentry type breadcrumb');\n }\n}\n//# sourceMappingURL=breadcrumbs.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { isInstanceOf } from '@sentry/utils';\nimport { exceptionFromStacktrace } from '../parsers';\nimport { computeStackTrace } from '../tracekit';\nvar DEFAULT_KEY = 'cause';\nvar DEFAULT_LIMIT = 5;\n/** Adds SDK info to an event. */\nvar LinkedErrors = /** @class */ (function () {\n /**\n * @inheritDoc\n */\n function LinkedErrors(options) {\n if (options === void 0) { options = {}; }\n /**\n * @inheritDoc\n */\n this.name = LinkedErrors.id;\n this._key = options.key || DEFAULT_KEY;\n this._limit = options.limit || DEFAULT_LIMIT;\n }\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event, hint) {\n var self = getCurrentHub().getIntegration(LinkedErrors);\n if (self) {\n return self._handler(event, hint);\n }\n return event;\n });\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype._handler = function (event, hint) {\n if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return event;\n }\n var linkedErrors = this._walkErrorTree(hint.originalException, this._key);\n event.exception.values = tslib_1.__spread(linkedErrors, event.exception.values);\n return event;\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {\n if (stack === void 0) { stack = []; }\n if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) {\n return stack;\n }\n var stacktrace = computeStackTrace(error[key]);\n var exception = exceptionFromStacktrace(stacktrace);\n return this._walkErrorTree(error[key], key, tslib_1.__spread([exception], stack));\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.id = 'LinkedErrors';\n return LinkedErrors;\n}());\nexport { LinkedErrors };\n//# sourceMappingURL=linkederrors.js.map","import * as tslib_1 from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\nvar global = getGlobalObject();\n/** UserAgent */\nvar UserAgent = /** @class */ (function () {\n function UserAgent() {\n /**\n * @inheritDoc\n */\n this.name = UserAgent.id;\n }\n /**\n * @inheritDoc\n */\n UserAgent.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event) {\n if (getCurrentHub().getIntegration(UserAgent)) {\n if (!global.navigator || !global.location) {\n return event;\n }\n // Request Interface: https://docs.sentry.io/development/sdk-dev/event-payloads/request/\n var request = event.request || {};\n request.url = request.url || global.location.href;\n request.headers = request.headers || {};\n request.headers['User-Agent'] = global.navigator.userAgent;\n return tslib_1.__assign({}, event, { request: request });\n }\n return event;\n });\n };\n /**\n * @inheritDoc\n */\n UserAgent.id = 'UserAgent';\n return UserAgent;\n}());\nexport { UserAgent };\n//# sourceMappingURL=useragent.js.map","import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';\nimport { getGlobalObject, SyncPromise } from '@sentry/utils';\nimport { BrowserClient } from './client';\nimport { wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';\nexport var defaultIntegrations = [\n new CoreIntegrations.InboundFilters(),\n new CoreIntegrations.FunctionToString(),\n new TryCatch(),\n new Breadcrumbs(),\n new GlobalHandlers(),\n new LinkedErrors(),\n new UserAgent(),\n];\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n * scope.setExtra({ battery: 0.7 });\n * scope.setTag({ user_mode: 'admin' });\n * scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options) {\n if (options === void 0) { options = {}; }\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = defaultIntegrations;\n }\n if (options.release === undefined) {\n var window_1 = getGlobalObject();\n // This supports the variable that sentry-webpack-plugin injects\n if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n options.release = window_1.SENTRY_RELEASE.id;\n }\n }\n initAndBind(BrowserClient, options);\n}\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options) {\n if (options === void 0) { options = {}; }\n if (!options.eventId) {\n options.eventId = getCurrentHub().lastEventId();\n }\n var client = getCurrentHub().getClient();\n if (client) {\n client.showReportDialog(options);\n }\n}\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId() {\n return getCurrentHub().lastEventId();\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad() {\n // Noop\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback) {\n callback();\n}\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function flush(timeout) {\n var client = getCurrentHub().getClient();\n if (client) {\n return client.flush(timeout);\n }\n return SyncPromise.reject(false);\n}\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function close(timeout) {\n var client = getCurrentHub().getClient();\n if (client) {\n return client.close(timeout);\n }\n return SyncPromise.reject(false);\n}\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\nexport function wrap(fn) {\n return internalWrap(fn)(); // tslint:disable-line:no-unsafe-any\n}\n//# sourceMappingURL=sdk.js.map","import { getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instanciate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(clientClass, options) {\n if (options.debug === true) {\n logger.enable();\n }\n var hub = getCurrentHub();\n var client = new clientClass(options);\n hub.bindClient(client);\n}\n//# sourceMappingURL=sdk.js.map","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_nonIterableRest()}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArrayLimit(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(r=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==a.return||a.return()}finally{if(o)throw i}}return n}function _nonIterableRest(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty},constants={facebook:{domain:\"facebook.com\",url:function(e){return\"https://graph.facebook.com/?id=\".concat(e,\"&fields=og_object{engagement}\")},shareCount:function(e){return e.og_object.engagement.count},popup:{width:640,height:360}},twitter:{domain:\"twitter.com\",url:function(){return null},shareCount:function(){return null},popup:{width:640,height:240}},pinterest:{domain:\"pinterest.com\",url:function(e){return\"https://widgets.pinterest.com/v1/urls/count.json?url=\".concat(e)},shareCount:function(e){return e.count},popup:{width:830,height:700}},github:{domain:\"github.com\",url:function(e,t){return\"https://api.github.com/repos/\".concat(e).concat(is.string(t)?\"?access_token=\".concat(t):\"\")},shareCount:function(e){return e.data.stargazers_count}},youtube:{domain:\"youtube.com\",url:function(e,t){return\"https://www.googleapis.com/youtube/v3/channels?part=statistics&id=\".concat(e,\"&key=\").concat(t)},shareCount:function(e){if(!is.empty(e.error))return null;var t=_slicedToArray(e.items,1)[0];return is.empty(t)?null:t.statistics.subscriberCount}}},defaults={debug:!1,wrapper:{className:\"shr\"},count:{className:\"shr__count\",displayZero:!1,format:!0,position:\"after\",increment:!0},tokens:{github:\"\",youtube:\"\"},storage:{enabled:!0,key:\"shr\",ttl:3e5}};function getJSONP(e){return new Promise(function(t,n){var r=\"jsonp_callback_\".concat(Math.round(1e5*Math.random())),o=document.createElement(\"script\");o.addEventListener(\"error\",function(e){return n(e)}),window[r]=function(e){delete window[r],document.body.removeChild(o),t(e)};var i=new URL(e);i.searchParams.set(\"callback\",r),o.setAttribute(\"src\",i.toString()),document.body.appendChild(o)})}var noop=function(){},Console=function(){function e(){var t=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0];_classCallCheck(this,e),this.enabled=window.console&&t,this.enabled&&this.log(\"Debugging enabled\")}return _createClass(e,[{key:\"log\",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):noop}},{key:\"warn\",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):noop}},{key:\"error\",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):noop}}]),e}();function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function wrap(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var r=0<n?t.cloneNode(!0):t,o=e.parentNode,i=e.nextSibling;r.appendChild(e),i?o.insertBefore(r,i):o.appendChild(r)})}function setAttributes(e,t){!is.element(e)||is.empty(t)||Object.entries(t).filter(function(e){var t=_slicedToArray(e,2)[1];return!is.nullOrUndefined(t)}).forEach(function(t){var n=_slicedToArray(t,2),r=n[0],o=n[1];return e.setAttribute(r,o)})}function createElement(e,t,n){var r=document.createElement(e);return is.object(t)&&setAttributes(r,t),is.string(n)&&(r.innerText=n),r}function formatNumber(e){var t=/\\./.test(1.1.toLocaleString())?\".\":\",\",n=new RegExp(\"\\\\\".concat(t,\"\\\\d+$\"));return Math.round(e).toLocaleString().replace(n,\"\")}function extend(){for(var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(1<t?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(!n.length)return e;var o=n.shift();return is.object(o)?(Object.keys(o).forEach(function(t){is.object(o[t])?(!Object.keys(e).includes(t)&&Object.assign(e,_defineProperty({},t,{})),extend(e[t],o[t])):Object.assign(e,_defineProperty({},t,o[t]))}),extend.apply(void 0,[e].concat(n))):e}var Storage=function(){function e(t,n){var r=!(2<arguments.length&&void 0!==arguments[2])||arguments[2];_classCallCheck(this,e),this.enabled=r&&e.supported,this.key=t,this.ttl=n}return _createClass(e,[{key:\"get\",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(is.empty(n))return null;var r=window.localStorage.getItem(\"\".concat(this.key,\"_ttl\"));if(is.empty(r)||r<Date.now())return null;var o=JSON.parse(n);return is.string(t)&&t.length?o[t]:o}},{key:\"set\",value:function(t){if(e.supported&&this.enabled&&is.object(t)){var n=this.get();is.empty(n)&&(n={}),extend(n,t),window.localStorage.setItem(this.key,JSON.stringify(n)),window.localStorage.setItem(\"\".concat(this.key,\"_ttl\"),Date.now()+this.ttl)}}}],[{key:\"supported\",get:function(){try{return\"localStorage\"in window&&(window.localStorage.setItem(\"___test\",\"___test\"),window.localStorage.removeItem(\"___test\"),!0)}catch(e){return!1}}}]),e}();function getDomain(e){var t=new URL(e).hostname,n=t.split(\".\"),r=n.length;return 2<r&&(t=\"\".concat(n[r-2],\".\").concat(n[r-1]),2===n[r-2].length&&2===n[r-1].length&&(t=\"\".concat(n[r-3],\".\").concat(t))),t}var Shr=function(){function e(t,n){var r=this;_classCallCheck(this,e),this.elements={count:null,trigger:null,popup:null},is.element(t)?this.elements.trigger=t:is.string(t)&&(this.elements.trigger=document.querySelector(t)),is.element(this.elements.trigger)&&is.empty(this.elements.trigger.shr)&&(this.config=extend({},defaults,n,{networks:constants}),this.console=new Console(this.config.debug),this.storage=new Storage(this.config.storage.key,this.config.storage.ttl,this.config.storage.enabled),this.getCount().then(function(e){return r.updateDisplay(e)}).catch(function(){}),this.listeners(!0),this.elements.trigger.shr=this)}return _createClass(e,[{key:\"destroy\",value:function(){this.listeners(!1)}},{key:\"listeners\",value:function(){var e=this,t=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0]?\"addEventListener\":\"removeEventListener\";this.elements.trigger[t](\"click\",function(t){return e.share(t)},!1)}},{key:\"share\",value:function(e){var t=this;this.openPopup(e);var n=this.config.count.increment;this.getCount().then(function(e){return t.updateDisplay(e,n)}).catch(function(){})}},{key:\"openPopup\",value:function(e){if(!is.empty(this.network)&&this.networkConfig.popup){is.event(e)&&e.preventDefault();var t=this.networkConfig.popup,n=t.width,r=t.height,o=\"shr-popup--\".concat(this.network);if(this.popup&&!this.popup.closed)this.popup.focus(),this.console.log(\"Popup re-focused.\");else{var i=void 0===window.screenLeft?window.screen.left:window.screenLeft,s=void 0===window.screenTop?window.screen.top:window.screenTop,a=window.screen.width/2-n/2+i,c=window.screen.height/2-r/2+s;this.popup=window.open(this.href,o,\"top=\".concat(c,\",left=\").concat(a,\",width=\").concat(n,\",height=\").concat(r)),!this.popup||this.popup.closed||!is.boolean(this.popup.closed)?this.console.error(\"Popup blocked.\"):(this.popup.focus(),this.console.log(\"Popup opened.\"))}}}},{key:\"getCount\",value:function(){var e=this,t=!(0<arguments.length&&void 0!==arguments[0])||arguments[0];return new Promise(function(n,r){var o=e.apiUrl;if(is.empty(o))r(new Error(\"No URL available for \".concat(e.network,\".\")));else{if(t){var i=e.storage.get(e.target);if(!is.empty(i)&&Object.keys(i).includes(e.network)){var s=i[e.network];return n(is.number(s)?s:0),void e.console.log(\"getCount for '\".concat(e.target,\"' for '\").concat(e.network,\"' resolved from cache.\"))}}getJSONP(o).then(function(t){var r=0,o=e.elements.trigger.getAttribute(\"data-shr-display\");r=is.empty(o)?e.networkConfig.shareCount(t):t[o],is.empty(r)?r=0:(r=parseInt(r,10),!is.number(r)&&(r=0)),e.storage.set(_defineProperty({},e.target,_defineProperty({},e.network,r))),n(r)}).catch(r)}})}},{key:\"updateDisplay\",value:function(e){var t=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],n=this.config,r=n.count,o=n.wrapper,i=t?e+1:e,s=r.position.toLowerCase();if(0<i||r.displayZero){var a=function(e){return Math.round(i/e*10)/10},c=formatNumber(i);r.format&&(1e6<i?c=\"\".concat(a(1e6),\"M\"):1e3<i&&(c=\"\".concat(a(1e3),\"K\"))),is.element(this.elements.count)?this.elements.count.textContent=c:(wrap(this.elements.trigger,createElement(\"span\",{class:o.className})),this.elements.count=createElement(\"span\",{class:\"\".concat(r.className,\" \").concat(r.className,\"--\").concat(s)},c),this.elements.trigger.insertAdjacentElement(\"after\"===s?\"afterend\":\"beforebegin\",this.elements.count))}}},{key:\"href\",get:function(){return is.element(this.elements.trigger)?this.elements.trigger.href:null}},{key:\"network\",get:function(){var e=this;if(!is.element(this.elements.trigger))return null;var t=this.config.networks;return Object.keys(t).find(function(n){return getDomain(e.href)===t[n].domain})}},{key:\"networkConfig\",get:function(){return is.empty(this.network)?null:this.config.networks[this.network]}},{key:\"target\",get:function(){if(is.empty(this.network))return null;var e=new URL(this.href);switch(this.network){case\"facebook\":return e.searchParams.get(\"u\");case\"github\":return e.pathname.substring(1);case\"youtube\":return e.pathname.split(\"/\").pop();default:return e.searchParams.get(\"url\")}}},{key:\"apiUrl\",get:function(){if(is.empty(this.network))return null;var e=this.config.tokens;switch(this.network){case\"github\":return this.networkConfig.url(this.target,e.github);case\"youtube\":return this.networkConfig.url(this.target,e.youtube);default:return this.networkConfig.url(encodeURIComponent(this.target))}}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.string(t)?r=Array.from(document.querySelectorAll(t)):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var o=Object.assign({},defaults,n);is.string(t)&&o.watch&&new MutationObserver(function(n){Array.from(n).forEach(function(n){Array.from(n.addedNodes).forEach(function(n){is.element(n)&&matches(n,t)&&new e(n,o)})})}).observe(document.body,{childList:!0,subtree:!0});return r.map(function(t){return new e(t,n)})}}]),e}();export default Shr;","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\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 toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\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 (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.7.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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 bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var anObject = require('../internals/an-object');\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n","module.exports = {};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? 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 ? ObjectPrototype : null;\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\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","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","'use strict';\nvar redefineAll = require('../internals/redefine-all');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar $has = require('../internals/has');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && $has(data, state.id) && delete data[state.id];\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && $has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","'use strict';\nvar global = require('../internals/global');\nvar redefineAll = require('../internals/redefine-all');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceIternalState = require('../internals/internal-state').enforce;\nvar NATIVE_WEAK_MAP = require('../internals/native-weak-map');\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar $every = require('../internals/array-iteration').every;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('every');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var classof = require('../internals/classof-raw');\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nmodule.exports = function (value) {\n if (typeof value != 'number' && classof(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toInteger = require('../internals/to-integer');\nvar thisNumberValue = require('../internals/this-number-value');\nvar repeat = require('../internals/string-repeat');\nvar fails = require('../internals/fails');\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor = Math.floor;\n\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n$({ target: 'Number', proto: true, forced: FORCED }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow(2, 69, 1)) - 69;\n z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + repeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + repeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\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 nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n }\n});\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","var $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar ownKeys = require('../internals/own-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar createProperty = require('../internals/create-property');\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(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 (\n global.addEventListener &&\n typeof postMessage == 'function' &&\n !global.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!IS_IOS && !IS_NODE && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\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 promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(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\nmodule.exports = queueMicrotask || 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","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can 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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\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 $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\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 var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (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\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/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","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 isEdge: window.navigator.userAgent.includes('Edge'),\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","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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","var $ = require('../internals/export');\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.github.io/ecma262/#sec-math.trunc\n$({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor : ceil)(it);\n }\n});\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = (value) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.3/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n\n 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\n // Toggle button and fire events\n this.onChange();\n }\n\n // Trap focus inside container\n trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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","// `Math.sign` method implementation\n// https://tc39.github.io/ecma262/#sec-math.sign\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","var $ = require('../internals/export');\nvar sign = require('../internals/math-sign');\n\n// `Math.sign` method\n// https://tc39.github.io/ecma262/#sec-math.sign\n$({ target: 'Math', stat: true }, {\n sign: sign\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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', 'autoplay,fullscreen,picture-in-picture');\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready() {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","'use strict';\nvar $ = require('../internals/export');\nvar $findIndex = require('../internals/array-iteration').findIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","var $ = require('../internals/export');\nvar lastIndexOf = require('../internals/array-last-index-of');\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: lastIndexOf\n});\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\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.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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 {Boolean} 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 * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n","const sources = {\n video: {\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 previewThumbnails: {\n src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt'],\n },\n },\n audio: {\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 youtube: {\n type: 'video',\n sources: [\n {\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n },\n ],\n },\n vimeo: {\n type: 'video',\n sources: [\n {\n src: 'https://vimeo.com/40648169',\n provider: 'vimeo',\n },\n ],\n },\n};\n\nexport default sources;\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 './tab-focus';\nimport 'custom-event-polyfill';\nimport 'url-polyfill';\n\nimport * as Sentry from '@sentry/browser';\nimport Shr from 'shr-buttons';\n\nimport Plyr from '../../../src/js/plyr';\nimport sources from './sources';\nimport toggleClass from './toggle-class';\n\n(() => {\n const production = 'plyr.io';\n\n // Sentry for demo site (https://plyr.io) only\n if (window.location.host === production) {\n Sentry.init({\n dsn: 'https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555',\n whitelistUrls: [production].map((d) => new RegExp(`https://(([a-z0-9])+(.))*${d}`)),\n });\n }\n\n document.addEventListener('DOMContentLoaded', () => {\n const selector = '#player';\n\n // Setup share buttons\n Shr.setup('.js-shr', {\n count: {\n className: 'button__count',\n },\n wrapper: {\n className: 'button--with-count',\n },\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/demo.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n ads: {\n enabled: window.location.host.includes(production),\n publisherId: '918848828995742',\n },\n previewThumbnails: {\n enabled: true,\n src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt'],\n },\n vimeo: {\n // Prevent Vimeo blocking plyr.io demo site\n referrerPolicy: 'no-referrer',\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 = Object.keys(sources);\n const historySupport = Boolean(window.history && window.history.pushState);\n let currentType = window.location.hash.substring(1);\n const hasInitialType = currentType.length;\n\n function render(type) {\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 // eslint-disable-next-line no-param-reassign\n cite.hidden = true;\n });\n\n document.querySelector(`.plyr__cite--${type}`).hidden = false;\n }\n\n // Set a new source\n function setSource(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 (!types.includes(type) || (!init && type === currentType) || (!currentType.length && type === 'video')) {\n return;\n }\n\n // Set the new source\n player.source = sources[type];\n\n // Set the current type for next time\n currentType = type;\n\n render(type);\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 setSource(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 && Object.keys(event.state).includes('type')) {\n setSource(event.state.type);\n }\n });\n\n // If there's no current type set, assume video\n if (!hasInitialType) {\n currentType = 'video';\n }\n\n // Replace current history state\n if (historySupport && types.includes(currentType)) {\n window.history.replaceState({ type: currentType }, '', hasInitialType ? `#${currentType}` : '');\n }\n\n // If it's not video, load the source\n if (currentType !== 'video') {\n setSource(currentType, true);\n }\n\n render(currentType);\n });\n})();\n","// Toggle class on an element\nconst toggleClass = (element, className = '', toggle = false) =>\n element && element.classList[toggle ? 'add' : 'remove'](className);\n\nexport default toggleClass;\n"]} \ No newline at end of file
+{"version":3,"sources":["demo.js","demo/node_modules/core-js/internals/global.js","demo/node_modules/core-js/internals/fails.js","demo/node_modules/core-js/internals/descriptors.js","demo/node_modules/core-js/internals/object-property-is-enumerable.js","demo/node_modules/core-js/internals/create-property-descriptor.js","demo/node_modules/core-js/internals/classof-raw.js","demo/node_modules/core-js/internals/indexed-object.js","demo/node_modules/core-js/internals/require-object-coercible.js","demo/node_modules/core-js/internals/to-indexed-object.js","demo/node_modules/core-js/internals/is-object.js","demo/node_modules/core-js/internals/to-primitive.js","demo/node_modules/core-js/internals/has.js","demo/node_modules/core-js/internals/document-create-element.js","demo/node_modules/core-js/internals/ie8-dom-define.js","demo/node_modules/core-js/internals/object-get-own-property-descriptor.js","demo/node_modules/core-js/internals/an-object.js","demo/node_modules/core-js/internals/object-define-property.js","demo/node_modules/core-js/internals/create-non-enumerable-property.js","demo/node_modules/core-js/internals/set-global.js","demo/node_modules/core-js/internals/shared-store.js","demo/node_modules/core-js/internals/inspect-source.js","demo/node_modules/core-js/internals/internal-state.js","demo/node_modules/core-js/internals/native-weak-map.js","demo/node_modules/core-js/internals/shared.js","demo/node_modules/core-js/internals/uid.js","demo/node_modules/core-js/internals/shared-key.js","demo/node_modules/core-js/internals/hidden-keys.js","demo/node_modules/core-js/internals/redefine.js","demo/node_modules/core-js/internals/path.js","demo/node_modules/core-js/internals/get-built-in.js","demo/node_modules/core-js/internals/to-integer.js","demo/node_modules/core-js/internals/to-length.js","demo/node_modules/core-js/internals/to-absolute-index.js","demo/node_modules/core-js/internals/array-includes.js","demo/node_modules/core-js/internals/object-keys-internal.js","demo/node_modules/core-js/internals/enum-bug-keys.js","demo/node_modules/core-js/internals/object-get-own-property-names.js","demo/node_modules/core-js/internals/object-get-own-property-symbols.js","demo/node_modules/core-js/internals/own-keys.js","demo/node_modules/core-js/internals/copy-constructor-properties.js","demo/node_modules/core-js/internals/is-forced.js","demo/node_modules/core-js/internals/export.js","demo/node_modules/core-js/internals/a-function.js","demo/node_modules/core-js/internals/function-bind-context.js","demo/node_modules/core-js/internals/to-object.js","demo/node_modules/core-js/internals/is-array.js","demo/node_modules/core-js/internals/native-symbol.js","demo/node_modules/core-js/internals/use-symbol-as-uid.js","demo/node_modules/core-js/internals/well-known-symbol.js","demo/node_modules/core-js/internals/array-species-create.js","demo/node_modules/core-js/internals/array-iteration.js","demo/node_modules/core-js/internals/array-method-is-strict.js","demo/node_modules/core-js/internals/array-method-uses-to-length.js","demo/node_modules/core-js/internals/array-for-each.js","demo/node_modules/core-js/modules/es.array.for-each.js","demo/node_modules/core-js/internals/call-with-safe-iteration-closing.js","demo/node_modules/core-js/internals/iterators.js","demo/node_modules/core-js/internals/is-array-iterator-method.js","demo/node_modules/core-js/internals/create-property.js","demo/node_modules/core-js/internals/to-string-tag-support.js","demo/node_modules/core-js/internals/classof.js","demo/node_modules/core-js/internals/get-iterator-method.js","demo/node_modules/core-js/internals/array-from.js","demo/node_modules/core-js/internals/check-correctness-of-iteration.js","demo/node_modules/core-js/modules/es.array.from.js","demo/node_modules/core-js/internals/object-keys.js","demo/node_modules/core-js/internals/object-create.js","demo/node_modules/core-js/internals/object-define-properties.js","demo/node_modules/core-js/internals/html.js","demo/node_modules/core-js/internals/add-to-unscopables.js","demo/node_modules/core-js/modules/es.array.includes.js","demo/node_modules/core-js/internals/engine-user-agent.js","demo/node_modules/core-js/internals/engine-v8-version.js","demo/node_modules/core-js/internals/array-method-has-species-support.js","demo/node_modules/core-js/modules/es.array.map.js","demo/node_modules/core-js/modules/es.object.keys.js","demo/node_modules/core-js/internals/a-possible-prototype.js","demo/node_modules/core-js/internals/object-set-prototype-of.js","demo/node_modules/core-js/internals/inherit-if-required.js","demo/node_modules/core-js/internals/is-regexp.js","demo/node_modules/core-js/internals/regexp-flags.js","demo/node_modules/core-js/internals/regexp-sticky-helpers.js","demo/node_modules/core-js/internals/set-species.js","demo/node_modules/core-js/modules/es.regexp.constructor.js","demo/node_modules/core-js/internals/regexp-exec.js","demo/node_modules/core-js/modules/es.regexp.exec.js","demo/node_modules/core-js/modules/es.regexp.to-string.js","demo/node_modules/core-js/internals/not-a-regexp.js","demo/node_modules/core-js/internals/correct-is-regexp-logic.js","demo/node_modules/core-js/modules/es.string.includes.js","demo/node_modules/core-js/internals/string-multibyte.js","demo/node_modules/core-js/internals/iterators-core.js","demo/node_modules/core-js/internals/correct-prototype-getter.js","demo/node_modules/core-js/internals/object-get-prototype-of.js","demo/node_modules/core-js/internals/set-to-string-tag.js","demo/node_modules/core-js/internals/create-iterator-constructor.js","demo/node_modules/core-js/internals/define-iterator.js","demo/node_modules/core-js/modules/es.string.iterator.js","demo/node_modules/core-js/internals/dom-iterables.js","demo/node_modules/core-js/modules/web.dom-collections.for-each.js","demo/src/js/tab-focus.js","demo/node_modules/custom-event-polyfill/polyfill.js","demo/node_modules/core-js/internals/object-get-own-property-names-external.js","demo/node_modules/core-js/internals/well-known-symbol-wrapped.js","demo/node_modules/core-js/internals/define-well-known-symbol.js","demo/node_modules/core-js/modules/es.symbol.js","demo/node_modules/core-js/modules/es.symbol.description.js","demo/node_modules/core-js/modules/es.symbol.iterator.js","demo/node_modules/core-js/modules/es.array.index-of.js","demo/node_modules/core-js/modules/es.array.iterator.js","demo/node_modules/core-js/modules/es.array.join.js","demo/node_modules/core-js/modules/es.array.slice.js","demo/node_modules/core-js/internals/object-to-string.js","demo/node_modules/core-js/modules/es.object.to-string.js","demo/node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","demo/node_modules/core-js/internals/advance-string-index.js","demo/node_modules/core-js/internals/regexp-exec-abstract.js","demo/node_modules/core-js/modules/es.string.replace.js","demo/node_modules/core-js/internals/same-value.js","demo/node_modules/core-js/modules/es.string.search.js","demo/node_modules/core-js/internals/species-constructor.js","demo/node_modules/core-js/modules/es.string.split.js","demo/node_modules/core-js/modules/web.dom-collections.iterator.js","demo/node_modules/core-js/internals/native-url.js","demo/node_modules/core-js/internals/an-instance.js","demo/node_modules/core-js/internals/object-assign.js","demo/node_modules/core-js/internals/string-punycode-to-ascii.js","demo/node_modules/core-js/internals/redefine-all.js","demo/node_modules/core-js/internals/get-iterator.js","demo/node_modules/core-js/modules/web.url-search-params.js","demo/node_modules/core-js/modules/web.url.js","demo/node_modules/url-polyfill/url-polyfill.js","demo/node_modules/core-js/modules/es.symbol.async-iterator.js","demo/node_modules/core-js/modules/es.array.concat.js","demo/node_modules/core-js/modules/es.object.assign.js","demo/node_modules/core-js/modules/es.object.get-own-property-descriptor.js","demo/node_modules/core-js/internals/native-promise-constructor.js","demo/node_modules/core-js/internals/task.js","demo/node_modules/core-js/internals/iterate.js","demo/node_modules/core-js/internals/engine-is-ios.js","demo/node_modules/core-js/internals/microtask.js","demo/node_modules/core-js/modules/es.promise.js","demo/node_modules/core-js/internals/new-promise-capability.js","demo/node_modules/core-js/internals/promise-resolve.js","demo/node_modules/core-js/internals/perform.js","demo/node_modules/core-js/internals/host-report-errors.js","demo/node_modules/tslib/tslib.es6.js","demo/node_modules/@sentry/types/esm/severity.js","demo/node_modules/@sentry/types/esm/status.js","demo/node_modules/core-js/modules/es.function.name.js","demo/node_modules/@sentry/utils/esm/polyfill.js","demo/node_modules/@sentry/utils/esm/error.js","demo/node_modules/@sentry/utils/esm/is.js","demo/node_modules/core-js/modules/es.string.match.js","demo/node_modules/core-js/internals/array-buffer-native.js","demo/node_modules/core-js/internals/array-buffer-view-core.js","demo/node_modules/core-js/internals/typed-array-constructors-require-wrappers.js","demo/node_modules/core-js/internals/to-index.js","demo/node_modules/core-js/internals/ieee754.js","demo/node_modules/core-js/internals/array-fill.js","demo/node_modules/core-js/internals/array-buffer.js","demo/node_modules/core-js/internals/to-offset.js","demo/node_modules/core-js/internals/to-positive-integer.js","demo/node_modules/core-js/internals/typed-array-from.js","demo/node_modules/core-js/internals/typed-array-constructor.js","demo/node_modules/core-js/modules/es.typed-array.uint16-array.js","demo/node_modules/core-js/internals/array-copy-within.js","demo/node_modules/core-js/modules/es.typed-array.copy-within.js","demo/node_modules/core-js/modules/es.typed-array.every.js","demo/node_modules/core-js/modules/es.typed-array.fill.js","demo/node_modules/core-js/modules/es.typed-array.filter.js","demo/node_modules/core-js/modules/es.typed-array.find.js","demo/node_modules/core-js/modules/es.typed-array.find-index.js","demo/node_modules/core-js/modules/es.typed-array.for-each.js","demo/node_modules/core-js/modules/es.typed-array.includes.js","demo/node_modules/core-js/modules/es.typed-array.index-of.js","demo/node_modules/core-js/modules/es.typed-array.iterator.js","demo/node_modules/core-js/modules/es.typed-array.join.js","demo/node_modules/core-js/internals/array-last-index-of.js","demo/node_modules/core-js/modules/es.typed-array.last-index-of.js","demo/node_modules/core-js/modules/es.typed-array.map.js","demo/node_modules/core-js/internals/array-reduce.js","demo/node_modules/core-js/modules/es.typed-array.reduce.js","demo/node_modules/core-js/modules/es.typed-array.reduce-right.js","demo/node_modules/core-js/modules/es.typed-array.reverse.js","demo/node_modules/core-js/modules/es.typed-array.set.js","demo/node_modules/core-js/modules/es.typed-array.slice.js","demo/node_modules/core-js/modules/es.typed-array.some.js","demo/node_modules/core-js/modules/es.typed-array.sort.js","demo/node_modules/core-js/modules/es.typed-array.subarray.js","demo/node_modules/core-js/modules/es.typed-array.to-locale-string.js","demo/node_modules/core-js/modules/es.typed-array.to-string.js","demo/node_modules/@sentry/utils/esm/string.js","demo/node_modules/@sentry/utils/esm/misc.js","demo/node_modules/@sentry/utils/esm/logger.js","demo/node_modules/core-js/modules/es.array.splice.js","demo/node_modules/core-js/internals/freezing.js","demo/node_modules/core-js/internals/internal-metadata.js","demo/node_modules/core-js/internals/collection-weak.js","demo/node_modules/core-js/internals/collection.js","demo/node_modules/core-js/modules/es.weak-set.js","demo/node_modules/@sentry/utils/esm/memo.js","demo/node_modules/@sentry/utils/esm/object.js","demo/node_modules/core-js/modules/web.url.to-json.js","demo/node_modules/core-js/modules/es.array.filter.js","demo/node_modules/core-js/modules/es.promise.finally.js","demo/node_modules/@sentry/utils/esm/syncpromise.js","demo/node_modules/@sentry/utils/esm/promisebuffer.js","demo/node_modules/@sentry/utils/esm/supports.js","demo/node_modules/@sentry/utils/esm/instrument.js","demo/node_modules/@sentry/utils/esm/dsn.js","demo/node_modules/@sentry/hub/esm/scope.js","demo/node_modules/@sentry/hub/esm/hub.js","demo/node_modules/@sentry/minimal/esm/index.js","demo/node_modules/@sentry/core/esm/api.js","demo/node_modules/@sentry/core/esm/integration.js","demo/node_modules/@sentry/core/esm/baseclient.js","demo/node_modules/@sentry/core/esm/integrations/functiontostring.js","demo/node_modules/@sentry/core/esm/transports/noop.js","demo/node_modules/@sentry/core/esm/basebackend.js","demo/node_modules/@sentry/core/esm/request.js","demo/node_modules/core-js/modules/es.array.some.js","demo/node_modules/@sentry/core/esm/integrations/inboundfilters.js","demo/node_modules/@sentry/browser/esm/tracekit.js","demo/node_modules/@sentry/browser/esm/parsers.js","demo/node_modules/@sentry/browser/esm/eventbuilder.js","demo/node_modules/@sentry/browser/esm/transports/base.js","demo/node_modules/@sentry/browser/esm/transports/fetch.js","demo/node_modules/@sentry/browser/esm/transports/xhr.js","demo/node_modules/@sentry/browser/esm/backend.js","demo/node_modules/@sentry/browser/esm/helpers.js","demo/node_modules/@sentry/browser/esm/integrations/globalhandlers.js","demo/node_modules/@sentry/browser/esm/integrations/trycatch.js","demo/node_modules/@sentry/browser/esm/integrations/breadcrumbs.js","demo/node_modules/@sentry/browser/esm/integrations/linkederrors.js","demo/node_modules/@sentry/browser/esm/integrations/useragent.js","demo/node_modules/@sentry/browser/esm/version.js","demo/node_modules/@sentry/browser/esm/client.js","demo/node_modules/@sentry/browser/esm/sdk.js","demo/node_modules/@sentry/core/esm/sdk.js","demo/node_modules/core-js/modules/es.array.find.js","demo/node_modules/core-js/internals/whitespaces.js","demo/node_modules/core-js/internals/string-trim.js","demo/node_modules/core-js/modules/es.number.constructor.js","demo/node_modules/core-js/modules/es.number.is-nan.js","demo/node_modules/core-js/internals/object-to-array.js","demo/node_modules/core-js/modules/es.object.entries.js","demo/node_modules/shr-buttons/dist/shr.mjs","node_modules/core-js/internals/global.js","node_modules/core-js/internals/fails.js","node_modules/core-js/internals/descriptors.js","node_modules/core-js/internals/object-property-is-enumerable.js","node_modules/core-js/internals/create-property-descriptor.js","node_modules/core-js/internals/classof-raw.js","node_modules/core-js/internals/indexed-object.js","node_modules/core-js/internals/require-object-coercible.js","node_modules/core-js/internals/to-indexed-object.js","node_modules/core-js/internals/is-object.js","node_modules/core-js/internals/to-primitive.js","node_modules/core-js/internals/has.js","node_modules/core-js/internals/document-create-element.js","node_modules/core-js/internals/ie8-dom-define.js","node_modules/core-js/internals/object-get-own-property-descriptor.js","node_modules/core-js/internals/an-object.js","node_modules/core-js/internals/object-define-property.js","node_modules/core-js/internals/create-non-enumerable-property.js","node_modules/core-js/internals/set-global.js","node_modules/core-js/internals/shared-store.js","node_modules/core-js/internals/inspect-source.js","node_modules/core-js/internals/internal-state.js","node_modules/core-js/internals/native-weak-map.js","node_modules/core-js/internals/shared.js","node_modules/core-js/internals/uid.js","node_modules/core-js/internals/shared-key.js","node_modules/core-js/internals/hidden-keys.js","node_modules/core-js/internals/engine-v8-version.js","node_modules/core-js/internals/redefine.js","node_modules/core-js/internals/path.js","node_modules/core-js/internals/get-built-in.js","node_modules/core-js/internals/to-integer.js","node_modules/core-js/internals/to-length.js","node_modules/core-js/internals/to-absolute-index.js","node_modules/core-js/internals/array-includes.js","node_modules/core-js/internals/object-keys-internal.js","node_modules/core-js/internals/enum-bug-keys.js","node_modules/core-js/internals/object-get-own-property-names.js","node_modules/core-js/internals/object-get-own-property-symbols.js","node_modules/core-js/internals/own-keys.js","node_modules/core-js/internals/copy-constructor-properties.js","node_modules/core-js/internals/is-forced.js","node_modules/core-js/internals/export.js","node_modules/core-js/internals/is-array.js","node_modules/core-js/internals/to-object.js","node_modules/core-js/internals/create-property.js","node_modules/core-js/internals/native-symbol.js","node_modules/core-js/internals/use-symbol-as-uid.js","node_modules/core-js/internals/well-known-symbol.js","node_modules/core-js/internals/array-species-create.js","node_modules/core-js/internals/engine-user-agent.js","node_modules/core-js/internals/array-method-has-species-support.js","node_modules/core-js/modules/es.array.concat.js","node_modules/core-js/internals/a-function.js","node_modules/core-js/internals/function-bind-context.js","node_modules/core-js/internals/array-iteration.js","node_modules/core-js/internals/array-method-uses-to-length.js","node_modules/core-js/modules/es.array.filter.js","node_modules/core-js/internals/object-keys.js","node_modules/core-js/internals/object-create.js","node_modules/core-js/internals/object-define-properties.js","node_modules/core-js/internals/html.js","node_modules/core-js/internals/add-to-unscopables.js","node_modules/core-js/modules/es.array.find.js","node_modules/core-js/internals/iterator-close.js","node_modules/core-js/internals/call-with-safe-iteration-closing.js","node_modules/core-js/internals/iterators.js","node_modules/core-js/internals/is-array-iterator-method.js","node_modules/core-js/internals/to-string-tag-support.js","node_modules/core-js/internals/classof.js","node_modules/core-js/internals/get-iterator-method.js","node_modules/core-js/internals/array-from.js","node_modules/core-js/internals/check-correctness-of-iteration.js","node_modules/core-js/modules/es.array.from.js","node_modules/core-js/modules/es.array.includes.js","node_modules/core-js/internals/correct-prototype-getter.js","node_modules/core-js/internals/iterators-core.js","node_modules/core-js/internals/object-get-prototype-of.js","node_modules/core-js/internals/set-to-string-tag.js","node_modules/core-js/internals/create-iterator-constructor.js","node_modules/core-js/internals/object-set-prototype-of.js","node_modules/core-js/internals/a-possible-prototype.js","node_modules/core-js/internals/define-iterator.js","node_modules/core-js/modules/es.array.iterator.js","node_modules/core-js/internals/array-method-is-strict.js","node_modules/core-js/modules/es.array.join.js","node_modules/core-js/modules/es.array.map.js","node_modules/core-js/internals/inherit-if-required.js","node_modules/core-js/internals/whitespaces.js","node_modules/core-js/internals/string-trim.js","node_modules/core-js/modules/es.number.constructor.js","node_modules/core-js/modules/es.object.keys.js","node_modules/core-js/internals/object-to-string.js","node_modules/core-js/modules/es.object.to-string.js","node_modules/core-js/internals/object-to-array.js","node_modules/core-js/modules/es.object.values.js","node_modules/core-js/internals/regexp-flags.js","node_modules/core-js/internals/regexp-sticky-helpers.js","node_modules/core-js/internals/regexp-exec.js","node_modules/core-js/modules/es.regexp.exec.js","node_modules/core-js/modules/es.regexp.to-string.js","node_modules/core-js/internals/is-regexp.js","node_modules/core-js/internals/not-a-regexp.js","node_modules/core-js/internals/correct-is-regexp-logic.js","node_modules/core-js/modules/es.string.includes.js","node_modules/core-js/internals/string-multibyte.js","node_modules/core-js/modules/es.string.iterator.js","node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","node_modules/core-js/internals/same-value.js","node_modules/core-js/internals/regexp-exec-abstract.js","node_modules/core-js/modules/es.string.search.js","node_modules/core-js/internals/redefine-all.js","node_modules/core-js/internals/freezing.js","node_modules/core-js/internals/internal-metadata.js","node_modules/core-js/internals/iterate.js","node_modules/core-js/internals/an-instance.js","node_modules/core-js/internals/collection-weak.js","node_modules/core-js/internals/dom-iterables.js","node_modules/core-js/modules/es.weak-map.js","node_modules/core-js/internals/collection.js","node_modules/core-js/modules/web.dom-collections.iterator.js","node_modules/core-js/modules/es.array.every.js","node_modules/core-js/internals/array-for-each.js","node_modules/core-js/modules/es.array.for-each.js","node_modules/core-js/modules/es.array.index-of.js","node_modules/core-js/internals/object-assign.js","node_modules/core-js/modules/es.object.assign.js","node_modules/core-js/internals/species-constructor.js","node_modules/core-js/internals/advance-string-index.js","node_modules/core-js/modules/es.string.split.js","node_modules/core-js/internals/string-trim-forced.js","node_modules/core-js/modules/es.string.trim.js","node_modules/core-js/modules/web.dom-collections.for-each.js","node_modules/core-js/internals/native-url.js","node_modules/core-js/internals/string-punycode-to-ascii.js","node_modules/core-js/internals/get-iterator.js","node_modules/core-js/modules/web.url-search-params.js","node_modules/core-js/modules/web.url.js","node_modules/core-js/modules/es.array.some.js","node_modules/core-js/internals/this-number-value.js","node_modules/core-js/internals/string-repeat.js","node_modules/core-js/modules/es.number.to-fixed.js","node_modules/core-js/modules/es.object.entries.js","node_modules/core-js/modules/es.string.replace.js","node_modules/core-js/internals/object-get-own-property-names-external.js","node_modules/core-js/internals/well-known-symbol-wrapped.js","node_modules/core-js/internals/define-well-known-symbol.js","node_modules/core-js/modules/es.symbol.js","node_modules/core-js/modules/es.number.is-nan.js","node_modules/core-js/modules/es.object.get-own-property-descriptor.js","node_modules/rangetouch/dist/rangetouch.mjs","node_modules/core-js/modules/es.object.get-own-property-descriptors.js","node_modules/core-js/modules/es.string.match.js","node_modules/core-js/internals/task.js","node_modules/core-js/internals/native-promise-constructor.js","node_modules/core-js/internals/set-species.js","node_modules/core-js/internals/engine-is-ios.js","node_modules/core-js/internals/engine-is-node.js","node_modules/core-js/internals/microtask.js","node_modules/core-js/modules/es.promise.js","node_modules/core-js/internals/new-promise-capability.js","node_modules/core-js/internals/promise-resolve.js","node_modules/core-js/internals/perform.js","node_modules/core-js/internals/host-report-errors.js","node_modules/core-js/modules/es.string.starts-with.js","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","node_modules/core-js/internals/array-reduce.js","node_modules/core-js/modules/es.array.reduce.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","node_modules/core-js/modules/es.array.slice.js","node_modules/core-js/modules/es.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/load-sprite.js","node_modules/core-js/modules/es.math.trunc.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/internals/math-sign.js","src/js/utils/load-image.js","node_modules/core-js/modules/es.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es.array.splice.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","node_modules/core-js/modules/es.array.find-index.js","node_modules/core-js/internals/array-last-index-of.js","node_modules/core-js/modules/es.array.last-index-of.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js","src/js/utils/numbers.js","demo/src/js/sources.js","demo/src/js/demo.js","demo/src/js/toggle-class.js"],"names":["navigator","commonjsGlobal","globalThis","window","global","self","createCommonjsModule","fn","module","exports","check","it","Math","global_1","Function","fails","exec","error","descriptors","Object","defineProperty","get","nativePropertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor","objectPropertyIsEnumerable","f","call","1","V","descriptor","this","enumerable","createPropertyDescriptor","bitmap","value","configurable","writable","toString","classofRaw","slice","split","indexedObject","classof","requireObjectCoercible","undefined","TypeError","toIndexedObject","IndexedObject","isObject","toPrimitive","input","PREFERRED_STRING","val","valueOf","hasOwnProperty","has","key","document","EXISTS","createElement","documentCreateElement","ie8DomDefine","DESCRIPTORS","a","nativeGetOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","O","P","IE8_DOM_DEFINE","propertyIsEnumerableModule","anObject","String","nativeDefineProperty","objectDefineProperty","Attributes","createNonEnumerableProperty","object","definePropertyModule","setGlobal","SHARED","sharedStore","functionToString","store","inspectSource","set","WeakMap","nativeWeakMap","test","shared","push","version","mode","copyright","id","postfix","random","uid","keys","sharedKey","hiddenKeys","NATIVE_WEAK_MAP","wmget","wmhas","wmset","metadata","STATE","objectHas","internalState","enforce","getterFor","TYPE","state","type","redefine","getInternalState","InternalStateModule","enforceInternalState","TEMPLATE","options","unsafe","simple","noTargetGet","source","join","prototype","path","aFunction","variable","getBuiltIn","namespace","method","arguments","length","ceil","floor","toInteger","argument","isNaN","min","toLength","max","toAbsoluteIndex","index","integer","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayIncludes","includes","indexOf","require$$0","objectKeysInternal","names","i","result","enumBugKeys","concat","objectGetOwnPropertyNames","getOwnPropertyNames","internalObjectKeys","objectGetOwnPropertySymbols","getOwnPropertySymbols","ownKeys","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","copyConstructorProperties","target","getOwnPropertyDescriptorModule","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","replace","toLowerCase","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","sham","aFunction$1","functionBindContext","that","b","c","apply","toObject","isArray","Array","arg","nativeSymbol","Symbol","useSymbolAsUid","NATIVE_SYMBOL","iterator","WellKnownSymbolsStore","createWellKnownSymbol","USE_SYMBOL_AS_UID","withoutSetter","wellKnownSymbol","name","SPECIES","arraySpeciesCreate","originalArray","C","constructor","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","callbackfn","specificCreate","boundFunction","bind","create","arrayIteration","forEach","map","filter","some","every","find","findIndex","arrayMethodIsStrict","METHOD_NAME","cache","thrower","arrayMethodUsesToLength","ACCESSORS","argument0","argument1","$forEach","STRICT_METHOD","USES_TO_LENGTH","arrayForEach","$","proto","callWithSafeIterationClosing","ENTRIES","returnMethod","iterators","ITERATOR","ArrayPrototype","isArrayIteratorMethod","Iterators","createProperty","propertyKey","toStringTagSupport","TO_STRING_TAG","CORRECT_ARGUMENTS","TO_STRING_TAG_SUPPORT","tag","tryGet","callee","getIteratorMethod","arrayFrom","arrayLike","step","next","argumentsLength","mapfn","mapping","iteratorMethod","done","SAFE_CLOSING","called","iteratorWithReturn","return","from","checkCorrectnessOfIteration","SKIP_CLOSING","ITERATION_SUPPORT","INCORRECT_ITERATION","iterable","activeXDocument","objectKeys","objectDefineProperties","defineProperties","Properties","html","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObject","domain","ActiveXObject","iframeDocument","iframe","write","close","temp","parentWindow","NullProtoObjectViaActiveX","style","display","appendChild","src","contentWindow","open","F","objectCreate","UNSCOPABLES","addToUnscopables","$includes","match","engineUserAgent","process","versions","v8","userAgent","engineV8Version","arrayMethodHasSpeciesSupport","V8_VERSION","array","foo","Boolean","$map","HAS_SPECIES_SUPPORT","FAILS_ON_PRIMITIVES","nativeKeys","objectSetPrototypeOf","setPrototypeOf","setter","CORRECT_SETTER","aPossiblePrototype","__proto__","inheritIfRequired","dummy","Wrapper","NewTarget","NewTargetPrototype","MATCH","isRegexp","isRegExp","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","s","RegExp","regexpStickyHelpers","UNSUPPORTED_Y","re","lastIndex","BROKEN_CARET","setSpecies","CONSTRUCTOR_NAME","Constructor","require$$1","setInternalState","require$$2","NativeRegExp","RegExpPrototype","re1","re2","CORRECT_NEW","stickyHelpers","RegExpWrapper","pattern","flags","thisIsRegExp","patternIsRegExp","flagsAreUndefined","getFlags","proxy","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","NPCG_INCLUDED","str","reCopy","charsAdded","strCopy","regexpExec","TO_STRING","nativeToString","NOT_GENERIC","INCORRECT_NAME","R","p","rf","notARegexp","regexp","e","correctIsRegExpLogic","searchString","notARegExp","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","CONVERT_TO_STRING","pos","first","second","S","position","size","charCodeAt","charAt","stringMultibyte","codeAt","correctPrototypeGetter","getPrototypeOf","ObjectPrototype","objectGetPrototypeOf","CORRECT_PROTOTYPE_GETTER","BUGGY_SAFARI_ITERATORS","iteratorsCore","setToStringTag","TAG","returnThis","createIteratorConstructor","IteratorConstructor","NAME","IteratorsCore","KEYS","VALUES","defineIterator","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","entries","values","STRING_ITERATOR","iterated","point","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","COLLECTION_NAME","DOMIterables","Collection","CollectionPrototype","container","getElementById","tabClassName","addEventListener","event","classList","contains","remove","keyCode","setTimeout","focused","activeElement","add","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","params","evt","origPrevent","bubbles","createEvent","initCustomEvent","detail","Event","nativeGetOwnPropertyNames","windowNames","objectGetOwnPropertyNamesExternal","getWindowNames","wellKnownSymbolWrapped","defineWellKnownSymbol","wrappedWellKnownSymbolModule","HIDDEN","SYMBOL","TO_PRIMITIVE","$Symbol","$stringify","getOwnPropertyNamesExternal","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","QObject","USE_SETTER","findChild","setSymbolDescriptor","nativeObjectCreate","ObjectPrototypeDescriptor","wrap","description","symbol","isSymbol","$defineProperty","$defineProperties","properties","$getOwnPropertySymbols","$propertyIsEnumerable","$getOwnPropertyDescriptor","$getOwnPropertyNames","IS_OBJECT_PROTOTYPE","for","keyFor","sym","useSetter","useSimple","FORCED_JSON_STRINGIFY","stringify","replacer","space","$replacer","args","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","symbolPrototype","symbolToString","native","desc","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","ARRAY_ITERATOR","es_array_iterator","kind","Arguments","nativeJoin","ES3_STRINGS","separator","0","nativeSlice","start","end","n","k","fin","objectToString","REPLACE_SUPPORTS_NAMED_GROUPS","groups","REPLACE_KEEPS_$0","REPLACE","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","fixRegexpWellKnownSymbolLogic","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","stringMethod","regexMethod","advanceStringIndex","regexpExecAbstract","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","fixRegExpWellKnownSymbolLogic","maybeCallNative","reason","UNSAFE_SUBSTITUTE","searchValue","replaceValue","res","rx","functionalReplace","fullUnicode","results","regExpExec","accumulatedResult","nextSourcePosition","matched","captures","j","namedCaptures","replacerArgs","getSubstitution","tailPos","m","symbols","ch","capture","sameValue","is","x","y","SEARCH","nativeSearch","searcher","previousLastIndex","speciesConstructor","defaultConstructor","arrayPush","MAX_UINT32","SUPPORTS_Y","SPLIT","nativeSplit","internalSplit","limit","lim","lastLength","output","lastLastIndex","separatorCopy","splitter","unicodeMatching","callRegExpExec","q","A","z","ArrayValues","ArrayIteratorMethods","nativeUrl","url","URL","searchParams","pathname","sort","href","URLSearchParams","username","host","hash","anInstance","nativeAssign","assign","objectAssign","B","alphabet","chr","T","maxInt","regexNonASCII","regexSeparators","OVERFLOW_ERROR","stringFromCharCode","fromCharCode","digitToBasic","digit","adapt","delta","numPoints","firstTime","baseMinusTMin","base","encode","currentValue","inputLength","counter","extra","ucs2decode","bias","basicLength","handledCPCount","handledCPCountPlusOne","RangeError","t","qMinusT","baseMinusT","redefineAll","getIterator","$fetch","Headers","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","getInternalIteratorState","plus","sequences","percentSequence","bytes","percentDecode","sequence","decodeURIComponent","deserialize","!","'","(",")","~","%20","serialize","encodeURIComponent","parseSearchParams","query","attribute","entry","attributes","shift","updateSearchParams","validateArgumentsLength","passed","required","URLSearchParamsIterator","URLSearchParamsConstructor","entryIterator","entryNext","init","updateURL","hasOwn","URLSearchParamsPrototype","append","delete","splice","getAll","found","entriesIndex","sliceIndex","callback","USE_NATIVE_URL","fetch","body","headers","EOF","web_urlSearchParams","getState","NativeURL","URLSearchParamsModule","getInternalSearchParamsState","getInternalURLState","pow","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","parseHost","codePoints","parseIPv6","isSpecial","label","encoded","labels","toASCII","parseIPv4","percentEncode","C0ControlPercentEncodeSet","partsLength","numbers","part","radix","number","ipv4","parts","pop","parseInt","numbersSeen","ipv4Piece","swaps","swap","address","pieceIndex","compress","pointer","char","serializeHost","ignore0","unshift","ipv6","maxIndex","maxLength","currStart","currLength","findLongestZeroSequence","fragmentPercentEncodeSet"," ","\"","<",">","`","pathPercentEncodeSet","#","?","{","}","userinfoPercentEncodeSet","/",":",";","=","@","[","\\","]","^","|","code","specialSchemes","ftp","file","http","https","ws","wss","scheme","includesCredentials","password","cannotHaveUsernamePasswordPort","cannotBeABaseURL","isWindowsDriveLetter","normalized","startsWithWindowsDriveLetter","third","shortenURLsPath","pathSize","isSingleDot","segment","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","parseURL","stateOverride","bufferCodePoints","failure","buffer","seenAt","seenBracket","seenPasswordToken","port","fragment","codePoint","encodedCodePoints","URLConstructor","baseState","urlString","searchParamsState","serializeURL","origin","getOrigin","protocol","getProtocol","getUsername","getPassword","getHost","hostname","getHostname","getPort","getPathname","search","getSearch","getSearchParams","getHash","URLPrototype","accessorDescriptor","getter","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","blob","_typeof","obj","_classCallCheck","instance","_defineProperties","props","_createClass","protoProps","staticProps","_defineProperty","ownKeys$1","enumerableOnly","_objectSpread2","getOwnPropertyDescriptors","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","_slicedToArray","arr","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","err","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","_iterableToArray","_nonIterableSpread","o","minLen","len","arr2","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","serializeParam","deserializeParam","checkIfURLSearchParamsSupported","typeofSearchString","_fromString","_this","_entries","thisArg","searchArray","polyfillURLSearchParams","u","checkIfURLIsSupported","_URL","baseElement","doc","location","implementation","createHTMLDocument","head","anchorElement","inputElement","checkValidity","enableSearchUpdate","enableSearchParamsUpdate","methodName","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","expectedPort","http:","https:","ftp:","addPortToOrigin","polyfillURL","setInterval","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","E","defer","channel","nativePromiseConstructor","Promise","iterate_1","Result","stopped","AS_ENTRIES","IS_ITERATOR","iterFn","stop","engineIsIos","setImmediate","clear","clearImmediate","MessageChannel","Dispatch","queue","ONREADYSTATECHANGE","run","runner","listener","post","postMessage","nextTick","now","IS_IOS","port2","port1","onmessage","importScripts","removeChild","flush","last","notify","toggle","node","promise","then","task","macrotask","MutationObserver","WebKitMutationObserver","IS_NODE","queueMicrotaskDescriptor","queueMicrotask","parent","exit","enter","createTextNode","observe","characterData","resolve","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","microtask","PromiseCapability","reject","$$resolve","$$reject","newPromiseCapability","promiseResolve","promiseCapability","perform","PROMISE","getInternalPromiseState","PromiseConstructor","NativePromise","newPromiseCapabilityModule","newGenericPromiseCapability","DISPATCH_EVENT","dispatchEvent","UNHANDLED_REJECTION","PromiseRejectionEvent","FakePromise","all","isThenable","isReject","notified","chain","reactions","ok","exited","reaction","handler","fail","rejection","onHandleUnhandled","onUnhandled","initEvent","console","hostReportErrors","isUnhandled","emit","unwrap","internalReject","internalResolve","wrapper","executor","onFulfilled","onRejected","catch","r","capability","$promiseResolve","remaining","iterate","alreadyCalled","race","extendStatics","d","__extends","__","Severity","Status","__assign","__read","ar","__spread","fromString","level","Debug","Info","Warning","Fatal","Critical","Log","fromHttpCode","Success","RateLimit","Invalid","Failed","Unknown","FunctionPrototype","FunctionPrototypeToString","nameRE","prop","SentryError","_super","message","_newTarget","isError","wat","isInstanceOf","isErrorEvent","isDOMError","isString","isPrimitive","isPlainObject","isEvent","isElement","Element","nativeMatch","matcher","matchStr","arrayBufferNative","ArrayBuffer","DataView","Int8Array","Int8ArrayPrototype","Uint8ClampedArray","Uint8ClampedArrayPrototype","TypedArray","TypedArrayPrototype","isPrototypeOf","TYPED_ARRAY_TAG","NATIVE_ARRAY_BUFFER_VIEWS","NATIVE_ARRAY_BUFFER","opera","TYPED_ARRAY_TAG_REQIRED","TypedArrayConstructorsList","Uint8Array","Int16Array","Uint16Array","Int32Array","Uint32Array","Float32Array","Float64Array","isTypedArray","arrayBufferViewCore","aTypedArray","aTypedArrayConstructor","ARRAY","TypedArrayConstructor","exportTypedArrayMethod","property","exportTypedArrayStaticMethod","isView","klass","typedArrayConstructorsRequireWrappers","toIndex","Infinity","abs","log","LN2","ieee754","mantissaLength","exponent","mantissa","exponentLength","eMax","eBias","rt","sign","nBits","NaN","arrayFill","endPos","ARRAY_BUFFER","DATA_VIEW","WRONG_INDEX","NativeArrayBuffer","$ArrayBuffer","$DataView","$DataViewPrototype","packIEEE754","IEEE754","unpackIEEE754","packInt8","packInt16","packInt32","unpackInt32","packFloat32","packFloat64","addGetter","view","count","isLittleEndian","intIndex","byteLength","byteOffset","pack","reverse","conversion","ArrayBufferPrototype","testView","nativeSetInt8","setInt8","getInt8","setUint8","bufferLength","offset","getUint8","getInt16","getUint16","getInt32","getUint32","getFloat32","getFloat64","setInt16","setUint16","setInt32","setUint32","setFloat32","setFloat64","arrayBuffer","toOffset","BYTES","toPositiveInteger","typedArrayFrom","round","ArrayBufferModule","ArrayBufferViewCore","BYTES_PER_ELEMENT","WRONG_LENGTH","fromList","list","isArrayBuffer","isTypedArrayIndex","wrappedGetOwnPropertyDescriptor","wrappedDefineProperty","CLAMPED","GETTER","SETTER","NativeTypedArrayConstructor","TypedArrayConstructorPrototype","exported","addElement","TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS","typedArrayOffset","$length","$len","createTypedArrayConstructor","arrayCopyWithin","copyWithin","to","inc","$copyWithin","$every","$fill","$filter","$find","predicate","$findIndex","arrayValues","ArrayIterators","arrayKeys","arrayEntries","nativeTypedArrayIterator","CORRECT_ITER_NAME","typedArrayValues","$join","nativeLastIndexOf","lastIndexOf","arrayLastIndexOf","$lastIndexOf","IS_RIGHT","memo","arrayReduce","left","right","$reduce","$reduceRight","middle","$slice","$some","$sort","comparefn","begin","beginIndex","$toLocaleString","toLocaleString","TO_LOCALE_STRING_BUG","Uint8ArrayPrototype","arrayToString","arrayJoin","IS_NOT_ARRAY_METHOD","truncate","substr","safeJoin","delimiter","isMatchingPattern","isNodeEnv","fallbackGlobalObject","getGlobalObject","uuid4","crypto","msCrypto","getRandomValues","pad","num","v","parseUrl","relative","getEventDescription","exception","event_id","consoleSandbox","originalConsole","wrappedLevels","__sentry_original__","addExceptionTypeValue","addExceptionMechanism","mechanism","_oO","htmlTreeAsString","elem","currentElem","out","height","sepLength","nextStr","_htmlElementAsString","parentNode","className","classes","attr","tagName","allowedAttrs","getAttribute","INITIAL_TIME","Date","prevNow","performanceFallback","timeOrigin","crossPlatformPerformance","mod","request","require","performance","_","timing","navigationStart","timestampWithMs","parseRetryAfterHeader","header","headerDelay","headerDate","parse","defaultFunctionName","getFunctionName","PREFIX","Logger","_enabled","disable","enable","warn","__SENTRY__","logger","MAXIMUM_ALLOWED_LENGTH_EXCEEDED","deleteCount","insertCount","actualDeleteCount","actualStart","freezing","isExtensible","preventExtensions","internalMetadata","METADATA","setMetadata","objectID","weakData","meta","REQUIRED","fastKey","getWeakData","onFreeze","FREEZING","internalStateGetterFor","ArrayIterationModule","uncaughtFrozenStore","frozen","UncaughtFrozenStore","findUncaughtFrozen","common","IS_WEAK","ADDER","NativeConstructor","NativePrototype","fixMethod","getConstructor","InternalMetadataModule","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","setStrong","collection","define","$has","Memo","_hasWeakSet","WeakSet","_inner","memoize","unmemoize","fill","original","wrapped","_Oo","getWalkSource","stack","event_1","currentTarget","jsonSize","encodeURI","utf8Length","JSON","normalizeToSize","depth","maxSize","serialized","normalizeValue","_events","walk","serializeValue","toJSON","acc","innerKey","extractExceptionKeysForMessage","includedKeys","States","NON_GENERIC","real","finally","onFinally","isFunction","SyncPromise","_state","PENDING","_handlers","_resolve","_setResult","RESOLVED","_reject","REJECTED","_value","_executeHandlers","_attachHandler","cachedHandlers","onfulfilled","onrejected","resolvedCollection","item","_onfulfilled","_onrejected","onfinally","isRejected","PromiseBuffer","_limit","_buffer","isReady","drain","timeout","capturedSetTimeout","clearTimeout","supportsFetch","Request","Response","isNativeFetch","func","supportsReferrerPolicy","referrerPolicy","lastHref","handlers","instrumented","instrument","originalConsoleLevel","triggerHandlers","instrumentConsole","domEventHandler","keypressEventHandler","eventName","handleEvent","innerOriginal","__sentry_wrapped__","instrumentDOM","xhrproto","XMLHttpRequest","originalOpen","xhr","__sentry_xhr__","toUpperCase","__sentry_own_request__","onreadystatechangeHandler","readyState","status_code","status","endTimestamp","startTimestamp","onreadystatechange","readyStateArgs","originalSend","instrumentXHR","sandbox","hidden","supportsNativeFetch","originalFetch","commonHandlerData","fetchData","getFetchMethod","getFetchUrl","response","instrumentFetch","chrome","isChromePackagedApp","app","runtime","hasHistoryApi","history","pushState","replaceState","supportsHistory","oldOnPopState","onpopstate","historyReplacementFunction","originalHistoryFunction","instrumentHistory","_oldOnErrorHandler","onerror","msg","line","column","_oldOnUnhandledRejectionHandler","onunhandledrejection","addInstrumentationHandler","e_1","_a","_b","__values","_c","e_1_1","fetchArgs","keypressTimeout","lastCapturedEvent","debounceTimer","debounce","isContentEditable","DSN_REGEX","ERROR_MESSAGE","Dsn","_fromComponents","_validate","withPassword","pass","projectId","user","projectMatch","components","component","Scope","_notifyingListeners","_scopeListeners","_eventProcessors","_breadcrumbs","_user","_tags","_extra","_contexts","clone","scope","newScope","_level","_span","_transactionName","_fingerprint","addScopeListener","addEventProcessor","setUser","_notifyScopeListeners","setTags","tags","setTag","setExtras","extras","setExtra","setFingerprint","fingerprint","setLevel","setTransactionName","setTransaction","setContext","context","setSpan","span","getSpan","getTransaction","spanRecorder","spans","update","captureContext","updatedScope","contexts","addBreadcrumb","breadcrumb","maxBreadcrumbs","mergedBreadcrumb","timestamp","clearBreadcrumbs","applyToEvent","hint","transaction","trace","getTraceContext","_applyFingerprint","breadcrumbs","_notifyEventProcessors","getGlobalEventProcessors","processors","processor","final","globalEventProcessors","addGlobalEventProcessor","Hub","client","_version","_stack","bindClient","isOlderThan","getStackTop","setupIntegrations","pushScope","getStack","parentScope","getClient","popScope","withScope","getScope","captureException","eventId","_lastEventId","finalHint","syntheticException","originalException","_invokeClient","captureMessage","captureEvent","lastEventId","top","getOptions","beforeBreadcrumb","finalBreadcrumb","configureScope","oldHub","makeMain","getIntegration","integration","startSpan","_callExtensionMethod","startTransaction","traceHeaders","carrier","getMainCarrier","sentry","extensions","hub","registry","getHubFromCarrier","setHubOnCarrier","getCurrentHub","hasHubOnCarrier","activeDomain","active","registryHubTopStack","getHubFromActiveDomain","callOnHub","API","dsn","_dsnObject","getDsn","getBaseApiEndpoint","getStoreEndpoint","_getIngestEndpoint","getStoreEndpointWithUrlEncodedAuth","_encodedAuth","getEnvelopeEndpointWithUrlEncodedAuth","_getEnvelopeEndpoint","getStoreEndpointPath","getRequestHeaders","clientName","clientVersion","Content-Type","X-Sentry-Auth","getReportDialogEndpoint","dialogOptions","endpoint","encodedOptions","email","auth","sentry_key","sentry_version","installedIntegrations","integrations","defaultIntegrations","userIntegrations","userIntegrationsNames_1","pickedIntegrationsNames_1","defaultIntegration","userIntegration","integrationsNames","alwaysLastToRun","getIntegrationsToSetup","setupOnce","setupIntegration","originalFunctionToString","BaseClient","backendClass","_integrations","_processing","_backend","_options","_dsn","_getBackend","eventFromException","eventFromMessage","_processEvent","finalEvent","_isClientProcessing","clearInterval","interval","getTransport","transportFlushed","ready","enabled","_isEnabled","ticked","_prepareEvent","normalizeDepth","prepared","_applyClientOptions","_applyIntegrationsMetadata","finalScope","_normalizeEvent","environment","release","dist","maxValueLength","sdkInfo","sdk","integrationsArray","_sendEvent","sendEvent","beforeSend","sampleRate","isTransaction","__sentry__","beforeSendResult","_handleAsyncBeforeSend","processedEvent","NoopTransport","Skipped","BaseBackend","_transport","_setupTransport","_exception","_hint","_message","eventToSentryRequest","api","useEnvelope","req","envelope","sent_at","toISOString","FunctionToString","DEFAULT_IGNORE_ERRORS","InboundFilters","clientOptions","_mergeOptions","_shouldDropEvent","_isSentryError","_isIgnoredError","_isDeniedUrl","_getEventFilterUrl","_isAllowedUrl","ignoreInternal","ignoreErrors","_getPossibleEventMessages","denyUrls","allowUrls","whitelistUrls","blacklistUrls","oO","stacktrace","frames_1","frames","filename","frames_2","UNKNOWN_FUNCTION","gecko","winjs","geckoEval","chromeEval","reactMinifiedRegexp","computeStackTrace","ex","popSize","framesToPop","opera10Regex","opera11Regex","lines","element","extractMessage","computeStackTraceFromStacktraceProp","popFrames","submatch","isNative","columnNumber","computeStackTraceFromStackProp","failed","exceptionFromStacktrace","prepareFramesForEvent","eventFromStacktrace","localStack","firstFrameFunction","lastFrameFunction","frame","colno","function","in_app","lineno","eventFromUnknownInput","domException","name_1","eventFromString","__serialized__","eventFromPlainObject","synthetic","attachStacktrace","BaseTransport","_api","FetchTransport","_disabledUntil","sentryReq","fetchParameters","retryAfterHeader","XHRTransport","getResponseHeader","setRequestHeader","send","BrowserBackend","handled","transportOptions","transport","ignoreOnError","shouldIgnoreOnError","ignoreNextOnError","before","sentryWrapped","wrappedArguments","injectReportDialog","script","async","onLoad","onload","GlobalHandlers","_onErrorHandlerInstalled","_onUnhandledRejectionHandlerInstalled","stackTraceLimit","_installGlobalOnErrorHandler","_installGlobalOnUnhandledRejectionHandler","currentHub","hasIntegration","isFailedOwnDelivery","_eventFromIncompleteOnError","_enhanceEventWithInitialFrame","_eventFromIncompleteRejection","getLocationHref","DEFAULT_EVENT_TARGET","TryCatch","eventTarget","requestAnimationFrame","_wrapTimeFunction","_wrapRAF","_wrapXHR","_wrapEventTarget","originalCallback","xmlHttpRequestProps","wrapOptions","Breadcrumbs","dom","addSentryBreadcrumb","category","_consoleBreadcrumb","_domBreadcrumb","_xhrBreadcrumb","_fetchBreadcrumb","_historyBreadcrumb","handlerData","parsedLoc","parsedFrom","parsedTo","LinkedErrors","_key","_handler","linkedErrors","_walkErrorTree","UserAgent","SDK_VERSION","BrowserClient","showReportDialog","platform","packages","CoreIntegrations.InboundFilters","CoreIntegrations.FunctionToString","window_1","SENTRY_RELEASE","clientClass","debug","initAndBind","FIND","SKIPS_HOLES","whitespace","ltrim","rtrim","stringTrim","trim","require$$3","NUMBER","NativeNumber","NumberPrototype","BROKEN_CLASSOF","toNumber","maxCode","digits","NumberWrapper","TO_ENTRIES","$entries","instanceOf","isNullOrUndefined","isNodeList","Number","constants","facebook","shareCount","og_object","engagement","popup","width","twitter","pinterest","github","stargazers_count","youtube","statistics","subscriberCount","defaults","displayZero","format","increment","tokens","storage","ttl","getJSONP","setAttribute","noop","Console","matches","querySelectorAll","cloneNode","nextSibling","insertBefore","setAttributes","innerText","formatNumber","extend","Storage","supported","localStorage","getItem","setItem","removeItem","Shr","elements","trigger","querySelector","shr","config","networks","getCount","updateDisplay","listeners","share","openPopup","network","networkConfig","closed","focus","screenLeft","screen","screenTop","apiUrl","textContent","class","insertAdjacentElement","getDomain","substring","watch","addedNodes","childList","subtree","global_1$1","fails$1","descriptors$1","objectPropertyIsEnumerable$1","createPropertyDescriptor$1","classofRaw$1","indexedObject$1","requireObjectCoercible$1","toIndexedObject$1","isObject$2","toPrimitive$1","has$2","documentCreateElement$1","ie8DomDefine$1","objectGetOwnPropertyDescriptor$1","anObject$1","objectDefineProperty$1","createNonEnumerableProperty$1","setGlobal$1","sharedStore$1","inspectSource$1","nativeWeakMap$1","shared$1","uid$1","sharedKey$1","hiddenKeys$2","facade","internalState$1","redefine$1","path$1","getBuiltIn$1","toInteger$1","toLength$1","toAbsoluteIndex$1","arrayIncludes$1","objectKeysInternal$1","enumBugKeys$1","objectGetOwnPropertyNames$1","objectGetOwnPropertySymbols$1","ownKeys$2","copyConstructorProperties$1","isForced_1$1","_export$1","isArray$2","toObject$1","createProperty$1","nativeSymbol$1","useSymbolAsUid$1","wellKnownSymbol$1","arraySpeciesCreate$1","engineUserAgent$1","engineV8Version$1","arrayMethodHasSpeciesSupport$1","aFunction$3","functionBindContext$1","arrayIteration$1","arrayMethodUsesToLength$1","objectKeys$1","objectDefineProperties$1","html$1","objectCreate$1","addToUnscopables$1","iteratorClose","callWithSafeIterationClosing$1","iterators$1","isArrayIteratorMethod$1","toStringTagSupport$1","classof$1","getIteratorMethod$1","arrayFrom$1","checkCorrectnessOfIteration$1","correctPrototypeGetter$1","objectGetPrototypeOf$1","iteratorsCore$1","setToStringTag$1","createIteratorConstructor$1","objectSetPrototypeOf$1","defineIterator$1","es_array_iterator$1","arrayMethodIsStrict$1","inheritIfRequired$1","whitespaces$1","whitespaces","stringTrim$1","objectToString$1","objectToArray$1","$values","regexpFlags$1","regexpStickyHelpers$1","regexpExec$1","isRegexp$1","notARegexp$1","correctIsRegexpLogic$1","error1","error2","stringMultibyte$1","fixRegexpWellKnownSymbolLogic$1","sameValue$1","regexpExecAbstract$1","redefineAll$1","freezing$1","internalMetadata$1","unboundFunction","INTERRUPTED","condition","callFn","anInstance$1","collectionWeak$1","domIterables$1","InternalWeakMap","enforceIternalState","IS_IE11","$WeakMap","collectionWeak","WeakMapPrototype","nativeDelete","nativeHas","nativeGet","nativeSet","arrayForEach$1","objectAssign$1","speciesConstructor$1","advanceStringIndex$1","$trim","forcedStringTrimMethod","nativeUrl$1","getIterator$1","web_urlSearchParams$1","stringRepeat","repeat","nativeToFixed","toFixed","fractionDigits","thisNumberValue","fractDigits","multiply","c2","divide","dataToString","x2","objectGetOwnPropertyNamesExternal$1","wellKnownSymbolWrapped$1","addCSS","thumbWidth","getDecimalPlaces","parseFloat","RangeTouch","rangeTouch","userSelect","webKitUserSelect","touchAction","changedTouches","getBoundingClientRect","clientX","disabled","documentElement","nativePromiseConstructor$1","setSpecies$1","engineIsIos$1","engineIsNode","task$2","microtask$1","newPromiseCapability$2","promiseResolve$1","perform$1","NATIVE_REJECTION_EVENT","nativeStartsWith","startsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","events","isEmpty","is$2","nodeType","ownerDocument","KeyboardEvent","TextTrack","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","delay","offsetHeight","browser","isIE","documentMode","isEdge","isWebkit","isIPhone","isIos","getDeep","reduce","_len","sources","targets","child","sibling","_ref","_ref3","_ref4","text","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","toggleHidden","hide","toggleClass","force","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","getElement","setFocus","tabFocus","preventScroll","classNames","CHROME_VERSION","range","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","removeEventListener","toggleListener","passive","eventListeners","on","off","once","_this2","onceCallback","triggerEvent","plyr","unbindListeners","_this3","silencePromise","validateRatio","reduceAspectRatio","ratio","_ratio","divider","getDivider","w","h","getAspectRatio","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","getComputedStyle","fullscreen","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","setup","player","speed","onChange","_player$media","currentTime","paused","preload","playbackRate","play","load","cancelRequests","blankVideo","dedupe","replaceAll","toTitleCase","toPascalCase","getHTML","innerHTML","resources","i18n","{seektime}","seekTime","{title}","title","json","responseType","responseText","loadSprite","prefix","hasId","exists","useStorage","cached","trunc","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","duration","seekTooltip","tooltip","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","createBadge","badge","menu","createButton","buttonType","toCamelCase","labelPressed","iconPressed","control","button","createRange","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","_ref$badge","_ref$checked","checked","aria-checked","flex","children","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","current","getPercentage","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sorting","setCaptionsMenu","_this7","tracks","getTracks","track","toggled","language","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","restore","propertyName","setDownloadUrl","download","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this11","seektime","addProperty","controlPressed","_this$config","safe","parser","buildUrlParams","isYouTube","insertAfter","languages","userLanguage","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","cue","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","Fullscreen","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","hasProperty","cleanupViewport","shiftKey","forceFallback","requestFullscreen","webkitEnterFullscreen","toggleFallback","navigationUI","webkitExitFullscreen","action","cancelFullScreen","closest","parentElement","trapFocus","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","mathSign","loadImage","minWidth","image","Image","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","backgroundImage","backgroundSize","toggleControls","checkLoading","timers","controlsElement","recentTouchSeek","lastSeekTime","migrateStyles","getPropertyValue","removeProperty","Listeners","focusTimer","lastKeyDown","timeStamp","wasKeyDown","handleKey","firstTouch","setTabFocus","setPlayerSize","measure","rect","resized","_player$fullscreen","usingNative","isEnter","_setPlayerSize","firstChild","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","togglePlay","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","increaseVolume","lastKey","altKey","ctrlKey","metaKey","decreaseVolume","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","executeCallbacks","success","loadFile","numTries","isLegacyIECss","maxTries","numRetries","beforeCallbackFn","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","loadFiles","paths","loadjs","arg1","loadFn","returnPromise","deps","isDefined","factory","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","$2","data-poster","thumbnail_url","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","createDocumentFragment","stripHTML","getPaused","seconds","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","google","ima","manager","destroy","displayContainer","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","FIND_INDEX","arrayLastIndexOf$1","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","vttDataString","processedList","thumbnail","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","urlPrefix","tempImage","naturalHeight","percentage","mousePosX","thumb","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","previewPos","_fitRatio","multiplier","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","Plyr","webkitShowPlaybackTargetPicker","isHidden","hiding","soft","unload","jQuery","getProviderByUrl","truthy","tabindex","inputIsValid","fauxDuration","realDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","clamp","updateStorage","prev","curr","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline","production","srclang","Sentry","historySupport","currentType","hasInitialType","cite","setSource"],"mappings":"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","file":"demo.min.js","sourcesContent":["typeof navigator === \"object\" && (function () {\n\t'use strict';\n\n\tvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n\tfunction createCommonjsModule(fn, module) {\n\t\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n\t}\n\n\tvar check = function (it) {\n\t return it && it.Math == Math && it;\n\t};\n\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar global_1 =\n\t // eslint-disable-next-line no-undef\n\t check(typeof globalThis == 'object' && globalThis) ||\n\t check(typeof window == 'object' && window) ||\n\t check(typeof self == 'object' && self) ||\n\t check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\n\t // eslint-disable-next-line no-new-func\n\t Function('return this')();\n\n\tvar fails = function (exec) {\n\t try {\n\t return !!exec();\n\t } catch (error) {\n\t return true;\n\t }\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar descriptors = !fails(function () {\n\t return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n\t});\n\n\tvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\n\tvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n\t// Nashorn ~ JDK8 bug\n\tvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n\t// `Object.prototype.propertyIsEnumerable` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n\tvar f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n\t var descriptor = getOwnPropertyDescriptor(this, V);\n\t return !!descriptor && descriptor.enumerable;\n\t} : nativePropertyIsEnumerable;\n\n\tvar objectPropertyIsEnumerable = {\n\t\tf: f\n\t};\n\n\tvar createPropertyDescriptor = function (bitmap, value) {\n\t return {\n\t enumerable: !(bitmap & 1),\n\t configurable: !(bitmap & 2),\n\t writable: !(bitmap & 4),\n\t value: value\n\t };\n\t};\n\n\tvar toString = {}.toString;\n\n\tvar classofRaw = function (it) {\n\t return toString.call(it).slice(8, -1);\n\t};\n\n\tvar split = ''.split;\n\n\t// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\tvar indexedObject = fails(function () {\n\t // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n\t // eslint-disable-next-line no-prototype-builtins\n\t return !Object('z').propertyIsEnumerable(0);\n\t}) ? function (it) {\n\t return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n\t} : Object;\n\n\t// `RequireObjectCoercible` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n\tvar requireObjectCoercible = function (it) {\n\t if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n\t return it;\n\t};\n\n\t// toObject with fallback for non-array-like ES3 strings\n\n\n\n\tvar toIndexedObject = function (it) {\n\t return indexedObject(requireObjectCoercible(it));\n\t};\n\n\tvar isObject = function (it) {\n\t return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n\t// `ToPrimitive` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toprimitive\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tvar toPrimitive = function (input, PREFERRED_STRING) {\n\t if (!isObject(input)) return input;\n\t var fn, val;\n\t if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n\t if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n\t throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n\tvar hasOwnProperty = {}.hasOwnProperty;\n\n\tvar has = function (it, key) {\n\t return hasOwnProperty.call(it, key);\n\t};\n\n\tvar document$1 = global_1.document;\n\t// typeof document.createElement is 'object' in old IE\n\tvar EXISTS = isObject(document$1) && isObject(document$1.createElement);\n\n\tvar documentCreateElement = function (it) {\n\t return EXISTS ? document$1.createElement(it) : {};\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar ie8DomDefine = !descriptors && !fails(function () {\n\t return Object.defineProperty(documentCreateElement('div'), 'a', {\n\t get: function () { return 7; }\n\t }).a != 7;\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\tvar f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n\t O = toIndexedObject(O);\n\t P = toPrimitive(P, true);\n\t if (ie8DomDefine) try {\n\t return nativeGetOwnPropertyDescriptor(O, P);\n\t } catch (error) { /* empty */ }\n\t if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n\t};\n\n\tvar objectGetOwnPropertyDescriptor = {\n\t\tf: f$1\n\t};\n\n\tvar anObject = function (it) {\n\t if (!isObject(it)) {\n\t throw TypeError(String(it) + ' is not an object');\n\t } return it;\n\t};\n\n\tvar nativeDefineProperty = Object.defineProperty;\n\n\t// `Object.defineProperty` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperty\n\tvar f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n\t anObject(O);\n\t P = toPrimitive(P, true);\n\t anObject(Attributes);\n\t if (ie8DomDefine) try {\n\t return nativeDefineProperty(O, P, Attributes);\n\t } catch (error) { /* empty */ }\n\t if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n\t if ('value' in Attributes) O[P] = Attributes.value;\n\t return O;\n\t};\n\n\tvar objectDefineProperty = {\n\t\tf: f$2\n\t};\n\n\tvar createNonEnumerableProperty = descriptors ? function (object, key, value) {\n\t return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n\t} : function (object, key, value) {\n\t object[key] = value;\n\t return object;\n\t};\n\n\tvar setGlobal = function (key, value) {\n\t try {\n\t createNonEnumerableProperty(global_1, key, value);\n\t } catch (error) {\n\t global_1[key] = value;\n\t } return value;\n\t};\n\n\tvar SHARED = '__core-js_shared__';\n\tvar store = global_1[SHARED] || setGlobal(SHARED, {});\n\n\tvar sharedStore = store;\n\n\tvar functionToString = Function.toString;\n\n\t// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\n\tif (typeof sharedStore.inspectSource != 'function') {\n\t sharedStore.inspectSource = function (it) {\n\t return functionToString.call(it);\n\t };\n\t}\n\n\tvar inspectSource = sharedStore.inspectSource;\n\n\tvar WeakMap$1 = global_1.WeakMap;\n\n\tvar nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\n\n\tvar isPure = false;\n\n\tvar shared = createCommonjsModule(function (module) {\n\t(module.exports = function (key, value) {\n\t return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\n\t})('versions', []).push({\n\t version: '3.6.5',\n\t mode: 'global',\n\t copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n\t});\n\t});\n\n\tvar id = 0;\n\tvar postfix = Math.random();\n\n\tvar uid = function (key) {\n\t return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n\t};\n\n\tvar keys = shared('keys');\n\n\tvar sharedKey = function (key) {\n\t return keys[key] || (keys[key] = uid(key));\n\t};\n\n\tvar hiddenKeys = {};\n\n\tvar WeakMap$2 = global_1.WeakMap;\n\tvar set, get, has$1;\n\n\tvar enforce = function (it) {\n\t return has$1(it) ? get(it) : set(it, {});\n\t};\n\n\tvar getterFor = function (TYPE) {\n\t return function (it) {\n\t var state;\n\t if (!isObject(it) || (state = get(it)).type !== TYPE) {\n\t throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n\t } return state;\n\t };\n\t};\n\n\tif (nativeWeakMap) {\n\t var store$1 = new WeakMap$2();\n\t var wmget = store$1.get;\n\t var wmhas = store$1.has;\n\t var wmset = store$1.set;\n\t set = function (it, metadata) {\n\t wmset.call(store$1, it, metadata);\n\t return metadata;\n\t };\n\t get = function (it) {\n\t return wmget.call(store$1, it) || {};\n\t };\n\t has$1 = function (it) {\n\t return wmhas.call(store$1, it);\n\t };\n\t} else {\n\t var STATE = sharedKey('state');\n\t hiddenKeys[STATE] = true;\n\t set = function (it, metadata) {\n\t createNonEnumerableProperty(it, STATE, metadata);\n\t return metadata;\n\t };\n\t get = function (it) {\n\t return has(it, STATE) ? it[STATE] : {};\n\t };\n\t has$1 = function (it) {\n\t return has(it, STATE);\n\t };\n\t}\n\n\tvar internalState = {\n\t set: set,\n\t get: get,\n\t has: has$1,\n\t enforce: enforce,\n\t getterFor: getterFor\n\t};\n\n\tvar redefine = createCommonjsModule(function (module) {\n\tvar getInternalState = internalState.get;\n\tvar enforceInternalState = internalState.enforce;\n\tvar TEMPLATE = String(String).split('String');\n\n\t(module.exports = function (O, key, value, options) {\n\t var unsafe = options ? !!options.unsafe : false;\n\t var simple = options ? !!options.enumerable : false;\n\t var noTargetGet = options ? !!options.noTargetGet : false;\n\t if (typeof value == 'function') {\n\t if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);\n\t enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n\t }\n\t if (O === global_1) {\n\t if (simple) O[key] = value;\n\t else setGlobal(key, value);\n\t return;\n\t } else if (!unsafe) {\n\t delete O[key];\n\t } else if (!noTargetGet && O[key]) {\n\t simple = true;\n\t }\n\t if (simple) O[key] = value;\n\t else createNonEnumerableProperty(O, key, value);\n\t// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\t})(Function.prototype, 'toString', function toString() {\n\t return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n\t});\n\t});\n\n\tvar path = global_1;\n\n\tvar aFunction = function (variable) {\n\t return typeof variable == 'function' ? variable : undefined;\n\t};\n\n\tvar getBuiltIn = function (namespace, method) {\n\t return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])\n\t : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n\t};\n\n\tvar ceil = Math.ceil;\n\tvar floor = Math.floor;\n\n\t// `ToInteger` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tointeger\n\tvar toInteger = function (argument) {\n\t return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n\t};\n\n\tvar min = Math.min;\n\n\t// `ToLength` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tolength\n\tvar toLength = function (argument) {\n\t return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n\t};\n\n\tvar max = Math.max;\n\tvar min$1 = Math.min;\n\n\t// Helper for a popular repeating case of the spec:\n\t// Let integer be ? ToInteger(index).\n\t// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\n\tvar toAbsoluteIndex = function (index, length) {\n\t var integer = toInteger(index);\n\t return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n\t};\n\n\t// `Array.prototype.{ indexOf, includes }` methods implementation\n\tvar createMethod = function (IS_INCLUDES) {\n\t return function ($this, el, fromIndex) {\n\t var O = toIndexedObject($this);\n\t var length = toLength(O.length);\n\t var index = toAbsoluteIndex(fromIndex, length);\n\t var value;\n\t // Array#includes uses SameValueZero equality algorithm\n\t // eslint-disable-next-line no-self-compare\n\t if (IS_INCLUDES && el != el) while (length > index) {\n\t value = O[index++];\n\t // eslint-disable-next-line no-self-compare\n\t if (value != value) return true;\n\t // Array#indexOf ignores holes, Array#includes - not\n\t } else for (;length > index; index++) {\n\t if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n\t } return !IS_INCLUDES && -1;\n\t };\n\t};\n\n\tvar arrayIncludes = {\n\t // `Array.prototype.includes` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t includes: createMethod(true),\n\t // `Array.prototype.indexOf` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t indexOf: createMethod(false)\n\t};\n\n\tvar indexOf = arrayIncludes.indexOf;\n\n\n\tvar objectKeysInternal = function (object, names) {\n\t var O = toIndexedObject(object);\n\t var i = 0;\n\t var result = [];\n\t var key;\n\t for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n\t // Don't enum bug & hidden keys\n\t while (names.length > i) if (has(O, key = names[i++])) {\n\t ~indexOf(result, key) || result.push(key);\n\t }\n\t return result;\n\t};\n\n\t// IE8- don't enum bug keys\n\tvar enumBugKeys = [\n\t 'constructor',\n\t 'hasOwnProperty',\n\t 'isPrototypeOf',\n\t 'propertyIsEnumerable',\n\t 'toLocaleString',\n\t 'toString',\n\t 'valueOf'\n\t];\n\n\tvar hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');\n\n\t// `Object.getOwnPropertyNames` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\tvar f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n\t return objectKeysInternal(O, hiddenKeys$1);\n\t};\n\n\tvar objectGetOwnPropertyNames = {\n\t\tf: f$3\n\t};\n\n\tvar f$4 = Object.getOwnPropertySymbols;\n\n\tvar objectGetOwnPropertySymbols = {\n\t\tf: f$4\n\t};\n\n\t// all object keys, includes non-enumerable and symbols\n\tvar ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n\t var keys = objectGetOwnPropertyNames.f(anObject(it));\n\t var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n\t};\n\n\tvar copyConstructorProperties = function (target, source) {\n\t var keys = ownKeys(source);\n\t var defineProperty = objectDefineProperty.f;\n\t var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\t for (var i = 0; i < keys.length; i++) {\n\t var key = keys[i];\n\t if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n\t }\n\t};\n\n\tvar replacement = /#|\\.prototype\\./;\n\n\tvar isForced = function (feature, detection) {\n\t var value = data[normalize(feature)];\n\t return value == POLYFILL ? true\n\t : value == NATIVE ? false\n\t : typeof detection == 'function' ? fails(detection)\n\t : !!detection;\n\t};\n\n\tvar normalize = isForced.normalize = function (string) {\n\t return String(string).replace(replacement, '.').toLowerCase();\n\t};\n\n\tvar data = isForced.data = {};\n\tvar NATIVE = isForced.NATIVE = 'N';\n\tvar POLYFILL = isForced.POLYFILL = 'P';\n\n\tvar isForced_1 = isForced;\n\n\tvar getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n\t/*\n\t options.target - name of the target object\n\t options.global - target is the global object\n\t options.stat - export as static methods of target\n\t options.proto - export as prototype methods of target\n\t options.real - real prototype method for the `pure` version\n\t options.forced - export even if the native feature is available\n\t options.bind - bind methods to the target, required for the `pure` version\n\t options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n\t options.unsafe - use the simple assignment of property instead of delete + defineProperty\n\t options.sham - add a flag to not completely full polyfills\n\t options.enumerable - export as enumerable property\n\t options.noTargetGet - prevent calling a getter on target\n\t*/\n\tvar _export = function (options, source) {\n\t var TARGET = options.target;\n\t var GLOBAL = options.global;\n\t var STATIC = options.stat;\n\t var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n\t if (GLOBAL) {\n\t target = global_1;\n\t } else if (STATIC) {\n\t target = global_1[TARGET] || setGlobal(TARGET, {});\n\t } else {\n\t target = (global_1[TARGET] || {}).prototype;\n\t }\n\t if (target) for (key in source) {\n\t sourceProperty = source[key];\n\t if (options.noTargetGet) {\n\t descriptor = getOwnPropertyDescriptor$1(target, key);\n\t targetProperty = descriptor && descriptor.value;\n\t } else targetProperty = target[key];\n\t FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n\t // contained in target\n\t if (!FORCED && targetProperty !== undefined) {\n\t if (typeof sourceProperty === typeof targetProperty) continue;\n\t copyConstructorProperties(sourceProperty, targetProperty);\n\t }\n\t // add a flag to not completely full polyfills\n\t if (options.sham || (targetProperty && targetProperty.sham)) {\n\t createNonEnumerableProperty(sourceProperty, 'sham', true);\n\t }\n\t // extend global\n\t redefine(target, key, sourceProperty, options);\n\t }\n\t};\n\n\tvar aFunction$1 = function (it) {\n\t if (typeof it != 'function') {\n\t throw TypeError(String(it) + ' is not a function');\n\t } return it;\n\t};\n\n\t// optional / simple context binding\n\tvar functionBindContext = function (fn, that, length) {\n\t aFunction$1(fn);\n\t if (that === undefined) return fn;\n\t switch (length) {\n\t case 0: return function () {\n\t return fn.call(that);\n\t };\n\t case 1: return function (a) {\n\t return fn.call(that, a);\n\t };\n\t case 2: return function (a, b) {\n\t return fn.call(that, a, b);\n\t };\n\t case 3: return function (a, b, c) {\n\t return fn.call(that, a, b, c);\n\t };\n\t }\n\t return function (/* ...args */) {\n\t return fn.apply(that, arguments);\n\t };\n\t};\n\n\t// `ToObject` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toobject\n\tvar toObject = function (argument) {\n\t return Object(requireObjectCoercible(argument));\n\t};\n\n\t// `IsArray` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isarray\n\tvar isArray = Array.isArray || function isArray(arg) {\n\t return classofRaw(arg) == 'Array';\n\t};\n\n\tvar nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n\t // Chrome 38 Symbol has incorrect toString conversion\n\t // eslint-disable-next-line no-undef\n\t return !String(Symbol());\n\t});\n\n\tvar useSymbolAsUid = nativeSymbol\n\t // eslint-disable-next-line no-undef\n\t && !Symbol.sham\n\t // eslint-disable-next-line no-undef\n\t && typeof Symbol.iterator == 'symbol';\n\n\tvar WellKnownSymbolsStore = shared('wks');\n\tvar Symbol$1 = global_1.Symbol;\n\tvar createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\n\n\tvar wellKnownSymbol = function (name) {\n\t if (!has(WellKnownSymbolsStore, name)) {\n\t if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name];\n\t else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n\t } return WellKnownSymbolsStore[name];\n\t};\n\n\tvar SPECIES = wellKnownSymbol('species');\n\n\t// `ArraySpeciesCreate` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n\tvar arraySpeciesCreate = function (originalArray, length) {\n\t var C;\n\t if (isArray(originalArray)) {\n\t C = originalArray.constructor;\n\t // cross-realm fallback\n\t if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n\t else if (isObject(C)) {\n\t C = C[SPECIES];\n\t if (C === null) C = undefined;\n\t }\n\t } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n\t};\n\n\tvar push = [].push;\n\n\t// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n\tvar createMethod$1 = function (TYPE) {\n\t var IS_MAP = TYPE == 1;\n\t var IS_FILTER = TYPE == 2;\n\t var IS_SOME = TYPE == 3;\n\t var IS_EVERY = TYPE == 4;\n\t var IS_FIND_INDEX = TYPE == 6;\n\t var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n\t return function ($this, callbackfn, that, specificCreate) {\n\t var O = toObject($this);\n\t var self = indexedObject(O);\n\t var boundFunction = functionBindContext(callbackfn, that, 3);\n\t var length = toLength(self.length);\n\t var index = 0;\n\t var create = specificCreate || arraySpeciesCreate;\n\t var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n\t var value, result;\n\t for (;length > index; index++) if (NO_HOLES || index in self) {\n\t value = self[index];\n\t result = boundFunction(value, index, O);\n\t if (TYPE) {\n\t if (IS_MAP) target[index] = result; // map\n\t else if (result) switch (TYPE) {\n\t case 3: return true; // some\n\t case 5: return value; // find\n\t case 6: return index; // findIndex\n\t case 2: push.call(target, value); // filter\n\t } else if (IS_EVERY) return false; // every\n\t }\n\t }\n\t return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n\t };\n\t};\n\n\tvar arrayIteration = {\n\t // `Array.prototype.forEach` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t forEach: createMethod$1(0),\n\t // `Array.prototype.map` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t map: createMethod$1(1),\n\t // `Array.prototype.filter` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t filter: createMethod$1(2),\n\t // `Array.prototype.some` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t some: createMethod$1(3),\n\t // `Array.prototype.every` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.every\n\t every: createMethod$1(4),\n\t // `Array.prototype.find` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t find: createMethod$1(5),\n\t // `Array.prototype.findIndex` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n\t findIndex: createMethod$1(6)\n\t};\n\n\tvar arrayMethodIsStrict = function (METHOD_NAME, argument) {\n\t var method = [][METHOD_NAME];\n\t return !!method && fails(function () {\n\t // eslint-disable-next-line no-useless-call,no-throw-literal\n\t method.call(null, argument || function () { throw 1; }, 1);\n\t });\n\t};\n\n\tvar defineProperty = Object.defineProperty;\n\tvar cache = {};\n\n\tvar thrower = function (it) { throw it; };\n\n\tvar arrayMethodUsesToLength = function (METHOD_NAME, options) {\n\t if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n\t if (!options) options = {};\n\t var method = [][METHOD_NAME];\n\t var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n\t var argument0 = has(options, 0) ? options[0] : thrower;\n\t var argument1 = has(options, 1) ? options[1] : undefined;\n\n\t return cache[METHOD_NAME] = !!method && !fails(function () {\n\t if (ACCESSORS && !descriptors) return true;\n\t var O = { length: -1 };\n\n\t if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n\t else O[1] = 1;\n\n\t method.call(O, argument0, argument1);\n\t });\n\t};\n\n\tvar $forEach = arrayIteration.forEach;\n\n\n\n\tvar STRICT_METHOD = arrayMethodIsStrict('forEach');\n\tvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n\t// `Array.prototype.forEach` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\tvar arrayForEach = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n\t return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t} : [].forEach;\n\n\t// `Array.prototype.forEach` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t_export({ target: 'Array', proto: true, forced: [].forEach != arrayForEach }, {\n\t forEach: arrayForEach\n\t});\n\n\t// call something on iterator step with safe closing on error\n\tvar callWithSafeIterationClosing = function (iterator, fn, value, ENTRIES) {\n\t try {\n\t return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n\t // 7.4.6 IteratorClose(iterator, completion)\n\t } catch (error) {\n\t var returnMethod = iterator['return'];\n\t if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n\t throw error;\n\t }\n\t};\n\n\tvar iterators = {};\n\n\tvar ITERATOR = wellKnownSymbol('iterator');\n\tvar ArrayPrototype = Array.prototype;\n\n\t// check on default Array iterator\n\tvar isArrayIteratorMethod = function (it) {\n\t return it !== undefined && (iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n\t};\n\n\tvar createProperty = function (object, key, value) {\n\t var propertyKey = toPrimitive(key);\n\t if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\n\t else object[propertyKey] = value;\n\t};\n\n\tvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\tvar test = {};\n\n\ttest[TO_STRING_TAG] = 'z';\n\n\tvar toStringTagSupport = String(test) === '[object z]';\n\n\tvar TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\n\t// ES3 wrong here\n\tvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n\t// fallback for IE11 Script Access Denied error\n\tvar tryGet = function (it, key) {\n\t try {\n\t return it[key];\n\t } catch (error) { /* empty */ }\n\t};\n\n\t// getting tag from ES6+ `Object.prototype.toString`\n\tvar classof = toStringTagSupport ? classofRaw : function (it) {\n\t var O, tag, result;\n\t return it === undefined ? 'Undefined' : it === null ? 'Null'\n\t // @@toStringTag case\n\t : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$1)) == 'string' ? tag\n\t // builtinTag case\n\t : CORRECT_ARGUMENTS ? classofRaw(O)\n\t // ES3 arguments fallback\n\t : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n\t};\n\n\tvar ITERATOR$1 = wellKnownSymbol('iterator');\n\n\tvar getIteratorMethod = function (it) {\n\t if (it != undefined) return it[ITERATOR$1]\n\t || it['@@iterator']\n\t || iterators[classof(it)];\n\t};\n\n\t// `Array.from` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\tvar arrayFrom = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n\t var O = toObject(arrayLike);\n\t var C = typeof this == 'function' ? this : Array;\n\t var argumentsLength = arguments.length;\n\t var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n\t var mapping = mapfn !== undefined;\n\t var iteratorMethod = getIteratorMethod(O);\n\t var index = 0;\n\t var length, result, step, iterator, next, value;\n\t if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n\t // if the target is not iterable or it's an array with the default iterator - use a simple case\n\t if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n\t iterator = iteratorMethod.call(O);\n\t next = iterator.next;\n\t result = new C();\n\t for (;!(step = next.call(iterator)).done; index++) {\n\t value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n\t createProperty(result, index, value);\n\t }\n\t } else {\n\t length = toLength(O.length);\n\t result = new C(length);\n\t for (;length > index; index++) {\n\t value = mapping ? mapfn(O[index], index) : O[index];\n\t createProperty(result, index, value);\n\t }\n\t }\n\t result.length = index;\n\t return result;\n\t};\n\n\tvar ITERATOR$2 = wellKnownSymbol('iterator');\n\tvar SAFE_CLOSING = false;\n\n\ttry {\n\t var called = 0;\n\t var iteratorWithReturn = {\n\t next: function () {\n\t return { done: !!called++ };\n\t },\n\t 'return': function () {\n\t SAFE_CLOSING = true;\n\t }\n\t };\n\t iteratorWithReturn[ITERATOR$2] = function () {\n\t return this;\n\t };\n\t // eslint-disable-next-line no-throw-literal\n\t Array.from(iteratorWithReturn, function () { throw 2; });\n\t} catch (error) { /* empty */ }\n\n\tvar checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) {\n\t if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n\t var ITERATION_SUPPORT = false;\n\t try {\n\t var object = {};\n\t object[ITERATOR$2] = function () {\n\t return {\n\t next: function () {\n\t return { done: ITERATION_SUPPORT = true };\n\t }\n\t };\n\t };\n\t exec(object);\n\t } catch (error) { /* empty */ }\n\t return ITERATION_SUPPORT;\n\t};\n\n\tvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n\t Array.from(iterable);\n\t});\n\n\t// `Array.from` method\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\t_export({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n\t from: arrayFrom\n\t});\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\tvar objectKeys = Object.keys || function keys(O) {\n\t return objectKeysInternal(O, enumBugKeys);\n\t};\n\n\t// `Object.defineProperties` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperties\n\tvar objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n\t anObject(O);\n\t var keys = objectKeys(Properties);\n\t var length = keys.length;\n\t var index = 0;\n\t var key;\n\t while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\n\t return O;\n\t};\n\n\tvar html = getBuiltIn('document', 'documentElement');\n\n\tvar GT = '>';\n\tvar LT = '<';\n\tvar PROTOTYPE = 'prototype';\n\tvar SCRIPT = 'script';\n\tvar IE_PROTO = sharedKey('IE_PROTO');\n\n\tvar EmptyConstructor = function () { /* empty */ };\n\n\tvar scriptTag = function (content) {\n\t return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n\t};\n\n\t// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\n\tvar NullProtoObjectViaActiveX = function (activeXDocument) {\n\t activeXDocument.write(scriptTag(''));\n\t activeXDocument.close();\n\t var temp = activeXDocument.parentWindow.Object;\n\t activeXDocument = null; // avoid memory leak\n\t return temp;\n\t};\n\n\t// Create object with fake `null` prototype: use iframe Object with cleared prototype\n\tvar NullProtoObjectViaIFrame = function () {\n\t // Thrash, waste and sodomy: IE GC bug\n\t var iframe = documentCreateElement('iframe');\n\t var JS = 'java' + SCRIPT + ':';\n\t var iframeDocument;\n\t iframe.style.display = 'none';\n\t html.appendChild(iframe);\n\t // https://github.com/zloirock/core-js/issues/475\n\t iframe.src = String(JS);\n\t iframeDocument = iframe.contentWindow.document;\n\t iframeDocument.open();\n\t iframeDocument.write(scriptTag('document.F=Object'));\n\t iframeDocument.close();\n\t return iframeDocument.F;\n\t};\n\n\t// Check for document.domain and active x support\n\t// No need to use active x approach when document.domain is not set\n\t// see https://github.com/es-shims/es5-shim/issues/150\n\t// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n\t// avoid IE GC bug\n\tvar activeXDocument;\n\tvar NullProtoObject = function () {\n\t try {\n\t /* global ActiveXObject */\n\t activeXDocument = document.domain && new ActiveXObject('htmlfile');\n\t } catch (error) { /* ignore */ }\n\t NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n\t var length = enumBugKeys.length;\n\t while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n\t return NullProtoObject();\n\t};\n\n\thiddenKeys[IE_PROTO] = true;\n\n\t// `Object.create` method\n\t// https://tc39.github.io/ecma262/#sec-object.create\n\tvar objectCreate = Object.create || function create(O, Properties) {\n\t var result;\n\t if (O !== null) {\n\t EmptyConstructor[PROTOTYPE] = anObject(O);\n\t result = new EmptyConstructor();\n\t EmptyConstructor[PROTOTYPE] = null;\n\t // add \"__proto__\" for Object.getPrototypeOf polyfill\n\t result[IE_PROTO] = O;\n\t } else result = NullProtoObject();\n\t return Properties === undefined ? result : objectDefineProperties(result, Properties);\n\t};\n\n\tvar UNSCOPABLES = wellKnownSymbol('unscopables');\n\tvar ArrayPrototype$1 = Array.prototype;\n\n\t// Array.prototype[@@unscopables]\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\tif (ArrayPrototype$1[UNSCOPABLES] == undefined) {\n\t objectDefineProperty.f(ArrayPrototype$1, UNSCOPABLES, {\n\t configurable: true,\n\t value: objectCreate(null)\n\t });\n\t}\n\n\t// add a key to Array.prototype[@@unscopables]\n\tvar addToUnscopables = function (key) {\n\t ArrayPrototype$1[UNSCOPABLES][key] = true;\n\t};\n\n\tvar $includes = arrayIncludes.includes;\n\n\n\n\tvar USES_TO_LENGTH$1 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n\t// `Array.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t_export({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$1 }, {\n\t includes: function includes(el /* , fromIndex = 0 */) {\n\t return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables('includes');\n\n\tvar engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\n\n\tvar process$1 = global_1.process;\n\tvar versions = process$1 && process$1.versions;\n\tvar v8 = versions && versions.v8;\n\tvar match, version;\n\n\tif (v8) {\n\t match = v8.split('.');\n\t version = match[0] + match[1];\n\t} else if (engineUserAgent) {\n\t match = engineUserAgent.match(/Edge\\/(\\d+)/);\n\t if (!match || match[1] >= 74) {\n\t match = engineUserAgent.match(/Chrome\\/(\\d+)/);\n\t if (match) version = match[1];\n\t }\n\t}\n\n\tvar engineV8Version = version && +version;\n\n\tvar SPECIES$1 = wellKnownSymbol('species');\n\n\tvar arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\n\t // We can't use this feature detection in V8 since it causes\n\t // deoptimization and serious performance degradation\n\t // https://github.com/zloirock/core-js/issues/677\n\t return engineV8Version >= 51 || !fails(function () {\n\t var array = [];\n\t var constructor = array.constructor = {};\n\t constructor[SPECIES$1] = function () {\n\t return { foo: 1 };\n\t };\n\t return array[METHOD_NAME](Boolean).foo !== 1;\n\t });\n\t};\n\n\tvar $map = arrayIteration.map;\n\n\n\n\tvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n\t// FF49- issue\n\tvar USES_TO_LENGTH$2 = arrayMethodUsesToLength('map');\n\n\t// `Array.prototype.map` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t// with adding support of @@species\n\t_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$2 }, {\n\t map: function map(callbackfn /* , thisArg */) {\n\t return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tvar FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); });\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\t_export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n\t keys: function keys(it) {\n\t return objectKeys(toObject(it));\n\t }\n\t});\n\n\tvar aPossiblePrototype = function (it) {\n\t if (!isObject(it) && it !== null) {\n\t throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n\t } return it;\n\t};\n\n\t// `Object.setPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n\t// Works with __proto__ only. Old v8 can't work with null proto objects.\n\t/* eslint-disable no-proto */\n\tvar objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n\t var CORRECT_SETTER = false;\n\t var test = {};\n\t var setter;\n\t try {\n\t setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n\t setter.call(test, []);\n\t CORRECT_SETTER = test instanceof Array;\n\t } catch (error) { /* empty */ }\n\t return function setPrototypeOf(O, proto) {\n\t anObject(O);\n\t aPossiblePrototype(proto);\n\t if (CORRECT_SETTER) setter.call(O, proto);\n\t else O.__proto__ = proto;\n\t return O;\n\t };\n\t}() : undefined);\n\n\t// makes subclassing work correct for wrapped built-ins\n\tvar inheritIfRequired = function ($this, dummy, Wrapper) {\n\t var NewTarget, NewTargetPrototype;\n\t if (\n\t // it can work only with native `setPrototypeOf`\n\t objectSetPrototypeOf &&\n\t // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n\t typeof (NewTarget = dummy.constructor) == 'function' &&\n\t NewTarget !== Wrapper &&\n\t isObject(NewTargetPrototype = NewTarget.prototype) &&\n\t NewTargetPrototype !== Wrapper.prototype\n\t ) objectSetPrototypeOf($this, NewTargetPrototype);\n\t return $this;\n\t};\n\n\tvar MATCH = wellKnownSymbol('match');\n\n\t// `IsRegExp` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isregexp\n\tvar isRegexp = function (it) {\n\t var isRegExp;\n\t return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\n\t};\n\n\t// `RegExp.prototype.flags` getter implementation\n\t// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n\tvar regexpFlags = function () {\n\t var that = anObject(this);\n\t var result = '';\n\t if (that.global) result += 'g';\n\t if (that.ignoreCase) result += 'i';\n\t if (that.multiline) result += 'm';\n\t if (that.dotAll) result += 's';\n\t if (that.unicode) result += 'u';\n\t if (that.sticky) result += 'y';\n\t return result;\n\t};\n\n\t// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n\t// so we use an intermediate function.\n\tfunction RE(s, f) {\n\t return RegExp(s, f);\n\t}\n\n\tvar UNSUPPORTED_Y = fails(function () {\n\t // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n\t var re = RE('a', 'y');\n\t re.lastIndex = 2;\n\t return re.exec('abcd') != null;\n\t});\n\n\tvar BROKEN_CARET = fails(function () {\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n\t var re = RE('^r', 'gy');\n\t re.lastIndex = 2;\n\t return re.exec('str') != null;\n\t});\n\n\tvar regexpStickyHelpers = {\n\t\tUNSUPPORTED_Y: UNSUPPORTED_Y,\n\t\tBROKEN_CARET: BROKEN_CARET\n\t};\n\n\tvar SPECIES$2 = wellKnownSymbol('species');\n\n\tvar setSpecies = function (CONSTRUCTOR_NAME) {\n\t var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n\t var defineProperty = objectDefineProperty.f;\n\n\t if (descriptors && Constructor && !Constructor[SPECIES$2]) {\n\t defineProperty(Constructor, SPECIES$2, {\n\t configurable: true,\n\t get: function () { return this; }\n\t });\n\t }\n\t};\n\n\tvar defineProperty$1 = objectDefineProperty.f;\n\tvar getOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n\n\n\n\n\tvar setInternalState = internalState.set;\n\n\n\n\tvar MATCH$1 = wellKnownSymbol('match');\n\tvar NativeRegExp = global_1.RegExp;\n\tvar RegExpPrototype = NativeRegExp.prototype;\n\tvar re1 = /a/g;\n\tvar re2 = /a/g;\n\n\t// \"new\" should create a new object, old webkit bug\n\tvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\n\tvar UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y;\n\n\tvar FORCED = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$1 || fails(function () {\n\t re2[MATCH$1] = false;\n\t // RegExp constructor can alter flags and IsRegExp works correct with @@match\n\t return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n\t})));\n\n\t// `RegExp` constructor\n\t// https://tc39.github.io/ecma262/#sec-regexp-constructor\n\tif (FORCED) {\n\t var RegExpWrapper = function RegExp(pattern, flags) {\n\t var thisIsRegExp = this instanceof RegExpWrapper;\n\t var patternIsRegExp = isRegexp(pattern);\n\t var flagsAreUndefined = flags === undefined;\n\t var sticky;\n\n\t if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n\t return pattern;\n\t }\n\n\t if (CORRECT_NEW) {\n\t if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n\t } else if (pattern instanceof RegExpWrapper) {\n\t if (flagsAreUndefined) flags = regexpFlags.call(pattern);\n\t pattern = pattern.source;\n\t }\n\n\t if (UNSUPPORTED_Y$1) {\n\t sticky = !!flags && flags.indexOf('y') > -1;\n\t if (sticky) flags = flags.replace(/y/g, '');\n\t }\n\n\t var result = inheritIfRequired(\n\t CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n\t thisIsRegExp ? this : RegExpPrototype,\n\t RegExpWrapper\n\t );\n\n\t if (UNSUPPORTED_Y$1 && sticky) setInternalState(result, { sticky: sticky });\n\n\t return result;\n\t };\n\t var proxy = function (key) {\n\t key in RegExpWrapper || defineProperty$1(RegExpWrapper, key, {\n\t configurable: true,\n\t get: function () { return NativeRegExp[key]; },\n\t set: function (it) { NativeRegExp[key] = it; }\n\t });\n\t };\n\t var keys$1 = getOwnPropertyNames(NativeRegExp);\n\t var index = 0;\n\t while (keys$1.length > index) proxy(keys$1[index++]);\n\t RegExpPrototype.constructor = RegExpWrapper;\n\t RegExpWrapper.prototype = RegExpPrototype;\n\t redefine(global_1, 'RegExp', RegExpWrapper);\n\t}\n\n\t// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\n\tsetSpecies('RegExp');\n\n\tvar nativeExec = RegExp.prototype.exec;\n\t// This always refers to the native implementation, because the\n\t// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n\t// which loads this file before patching the method.\n\tvar nativeReplace = String.prototype.replace;\n\n\tvar patchedExec = nativeExec;\n\n\tvar UPDATES_LAST_INDEX_WRONG = (function () {\n\t var re1 = /a/;\n\t var re2 = /b*/g;\n\t nativeExec.call(re1, 'a');\n\t nativeExec.call(re2, 'a');\n\t return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n\t})();\n\n\tvar UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\n\n\t// nonparticipating capturing group, copied from es5-shim's String#split patch.\n\tvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\n\tvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$2;\n\n\tif (PATCH) {\n\t patchedExec = function exec(str) {\n\t var re = this;\n\t var lastIndex, reCopy, match, i;\n\t var sticky = UNSUPPORTED_Y$2 && re.sticky;\n\t var flags = regexpFlags.call(re);\n\t var source = re.source;\n\t var charsAdded = 0;\n\t var strCopy = str;\n\n\t if (sticky) {\n\t flags = flags.replace('y', '');\n\t if (flags.indexOf('g') === -1) {\n\t flags += 'g';\n\t }\n\n\t strCopy = String(str).slice(re.lastIndex);\n\t // Support anchored sticky behavior.\n\t if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n\t source = '(?: ' + source + ')';\n\t strCopy = ' ' + strCopy;\n\t charsAdded++;\n\t }\n\t // ^(? + rx + ) is needed, in combination with some str slicing, to\n\t // simulate the 'y' flag.\n\t reCopy = new RegExp('^(?:' + source + ')', flags);\n\t }\n\n\t if (NPCG_INCLUDED) {\n\t reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n\t }\n\t if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n\t match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n\t if (sticky) {\n\t if (match) {\n\t match.input = match.input.slice(charsAdded);\n\t match[0] = match[0].slice(charsAdded);\n\t match.index = re.lastIndex;\n\t re.lastIndex += match[0].length;\n\t } else re.lastIndex = 0;\n\t } else if (UPDATES_LAST_INDEX_WRONG && match) {\n\t re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n\t }\n\t if (NPCG_INCLUDED && match && match.length > 1) {\n\t // Fix browsers whose `exec` methods don't consistently return `undefined`\n\t // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n\t nativeReplace.call(match[0], reCopy, function () {\n\t for (i = 1; i < arguments.length - 2; i++) {\n\t if (arguments[i] === undefined) match[i] = undefined;\n\t }\n\t });\n\t }\n\n\t return match;\n\t };\n\t}\n\n\tvar regexpExec = patchedExec;\n\n\t_export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\n\t exec: regexpExec\n\t});\n\n\tvar TO_STRING = 'toString';\n\tvar RegExpPrototype$1 = RegExp.prototype;\n\tvar nativeToString = RegExpPrototype$1[TO_STRING];\n\n\tvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n\t// FF44- RegExp#toString has a wrong name\n\tvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n\t// `RegExp.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\n\tif (NOT_GENERIC || INCORRECT_NAME) {\n\t redefine(RegExp.prototype, TO_STRING, function toString() {\n\t var R = anObject(this);\n\t var p = String(R.source);\n\t var rf = R.flags;\n\t var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype$1) ? regexpFlags.call(R) : rf);\n\t return '/' + p + '/' + f;\n\t }, { unsafe: true });\n\t}\n\n\tvar notARegexp = function (it) {\n\t if (isRegexp(it)) {\n\t throw TypeError(\"The method doesn't accept regular expressions\");\n\t } return it;\n\t};\n\n\tvar MATCH$2 = wellKnownSymbol('match');\n\n\tvar correctIsRegexpLogic = function (METHOD_NAME) {\n\t var regexp = /./;\n\t try {\n\t '/./'[METHOD_NAME](regexp);\n\t } catch (e) {\n\t try {\n\t regexp[MATCH$2] = false;\n\t return '/./'[METHOD_NAME](regexp);\n\t } catch (f) { /* empty */ }\n\t } return false;\n\t};\n\n\t// `String.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n\t_export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\n\t includes: function includes(searchString /* , position = 0 */) {\n\t return !!~String(requireObjectCoercible(this))\n\t .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// `String.prototype.{ codePointAt, at }` methods implementation\n\tvar createMethod$2 = function (CONVERT_TO_STRING) {\n\t return function ($this, pos) {\n\t var S = String(requireObjectCoercible($this));\n\t var position = toInteger(pos);\n\t var size = S.length;\n\t var first, second;\n\t if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n\t first = S.charCodeAt(position);\n\t return first < 0xD800 || first > 0xDBFF || position + 1 === size\n\t || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n\t ? CONVERT_TO_STRING ? S.charAt(position) : first\n\t : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n\t };\n\t};\n\n\tvar stringMultibyte = {\n\t // `String.prototype.codePointAt` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n\t codeAt: createMethod$2(false),\n\t // `String.prototype.at` method\n\t // https://github.com/mathiasbynens/String.prototype.at\n\t charAt: createMethod$2(true)\n\t};\n\n\tvar correctPrototypeGetter = !fails(function () {\n\t function F() { /* empty */ }\n\t F.prototype.constructor = null;\n\t return Object.getPrototypeOf(new F()) !== F.prototype;\n\t});\n\n\tvar IE_PROTO$1 = sharedKey('IE_PROTO');\n\tvar ObjectPrototype = Object.prototype;\n\n\t// `Object.getPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.getprototypeof\n\tvar objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {\n\t O = toObject(O);\n\t if (has(O, IE_PROTO$1)) return O[IE_PROTO$1];\n\t if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n\t return O.constructor.prototype;\n\t } return O instanceof Object ? ObjectPrototype : null;\n\t};\n\n\tvar ITERATOR$3 = wellKnownSymbol('iterator');\n\tvar BUGGY_SAFARI_ITERATORS = false;\n\n\tvar returnThis = function () { return this; };\n\n\t// `%IteratorPrototype%` object\n\t// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\n\tvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n\tif ([].keys) {\n\t arrayIterator = [].keys();\n\t // Safari 8 has buggy iterators w/o `next`\n\t if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n\t else {\n\t PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));\n\t if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n\t }\n\t}\n\n\tif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n\t// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\tif ( !has(IteratorPrototype, ITERATOR$3)) {\n\t createNonEnumerableProperty(IteratorPrototype, ITERATOR$3, returnThis);\n\t}\n\n\tvar iteratorsCore = {\n\t IteratorPrototype: IteratorPrototype,\n\t BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n\t};\n\n\tvar defineProperty$2 = objectDefineProperty.f;\n\n\n\n\tvar TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');\n\n\tvar setToStringTag = function (it, TAG, STATIC) {\n\t if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG$2)) {\n\t defineProperty$2(it, TO_STRING_TAG$2, { configurable: true, value: TAG });\n\t }\n\t};\n\n\tvar IteratorPrototype$1 = iteratorsCore.IteratorPrototype;\n\n\n\n\n\n\tvar returnThis$1 = function () { return this; };\n\n\tvar createIteratorConstructor = function (IteratorConstructor, NAME, next) {\n\t var TO_STRING_TAG = NAME + ' Iterator';\n\t IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });\n\t setToStringTag(IteratorConstructor, TO_STRING_TAG, false);\n\t iterators[TO_STRING_TAG] = returnThis$1;\n\t return IteratorConstructor;\n\t};\n\n\tvar IteratorPrototype$2 = iteratorsCore.IteratorPrototype;\n\tvar BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\n\tvar ITERATOR$4 = wellKnownSymbol('iterator');\n\tvar KEYS = 'keys';\n\tvar VALUES = 'values';\n\tvar ENTRIES = 'entries';\n\n\tvar returnThis$2 = function () { return this; };\n\n\tvar defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n\t createIteratorConstructor(IteratorConstructor, NAME, next);\n\n\t var getIterationMethod = function (KIND) {\n\t if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n\t if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];\n\t switch (KIND) {\n\t case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n\t case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n\t case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n\t } return function () { return new IteratorConstructor(this); };\n\t };\n\n\t var TO_STRING_TAG = NAME + ' Iterator';\n\t var INCORRECT_VALUES_NAME = false;\n\t var IterablePrototype = Iterable.prototype;\n\t var nativeIterator = IterablePrototype[ITERATOR$4]\n\t || IterablePrototype['@@iterator']\n\t || DEFAULT && IterablePrototype[DEFAULT];\n\t var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);\n\t var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n\t var CurrentIteratorPrototype, methods, KEY;\n\n\t // fix native\n\t if (anyNativeIterator) {\n\t CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));\n\t if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {\n\t if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {\n\t if (objectSetPrototypeOf) {\n\t objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);\n\t } else if (typeof CurrentIteratorPrototype[ITERATOR$4] != 'function') {\n\t createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$4, returnThis$2);\n\t }\n\t }\n\t // Set @@toStringTag to native iterators\n\t setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);\n\t }\n\t }\n\n\t // fix Array#{values, @@iterator}.name in V8 / FF\n\t if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n\t INCORRECT_VALUES_NAME = true;\n\t defaultIterator = function values() { return nativeIterator.call(this); };\n\t }\n\n\t // define iterator\n\t if ( IterablePrototype[ITERATOR$4] !== defaultIterator) {\n\t createNonEnumerableProperty(IterablePrototype, ITERATOR$4, defaultIterator);\n\t }\n\t iterators[NAME] = defaultIterator;\n\n\t // export additional methods\n\t if (DEFAULT) {\n\t methods = {\n\t values: getIterationMethod(VALUES),\n\t keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n\t entries: getIterationMethod(ENTRIES)\n\t };\n\t if (FORCED) for (KEY in methods) {\n\t if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n\t redefine(IterablePrototype, KEY, methods[KEY]);\n\t }\n\t } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods);\n\t }\n\n\t return methods;\n\t};\n\n\tvar charAt = stringMultibyte.charAt;\n\n\n\n\tvar STRING_ITERATOR = 'String Iterator';\n\tvar setInternalState$1 = internalState.set;\n\tvar getInternalState = internalState.getterFor(STRING_ITERATOR);\n\n\t// `String.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\n\tdefineIterator(String, 'String', function (iterated) {\n\t setInternalState$1(this, {\n\t type: STRING_ITERATOR,\n\t string: String(iterated),\n\t index: 0\n\t });\n\t// `%StringIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n\t}, function next() {\n\t var state = getInternalState(this);\n\t var string = state.string;\n\t var index = state.index;\n\t var point;\n\t if (index >= string.length) return { value: undefined, done: true };\n\t point = charAt(string, index);\n\t state.index += point.length;\n\t return { value: point, done: false };\n\t});\n\n\t// iterable DOM collections\n\t// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\n\tvar domIterables = {\n\t CSSRuleList: 0,\n\t CSSStyleDeclaration: 0,\n\t CSSValueList: 0,\n\t ClientRectList: 0,\n\t DOMRectList: 0,\n\t DOMStringList: 0,\n\t DOMTokenList: 1,\n\t DataTransferItemList: 0,\n\t FileList: 0,\n\t HTMLAllCollection: 0,\n\t HTMLCollection: 0,\n\t HTMLFormElement: 0,\n\t HTMLSelectElement: 0,\n\t MediaList: 0,\n\t MimeTypeArray: 0,\n\t NamedNodeMap: 0,\n\t NodeList: 1,\n\t PaintRequestList: 0,\n\t Plugin: 0,\n\t PluginArray: 0,\n\t SVGLengthList: 0,\n\t SVGNumberList: 0,\n\t SVGPathSegList: 0,\n\t SVGPointList: 0,\n\t SVGStringList: 0,\n\t SVGTransformList: 0,\n\t SourceBufferList: 0,\n\t StyleSheetList: 0,\n\t TextTrackCueList: 0,\n\t TextTrackList: 0,\n\t TouchList: 0\n\t};\n\n\tfor (var COLLECTION_NAME in domIterables) {\n\t var Collection = global_1[COLLECTION_NAME];\n\t var CollectionPrototype = Collection && Collection.prototype;\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {\n\t createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach);\n\t } catch (error) {\n\t CollectionPrototype.forEach = arrayForEach;\n\t }\n\t}\n\n\t// Setup tab focus\n\tvar container = document.getElementById('container');\n\tvar tabClassName = 'tab-focus'; // Remove class on blur\n\n\tdocument.addEventListener('focusout', function (event) {\n\t if (!event.target.classList || container.contains(event.target)) {\n\t return;\n\t }\n\n\t event.target.classList.remove(tabClassName);\n\t}); // Add classname to tabbed elements\n\n\tdocument.addEventListener('keydown', function (event) {\n\t if (event.keyCode !== 9) {\n\t return;\n\t } // Delay the adding of classname until the focus has changed\n\t // This event fires before the focusin event\n\n\n\t setTimeout(function () {\n\t var focused = document.activeElement;\n\n\t if (!focused || !focused.classList || container.contains(focused)) {\n\t return;\n\t }\n\n\t focused.classList.add(tabClassName);\n\t }, 10);\n\t});\n\n\t// Polyfill for creating CustomEvents on IE9/10/11\n\t// code pulled from:\n\t// https://github.com/d4tocchini/customevent-polyfill\n\t// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n\t(function () {\n\t if (typeof window === 'undefined') {\n\t return;\n\t }\n\n\t try {\n\t var ce = new window.CustomEvent('test', {\n\t cancelable: true\n\t });\n\t ce.preventDefault();\n\n\t if (ce.defaultPrevented !== true) {\n\t // IE has problems with .preventDefault() on custom events\n\t // http://stackoverflow.com/questions/23349191\n\t throw new Error('Could not prevent default');\n\t }\n\t } catch (e) {\n\t var CustomEvent = function CustomEvent(event, params) {\n\t var evt, origPrevent;\n\t params = params || {};\n\t params.bubbles = !!params.bubbles;\n\t params.cancelable = !!params.cancelable;\n\t evt = document.createEvent('CustomEvent');\n\t evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n\t origPrevent = evt.preventDefault;\n\n\t evt.preventDefault = function () {\n\t origPrevent.call(this);\n\n\t try {\n\t Object.defineProperty(this, 'defaultPrevented', {\n\t get: function get() {\n\t return true;\n\t }\n\t });\n\t } catch (e) {\n\t this.defaultPrevented = true;\n\t }\n\t };\n\n\t return evt;\n\t };\n\n\t CustomEvent.prototype = window.Event.prototype;\n\t window.CustomEvent = CustomEvent; // expose definition to window\n\t }\n\t})();\n\n\tvar nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n\tvar toString$1 = {}.toString;\n\n\tvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n\t ? Object.getOwnPropertyNames(window) : [];\n\n\tvar getWindowNames = function (it) {\n\t try {\n\t return nativeGetOwnPropertyNames(it);\n\t } catch (error) {\n\t return windowNames.slice();\n\t }\n\t};\n\n\t// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\tvar f$5 = function getOwnPropertyNames(it) {\n\t return windowNames && toString$1.call(it) == '[object Window]'\n\t ? getWindowNames(it)\n\t : nativeGetOwnPropertyNames(toIndexedObject(it));\n\t};\n\n\tvar objectGetOwnPropertyNamesExternal = {\n\t\tf: f$5\n\t};\n\n\tvar f$6 = wellKnownSymbol;\n\n\tvar wellKnownSymbolWrapped = {\n\t\tf: f$6\n\t};\n\n\tvar defineProperty$3 = objectDefineProperty.f;\n\n\tvar defineWellKnownSymbol = function (NAME) {\n\t var Symbol = path.Symbol || (path.Symbol = {});\n\t if (!has(Symbol, NAME)) defineProperty$3(Symbol, NAME, {\n\t value: wellKnownSymbolWrapped.f(NAME)\n\t });\n\t};\n\n\tvar $forEach$1 = arrayIteration.forEach;\n\n\tvar HIDDEN = sharedKey('hidden');\n\tvar SYMBOL = 'Symbol';\n\tvar PROTOTYPE$1 = 'prototype';\n\tvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n\tvar setInternalState$2 = internalState.set;\n\tvar getInternalState$1 = internalState.getterFor(SYMBOL);\n\tvar ObjectPrototype$1 = Object[PROTOTYPE$1];\n\tvar $Symbol = global_1.Symbol;\n\tvar $stringify = getBuiltIn('JSON', 'stringify');\n\tvar nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\tvar nativeDefineProperty$1 = objectDefineProperty.f;\n\tvar nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;\n\tvar nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;\n\tvar AllSymbols = shared('symbols');\n\tvar ObjectPrototypeSymbols = shared('op-symbols');\n\tvar StringToSymbolRegistry = shared('string-to-symbol-registry');\n\tvar SymbolToStringRegistry = shared('symbol-to-string-registry');\n\tvar WellKnownSymbolsStore$1 = shared('wks');\n\tvar QObject = global_1.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;\n\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDescriptor = descriptors && fails(function () {\n\t return objectCreate(nativeDefineProperty$1({}, 'a', {\n\t get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }\n\t })).a != 7;\n\t}) ? function (O, P, Attributes) {\n\t var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype$1, P);\n\t if (ObjectPrototypeDescriptor) delete ObjectPrototype$1[P];\n\t nativeDefineProperty$1(O, P, Attributes);\n\t if (ObjectPrototypeDescriptor && O !== ObjectPrototype$1) {\n\t nativeDefineProperty$1(ObjectPrototype$1, P, ObjectPrototypeDescriptor);\n\t }\n\t} : nativeDefineProperty$1;\n\n\tvar wrap = function (tag, description) {\n\t var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);\n\t setInternalState$2(symbol, {\n\t type: SYMBOL,\n\t tag: tag,\n\t description: description\n\t });\n\t if (!descriptors) symbol.description = description;\n\t return symbol;\n\t};\n\n\tvar isSymbol = useSymbolAsUid ? function (it) {\n\t return typeof it == 'symbol';\n\t} : function (it) {\n\t return Object(it) instanceof $Symbol;\n\t};\n\n\tvar $defineProperty = function defineProperty(O, P, Attributes) {\n\t if (O === ObjectPrototype$1) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n\t anObject(O);\n\t var key = toPrimitive(P, true);\n\t anObject(Attributes);\n\t if (has(AllSymbols, key)) {\n\t if (!Attributes.enumerable) {\n\t if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));\n\t O[HIDDEN][key] = true;\n\t } else {\n\t if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n\t Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n\t } return setSymbolDescriptor(O, key, Attributes);\n\t } return nativeDefineProperty$1(O, key, Attributes);\n\t};\n\n\tvar $defineProperties = function defineProperties(O, Properties) {\n\t anObject(O);\n\t var properties = toIndexedObject(Properties);\n\t var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n\t $forEach$1(keys, function (key) {\n\t if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n\t });\n\t return O;\n\t};\n\n\tvar $create = function create(O, Properties) {\n\t return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);\n\t};\n\n\tvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n\t var P = toPrimitive(V, true);\n\t var enumerable = nativePropertyIsEnumerable$1.call(this, P);\n\t if (this === ObjectPrototype$1 && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n\t return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n\t};\n\n\tvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n\t var it = toIndexedObject(O);\n\t var key = toPrimitive(P, true);\n\t if (it === ObjectPrototype$1 && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n\t var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);\n\t if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n\t descriptor.enumerable = true;\n\t }\n\t return descriptor;\n\t};\n\n\tvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n\t var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));\n\t var result = [];\n\t $forEach$1(names, function (key) {\n\t if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n\t });\n\t return result;\n\t};\n\n\tvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n\t var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$1;\n\t var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n\t var result = [];\n\t $forEach$1(names, function (key) {\n\t if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype$1, key))) {\n\t result.push(AllSymbols[key]);\n\t }\n\t });\n\t return result;\n\t};\n\n\t// `Symbol` constructor\n\t// https://tc39.github.io/ecma262/#sec-symbol-constructor\n\tif (!nativeSymbol) {\n\t $Symbol = function Symbol() {\n\t if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n\t var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t var tag = uid(description);\n\t var setter = function (value) {\n\t if (this === ObjectPrototype$1) setter.call(ObjectPrototypeSymbols, value);\n\t if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n\t setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n\t };\n\t if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype$1, tag, { configurable: true, set: setter });\n\t return wrap(tag, description);\n\t };\n\n\t redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {\n\t return getInternalState$1(this).tag;\n\t });\n\n\t redefine($Symbol, 'withoutSetter', function (description) {\n\t return wrap(uid(description), description);\n\t });\n\n\t objectPropertyIsEnumerable.f = $propertyIsEnumerable;\n\t objectDefineProperty.f = $defineProperty;\n\t objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;\n\t objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n\t objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;\n\n\t wellKnownSymbolWrapped.f = function (name) {\n\t return wrap(wellKnownSymbol(name), name);\n\t };\n\n\t if (descriptors) {\n\t // https://github.com/tc39/proposal-Symbol-description\n\t nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {\n\t configurable: true,\n\t get: function description() {\n\t return getInternalState$1(this).description;\n\t }\n\t });\n\t {\n\t redefine(ObjectPrototype$1, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n\t }\n\t }\n\t}\n\n\t_export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, {\n\t Symbol: $Symbol\n\t});\n\n\t$forEach$1(objectKeys(WellKnownSymbolsStore$1), function (name) {\n\t defineWellKnownSymbol(name);\n\t});\n\n\t_export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, {\n\t // `Symbol.for` method\n\t // https://tc39.github.io/ecma262/#sec-symbol.for\n\t 'for': function (key) {\n\t var string = String(key);\n\t if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n\t var symbol = $Symbol(string);\n\t StringToSymbolRegistry[string] = symbol;\n\t SymbolToStringRegistry[symbol] = string;\n\t return symbol;\n\t },\n\t // `Symbol.keyFor` method\n\t // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n\t keyFor: function keyFor(sym) {\n\t if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n\t if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n\t },\n\t useSetter: function () { USE_SETTER = true; },\n\t useSimple: function () { USE_SETTER = false; }\n\t});\n\n\t_export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, {\n\t // `Object.create` method\n\t // https://tc39.github.io/ecma262/#sec-object.create\n\t create: $create,\n\t // `Object.defineProperty` method\n\t // https://tc39.github.io/ecma262/#sec-object.defineproperty\n\t defineProperty: $defineProperty,\n\t // `Object.defineProperties` method\n\t // https://tc39.github.io/ecma262/#sec-object.defineproperties\n\t defineProperties: $defineProperties,\n\t // `Object.getOwnPropertyDescriptor` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n\t});\n\n\t_export({ target: 'Object', stat: true, forced: !nativeSymbol }, {\n\t // `Object.getOwnPropertyNames` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\t getOwnPropertyNames: $getOwnPropertyNames,\n\t // `Object.getOwnPropertySymbols` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n\t getOwnPropertySymbols: $getOwnPropertySymbols\n\t});\n\n\t// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n\t// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n\t_export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {\n\t getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n\t return objectGetOwnPropertySymbols.f(toObject(it));\n\t }\n\t});\n\n\t// `JSON.stringify` method behavior with symbols\n\t// https://tc39.github.io/ecma262/#sec-json.stringify\n\tif ($stringify) {\n\t var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () {\n\t var symbol = $Symbol();\n\t // MS Edge converts symbol values to JSON as {}\n\t return $stringify([symbol]) != '[null]'\n\t // WebKit converts symbol values to JSON as null\n\t || $stringify({ a: symbol }) != '{}'\n\t // V8 throws on boxed symbols\n\t || $stringify(Object(symbol)) != '{}';\n\t });\n\n\t _export({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n\t // eslint-disable-next-line no-unused-vars\n\t stringify: function stringify(it, replacer, space) {\n\t var args = [it];\n\t var index = 1;\n\t var $replacer;\n\t while (arguments.length > index) args.push(arguments[index++]);\n\t $replacer = replacer;\n\t if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n\t if (!isArray(replacer)) replacer = function (key, value) {\n\t if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n\t if (!isSymbol(value)) return value;\n\t };\n\t args[1] = replacer;\n\t return $stringify.apply(null, args);\n\t }\n\t });\n\t}\n\n\t// `Symbol.prototype[@@toPrimitive]` method\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\n\tif (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) {\n\t createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);\n\t}\n\t// `Symbol.prototype[@@toStringTag]` property\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\n\tsetToStringTag($Symbol, SYMBOL);\n\n\thiddenKeys[HIDDEN] = true;\n\n\tvar defineProperty$4 = objectDefineProperty.f;\n\n\n\tvar NativeSymbol = global_1.Symbol;\n\n\tif (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n\t // Safari 12 bug\n\t NativeSymbol().description !== undefined\n\t)) {\n\t var EmptyStringDescriptionStore = {};\n\t // wrap Symbol constructor for correct work with undefined description\n\t var SymbolWrapper = function Symbol() {\n\t var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t var result = this instanceof SymbolWrapper\n\t ? new NativeSymbol(description)\n\t // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n\t : description === undefined ? NativeSymbol() : NativeSymbol(description);\n\t if (description === '') EmptyStringDescriptionStore[result] = true;\n\t return result;\n\t };\n\t copyConstructorProperties(SymbolWrapper, NativeSymbol);\n\t var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n\t symbolPrototype.constructor = SymbolWrapper;\n\n\t var symbolToString = symbolPrototype.toString;\n\t var native = String(NativeSymbol('test')) == 'Symbol(test)';\n\t var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n\t defineProperty$4(symbolPrototype, 'description', {\n\t configurable: true,\n\t get: function description() {\n\t var symbol = isObject(this) ? this.valueOf() : this;\n\t var string = symbolToString.call(symbol);\n\t if (has(EmptyStringDescriptionStore, symbol)) return '';\n\t var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n\t return desc === '' ? undefined : desc;\n\t }\n\t });\n\n\t _export({ global: true, forced: true }, {\n\t Symbol: SymbolWrapper\n\t });\n\t}\n\n\t// `Symbol.iterator` well-known symbol\n\t// https://tc39.github.io/ecma262/#sec-symbol.iterator\n\tdefineWellKnownSymbol('iterator');\n\n\tvar $indexOf = arrayIncludes.indexOf;\n\n\n\n\tvar nativeIndexOf = [].indexOf;\n\n\tvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\n\tvar STRICT_METHOD$1 = arrayMethodIsStrict('indexOf');\n\tvar USES_TO_LENGTH$3 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n\t// `Array.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t_export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD$1 || !USES_TO_LENGTH$3 }, {\n\t indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n\t return NEGATIVE_ZERO\n\t // convert -0 to +0\n\t ? nativeIndexOf.apply(this, arguments) || 0\n\t : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tvar ARRAY_ITERATOR = 'Array Iterator';\n\tvar setInternalState$3 = internalState.set;\n\tvar getInternalState$2 = internalState.getterFor(ARRAY_ITERATOR);\n\n\t// `Array.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n\t// `Array.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n\t// `Array.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.values\n\t// `Array.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n\t// `CreateArrayIterator` internal method\n\t// https://tc39.github.io/ecma262/#sec-createarrayiterator\n\tvar es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {\n\t setInternalState$3(this, {\n\t type: ARRAY_ITERATOR,\n\t target: toIndexedObject(iterated), // target\n\t index: 0, // next index\n\t kind: kind // kind\n\t });\n\t// `%ArrayIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n\t}, function () {\n\t var state = getInternalState$2(this);\n\t var target = state.target;\n\t var kind = state.kind;\n\t var index = state.index++;\n\t if (!target || index >= target.length) {\n\t state.target = undefined;\n\t return { value: undefined, done: true };\n\t }\n\t if (kind == 'keys') return { value: index, done: false };\n\t if (kind == 'values') return { value: target[index], done: false };\n\t return { value: [index, target[index]], done: false };\n\t}, 'values');\n\n\t// argumentsList[@@iterator] is %ArrayProto_values%\n\t// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n\t// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\n\titerators.Arguments = iterators.Array;\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables('keys');\n\taddToUnscopables('values');\n\taddToUnscopables('entries');\n\n\tvar nativeJoin = [].join;\n\n\tvar ES3_STRINGS = indexedObject != Object;\n\tvar STRICT_METHOD$2 = arrayMethodIsStrict('join', ',');\n\n\t// `Array.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.join\n\t_export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$2 }, {\n\t join: function join(separator) {\n\t return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n\t }\n\t});\n\n\tvar HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('slice');\n\tvar USES_TO_LENGTH$4 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n\tvar SPECIES$3 = wellKnownSymbol('species');\n\tvar nativeSlice = [].slice;\n\tvar max$1 = Math.max;\n\n\t// `Array.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n\t// fallback for not array-like ES3 strings and DOM objects\n\t_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$4 }, {\n\t slice: function slice(start, end) {\n\t var O = toIndexedObject(this);\n\t var length = toLength(O.length);\n\t var k = toAbsoluteIndex(start, length);\n\t var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n\t // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n\t var Constructor, result, n;\n\t if (isArray(O)) {\n\t Constructor = O.constructor;\n\t // cross-realm fallback\n\t if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n\t Constructor = undefined;\n\t } else if (isObject(Constructor)) {\n\t Constructor = Constructor[SPECIES$3];\n\t if (Constructor === null) Constructor = undefined;\n\t }\n\t if (Constructor === Array || Constructor === undefined) {\n\t return nativeSlice.call(O, k, fin);\n\t }\n\t }\n\t result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\n\t for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n\t result.length = n;\n\t return result;\n\t }\n\t});\n\n\t// `Object.prototype.toString` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tvar objectToString = toStringTagSupport ? {}.toString : function toString() {\n\t return '[object ' + classof(this) + ']';\n\t};\n\n\t// `Object.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tif (!toStringTagSupport) {\n\t redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\n\t}\n\n\t// TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\n\n\n\n\n\tvar SPECIES$4 = wellKnownSymbol('species');\n\n\tvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n\t // #replace needs built-in support for named groups.\n\t // #match works fine because it just return the exec results, even if it has\n\t // a \"grops\" property.\n\t var re = /./;\n\t re.exec = function () {\n\t var result = [];\n\t result.groups = { a: '7' };\n\t return result;\n\t };\n\t return ''.replace(re, '$<a>') !== '7';\n\t});\n\n\t// IE <= 11 replaces $0 with the whole match, as if it was $&\n\t// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\n\tvar REPLACE_KEEPS_$0 = (function () {\n\t return 'a'.replace(/./, '$0') === '$0';\n\t})();\n\n\tvar REPLACE = wellKnownSymbol('replace');\n\t// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\n\tvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n\t if (/./[REPLACE]) {\n\t return /./[REPLACE]('a', '$0') === '';\n\t }\n\t return false;\n\t})();\n\n\t// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n\t// Weex JS has frozen built-in prototypes, so use try / catch wrapper\n\tvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n\t var re = /(?:)/;\n\t var originalExec = re.exec;\n\t re.exec = function () { return originalExec.apply(this, arguments); };\n\t var result = 'ab'.split(re);\n\t return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n\t});\n\n\tvar fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {\n\t var SYMBOL = wellKnownSymbol(KEY);\n\n\t var DELEGATES_TO_SYMBOL = !fails(function () {\n\t // String methods call symbol-named RegEp methods\n\t var O = {};\n\t O[SYMBOL] = function () { return 7; };\n\t return ''[KEY](O) != 7;\n\t });\n\n\t var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n\t // Symbol-named RegExp methods call .exec\n\t var execCalled = false;\n\t var re = /a/;\n\n\t if (KEY === 'split') {\n\t // We can't use real regex here since it causes deoptimization\n\t // and serious performance degradation in V8\n\t // https://github.com/zloirock/core-js/issues/306\n\t re = {};\n\t // RegExp[@@split] doesn't call the regex's exec method, but first creates\n\t // a new one. We need to return the patched regex when creating the new one.\n\t re.constructor = {};\n\t re.constructor[SPECIES$4] = function () { return re; };\n\t re.flags = '';\n\t re[SYMBOL] = /./[SYMBOL];\n\t }\n\n\t re.exec = function () { execCalled = true; return null; };\n\n\t re[SYMBOL]('');\n\t return !execCalled;\n\t });\n\n\t if (\n\t !DELEGATES_TO_SYMBOL ||\n\t !DELEGATES_TO_EXEC ||\n\t (KEY === 'replace' && !(\n\t REPLACE_SUPPORTS_NAMED_GROUPS &&\n\t REPLACE_KEEPS_$0 &&\n\t !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n\t )) ||\n\t (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n\t ) {\n\t var nativeRegExpMethod = /./[SYMBOL];\n\t var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n\t if (regexp.exec === regexpExec) {\n\t if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n\t // The native String method already delegates to @@method (this\n\t // polyfilled function), leasing to infinite recursion.\n\t // We avoid it by directly calling the native @@method method.\n\t return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n\t }\n\t return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n\t }\n\t return { done: false };\n\t }, {\n\t REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n\t REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n\t });\n\t var stringMethod = methods[0];\n\t var regexMethod = methods[1];\n\n\t redefine(String.prototype, KEY, stringMethod);\n\t redefine(RegExp.prototype, SYMBOL, length == 2\n\t // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n\t // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n\t ? function (string, arg) { return regexMethod.call(string, this, arg); }\n\t // 21.2.5.6 RegExp.prototype[@@match](string)\n\t // 21.2.5.9 RegExp.prototype[@@search](string)\n\t : function (string) { return regexMethod.call(string, this); }\n\t );\n\t }\n\n\t if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n\t};\n\n\tvar charAt$1 = stringMultibyte.charAt;\n\n\t// `AdvanceStringIndex` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-advancestringindex\n\tvar advanceStringIndex = function (S, index, unicode) {\n\t return index + (unicode ? charAt$1(S, index).length : 1);\n\t};\n\n\t// `RegExpExec` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-regexpexec\n\tvar regexpExecAbstract = function (R, S) {\n\t var exec = R.exec;\n\t if (typeof exec === 'function') {\n\t var result = exec.call(R, S);\n\t if (typeof result !== 'object') {\n\t throw TypeError('RegExp exec method returned something other than an Object or null');\n\t }\n\t return result;\n\t }\n\n\t if (classofRaw(R) !== 'RegExp') {\n\t throw TypeError('RegExp#exec called on incompatible receiver');\n\t }\n\n\t return regexpExec.call(R, S);\n\t};\n\n\tvar max$2 = Math.max;\n\tvar min$2 = Math.min;\n\tvar floor$1 = Math.floor;\n\tvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\n\tvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n\tvar maybeToString = function (it) {\n\t return it === undefined ? it : String(it);\n\t};\n\n\t// @@replace logic\n\tfixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n\t var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n\t var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n\t var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n\t return [\n\t // `String.prototype.replace` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n\t function replace(searchValue, replaceValue) {\n\t var O = requireObjectCoercible(this);\n\t var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n\t return replacer !== undefined\n\t ? replacer.call(searchValue, O, replaceValue)\n\t : nativeReplace.call(String(O), searchValue, replaceValue);\n\t },\n\t // `RegExp.prototype[@@replace]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n\t function (regexp, replaceValue) {\n\t if (\n\t (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n\t (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n\t ) {\n\t var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n\t if (res.done) return res.value;\n\t }\n\n\t var rx = anObject(regexp);\n\t var S = String(this);\n\n\t var functionalReplace = typeof replaceValue === 'function';\n\t if (!functionalReplace) replaceValue = String(replaceValue);\n\n\t var global = rx.global;\n\t if (global) {\n\t var fullUnicode = rx.unicode;\n\t rx.lastIndex = 0;\n\t }\n\t var results = [];\n\t while (true) {\n\t var result = regexpExecAbstract(rx, S);\n\t if (result === null) break;\n\n\t results.push(result);\n\t if (!global) break;\n\n\t var matchStr = String(result[0]);\n\t if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n\t }\n\n\t var accumulatedResult = '';\n\t var nextSourcePosition = 0;\n\t for (var i = 0; i < results.length; i++) {\n\t result = results[i];\n\n\t var matched = String(result[0]);\n\t var position = max$2(min$2(toInteger(result.index), S.length), 0);\n\t var captures = [];\n\t // NOTE: This is equivalent to\n\t // captures = result.slice(1).map(maybeToString)\n\t // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n\t // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n\t // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n\t for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n\t var namedCaptures = result.groups;\n\t if (functionalReplace) {\n\t var replacerArgs = [matched].concat(captures, position, S);\n\t if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n\t var replacement = String(replaceValue.apply(undefined, replacerArgs));\n\t } else {\n\t replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n\t }\n\t if (position >= nextSourcePosition) {\n\t accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n\t nextSourcePosition = position + matched.length;\n\t }\n\t }\n\t return accumulatedResult + S.slice(nextSourcePosition);\n\t }\n\t ];\n\n\t // https://tc39.github.io/ecma262/#sec-getsubstitution\n\t function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n\t var tailPos = position + matched.length;\n\t var m = captures.length;\n\t var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n\t if (namedCaptures !== undefined) {\n\t namedCaptures = toObject(namedCaptures);\n\t symbols = SUBSTITUTION_SYMBOLS;\n\t }\n\t return nativeReplace.call(replacement, symbols, function (match, ch) {\n\t var capture;\n\t switch (ch.charAt(0)) {\n\t case '$': return '$';\n\t case '&': return matched;\n\t case '`': return str.slice(0, position);\n\t case \"'\": return str.slice(tailPos);\n\t case '<':\n\t capture = namedCaptures[ch.slice(1, -1)];\n\t break;\n\t default: // \\d\\d?\n\t var n = +ch;\n\t if (n === 0) return match;\n\t if (n > m) {\n\t var f = floor$1(n / 10);\n\t if (f === 0) return match;\n\t if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n\t return match;\n\t }\n\t capture = captures[n - 1];\n\t }\n\t return capture === undefined ? '' : capture;\n\t });\n\t }\n\t});\n\n\t// `SameValue` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-samevalue\n\tvar sameValue = Object.is || function is(x, y) {\n\t // eslint-disable-next-line no-self-compare\n\t return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n\t};\n\n\t// @@search logic\n\tfixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n\t return [\n\t // `String.prototype.search` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.search\n\t function search(regexp) {\n\t var O = requireObjectCoercible(this);\n\t var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n\t return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n\t },\n\t // `RegExp.prototype[@@search]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n\t function (regexp) {\n\t var res = maybeCallNative(nativeSearch, regexp, this);\n\t if (res.done) return res.value;\n\n\t var rx = anObject(regexp);\n\t var S = String(this);\n\n\t var previousLastIndex = rx.lastIndex;\n\t if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n\t var result = regexpExecAbstract(rx, S);\n\t if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n\t return result === null ? -1 : result.index;\n\t }\n\t ];\n\t});\n\n\tvar SPECIES$5 = wellKnownSymbol('species');\n\n\t// `SpeciesConstructor` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-speciesconstructor\n\tvar speciesConstructor = function (O, defaultConstructor) {\n\t var C = anObject(O).constructor;\n\t var S;\n\t return C === undefined || (S = anObject(C)[SPECIES$5]) == undefined ? defaultConstructor : aFunction$1(S);\n\t};\n\n\tvar arrayPush = [].push;\n\tvar min$3 = Math.min;\n\tvar MAX_UINT32 = 0xFFFFFFFF;\n\n\t// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n\tvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n\t// @@split logic\n\tfixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n\t var internalSplit;\n\t if (\n\t 'abbc'.split(/(b)*/)[1] == 'c' ||\n\t 'test'.split(/(?:)/, -1).length != 4 ||\n\t 'ab'.split(/(?:ab)*/).length != 2 ||\n\t '.'.split(/(.?)(.?)/).length != 4 ||\n\t '.'.split(/()()/).length > 1 ||\n\t ''.split(/.?/).length\n\t ) {\n\t // based on es5-shim implementation, need to rework it\n\t internalSplit = function (separator, limit) {\n\t var string = String(requireObjectCoercible(this));\n\t var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n\t if (lim === 0) return [];\n\t if (separator === undefined) return [string];\n\t // If `separator` is not a regex, use native split\n\t if (!isRegexp(separator)) {\n\t return nativeSplit.call(string, separator, lim);\n\t }\n\t var output = [];\n\t var flags = (separator.ignoreCase ? 'i' : '') +\n\t (separator.multiline ? 'm' : '') +\n\t (separator.unicode ? 'u' : '') +\n\t (separator.sticky ? 'y' : '');\n\t var lastLastIndex = 0;\n\t // Make `global` and avoid `lastIndex` issues by working with a copy\n\t var separatorCopy = new RegExp(separator.source, flags + 'g');\n\t var match, lastIndex, lastLength;\n\t while (match = regexpExec.call(separatorCopy, string)) {\n\t lastIndex = separatorCopy.lastIndex;\n\t if (lastIndex > lastLastIndex) {\n\t output.push(string.slice(lastLastIndex, match.index));\n\t if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n\t lastLength = match[0].length;\n\t lastLastIndex = lastIndex;\n\t if (output.length >= lim) break;\n\t }\n\t if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n\t }\n\t if (lastLastIndex === string.length) {\n\t if (lastLength || !separatorCopy.test('')) output.push('');\n\t } else output.push(string.slice(lastLastIndex));\n\t return output.length > lim ? output.slice(0, lim) : output;\n\t };\n\t // Chakra, V8\n\t } else if ('0'.split(undefined, 0).length) {\n\t internalSplit = function (separator, limit) {\n\t return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n\t };\n\t } else internalSplit = nativeSplit;\n\n\t return [\n\t // `String.prototype.split` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.split\n\t function split(separator, limit) {\n\t var O = requireObjectCoercible(this);\n\t var splitter = separator == undefined ? undefined : separator[SPLIT];\n\t return splitter !== undefined\n\t ? splitter.call(separator, O, limit)\n\t : internalSplit.call(String(O), separator, limit);\n\t },\n\t // `RegExp.prototype[@@split]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n\t //\n\t // NOTE: This cannot be properly polyfilled in engines that don't support\n\t // the 'y' flag.\n\t function (regexp, limit) {\n\t var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n\t if (res.done) return res.value;\n\n\t var rx = anObject(regexp);\n\t var S = String(this);\n\t var C = speciesConstructor(rx, RegExp);\n\n\t var unicodeMatching = rx.unicode;\n\t var flags = (rx.ignoreCase ? 'i' : '') +\n\t (rx.multiline ? 'm' : '') +\n\t (rx.unicode ? 'u' : '') +\n\t (SUPPORTS_Y ? 'y' : 'g');\n\n\t // ^(? + rx + ) is needed, in combination with some S slicing, to\n\t // simulate the 'y' flag.\n\t var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n\t var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n\t if (lim === 0) return [];\n\t if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\n\t var p = 0;\n\t var q = 0;\n\t var A = [];\n\t while (q < S.length) {\n\t splitter.lastIndex = SUPPORTS_Y ? q : 0;\n\t var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n\t var e;\n\t if (\n\t z === null ||\n\t (e = min$3(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n\t ) {\n\t q = advanceStringIndex(S, q, unicodeMatching);\n\t } else {\n\t A.push(S.slice(p, q));\n\t if (A.length === lim) return A;\n\t for (var i = 1; i <= z.length - 1; i++) {\n\t A.push(z[i]);\n\t if (A.length === lim) return A;\n\t }\n\t q = p = e;\n\t }\n\t }\n\t A.push(S.slice(p));\n\t return A;\n\t }\n\t ];\n\t}, !SUPPORTS_Y);\n\n\tvar ITERATOR$5 = wellKnownSymbol('iterator');\n\tvar TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');\n\tvar ArrayValues = es_array_iterator.values;\n\n\tfor (var COLLECTION_NAME$1 in domIterables) {\n\t var Collection$1 = global_1[COLLECTION_NAME$1];\n\t var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;\n\t if (CollectionPrototype$1) {\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$1[ITERATOR$5] !== ArrayValues) try {\n\t createNonEnumerableProperty(CollectionPrototype$1, ITERATOR$5, ArrayValues);\n\t } catch (error) {\n\t CollectionPrototype$1[ITERATOR$5] = ArrayValues;\n\t }\n\t if (!CollectionPrototype$1[TO_STRING_TAG$3]) {\n\t createNonEnumerableProperty(CollectionPrototype$1, TO_STRING_TAG$3, COLLECTION_NAME$1);\n\t }\n\t if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) {\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {\n\t createNonEnumerableProperty(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]);\n\t } catch (error) {\n\t CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME];\n\t }\n\t }\n\t }\n\t}\n\n\tvar ITERATOR$6 = wellKnownSymbol('iterator');\n\n\tvar nativeUrl = !fails(function () {\n\t var url = new URL('b?a=1&b=2&c=3', 'http://a');\n\t var searchParams = url.searchParams;\n\t var result = '';\n\t url.pathname = 'c%20d';\n\t searchParams.forEach(function (value, key) {\n\t searchParams['delete']('b');\n\t result += key + value;\n\t });\n\t return (isPure && !url.toJSON)\n\t || !searchParams.sort\n\t || url.href !== 'http://a/c%20d?a=1&c=3'\n\t || searchParams.get('c') !== '3'\n\t || String(new URLSearchParams('?a=1')) !== 'a=1'\n\t || !searchParams[ITERATOR$6]\n\t // throws in Edge\n\t || new URL('https://a@b').username !== 'a'\n\t || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n\t // not punycoded in Edge\n\t || new URL('http://тест').host !== 'xn--e1aybc'\n\t // not escaped in Chrome 62-\n\t || new URL('http://a#б').hash !== '#%D0%B1'\n\t // fails in Chrome 66-\n\t || result !== 'a1c3'\n\t // throws in Safari\n\t || new URL('http://x', undefined).host !== 'x';\n\t});\n\n\tvar anInstance = function (it, Constructor, name) {\n\t if (!(it instanceof Constructor)) {\n\t throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n\t } return it;\n\t};\n\n\tvar nativeAssign = Object.assign;\n\tvar defineProperty$5 = Object.defineProperty;\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\tvar objectAssign = !nativeAssign || fails(function () {\n\t // should have correct order of operations (Edge bug)\n\t if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$5({}, 'a', {\n\t enumerable: true,\n\t get: function () {\n\t defineProperty$5(this, 'b', {\n\t value: 3,\n\t enumerable: false\n\t });\n\t }\n\t }), { b: 2 })).b !== 1) return true;\n\t // should work with symbols and should have deterministic property order (V8 bug)\n\t var A = {};\n\t var B = {};\n\t // eslint-disable-next-line no-undef\n\t var symbol = Symbol();\n\t var alphabet = 'abcdefghijklmnopqrst';\n\t A[symbol] = 7;\n\t alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n\t return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n\t}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n\t var T = toObject(target);\n\t var argumentsLength = arguments.length;\n\t var index = 1;\n\t var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n\t var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\t while (argumentsLength > index) {\n\t var S = indexedObject(arguments[index++]);\n\t var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n\t var length = keys.length;\n\t var j = 0;\n\t var key;\n\t while (length > j) {\n\t key = keys[j++];\n\t if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n\t }\n\t } return T;\n\t} : nativeAssign;\n\n\t// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\n\tvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\tvar base = 36;\n\tvar tMin = 1;\n\tvar tMax = 26;\n\tvar skew = 38;\n\tvar damp = 700;\n\tvar initialBias = 72;\n\tvar initialN = 128; // 0x80\n\tvar delimiter = '-'; // '\\x2D'\n\tvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\n\tvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\tvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\n\tvar baseMinusTMin = base - tMin;\n\tvar floor$2 = Math.floor;\n\tvar stringFromCharCode = String.fromCharCode;\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t */\n\tvar ucs2decode = function (string) {\n\t var output = [];\n\t var counter = 0;\n\t var length = string.length;\n\t while (counter < length) {\n\t var value = string.charCodeAt(counter++);\n\t if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t // It's a high surrogate, and there is a next character.\n\t var extra = string.charCodeAt(counter++);\n\t if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t } else {\n\t // It's an unmatched surrogate; only append this code unit, in case the\n\t // next code unit is the high surrogate of a surrogate pair.\n\t output.push(value);\n\t counter--;\n\t }\n\t } else {\n\t output.push(value);\n\t }\n\t }\n\t return output;\n\t};\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t */\n\tvar digitToBasic = function (digit) {\n\t // 0..25 map to ASCII a..z or A..Z\n\t // 26..35 map to ASCII 0..9\n\t return digit + 22 + 75 * (digit < 26);\n\t};\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t */\n\tvar adapt = function (delta, numPoints, firstTime) {\n\t var k = 0;\n\t delta = firstTime ? floor$2(delta / damp) : delta >> 1;\n\t delta += floor$2(delta / numPoints);\n\t for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n\t delta = floor$2(delta / baseMinusTMin);\n\t }\n\t return floor$2(k + (baseMinusTMin + 1) * delta / (delta + skew));\n\t};\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t */\n\t// eslint-disable-next-line max-statements\n\tvar encode = function (input) {\n\t var output = [];\n\n\t // Convert the input in UCS-2 to an array of Unicode code points.\n\t input = ucs2decode(input);\n\n\t // Cache the length.\n\t var inputLength = input.length;\n\n\t // Initialize the state.\n\t var n = initialN;\n\t var delta = 0;\n\t var bias = initialBias;\n\t var i, currentValue;\n\n\t // Handle the basic code points.\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue < 0x80) {\n\t output.push(stringFromCharCode(currentValue));\n\t }\n\t }\n\n\t var basicLength = output.length; // number of basic code points.\n\t var handledCPCount = basicLength; // number of code points that have been handled;\n\n\t // Finish the basic string with a delimiter unless it's empty.\n\t if (basicLength) {\n\t output.push(delimiter);\n\t }\n\n\t // Main encoding loop:\n\t while (handledCPCount < inputLength) {\n\t // All non-basic code points < n have been handled already. Find the next larger one:\n\t var m = maxInt;\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue >= n && currentValue < m) {\n\t m = currentValue;\n\t }\n\t }\n\n\t // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n\t var handledCPCountPlusOne = handledCPCount + 1;\n\t if (m - n > floor$2((maxInt - delta) / handledCPCountPlusOne)) {\n\t throw RangeError(OVERFLOW_ERROR);\n\t }\n\n\t delta += (m - n) * handledCPCountPlusOne;\n\t n = m;\n\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue < n && ++delta > maxInt) {\n\t throw RangeError(OVERFLOW_ERROR);\n\t }\n\t if (currentValue == n) {\n\t // Represent delta as a generalized variable-length integer.\n\t var q = delta;\n\t for (var k = base; /* no condition */; k += base) {\n\t var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n\t if (q < t) break;\n\t var qMinusT = q - t;\n\t var baseMinusT = base - t;\n\t output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n\t q = floor$2(qMinusT / baseMinusT);\n\t }\n\n\t output.push(stringFromCharCode(digitToBasic(q)));\n\t bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t delta = 0;\n\t ++handledCPCount;\n\t }\n\t }\n\n\t ++delta;\n\t ++n;\n\t }\n\t return output.join('');\n\t};\n\n\tvar stringPunycodeToAscii = function (input) {\n\t var encoded = [];\n\t var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n\t var i, label;\n\t for (i = 0; i < labels.length; i++) {\n\t label = labels[i];\n\t encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n\t }\n\t return encoded.join('.');\n\t};\n\n\tvar redefineAll = function (target, src, options) {\n\t for (var key in src) redefine(target, key, src[key], options);\n\t return target;\n\t};\n\n\tvar getIterator = function (it) {\n\t var iteratorMethod = getIteratorMethod(it);\n\t if (typeof iteratorMethod != 'function') {\n\t throw TypeError(String(it) + ' is not iterable');\n\t } return anObject(iteratorMethod.call(it));\n\t};\n\n\t// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\tvar $fetch = getBuiltIn('fetch');\n\tvar Headers$1 = getBuiltIn('Headers');\n\tvar ITERATOR$7 = wellKnownSymbol('iterator');\n\tvar URL_SEARCH_PARAMS = 'URLSearchParams';\n\tvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\n\tvar setInternalState$4 = internalState.set;\n\tvar getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS);\n\tvar getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\n\tvar plus = /\\+/g;\n\tvar sequences = Array(4);\n\n\tvar percentSequence = function (bytes) {\n\t return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n\t};\n\n\tvar percentDecode = function (sequence) {\n\t try {\n\t return decodeURIComponent(sequence);\n\t } catch (error) {\n\t return sequence;\n\t }\n\t};\n\n\tvar deserialize = function (it) {\n\t var result = it.replace(plus, ' ');\n\t var bytes = 4;\n\t try {\n\t return decodeURIComponent(result);\n\t } catch (error) {\n\t while (bytes) {\n\t result = result.replace(percentSequence(bytes--), percentDecode);\n\t }\n\t return result;\n\t }\n\t};\n\n\tvar find = /[!'()~]|%20/g;\n\n\tvar replace = {\n\t '!': '%21',\n\t \"'\": '%27',\n\t '(': '%28',\n\t ')': '%29',\n\t '~': '%7E',\n\t '%20': '+'\n\t};\n\n\tvar replacer = function (match) {\n\t return replace[match];\n\t};\n\n\tvar serialize = function (it) {\n\t return encodeURIComponent(it).replace(find, replacer);\n\t};\n\n\tvar parseSearchParams = function (result, query) {\n\t if (query) {\n\t var attributes = query.split('&');\n\t var index = 0;\n\t var attribute, entry;\n\t while (index < attributes.length) {\n\t attribute = attributes[index++];\n\t if (attribute.length) {\n\t entry = attribute.split('=');\n\t result.push({\n\t key: deserialize(entry.shift()),\n\t value: deserialize(entry.join('='))\n\t });\n\t }\n\t }\n\t }\n\t};\n\n\tvar updateSearchParams = function (query) {\n\t this.entries.length = 0;\n\t parseSearchParams(this.entries, query);\n\t};\n\n\tvar validateArgumentsLength = function (passed, required) {\n\t if (passed < required) throw TypeError('Not enough arguments');\n\t};\n\n\tvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n\t setInternalState$4(this, {\n\t type: URL_SEARCH_PARAMS_ITERATOR,\n\t iterator: getIterator(getInternalParamsState(params).entries),\n\t kind: kind\n\t });\n\t}, 'Iterator', function next() {\n\t var state = getInternalIteratorState(this);\n\t var kind = state.kind;\n\t var step = state.iterator.next();\n\t var entry = step.value;\n\t if (!step.done) {\n\t step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n\t } return step;\n\t});\n\n\t// `URLSearchParams` constructor\n\t// https://url.spec.whatwg.org/#interface-urlsearchparams\n\tvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n\t anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\t var init = arguments.length > 0 ? arguments[0] : undefined;\n\t var that = this;\n\t var entries = [];\n\t var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n\t setInternalState$4(that, {\n\t type: URL_SEARCH_PARAMS,\n\t entries: entries,\n\t updateURL: function () { /* empty */ },\n\t updateSearchParams: updateSearchParams\n\t });\n\n\t if (init !== undefined) {\n\t if (isObject(init)) {\n\t iteratorMethod = getIteratorMethod(init);\n\t if (typeof iteratorMethod === 'function') {\n\t iterator = iteratorMethod.call(init);\n\t next = iterator.next;\n\t while (!(step = next.call(iterator)).done) {\n\t entryIterator = getIterator(anObject(step.value));\n\t entryNext = entryIterator.next;\n\t if (\n\t (first = entryNext.call(entryIterator)).done ||\n\t (second = entryNext.call(entryIterator)).done ||\n\t !entryNext.call(entryIterator).done\n\t ) throw TypeError('Expected sequence with length 2');\n\t entries.push({ key: first.value + '', value: second.value + '' });\n\t }\n\t } else for (key in init) if (has(init, key)) entries.push({ key: key, value: init[key] + '' });\n\t } else {\n\t parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n\t }\n\t }\n\t};\n\n\tvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\n\tredefineAll(URLSearchParamsPrototype, {\n\t // `URLSearchParams.prototype.appent` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n\t append: function append(name, value) {\n\t validateArgumentsLength(arguments.length, 2);\n\t var state = getInternalParamsState(this);\n\t state.entries.push({ key: name + '', value: value + '' });\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.delete` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n\t 'delete': function (name) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var state = getInternalParamsState(this);\n\t var entries = state.entries;\n\t var key = name + '';\n\t var index = 0;\n\t while (index < entries.length) {\n\t if (entries[index].key === key) entries.splice(index, 1);\n\t else index++;\n\t }\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.get` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n\t get: function get(name) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var entries = getInternalParamsState(this).entries;\n\t var key = name + '';\n\t var index = 0;\n\t for (; index < entries.length; index++) {\n\t if (entries[index].key === key) return entries[index].value;\n\t }\n\t return null;\n\t },\n\t // `URLSearchParams.prototype.getAll` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n\t getAll: function getAll(name) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var entries = getInternalParamsState(this).entries;\n\t var key = name + '';\n\t var result = [];\n\t var index = 0;\n\t for (; index < entries.length; index++) {\n\t if (entries[index].key === key) result.push(entries[index].value);\n\t }\n\t return result;\n\t },\n\t // `URLSearchParams.prototype.has` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n\t has: function has(name) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var entries = getInternalParamsState(this).entries;\n\t var key = name + '';\n\t var index = 0;\n\t while (index < entries.length) {\n\t if (entries[index++].key === key) return true;\n\t }\n\t return false;\n\t },\n\t // `URLSearchParams.prototype.set` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n\t set: function set(name, value) {\n\t validateArgumentsLength(arguments.length, 1);\n\t var state = getInternalParamsState(this);\n\t var entries = state.entries;\n\t var found = false;\n\t var key = name + '';\n\t var val = value + '';\n\t var index = 0;\n\t var entry;\n\t for (; index < entries.length; index++) {\n\t entry = entries[index];\n\t if (entry.key === key) {\n\t if (found) entries.splice(index--, 1);\n\t else {\n\t found = true;\n\t entry.value = val;\n\t }\n\t }\n\t }\n\t if (!found) entries.push({ key: key, value: val });\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.sort` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n\t sort: function sort() {\n\t var state = getInternalParamsState(this);\n\t var entries = state.entries;\n\t // Array#sort is not stable in some engines\n\t var slice = entries.slice();\n\t var entry, entriesIndex, sliceIndex;\n\t entries.length = 0;\n\t for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n\t entry = slice[sliceIndex];\n\t for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n\t if (entries[entriesIndex].key > entry.key) {\n\t entries.splice(entriesIndex, 0, entry);\n\t break;\n\t }\n\t }\n\t if (entriesIndex === sliceIndex) entries.push(entry);\n\t }\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.forEach` method\n\t forEach: function forEach(callback /* , thisArg */) {\n\t var entries = getInternalParamsState(this).entries;\n\t var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n\t var index = 0;\n\t var entry;\n\t while (index < entries.length) {\n\t entry = entries[index++];\n\t boundFunction(entry.value, entry.key, this);\n\t }\n\t },\n\t // `URLSearchParams.prototype.keys` method\n\t keys: function keys() {\n\t return new URLSearchParamsIterator(this, 'keys');\n\t },\n\t // `URLSearchParams.prototype.values` method\n\t values: function values() {\n\t return new URLSearchParamsIterator(this, 'values');\n\t },\n\t // `URLSearchParams.prototype.entries` method\n\t entries: function entries() {\n\t return new URLSearchParamsIterator(this, 'entries');\n\t }\n\t}, { enumerable: true });\n\n\t// `URLSearchParams.prototype[@@iterator]` method\n\tredefine(URLSearchParamsPrototype, ITERATOR$7, URLSearchParamsPrototype.entries);\n\n\t// `URLSearchParams.prototype.toString` method\n\t// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\n\tredefine(URLSearchParamsPrototype, 'toString', function toString() {\n\t var entries = getInternalParamsState(this).entries;\n\t var result = [];\n\t var index = 0;\n\t var entry;\n\t while (index < entries.length) {\n\t entry = entries[index++];\n\t result.push(serialize(entry.key) + '=' + serialize(entry.value));\n\t } return result.join('&');\n\t}, { enumerable: true });\n\n\tsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n\t_export({ global: true, forced: !nativeUrl }, {\n\t URLSearchParams: URLSearchParamsConstructor\n\t});\n\n\t// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n\t// https://github.com/zloirock/core-js/issues/674\n\tif (!nativeUrl && typeof $fetch == 'function' && typeof Headers$1 == 'function') {\n\t _export({ global: true, enumerable: true, forced: true }, {\n\t fetch: function fetch(input /* , init */) {\n\t var args = [input];\n\t var init, body, headers;\n\t if (arguments.length > 1) {\n\t init = arguments[1];\n\t if (isObject(init)) {\n\t body = init.body;\n\t if (classof(body) === URL_SEARCH_PARAMS) {\n\t headers = init.headers ? new Headers$1(init.headers) : new Headers$1();\n\t if (!headers.has('content-type')) {\n\t headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n\t }\n\t init = objectCreate(init, {\n\t body: createPropertyDescriptor(0, String(body)),\n\t headers: createPropertyDescriptor(0, headers)\n\t });\n\t }\n\t }\n\t args.push(init);\n\t } return $fetch.apply(this, args);\n\t }\n\t });\n\t}\n\n\tvar web_urlSearchParams = {\n\t URLSearchParams: URLSearchParamsConstructor,\n\t getState: getInternalParamsState\n\t};\n\n\t// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\tvar codeAt = stringMultibyte.codeAt;\n\n\n\n\n\n\tvar NativeURL = global_1.URL;\n\tvar URLSearchParams$1 = web_urlSearchParams.URLSearchParams;\n\tvar getInternalSearchParamsState = web_urlSearchParams.getState;\n\tvar setInternalState$5 = internalState.set;\n\tvar getInternalURLState = internalState.getterFor('URL');\n\tvar floor$3 = Math.floor;\n\tvar pow = Math.pow;\n\n\tvar INVALID_AUTHORITY = 'Invalid authority';\n\tvar INVALID_SCHEME = 'Invalid scheme';\n\tvar INVALID_HOST = 'Invalid host';\n\tvar INVALID_PORT = 'Invalid port';\n\n\tvar ALPHA = /[A-Za-z]/;\n\tvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\n\tvar DIGIT = /\\d/;\n\tvar HEX_START = /^(0x|0X)/;\n\tvar OCT = /^[0-7]+$/;\n\tvar DEC = /^\\d+$/;\n\tvar HEX = /^[\\dA-Fa-f]+$/;\n\t// eslint-disable-next-line no-control-regex\n\tvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n\t// eslint-disable-next-line no-control-regex\n\tvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n\t// eslint-disable-next-line no-control-regex\n\tvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n\t// eslint-disable-next-line no-control-regex\n\tvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\n\tvar EOF;\n\n\tvar parseHost = function (url, input) {\n\t var result, codePoints, index;\n\t if (input.charAt(0) == '[') {\n\t if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n\t result = parseIPv6(input.slice(1, -1));\n\t if (!result) return INVALID_HOST;\n\t url.host = result;\n\t // opaque host\n\t } else if (!isSpecial(url)) {\n\t if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n\t result = '';\n\t codePoints = arrayFrom(input);\n\t for (index = 0; index < codePoints.length; index++) {\n\t result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n\t }\n\t url.host = result;\n\t } else {\n\t input = stringPunycodeToAscii(input);\n\t if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n\t result = parseIPv4(input);\n\t if (result === null) return INVALID_HOST;\n\t url.host = result;\n\t }\n\t};\n\n\tvar parseIPv4 = function (input) {\n\t var parts = input.split('.');\n\t var partsLength, numbers, index, part, radix, number, ipv4;\n\t if (parts.length && parts[parts.length - 1] == '') {\n\t parts.pop();\n\t }\n\t partsLength = parts.length;\n\t if (partsLength > 4) return input;\n\t numbers = [];\n\t for (index = 0; index < partsLength; index++) {\n\t part = parts[index];\n\t if (part == '') return input;\n\t radix = 10;\n\t if (part.length > 1 && part.charAt(0) == '0') {\n\t radix = HEX_START.test(part) ? 16 : 8;\n\t part = part.slice(radix == 8 ? 1 : 2);\n\t }\n\t if (part === '') {\n\t number = 0;\n\t } else {\n\t if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n\t number = parseInt(part, radix);\n\t }\n\t numbers.push(number);\n\t }\n\t for (index = 0; index < partsLength; index++) {\n\t number = numbers[index];\n\t if (index == partsLength - 1) {\n\t if (number >= pow(256, 5 - partsLength)) return null;\n\t } else if (number > 255) return null;\n\t }\n\t ipv4 = numbers.pop();\n\t for (index = 0; index < numbers.length; index++) {\n\t ipv4 += numbers[index] * pow(256, 3 - index);\n\t }\n\t return ipv4;\n\t};\n\n\t// eslint-disable-next-line max-statements\n\tvar parseIPv6 = function (input) {\n\t var address = [0, 0, 0, 0, 0, 0, 0, 0];\n\t var pieceIndex = 0;\n\t var compress = null;\n\t var pointer = 0;\n\t var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n\t var char = function () {\n\t return input.charAt(pointer);\n\t };\n\n\t if (char() == ':') {\n\t if (input.charAt(1) != ':') return;\n\t pointer += 2;\n\t pieceIndex++;\n\t compress = pieceIndex;\n\t }\n\t while (char()) {\n\t if (pieceIndex == 8) return;\n\t if (char() == ':') {\n\t if (compress !== null) return;\n\t pointer++;\n\t pieceIndex++;\n\t compress = pieceIndex;\n\t continue;\n\t }\n\t value = length = 0;\n\t while (length < 4 && HEX.test(char())) {\n\t value = value * 16 + parseInt(char(), 16);\n\t pointer++;\n\t length++;\n\t }\n\t if (char() == '.') {\n\t if (length == 0) return;\n\t pointer -= length;\n\t if (pieceIndex > 6) return;\n\t numbersSeen = 0;\n\t while (char()) {\n\t ipv4Piece = null;\n\t if (numbersSeen > 0) {\n\t if (char() == '.' && numbersSeen < 4) pointer++;\n\t else return;\n\t }\n\t if (!DIGIT.test(char())) return;\n\t while (DIGIT.test(char())) {\n\t number = parseInt(char(), 10);\n\t if (ipv4Piece === null) ipv4Piece = number;\n\t else if (ipv4Piece == 0) return;\n\t else ipv4Piece = ipv4Piece * 10 + number;\n\t if (ipv4Piece > 255) return;\n\t pointer++;\n\t }\n\t address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n\t numbersSeen++;\n\t if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n\t }\n\t if (numbersSeen != 4) return;\n\t break;\n\t } else if (char() == ':') {\n\t pointer++;\n\t if (!char()) return;\n\t } else if (char()) return;\n\t address[pieceIndex++] = value;\n\t }\n\t if (compress !== null) {\n\t swaps = pieceIndex - compress;\n\t pieceIndex = 7;\n\t while (pieceIndex != 0 && swaps > 0) {\n\t swap = address[pieceIndex];\n\t address[pieceIndex--] = address[compress + swaps - 1];\n\t address[compress + --swaps] = swap;\n\t }\n\t } else if (pieceIndex != 8) return;\n\t return address;\n\t};\n\n\tvar findLongestZeroSequence = function (ipv6) {\n\t var maxIndex = null;\n\t var maxLength = 1;\n\t var currStart = null;\n\t var currLength = 0;\n\t var index = 0;\n\t for (; index < 8; index++) {\n\t if (ipv6[index] !== 0) {\n\t if (currLength > maxLength) {\n\t maxIndex = currStart;\n\t maxLength = currLength;\n\t }\n\t currStart = null;\n\t currLength = 0;\n\t } else {\n\t if (currStart === null) currStart = index;\n\t ++currLength;\n\t }\n\t }\n\t if (currLength > maxLength) {\n\t maxIndex = currStart;\n\t maxLength = currLength;\n\t }\n\t return maxIndex;\n\t};\n\n\tvar serializeHost = function (host) {\n\t var result, index, compress, ignore0;\n\t // ipv4\n\t if (typeof host == 'number') {\n\t result = [];\n\t for (index = 0; index < 4; index++) {\n\t result.unshift(host % 256);\n\t host = floor$3(host / 256);\n\t } return result.join('.');\n\t // ipv6\n\t } else if (typeof host == 'object') {\n\t result = '';\n\t compress = findLongestZeroSequence(host);\n\t for (index = 0; index < 8; index++) {\n\t if (ignore0 && host[index] === 0) continue;\n\t if (ignore0) ignore0 = false;\n\t if (compress === index) {\n\t result += index ? ':' : '::';\n\t ignore0 = true;\n\t } else {\n\t result += host[index].toString(16);\n\t if (index < 7) result += ':';\n\t }\n\t }\n\t return '[' + result + ']';\n\t } return host;\n\t};\n\n\tvar C0ControlPercentEncodeSet = {};\n\tvar fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, {\n\t ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n\t});\n\tvar pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, {\n\t '#': 1, '?': 1, '{': 1, '}': 1\n\t});\n\tvar userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, {\n\t '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n\t});\n\n\tvar percentEncode = function (char, set) {\n\t var code = codeAt(char, 0);\n\t return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n\t};\n\n\tvar specialSchemes = {\n\t ftp: 21,\n\t file: null,\n\t http: 80,\n\t https: 443,\n\t ws: 80,\n\t wss: 443\n\t};\n\n\tvar isSpecial = function (url) {\n\t return has(specialSchemes, url.scheme);\n\t};\n\n\tvar includesCredentials = function (url) {\n\t return url.username != '' || url.password != '';\n\t};\n\n\tvar cannotHaveUsernamePasswordPort = function (url) {\n\t return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n\t};\n\n\tvar isWindowsDriveLetter = function (string, normalized) {\n\t var second;\n\t return string.length == 2 && ALPHA.test(string.charAt(0))\n\t && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n\t};\n\n\tvar startsWithWindowsDriveLetter = function (string) {\n\t var third;\n\t return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n\t string.length == 2 ||\n\t ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n\t );\n\t};\n\n\tvar shortenURLsPath = function (url) {\n\t var path = url.path;\n\t var pathSize = path.length;\n\t if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n\t path.pop();\n\t }\n\t};\n\n\tvar isSingleDot = function (segment) {\n\t return segment === '.' || segment.toLowerCase() === '%2e';\n\t};\n\n\tvar isDoubleDot = function (segment) {\n\t segment = segment.toLowerCase();\n\t return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n\t};\n\n\t// States:\n\tvar SCHEME_START = {};\n\tvar SCHEME = {};\n\tvar NO_SCHEME = {};\n\tvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\n\tvar PATH_OR_AUTHORITY = {};\n\tvar RELATIVE = {};\n\tvar RELATIVE_SLASH = {};\n\tvar SPECIAL_AUTHORITY_SLASHES = {};\n\tvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\n\tvar AUTHORITY = {};\n\tvar HOST = {};\n\tvar HOSTNAME = {};\n\tvar PORT = {};\n\tvar FILE = {};\n\tvar FILE_SLASH = {};\n\tvar FILE_HOST = {};\n\tvar PATH_START = {};\n\tvar PATH = {};\n\tvar CANNOT_BE_A_BASE_URL_PATH = {};\n\tvar QUERY = {};\n\tvar FRAGMENT = {};\n\n\t// eslint-disable-next-line max-statements\n\tvar parseURL = function (url, input, stateOverride, base) {\n\t var state = stateOverride || SCHEME_START;\n\t var pointer = 0;\n\t var buffer = '';\n\t var seenAt = false;\n\t var seenBracket = false;\n\t var seenPasswordToken = false;\n\t var codePoints, char, bufferCodePoints, failure;\n\n\t if (!stateOverride) {\n\t url.scheme = '';\n\t url.username = '';\n\t url.password = '';\n\t url.host = null;\n\t url.port = null;\n\t url.path = [];\n\t url.query = null;\n\t url.fragment = null;\n\t url.cannotBeABaseURL = false;\n\t input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n\t }\n\n\t input = input.replace(TAB_AND_NEW_LINE, '');\n\n\t codePoints = arrayFrom(input);\n\n\t while (pointer <= codePoints.length) {\n\t char = codePoints[pointer];\n\t switch (state) {\n\t case SCHEME_START:\n\t if (char && ALPHA.test(char)) {\n\t buffer += char.toLowerCase();\n\t state = SCHEME;\n\t } else if (!stateOverride) {\n\t state = NO_SCHEME;\n\t continue;\n\t } else return INVALID_SCHEME;\n\t break;\n\n\t case SCHEME:\n\t if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n\t buffer += char.toLowerCase();\n\t } else if (char == ':') {\n\t if (stateOverride && (\n\t (isSpecial(url) != has(specialSchemes, buffer)) ||\n\t (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n\t (url.scheme == 'file' && !url.host)\n\t )) return;\n\t url.scheme = buffer;\n\t if (stateOverride) {\n\t if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n\t return;\n\t }\n\t buffer = '';\n\t if (url.scheme == 'file') {\n\t state = FILE;\n\t } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n\t state = SPECIAL_RELATIVE_OR_AUTHORITY;\n\t } else if (isSpecial(url)) {\n\t state = SPECIAL_AUTHORITY_SLASHES;\n\t } else if (codePoints[pointer + 1] == '/') {\n\t state = PATH_OR_AUTHORITY;\n\t pointer++;\n\t } else {\n\t url.cannotBeABaseURL = true;\n\t url.path.push('');\n\t state = CANNOT_BE_A_BASE_URL_PATH;\n\t }\n\t } else if (!stateOverride) {\n\t buffer = '';\n\t state = NO_SCHEME;\n\t pointer = 0;\n\t continue;\n\t } else return INVALID_SCHEME;\n\t break;\n\n\t case NO_SCHEME:\n\t if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n\t if (base.cannotBeABaseURL && char == '#') {\n\t url.scheme = base.scheme;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t url.cannotBeABaseURL = true;\n\t state = FRAGMENT;\n\t break;\n\t }\n\t state = base.scheme == 'file' ? FILE : RELATIVE;\n\t continue;\n\n\t case SPECIAL_RELATIVE_OR_AUTHORITY:\n\t if (char == '/' && codePoints[pointer + 1] == '/') {\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t pointer++;\n\t } else {\n\t state = RELATIVE;\n\t continue;\n\t } break;\n\n\t case PATH_OR_AUTHORITY:\n\t if (char == '/') {\n\t state = AUTHORITY;\n\t break;\n\t } else {\n\t state = PATH;\n\t continue;\n\t }\n\n\t case RELATIVE:\n\t url.scheme = base.scheme;\n\t if (char == EOF) {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n\t state = RELATIVE_SLASH;\n\t } else if (char == '?') {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = '';\n\t state = QUERY;\n\t } else if (char == '#') {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.path.pop();\n\t state = PATH;\n\t continue;\n\t } break;\n\n\t case RELATIVE_SLASH:\n\t if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t } else if (char == '/') {\n\t state = AUTHORITY;\n\t } else {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t state = PATH;\n\t continue;\n\t } break;\n\n\t case SPECIAL_AUTHORITY_SLASHES:\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n\t if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n\t pointer++;\n\t break;\n\n\t case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n\t if (char != '/' && char != '\\\\') {\n\t state = AUTHORITY;\n\t continue;\n\t } break;\n\n\t case AUTHORITY:\n\t if (char == '@') {\n\t if (seenAt) buffer = '%40' + buffer;\n\t seenAt = true;\n\t bufferCodePoints = arrayFrom(buffer);\n\t for (var i = 0; i < bufferCodePoints.length; i++) {\n\t var codePoint = bufferCodePoints[i];\n\t if (codePoint == ':' && !seenPasswordToken) {\n\t seenPasswordToken = true;\n\t continue;\n\t }\n\t var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n\t if (seenPasswordToken) url.password += encodedCodePoints;\n\t else url.username += encodedCodePoints;\n\t }\n\t buffer = '';\n\t } else if (\n\t char == EOF || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial(url))\n\t ) {\n\t if (seenAt && buffer == '') return INVALID_AUTHORITY;\n\t pointer -= arrayFrom(buffer).length + 1;\n\t buffer = '';\n\t state = HOST;\n\t } else buffer += char;\n\t break;\n\n\t case HOST:\n\t case HOSTNAME:\n\t if (stateOverride && url.scheme == 'file') {\n\t state = FILE_HOST;\n\t continue;\n\t } else if (char == ':' && !seenBracket) {\n\t if (buffer == '') return INVALID_HOST;\n\t failure = parseHost(url, buffer);\n\t if (failure) return failure;\n\t buffer = '';\n\t state = PORT;\n\t if (stateOverride == HOSTNAME) return;\n\t } else if (\n\t char == EOF || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial(url))\n\t ) {\n\t if (isSpecial(url) && buffer == '') return INVALID_HOST;\n\t if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n\t failure = parseHost(url, buffer);\n\t if (failure) return failure;\n\t buffer = '';\n\t state = PATH_START;\n\t if (stateOverride) return;\n\t continue;\n\t } else {\n\t if (char == '[') seenBracket = true;\n\t else if (char == ']') seenBracket = false;\n\t buffer += char;\n\t } break;\n\n\t case PORT:\n\t if (DIGIT.test(char)) {\n\t buffer += char;\n\t } else if (\n\t char == EOF || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial(url)) ||\n\t stateOverride\n\t ) {\n\t if (buffer != '') {\n\t var port = parseInt(buffer, 10);\n\t if (port > 0xFFFF) return INVALID_PORT;\n\t url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n\t buffer = '';\n\t }\n\t if (stateOverride) return;\n\t state = PATH_START;\n\t continue;\n\t } else return INVALID_PORT;\n\t break;\n\n\t case FILE:\n\t url.scheme = 'file';\n\t if (char == '/' || char == '\\\\') state = FILE_SLASH;\n\t else if (base && base.scheme == 'file') {\n\t if (char == EOF) {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t } else if (char == '?') {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = '';\n\t state = QUERY;\n\t } else if (char == '#') {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else {\n\t if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t shortenURLsPath(url);\n\t }\n\t state = PATH;\n\t continue;\n\t }\n\t } else {\n\t state = PATH;\n\t continue;\n\t } break;\n\n\t case FILE_SLASH:\n\t if (char == '/' || char == '\\\\') {\n\t state = FILE_HOST;\n\t break;\n\t }\n\t if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n\t if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n\t else url.host = base.host;\n\t }\n\t state = PATH;\n\t continue;\n\n\t case FILE_HOST:\n\t if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n\t if (!stateOverride && isWindowsDriveLetter(buffer)) {\n\t state = PATH;\n\t } else if (buffer == '') {\n\t url.host = '';\n\t if (stateOverride) return;\n\t state = PATH_START;\n\t } else {\n\t failure = parseHost(url, buffer);\n\t if (failure) return failure;\n\t if (url.host == 'localhost') url.host = '';\n\t if (stateOverride) return;\n\t buffer = '';\n\t state = PATH_START;\n\t } continue;\n\t } else buffer += char;\n\t break;\n\n\t case PATH_START:\n\t if (isSpecial(url)) {\n\t state = PATH;\n\t if (char != '/' && char != '\\\\') continue;\n\t } else if (!stateOverride && char == '?') {\n\t url.query = '';\n\t state = QUERY;\n\t } else if (!stateOverride && char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else if (char != EOF) {\n\t state = PATH;\n\t if (char != '/') continue;\n\t } break;\n\n\t case PATH:\n\t if (\n\t char == EOF || char == '/' ||\n\t (char == '\\\\' && isSpecial(url)) ||\n\t (!stateOverride && (char == '?' || char == '#'))\n\t ) {\n\t if (isDoubleDot(buffer)) {\n\t shortenURLsPath(url);\n\t if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n\t url.path.push('');\n\t }\n\t } else if (isSingleDot(buffer)) {\n\t if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n\t url.path.push('');\n\t }\n\t } else {\n\t if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n\t if (url.host) url.host = '';\n\t buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n\t }\n\t url.path.push(buffer);\n\t }\n\t buffer = '';\n\t if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n\t while (url.path.length > 1 && url.path[0] === '') {\n\t url.path.shift();\n\t }\n\t }\n\t if (char == '?') {\n\t url.query = '';\n\t state = QUERY;\n\t } else if (char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t }\n\t } else {\n\t buffer += percentEncode(char, pathPercentEncodeSet);\n\t } break;\n\n\t case CANNOT_BE_A_BASE_URL_PATH:\n\t if (char == '?') {\n\t url.query = '';\n\t state = QUERY;\n\t } else if (char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else if (char != EOF) {\n\t url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n\t } break;\n\n\t case QUERY:\n\t if (!stateOverride && char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT;\n\t } else if (char != EOF) {\n\t if (char == \"'\" && isSpecial(url)) url.query += '%27';\n\t else if (char == '#') url.query += '%23';\n\t else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n\t } break;\n\n\t case FRAGMENT:\n\t if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n\t break;\n\t }\n\n\t pointer++;\n\t }\n\t};\n\n\t// `URL` constructor\n\t// https://url.spec.whatwg.org/#url-class\n\tvar URLConstructor = function URL(url /* , base */) {\n\t var that = anInstance(this, URLConstructor, 'URL');\n\t var base = arguments.length > 1 ? arguments[1] : undefined;\n\t var urlString = String(url);\n\t var state = setInternalState$5(that, { type: 'URL' });\n\t var baseState, failure;\n\t if (base !== undefined) {\n\t if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n\t else {\n\t failure = parseURL(baseState = {}, String(base));\n\t if (failure) throw TypeError(failure);\n\t }\n\t }\n\t failure = parseURL(state, urlString, null, baseState);\n\t if (failure) throw TypeError(failure);\n\t var searchParams = state.searchParams = new URLSearchParams$1();\n\t var searchParamsState = getInternalSearchParamsState(searchParams);\n\t searchParamsState.updateSearchParams(state.query);\n\t searchParamsState.updateURL = function () {\n\t state.query = String(searchParams) || null;\n\t };\n\t if (!descriptors) {\n\t that.href = serializeURL.call(that);\n\t that.origin = getOrigin.call(that);\n\t that.protocol = getProtocol.call(that);\n\t that.username = getUsername.call(that);\n\t that.password = getPassword.call(that);\n\t that.host = getHost.call(that);\n\t that.hostname = getHostname.call(that);\n\t that.port = getPort.call(that);\n\t that.pathname = getPathname.call(that);\n\t that.search = getSearch.call(that);\n\t that.searchParams = getSearchParams.call(that);\n\t that.hash = getHash.call(that);\n\t }\n\t};\n\n\tvar URLPrototype = URLConstructor.prototype;\n\n\tvar serializeURL = function () {\n\t var url = getInternalURLState(this);\n\t var scheme = url.scheme;\n\t var username = url.username;\n\t var password = url.password;\n\t var host = url.host;\n\t var port = url.port;\n\t var path = url.path;\n\t var query = url.query;\n\t var fragment = url.fragment;\n\t var output = scheme + ':';\n\t if (host !== null) {\n\t output += '//';\n\t if (includesCredentials(url)) {\n\t output += username + (password ? ':' + password : '') + '@';\n\t }\n\t output += serializeHost(host);\n\t if (port !== null) output += ':' + port;\n\t } else if (scheme == 'file') output += '//';\n\t output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t if (query !== null) output += '?' + query;\n\t if (fragment !== null) output += '#' + fragment;\n\t return output;\n\t};\n\n\tvar getOrigin = function () {\n\t var url = getInternalURLState(this);\n\t var scheme = url.scheme;\n\t var port = url.port;\n\t if (scheme == 'blob') try {\n\t return new URL(scheme.path[0]).origin;\n\t } catch (error) {\n\t return 'null';\n\t }\n\t if (scheme == 'file' || !isSpecial(url)) return 'null';\n\t return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n\t};\n\n\tvar getProtocol = function () {\n\t return getInternalURLState(this).scheme + ':';\n\t};\n\n\tvar getUsername = function () {\n\t return getInternalURLState(this).username;\n\t};\n\n\tvar getPassword = function () {\n\t return getInternalURLState(this).password;\n\t};\n\n\tvar getHost = function () {\n\t var url = getInternalURLState(this);\n\t var host = url.host;\n\t var port = url.port;\n\t return host === null ? ''\n\t : port === null ? serializeHost(host)\n\t : serializeHost(host) + ':' + port;\n\t};\n\n\tvar getHostname = function () {\n\t var host = getInternalURLState(this).host;\n\t return host === null ? '' : serializeHost(host);\n\t};\n\n\tvar getPort = function () {\n\t var port = getInternalURLState(this).port;\n\t return port === null ? '' : String(port);\n\t};\n\n\tvar getPathname = function () {\n\t var url = getInternalURLState(this);\n\t var path = url.path;\n\t return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t};\n\n\tvar getSearch = function () {\n\t var query = getInternalURLState(this).query;\n\t return query ? '?' + query : '';\n\t};\n\n\tvar getSearchParams = function () {\n\t return getInternalURLState(this).searchParams;\n\t};\n\n\tvar getHash = function () {\n\t var fragment = getInternalURLState(this).fragment;\n\t return fragment ? '#' + fragment : '';\n\t};\n\n\tvar accessorDescriptor = function (getter, setter) {\n\t return { get: getter, set: setter, configurable: true, enumerable: true };\n\t};\n\n\tif (descriptors) {\n\t objectDefineProperties(URLPrototype, {\n\t // `URL.prototype.href` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-href\n\t href: accessorDescriptor(serializeURL, function (href) {\n\t var url = getInternalURLState(this);\n\t var urlString = String(href);\n\t var failure = parseURL(url, urlString);\n\t if (failure) throw TypeError(failure);\n\t getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n\t }),\n\t // `URL.prototype.origin` getter\n\t // https://url.spec.whatwg.org/#dom-url-origin\n\t origin: accessorDescriptor(getOrigin),\n\t // `URL.prototype.protocol` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-protocol\n\t protocol: accessorDescriptor(getProtocol, function (protocol) {\n\t var url = getInternalURLState(this);\n\t parseURL(url, String(protocol) + ':', SCHEME_START);\n\t }),\n\t // `URL.prototype.username` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-username\n\t username: accessorDescriptor(getUsername, function (username) {\n\t var url = getInternalURLState(this);\n\t var codePoints = arrayFrom(String(username));\n\t if (cannotHaveUsernamePasswordPort(url)) return;\n\t url.username = '';\n\t for (var i = 0; i < codePoints.length; i++) {\n\t url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n\t }\n\t }),\n\t // `URL.prototype.password` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-password\n\t password: accessorDescriptor(getPassword, function (password) {\n\t var url = getInternalURLState(this);\n\t var codePoints = arrayFrom(String(password));\n\t if (cannotHaveUsernamePasswordPort(url)) return;\n\t url.password = '';\n\t for (var i = 0; i < codePoints.length; i++) {\n\t url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n\t }\n\t }),\n\t // `URL.prototype.host` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-host\n\t host: accessorDescriptor(getHost, function (host) {\n\t var url = getInternalURLState(this);\n\t if (url.cannotBeABaseURL) return;\n\t parseURL(url, String(host), HOST);\n\t }),\n\t // `URL.prototype.hostname` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-hostname\n\t hostname: accessorDescriptor(getHostname, function (hostname) {\n\t var url = getInternalURLState(this);\n\t if (url.cannotBeABaseURL) return;\n\t parseURL(url, String(hostname), HOSTNAME);\n\t }),\n\t // `URL.prototype.port` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-port\n\t port: accessorDescriptor(getPort, function (port) {\n\t var url = getInternalURLState(this);\n\t if (cannotHaveUsernamePasswordPort(url)) return;\n\t port = String(port);\n\t if (port == '') url.port = null;\n\t else parseURL(url, port, PORT);\n\t }),\n\t // `URL.prototype.pathname` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-pathname\n\t pathname: accessorDescriptor(getPathname, function (pathname) {\n\t var url = getInternalURLState(this);\n\t if (url.cannotBeABaseURL) return;\n\t url.path = [];\n\t parseURL(url, pathname + '', PATH_START);\n\t }),\n\t // `URL.prototype.search` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-search\n\t search: accessorDescriptor(getSearch, function (search) {\n\t var url = getInternalURLState(this);\n\t search = String(search);\n\t if (search == '') {\n\t url.query = null;\n\t } else {\n\t if ('?' == search.charAt(0)) search = search.slice(1);\n\t url.query = '';\n\t parseURL(url, search, QUERY);\n\t }\n\t getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n\t }),\n\t // `URL.prototype.searchParams` getter\n\t // https://url.spec.whatwg.org/#dom-url-searchparams\n\t searchParams: accessorDescriptor(getSearchParams),\n\t // `URL.prototype.hash` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-hash\n\t hash: accessorDescriptor(getHash, function (hash) {\n\t var url = getInternalURLState(this);\n\t hash = String(hash);\n\t if (hash == '') {\n\t url.fragment = null;\n\t return;\n\t }\n\t if ('#' == hash.charAt(0)) hash = hash.slice(1);\n\t url.fragment = '';\n\t parseURL(url, hash, FRAGMENT);\n\t })\n\t });\n\t}\n\n\t// `URL.prototype.toJSON` method\n\t// https://url.spec.whatwg.org/#dom-url-tojson\n\tredefine(URLPrototype, 'toJSON', function toJSON() {\n\t return serializeURL.call(this);\n\t}, { enumerable: true });\n\n\t// `URL.prototype.toString` method\n\t// https://url.spec.whatwg.org/#URL-stringification-behavior\n\tredefine(URLPrototype, 'toString', function toString() {\n\t return serializeURL.call(this);\n\t}, { enumerable: true });\n\n\tif (NativeURL) {\n\t var nativeCreateObjectURL = NativeURL.createObjectURL;\n\t var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n\t // `URL.createObjectURL` method\n\t // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n\t // eslint-disable-next-line no-unused-vars\n\t if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n\t return nativeCreateObjectURL.apply(NativeURL, arguments);\n\t });\n\t // `URL.revokeObjectURL` method\n\t // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n\t // eslint-disable-next-line no-unused-vars\n\t if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n\t return nativeRevokeObjectURL.apply(NativeURL, arguments);\n\t });\n\t}\n\n\tsetToStringTag(URLConstructor, 'URL');\n\n\t_export({ global: true, forced: !nativeUrl, sham: !descriptors }, {\n\t URL: URLConstructor\n\t});\n\n\tfunction _typeof(obj) {\n\t \"@babel/helpers - typeof\";\n\n\t if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n\t _typeof = function (obj) {\n\t return typeof obj;\n\t };\n\t } else {\n\t _typeof = function (obj) {\n\t return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n\t };\n\t }\n\n\t return _typeof(obj);\n\t}\n\n\tfunction _classCallCheck(instance, Constructor) {\n\t if (!(instance instanceof Constructor)) {\n\t throw new TypeError(\"Cannot call a class as a function\");\n\t }\n\t}\n\n\tfunction _defineProperties(target, props) {\n\t for (var i = 0; i < props.length; i++) {\n\t var descriptor = props[i];\n\t descriptor.enumerable = descriptor.enumerable || false;\n\t descriptor.configurable = true;\n\t if (\"value\" in descriptor) descriptor.writable = true;\n\t Object.defineProperty(target, descriptor.key, descriptor);\n\t }\n\t}\n\n\tfunction _createClass(Constructor, protoProps, staticProps) {\n\t if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n\t if (staticProps) _defineProperties(Constructor, staticProps);\n\t return Constructor;\n\t}\n\n\tfunction _defineProperty(obj, key, value) {\n\t if (key in obj) {\n\t Object.defineProperty(obj, key, {\n\t value: value,\n\t enumerable: true,\n\t configurable: true,\n\t writable: true\n\t });\n\t } else {\n\t obj[key] = value;\n\t }\n\n\t return obj;\n\t}\n\n\tfunction ownKeys$1(object, enumerableOnly) {\n\t var keys = Object.keys(object);\n\n\t if (Object.getOwnPropertySymbols) {\n\t var symbols = Object.getOwnPropertySymbols(object);\n\t if (enumerableOnly) symbols = symbols.filter(function (sym) {\n\t return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n\t });\n\t keys.push.apply(keys, symbols);\n\t }\n\n\t return keys;\n\t}\n\n\tfunction _objectSpread2(target) {\n\t for (var i = 1; i < arguments.length; i++) {\n\t var source = arguments[i] != null ? arguments[i] : {};\n\n\t if (i % 2) {\n\t ownKeys$1(Object(source), true).forEach(function (key) {\n\t _defineProperty(target, key, source[key]);\n\t });\n\t } else if (Object.getOwnPropertyDescriptors) {\n\t Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n\t } else {\n\t ownKeys$1(Object(source)).forEach(function (key) {\n\t Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n\t });\n\t }\n\t }\n\n\t return target;\n\t}\n\n\tfunction _objectWithoutPropertiesLoose(source, excluded) {\n\t if (source == null) return {};\n\t var target = {};\n\t var sourceKeys = Object.keys(source);\n\t var key, i;\n\n\t for (i = 0; i < sourceKeys.length; i++) {\n\t key = sourceKeys[i];\n\t if (excluded.indexOf(key) >= 0) continue;\n\t target[key] = source[key];\n\t }\n\n\t return target;\n\t}\n\n\tfunction _objectWithoutProperties(source, excluded) {\n\t if (source == null) return {};\n\n\t var target = _objectWithoutPropertiesLoose(source, excluded);\n\n\t var key, i;\n\n\t if (Object.getOwnPropertySymbols) {\n\t var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n\t for (i = 0; i < sourceSymbolKeys.length; i++) {\n\t key = sourceSymbolKeys[i];\n\t if (excluded.indexOf(key) >= 0) continue;\n\t if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n\t target[key] = source[key];\n\t }\n\t }\n\n\t return target;\n\t}\n\n\tfunction _slicedToArray(arr, i) {\n\t return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n\t}\n\n\tfunction _toConsumableArray(arr) {\n\t return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n\t}\n\n\tfunction _arrayWithoutHoles(arr) {\n\t if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n\t}\n\n\tfunction _arrayWithHoles(arr) {\n\t if (Array.isArray(arr)) return arr;\n\t}\n\n\tfunction _iterableToArray(iter) {\n\t if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n\t}\n\n\tfunction _iterableToArrayLimit(arr, i) {\n\t if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n\t var _arr = [];\n\t var _n = true;\n\t var _d = false;\n\t var _e = undefined;\n\n\t try {\n\t for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n\t _arr.push(_s.value);\n\n\t if (i && _arr.length === i) break;\n\t }\n\t } catch (err) {\n\t _d = true;\n\t _e = err;\n\t } finally {\n\t try {\n\t if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n\t } finally {\n\t if (_d) throw _e;\n\t }\n\t }\n\n\t return _arr;\n\t}\n\n\tfunction _unsupportedIterableToArray(o, minLen) {\n\t if (!o) return;\n\t if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n\t var n = Object.prototype.toString.call(o).slice(8, -1);\n\t if (n === \"Object\" && o.constructor) n = o.constructor.name;\n\t if (n === \"Map\" || n === \"Set\") return Array.from(o);\n\t if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n\t}\n\n\tfunction _arrayLikeToArray(arr, len) {\n\t if (len == null || len > arr.length) len = arr.length;\n\n\t for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n\t return arr2;\n\t}\n\n\tfunction _nonIterableSpread() {\n\t throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t}\n\n\tfunction _nonIterableRest() {\n\t throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n\t}\n\n\t(function (global) {\n\t /**\r\n\t * Polyfill URLSearchParams\r\n\t *\r\n\t * Inspired from : https://github.com/WebReflection/url-search-params/blob/master/src/url-search-params.js\r\n\t */\n\t var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() {\n\t try {\n\t return !!Symbol.iterator;\n\t } catch (error) {\n\t return false;\n\t }\n\t };\n\n\t var iteratorSupported = checkIfIteratorIsSupported();\n\n\t var createIterator = function createIterator(items) {\n\t var iterator = {\n\t next: function next() {\n\t var value = items.shift();\n\t return {\n\t done: value === void 0,\n\t value: value\n\t };\n\t }\n\t };\n\n\t if (iteratorSupported) {\n\t iterator[Symbol.iterator] = function () {\n\t return iterator;\n\t };\n\t }\n\n\t return iterator;\n\t };\n\t /**\r\n\t * Search param name and values should be encoded according to https://url.spec.whatwg.org/#urlencoded-serializing\r\n\t * encodeURIComponent() produces the same result except encoding spaces as `%20` instead of `+`.\r\n\t */\n\n\n\t var serializeParam = function serializeParam(value) {\n\t return encodeURIComponent(value).replace(/%20/g, '+');\n\t };\n\n\t var deserializeParam = function deserializeParam(value) {\n\t return decodeURIComponent(String(value).replace(/\\+/g, ' '));\n\t };\n\n\t var polyfillURLSearchParams = function polyfillURLSearchParams() {\n\t var URLSearchParams = function URLSearchParams(searchString) {\n\t Object.defineProperty(this, '_entries', {\n\t writable: true,\n\t value: {}\n\t });\n\n\t var typeofSearchString = _typeof(searchString);\n\n\t if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n\t if (searchString !== '') {\n\t this._fromString(searchString);\n\t }\n\t } else if (searchString instanceof URLSearchParams) {\n\t var _this = this;\n\n\t searchString.forEach(function (value, name) {\n\t _this.append(name, value);\n\t });\n\t } else if (searchString !== null && typeofSearchString === 'object') {\n\t if (Object.prototype.toString.call(searchString) === '[object Array]') {\n\t for (var i = 0; i < searchString.length; i++) {\n\t var entry = searchString[i];\n\n\t if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n\t this.append(entry[0], entry[1]);\n\t } else {\n\t throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n\t }\n\t }\n\t } else {\n\t for (var key in searchString) {\n\t if (searchString.hasOwnProperty(key)) {\n\t this.append(key, searchString[key]);\n\t }\n\t }\n\t }\n\t } else {\n\t throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n\t }\n\t };\n\n\t var proto = URLSearchParams.prototype;\n\n\t proto.append = function (name, value) {\n\t if (name in this._entries) {\n\t this._entries[name].push(String(value));\n\t } else {\n\t this._entries[name] = [String(value)];\n\t }\n\t };\n\n\t proto.delete = function (name) {\n\t delete this._entries[name];\n\t };\n\n\t proto.get = function (name) {\n\t return name in this._entries ? this._entries[name][0] : null;\n\t };\n\n\t proto.getAll = function (name) {\n\t return name in this._entries ? this._entries[name].slice(0) : [];\n\t };\n\n\t proto.has = function (name) {\n\t return name in this._entries;\n\t };\n\n\t proto.set = function (name, value) {\n\t this._entries[name] = [String(value)];\n\t };\n\n\t proto.forEach = function (callback, thisArg) {\n\t var entries;\n\n\t for (var name in this._entries) {\n\t if (this._entries.hasOwnProperty(name)) {\n\t entries = this._entries[name];\n\n\t for (var i = 0; i < entries.length; i++) {\n\t callback.call(thisArg, entries[i], name, this);\n\t }\n\t }\n\t }\n\t };\n\n\t proto.keys = function () {\n\t var items = [];\n\t this.forEach(function (value, name) {\n\t items.push(name);\n\t });\n\t return createIterator(items);\n\t };\n\n\t proto.values = function () {\n\t var items = [];\n\t this.forEach(function (value) {\n\t items.push(value);\n\t });\n\t return createIterator(items);\n\t };\n\n\t proto.entries = function () {\n\t var items = [];\n\t this.forEach(function (value, name) {\n\t items.push([name, value]);\n\t });\n\t return createIterator(items);\n\t };\n\n\t if (iteratorSupported) {\n\t proto[Symbol.iterator] = proto.entries;\n\t }\n\n\t proto.toString = function () {\n\t var searchArray = [];\n\t this.forEach(function (value, name) {\n\t searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n\t });\n\t return searchArray.join('&');\n\t };\n\n\t global.URLSearchParams = URLSearchParams;\n\t };\n\n\t var checkIfURLSearchParamsSupported = function checkIfURLSearchParamsSupported() {\n\t try {\n\t var URLSearchParams = global.URLSearchParams;\n\t return new URLSearchParams('?a=1').toString() === 'a=1' && typeof URLSearchParams.prototype.set === 'function' && typeof URLSearchParams.prototype.entries === 'function';\n\t } catch (e) {\n\t return false;\n\t }\n\t };\n\n\t if (!checkIfURLSearchParamsSupported()) {\n\t polyfillURLSearchParams();\n\t }\n\n\t var proto = global.URLSearchParams.prototype;\n\n\t if (typeof proto.sort !== 'function') {\n\t proto.sort = function () {\n\t var _this = this;\n\n\t var items = [];\n\t this.forEach(function (value, name) {\n\t items.push([name, value]);\n\n\t if (!_this._entries) {\n\t _this.delete(name);\n\t }\n\t });\n\t items.sort(function (a, b) {\n\t if (a[0] < b[0]) {\n\t return -1;\n\t } else if (a[0] > b[0]) {\n\t return +1;\n\t } else {\n\t return 0;\n\t }\n\t });\n\n\t if (_this._entries) {\n\t // force reset because IE keeps keys index\n\t _this._entries = {};\n\t }\n\n\t for (var i = 0; i < items.length; i++) {\n\t this.append(items[i][0], items[i][1]);\n\t }\n\t };\n\t }\n\n\t if (typeof proto._fromString !== 'function') {\n\t Object.defineProperty(proto, '_fromString', {\n\t enumerable: false,\n\t configurable: false,\n\t writable: false,\n\t value: function value(searchString) {\n\t if (this._entries) {\n\t this._entries = {};\n\t } else {\n\t var keys = [];\n\t this.forEach(function (value, name) {\n\t keys.push(name);\n\t });\n\n\t for (var i = 0; i < keys.length; i++) {\n\t this.delete(keys[i]);\n\t }\n\t }\n\n\t searchString = searchString.replace(/^\\?/, '');\n\t var attributes = searchString.split('&');\n\t var attribute;\n\n\t for (var i = 0; i < attributes.length; i++) {\n\t attribute = attributes[i].split('=');\n\t this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n\t }\n\t }\n\t });\n\t } // HTMLAnchorElement\n\n\t})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n\t(function (global) {\n\t /**\r\n\t * Polyfill URL\r\n\t *\r\n\t * Inspired from : https://github.com/arv/DOM-URL-Polyfill/blob/master/src/url.js\r\n\t */\n\t var checkIfURLIsSupported = function checkIfURLIsSupported() {\n\t try {\n\t var u = new global.URL('b', 'http://a');\n\t u.pathname = 'c d';\n\t return u.href === 'http://a/c%20d' && u.searchParams;\n\t } catch (e) {\n\t return false;\n\t }\n\t };\n\n\t var polyfillURL = function polyfillURL() {\n\t var _URL = global.URL;\n\n\t var URL = function URL(url, base) {\n\t if (typeof url !== 'string') url = String(url); // Only create another document if the base is different from current location.\n\n\t var doc = document,\n\t baseElement;\n\n\t if (base && (global.location === void 0 || base !== global.location.href)) {\n\t doc = document.implementation.createHTMLDocument('');\n\t baseElement = doc.createElement('base');\n\t baseElement.href = base;\n\t doc.head.appendChild(baseElement);\n\n\t try {\n\t if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n\t } catch (err) {\n\t throw new Error('URL unable to set base ' + base + ' due to ' + err);\n\t }\n\t }\n\n\t var anchorElement = doc.createElement('a');\n\t anchorElement.href = url;\n\n\t if (baseElement) {\n\t doc.body.appendChild(anchorElement);\n\t anchorElement.href = anchorElement.href; // force href to refresh\n\t }\n\n\t var inputElement = doc.createElement('input');\n\t inputElement.type = 'url';\n\t inputElement.value = url;\n\n\t if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || !inputElement.checkValidity() && !base) {\n\t throw new TypeError('Invalid URL');\n\t }\n\n\t Object.defineProperty(this, '_anchorElement', {\n\t value: anchorElement\n\t }); // create a linked searchParams which reflect its changes on URL\n\n\t var searchParams = new global.URLSearchParams(this.search);\n\t var enableSearchUpdate = true;\n\t var enableSearchParamsUpdate = true;\n\n\t var _this = this;\n\n\t ['append', 'delete', 'set'].forEach(function (methodName) {\n\t var method = searchParams[methodName];\n\n\t searchParams[methodName] = function () {\n\t method.apply(searchParams, arguments);\n\n\t if (enableSearchUpdate) {\n\t enableSearchParamsUpdate = false;\n\t _this.search = searchParams.toString();\n\t enableSearchParamsUpdate = true;\n\t }\n\t };\n\t });\n\t Object.defineProperty(this, 'searchParams', {\n\t value: searchParams,\n\t enumerable: true\n\t });\n\t var search = void 0;\n\t Object.defineProperty(this, '_updateSearchParams', {\n\t enumerable: false,\n\t configurable: false,\n\t writable: false,\n\t value: function value() {\n\t if (this.search !== search) {\n\t search = this.search;\n\n\t if (enableSearchParamsUpdate) {\n\t enableSearchUpdate = false;\n\n\t this.searchParams._fromString(this.search);\n\n\t enableSearchUpdate = true;\n\t }\n\t }\n\t }\n\t });\n\t };\n\n\t var proto = URL.prototype;\n\n\t var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) {\n\t Object.defineProperty(proto, attributeName, {\n\t get: function get() {\n\t return this._anchorElement[attributeName];\n\t },\n\t set: function set(value) {\n\t this._anchorElement[attributeName] = value;\n\t },\n\t enumerable: true\n\t });\n\t };\n\n\t ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n\t linkURLWithAnchorAttribute(attributeName);\n\t });\n\t Object.defineProperty(proto, 'search', {\n\t get: function get() {\n\t return this._anchorElement['search'];\n\t },\n\t set: function set(value) {\n\t this._anchorElement['search'] = value;\n\n\t this._updateSearchParams();\n\t },\n\t enumerable: true\n\t });\n\t Object.defineProperties(proto, {\n\t 'toString': {\n\t get: function get() {\n\t var _this = this;\n\n\t return function () {\n\t return _this.href;\n\t };\n\t }\n\t },\n\t 'href': {\n\t get: function get() {\n\t return this._anchorElement.href.replace(/\\?$/, '');\n\t },\n\t set: function set(value) {\n\t this._anchorElement.href = value;\n\n\t this._updateSearchParams();\n\t },\n\t enumerable: true\n\t },\n\t 'pathname': {\n\t get: function get() {\n\t return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n\t },\n\t set: function set(value) {\n\t this._anchorElement.pathname = value;\n\t },\n\t enumerable: true\n\t },\n\t 'origin': {\n\t get: function get() {\n\t // get expected port from protocol\n\t var expectedPort = {\n\t 'http:': 80,\n\t 'https:': 443,\n\t 'ftp:': 21\n\t }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port\n\t // and it is not empty f.e http://foo:8080\n\t // 8080 != 80 && 8080 != ''\n\n\t var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n\t return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n\t },\n\t enumerable: true\n\t },\n\t 'password': {\n\t // TODO\n\t get: function get() {\n\t return '';\n\t },\n\t set: function set(value) {},\n\t enumerable: true\n\t },\n\t 'username': {\n\t // TODO\n\t get: function get() {\n\t return '';\n\t },\n\t set: function set(value) {},\n\t enumerable: true\n\t }\n\t });\n\n\t URL.createObjectURL = function (blob) {\n\t return _URL.createObjectURL.apply(_URL, arguments);\n\t };\n\n\t URL.revokeObjectURL = function (url) {\n\t return _URL.revokeObjectURL.apply(_URL, arguments);\n\t };\n\n\t global.URL = URL;\n\t };\n\n\t if (!checkIfURLIsSupported()) {\n\t polyfillURL();\n\t }\n\n\t if (global.location !== void 0 && !('origin' in global.location)) {\n\t var getOrigin = function getOrigin() {\n\t return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n\t };\n\n\t try {\n\t Object.defineProperty(global.location, 'origin', {\n\t get: getOrigin,\n\t enumerable: true\n\t });\n\t } catch (e) {\n\t setInterval(function () {\n\t global.location.origin = getOrigin();\n\t }, 100);\n\t }\n\t }\n\t})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n\t// `Symbol.asyncIterator` well-known symbol\n\t// https://tc39.github.io/ecma262/#sec-symbol.asynciterator\n\tdefineWellKnownSymbol('asyncIterator');\n\n\tvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n\tvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n\t// We can't use this feature detection in V8 since it causes\n\t// deoptimization and serious performance degradation\n\t// https://github.com/zloirock/core-js/issues/679\n\tvar IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\n\t var array = [];\n\t array[IS_CONCAT_SPREADABLE] = false;\n\t return array.concat()[0] !== array;\n\t});\n\n\tvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\n\tvar isConcatSpreadable = function (O) {\n\t if (!isObject(O)) return false;\n\t var spreadable = O[IS_CONCAT_SPREADABLE];\n\t return spreadable !== undefined ? !!spreadable : isArray(O);\n\t};\n\n\tvar FORCED$1 = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n\t// `Array.prototype.concat` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n\t// with adding support of @@isConcatSpreadable and @@species\n\t_export({ target: 'Array', proto: true, forced: FORCED$1 }, {\n\t concat: function concat(arg) { // eslint-disable-line no-unused-vars\n\t var O = toObject(this);\n\t var A = arraySpeciesCreate(O, 0);\n\t var n = 0;\n\t var i, k, length, len, E;\n\t for (i = -1, length = arguments.length; i < length; i++) {\n\t E = i === -1 ? O : arguments[i];\n\t if (isConcatSpreadable(E)) {\n\t len = toLength(E.length);\n\t if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n\t } else {\n\t if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n\t createProperty(A, n++, E);\n\t }\n\t }\n\t A.length = n;\n\t return A;\n\t }\n\t});\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\t_export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\n\t assign: objectAssign\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\n\n\tvar FAILS_ON_PRIMITIVES$1 = fails(function () { nativeGetOwnPropertyDescriptor$2(1); });\n\tvar FORCED$2 = !descriptors || FAILS_ON_PRIMITIVES$1;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\t_export({ target: 'Object', stat: true, forced: FORCED$2, sham: !descriptors }, {\n\t getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n\t return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key);\n\t }\n\t});\n\n\tvar nativePromiseConstructor = global_1.Promise;\n\n\tvar iterate_1 = createCommonjsModule(function (module) {\n\tvar Result = function (stopped, result) {\n\t this.stopped = stopped;\n\t this.result = result;\n\t};\n\n\tvar iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) {\n\t var boundFunction = functionBindContext(fn, that, AS_ENTRIES ? 2 : 1);\n\t var iterator, iterFn, index, length, result, next, step;\n\n\t if (IS_ITERATOR) {\n\t iterator = iterable;\n\t } else {\n\t iterFn = getIteratorMethod(iterable);\n\t if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n\t // optimisation for array iterators\n\t if (isArrayIteratorMethod(iterFn)) {\n\t for (index = 0, length = toLength(iterable.length); length > index; index++) {\n\t result = AS_ENTRIES\n\t ? boundFunction(anObject(step = iterable[index])[0], step[1])\n\t : boundFunction(iterable[index]);\n\t if (result && result instanceof Result) return result;\n\t } return new Result(false);\n\t }\n\t iterator = iterFn.call(iterable);\n\t }\n\n\t next = iterator.next;\n\t while (!(step = next.call(iterator)).done) {\n\t result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES);\n\t if (typeof result == 'object' && result && result instanceof Result) return result;\n\t } return new Result(false);\n\t};\n\n\titerate.stop = function (result) {\n\t return new Result(true, result);\n\t};\n\t});\n\n\tvar engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent);\n\n\tvar location = global_1.location;\n\tvar set$1 = global_1.setImmediate;\n\tvar clear = global_1.clearImmediate;\n\tvar process$2 = global_1.process;\n\tvar MessageChannel = global_1.MessageChannel;\n\tvar Dispatch = global_1.Dispatch;\n\tvar counter = 0;\n\tvar queue = {};\n\tvar ONREADYSTATECHANGE = 'onreadystatechange';\n\tvar defer, channel, port;\n\n\tvar run = function (id) {\n\t // eslint-disable-next-line no-prototype-builtins\n\t if (queue.hasOwnProperty(id)) {\n\t var fn = queue[id];\n\t delete queue[id];\n\t fn();\n\t }\n\t};\n\n\tvar runner = function (id) {\n\t return function () {\n\t run(id);\n\t };\n\t};\n\n\tvar listener = function (event) {\n\t run(event.data);\n\t};\n\n\tvar post = function (id) {\n\t // old engines have not location.origin\n\t global_1.postMessage(id + '', location.protocol + '//' + location.host);\n\t};\n\n\t// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n\tif (!set$1 || !clear) {\n\t set$1 = function setImmediate(fn) {\n\t var args = [];\n\t var i = 1;\n\t while (arguments.length > i) args.push(arguments[i++]);\n\t queue[++counter] = function () {\n\t // eslint-disable-next-line no-new-func\n\t (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n\t };\n\t defer(counter);\n\t return counter;\n\t };\n\t clear = function clearImmediate(id) {\n\t delete queue[id];\n\t };\n\t // Node.js 0.8-\n\t if (classofRaw(process$2) == 'process') {\n\t defer = function (id) {\n\t process$2.nextTick(runner(id));\n\t };\n\t // Sphere (JS game engine) Dispatch API\n\t } else if (Dispatch && Dispatch.now) {\n\t defer = function (id) {\n\t Dispatch.now(runner(id));\n\t };\n\t // Browsers with MessageChannel, includes WebWorkers\n\t // except iOS - https://github.com/zloirock/core-js/issues/624\n\t } else if (MessageChannel && !engineIsIos) {\n\t channel = new MessageChannel();\n\t port = channel.port2;\n\t channel.port1.onmessage = listener;\n\t defer = functionBindContext(port.postMessage, port, 1);\n\t // Browsers with postMessage, skip WebWorkers\n\t // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n\t } else if (\n\t global_1.addEventListener &&\n\t typeof postMessage == 'function' &&\n\t !global_1.importScripts &&\n\t !fails(post) &&\n\t location.protocol !== 'file:'\n\t ) {\n\t defer = post;\n\t global_1.addEventListener('message', listener, false);\n\t // IE8-\n\t } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {\n\t defer = function (id) {\n\t html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {\n\t html.removeChild(this);\n\t run(id);\n\t };\n\t };\n\t // Rest old browsers\n\t } else {\n\t defer = function (id) {\n\t setTimeout(runner(id), 0);\n\t };\n\t }\n\t}\n\n\tvar task = {\n\t set: set$1,\n\t clear: clear\n\t};\n\n\tvar getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\n\tvar macrotask = task.set;\n\n\n\tvar MutationObserver$1 = global_1.MutationObserver || global_1.WebKitMutationObserver;\n\tvar process$3 = global_1.process;\n\tvar Promise$1 = global_1.Promise;\n\tvar IS_NODE = classofRaw(process$3) == 'process';\n\t// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\n\tvar queueMicrotaskDescriptor = getOwnPropertyDescriptor$2(global_1, 'queueMicrotask');\n\tvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\n\tvar flush, head, last, notify, toggle, node, promise, then;\n\n\t// modern engines have queueMicrotask method\n\tif (!queueMicrotask) {\n\t flush = function () {\n\t var parent, fn;\n\t if (IS_NODE && (parent = process$3.domain)) parent.exit();\n\t while (head) {\n\t fn = head.fn;\n\t head = head.next;\n\t try {\n\t fn();\n\t } catch (error) {\n\t if (head) notify();\n\t else last = undefined;\n\t throw error;\n\t }\n\t } last = undefined;\n\t if (parent) parent.enter();\n\t };\n\n\t // Node.js\n\t if (IS_NODE) {\n\t notify = function () {\n\t process$3.nextTick(flush);\n\t };\n\t // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n\t } else if (MutationObserver$1 && !engineIsIos) {\n\t toggle = true;\n\t node = document.createTextNode('');\n\t new MutationObserver$1(flush).observe(node, { characterData: true });\n\t notify = function () {\n\t node.data = toggle = !toggle;\n\t };\n\t // environments with maybe non-completely correct, but existent Promise\n\t } else if (Promise$1 && Promise$1.resolve) {\n\t // Promise.resolve without an argument throws an error in LG WebOS 2\n\t promise = Promise$1.resolve(undefined);\n\t then = promise.then;\n\t notify = function () {\n\t then.call(promise, flush);\n\t };\n\t // for other environments - macrotask based on:\n\t // - setImmediate\n\t // - MessageChannel\n\t // - window.postMessag\n\t // - onreadystatechange\n\t // - setTimeout\n\t } else {\n\t notify = function () {\n\t // strange IE + webpack dev server bug - use .call(global)\n\t macrotask.call(global_1, flush);\n\t };\n\t }\n\t}\n\n\tvar microtask = queueMicrotask || function (fn) {\n\t var task = { fn: fn, next: undefined };\n\t if (last) last.next = task;\n\t if (!head) {\n\t head = task;\n\t notify();\n\t } last = task;\n\t};\n\n\tvar PromiseCapability = function (C) {\n\t var resolve, reject;\n\t this.promise = new C(function ($$resolve, $$reject) {\n\t if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n\t resolve = $$resolve;\n\t reject = $$reject;\n\t });\n\t this.resolve = aFunction$1(resolve);\n\t this.reject = aFunction$1(reject);\n\t};\n\n\t// 25.4.1.5 NewPromiseCapability(C)\n\tvar f$7 = function (C) {\n\t return new PromiseCapability(C);\n\t};\n\n\tvar newPromiseCapability = {\n\t\tf: f$7\n\t};\n\n\tvar promiseResolve = function (C, x) {\n\t anObject(C);\n\t if (isObject(x) && x.constructor === C) return x;\n\t var promiseCapability = newPromiseCapability.f(C);\n\t var resolve = promiseCapability.resolve;\n\t resolve(x);\n\t return promiseCapability.promise;\n\t};\n\n\tvar hostReportErrors = function (a, b) {\n\t var console = global_1.console;\n\t if (console && console.error) {\n\t arguments.length === 1 ? console.error(a) : console.error(a, b);\n\t }\n\t};\n\n\tvar perform = function (exec) {\n\t try {\n\t return { error: false, value: exec() };\n\t } catch (error) {\n\t return { error: true, value: error };\n\t }\n\t};\n\n\tvar task$1 = task.set;\n\n\n\n\n\n\n\n\n\n\n\tvar SPECIES$6 = wellKnownSymbol('species');\n\tvar PROMISE = 'Promise';\n\tvar getInternalState$3 = internalState.get;\n\tvar setInternalState$6 = internalState.set;\n\tvar getInternalPromiseState = internalState.getterFor(PROMISE);\n\tvar PromiseConstructor = nativePromiseConstructor;\n\tvar TypeError$1 = global_1.TypeError;\n\tvar document$2 = global_1.document;\n\tvar process$4 = global_1.process;\n\tvar $fetch$1 = getBuiltIn('fetch');\n\tvar newPromiseCapability$1 = newPromiseCapability.f;\n\tvar newGenericPromiseCapability = newPromiseCapability$1;\n\tvar IS_NODE$1 = classofRaw(process$4) == 'process';\n\tvar DISPATCH_EVENT = !!(document$2 && document$2.createEvent && global_1.dispatchEvent);\n\tvar UNHANDLED_REJECTION = 'unhandledrejection';\n\tvar REJECTION_HANDLED = 'rejectionhandled';\n\tvar PENDING = 0;\n\tvar FULFILLED = 1;\n\tvar REJECTED = 2;\n\tvar HANDLED = 1;\n\tvar UNHANDLED = 2;\n\tvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n\tvar FORCED$3 = isForced_1(PROMISE, function () {\n\t var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n\t if (!GLOBAL_CORE_JS_PROMISE) {\n\t // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n\t // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n\t // We can't detect it synchronously, so just check versions\n\t if (engineV8Version === 66) return true;\n\t // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n\t if (!IS_NODE$1 && typeof PromiseRejectionEvent != 'function') return true;\n\t }\n\t // We can't use @@species feature detection in V8 since it causes\n\t // deoptimization and performance degradation\n\t // https://github.com/zloirock/core-js/issues/679\n\t if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false;\n\t // Detect correctness of subclassing with @@species support\n\t var promise = PromiseConstructor.resolve(1);\n\t var FakePromise = function (exec) {\n\t exec(function () { /* empty */ }, function () { /* empty */ });\n\t };\n\t var constructor = promise.constructor = {};\n\t constructor[SPECIES$6] = FakePromise;\n\t return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n\t});\n\n\tvar INCORRECT_ITERATION$1 = FORCED$3 || !checkCorrectnessOfIteration(function (iterable) {\n\t PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n\t});\n\n\t// helpers\n\tvar isThenable = function (it) {\n\t var then;\n\t return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n\t};\n\n\tvar notify$1 = function (promise, state, isReject) {\n\t if (state.notified) return;\n\t state.notified = true;\n\t var chain = state.reactions;\n\t microtask(function () {\n\t var value = state.value;\n\t var ok = state.state == FULFILLED;\n\t var index = 0;\n\t // variable length - can't use forEach\n\t while (chain.length > index) {\n\t var reaction = chain[index++];\n\t var handler = ok ? reaction.ok : reaction.fail;\n\t var resolve = reaction.resolve;\n\t var reject = reaction.reject;\n\t var domain = reaction.domain;\n\t var result, then, exited;\n\t try {\n\t if (handler) {\n\t if (!ok) {\n\t if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n\t state.rejection = HANDLED;\n\t }\n\t if (handler === true) result = value;\n\t else {\n\t if (domain) domain.enter();\n\t result = handler(value); // can throw\n\t if (domain) {\n\t domain.exit();\n\t exited = true;\n\t }\n\t }\n\t if (result === reaction.promise) {\n\t reject(TypeError$1('Promise-chain cycle'));\n\t } else if (then = isThenable(result)) {\n\t then.call(result, resolve, reject);\n\t } else resolve(result);\n\t } else reject(value);\n\t } catch (error) {\n\t if (domain && !exited) domain.exit();\n\t reject(error);\n\t }\n\t }\n\t state.reactions = [];\n\t state.notified = false;\n\t if (isReject && !state.rejection) onUnhandled(promise, state);\n\t });\n\t};\n\n\tvar dispatchEvent = function (name, promise, reason) {\n\t var event, handler;\n\t if (DISPATCH_EVENT) {\n\t event = document$2.createEvent('Event');\n\t event.promise = promise;\n\t event.reason = reason;\n\t event.initEvent(name, false, true);\n\t global_1.dispatchEvent(event);\n\t } else event = { promise: promise, reason: reason };\n\t if (handler = global_1['on' + name]) handler(event);\n\t else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n\t};\n\n\tvar onUnhandled = function (promise, state) {\n\t task$1.call(global_1, function () {\n\t var value = state.value;\n\t var IS_UNHANDLED = isUnhandled(state);\n\t var result;\n\t if (IS_UNHANDLED) {\n\t result = perform(function () {\n\t if (IS_NODE$1) {\n\t process$4.emit('unhandledRejection', value, promise);\n\t } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n\t });\n\t // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n\t state.rejection = IS_NODE$1 || isUnhandled(state) ? UNHANDLED : HANDLED;\n\t if (result.error) throw result.value;\n\t }\n\t });\n\t};\n\n\tvar isUnhandled = function (state) {\n\t return state.rejection !== HANDLED && !state.parent;\n\t};\n\n\tvar onHandleUnhandled = function (promise, state) {\n\t task$1.call(global_1, function () {\n\t if (IS_NODE$1) {\n\t process$4.emit('rejectionHandled', promise);\n\t } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n\t });\n\t};\n\n\tvar bind = function (fn, promise, state, unwrap) {\n\t return function (value) {\n\t fn(promise, state, value, unwrap);\n\t };\n\t};\n\n\tvar internalReject = function (promise, state, value, unwrap) {\n\t if (state.done) return;\n\t state.done = true;\n\t if (unwrap) state = unwrap;\n\t state.value = value;\n\t state.state = REJECTED;\n\t notify$1(promise, state, true);\n\t};\n\n\tvar internalResolve = function (promise, state, value, unwrap) {\n\t if (state.done) return;\n\t state.done = true;\n\t if (unwrap) state = unwrap;\n\t try {\n\t if (promise === value) throw TypeError$1(\"Promise can't be resolved itself\");\n\t var then = isThenable(value);\n\t if (then) {\n\t microtask(function () {\n\t var wrapper = { done: false };\n\t try {\n\t then.call(value,\n\t bind(internalResolve, promise, wrapper, state),\n\t bind(internalReject, promise, wrapper, state)\n\t );\n\t } catch (error) {\n\t internalReject(promise, wrapper, error, state);\n\t }\n\t });\n\t } else {\n\t state.value = value;\n\t state.state = FULFILLED;\n\t notify$1(promise, state, false);\n\t }\n\t } catch (error) {\n\t internalReject(promise, { done: false }, error, state);\n\t }\n\t};\n\n\t// constructor polyfill\n\tif (FORCED$3) {\n\t // 25.4.3.1 Promise(executor)\n\t PromiseConstructor = function Promise(executor) {\n\t anInstance(this, PromiseConstructor, PROMISE);\n\t aFunction$1(executor);\n\t Internal.call(this);\n\t var state = getInternalState$3(this);\n\t try {\n\t executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n\t } catch (error) {\n\t internalReject(this, state, error);\n\t }\n\t };\n\t // eslint-disable-next-line no-unused-vars\n\t Internal = function Promise(executor) {\n\t setInternalState$6(this, {\n\t type: PROMISE,\n\t done: false,\n\t notified: false,\n\t parent: false,\n\t reactions: [],\n\t rejection: false,\n\t state: PENDING,\n\t value: undefined\n\t });\n\t };\n\t Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n\t // `Promise.prototype.then` method\n\t // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n\t then: function then(onFulfilled, onRejected) {\n\t var state = getInternalPromiseState(this);\n\t var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor));\n\t reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n\t reaction.fail = typeof onRejected == 'function' && onRejected;\n\t reaction.domain = IS_NODE$1 ? process$4.domain : undefined;\n\t state.parent = true;\n\t state.reactions.push(reaction);\n\t if (state.state != PENDING) notify$1(this, state, false);\n\t return reaction.promise;\n\t },\n\t // `Promise.prototype.catch` method\n\t // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n\t 'catch': function (onRejected) {\n\t return this.then(undefined, onRejected);\n\t }\n\t });\n\t OwnPromiseCapability = function () {\n\t var promise = new Internal();\n\t var state = getInternalState$3(promise);\n\t this.promise = promise;\n\t this.resolve = bind(internalResolve, promise, state);\n\t this.reject = bind(internalReject, promise, state);\n\t };\n\t newPromiseCapability.f = newPromiseCapability$1 = function (C) {\n\t return C === PromiseConstructor || C === PromiseWrapper\n\t ? new OwnPromiseCapability(C)\n\t : newGenericPromiseCapability(C);\n\t };\n\n\t if ( typeof nativePromiseConstructor == 'function') {\n\t nativeThen = nativePromiseConstructor.prototype.then;\n\n\t // wrap native Promise#then for native async functions\n\t redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) {\n\t var that = this;\n\t return new PromiseConstructor(function (resolve, reject) {\n\t nativeThen.call(that, resolve, reject);\n\t }).then(onFulfilled, onRejected);\n\t // https://github.com/zloirock/core-js/issues/640\n\t }, { unsafe: true });\n\n\t // wrap fetch result\n\t if (typeof $fetch$1 == 'function') _export({ global: true, enumerable: true, forced: true }, {\n\t // eslint-disable-next-line no-unused-vars\n\t fetch: function fetch(input /* , init */) {\n\t return promiseResolve(PromiseConstructor, $fetch$1.apply(global_1, arguments));\n\t }\n\t });\n\t }\n\t}\n\n\t_export({ global: true, wrap: true, forced: FORCED$3 }, {\n\t Promise: PromiseConstructor\n\t});\n\n\tsetToStringTag(PromiseConstructor, PROMISE, false);\n\tsetSpecies(PROMISE);\n\n\tPromiseWrapper = getBuiltIn(PROMISE);\n\n\t// statics\n\t_export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n\t // `Promise.reject` method\n\t // https://tc39.github.io/ecma262/#sec-promise.reject\n\t reject: function reject(r) {\n\t var capability = newPromiseCapability$1(this);\n\t capability.reject.call(undefined, r);\n\t return capability.promise;\n\t }\n\t});\n\n\t_export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n\t // `Promise.resolve` method\n\t // https://tc39.github.io/ecma262/#sec-promise.resolve\n\t resolve: function resolve(x) {\n\t return promiseResolve( this, x);\n\t }\n\t});\n\n\t_export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {\n\t // `Promise.all` method\n\t // https://tc39.github.io/ecma262/#sec-promise.all\n\t all: function all(iterable) {\n\t var C = this;\n\t var capability = newPromiseCapability$1(C);\n\t var resolve = capability.resolve;\n\t var reject = capability.reject;\n\t var result = perform(function () {\n\t var $promiseResolve = aFunction$1(C.resolve);\n\t var values = [];\n\t var counter = 0;\n\t var remaining = 1;\n\t iterate_1(iterable, function (promise) {\n\t var index = counter++;\n\t var alreadyCalled = false;\n\t values.push(undefined);\n\t remaining++;\n\t $promiseResolve.call(C, promise).then(function (value) {\n\t if (alreadyCalled) return;\n\t alreadyCalled = true;\n\t values[index] = value;\n\t --remaining || resolve(values);\n\t }, reject);\n\t });\n\t --remaining || resolve(values);\n\t });\n\t if (result.error) reject(result.value);\n\t return capability.promise;\n\t },\n\t // `Promise.race` method\n\t // https://tc39.github.io/ecma262/#sec-promise.race\n\t race: function race(iterable) {\n\t var C = this;\n\t var capability = newPromiseCapability$1(C);\n\t var reject = capability.reject;\n\t var result = perform(function () {\n\t var $promiseResolve = aFunction$1(C.resolve);\n\t iterate_1(iterable, function (promise) {\n\t $promiseResolve.call(C, promise).then(capability.resolve, reject);\n\t });\n\t });\n\t if (result.error) reject(result.value);\n\t return capability.promise;\n\t }\n\t});\n\n\t/*! *****************************************************************************\r\n\tCopyright (c) Microsoft Corporation. All rights reserved.\r\n\tLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\n\tthis file except in compliance with the License. You may obtain a copy of the\r\n\tLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\n\tTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\n\tKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\n\tWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\n\tMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\n\tSee the Apache Version 2.0 License for specific language governing permissions\r\n\tand limitations under the License.\r\n\t***************************************************************************** */\n\n\t/* global Reflect, Promise */\n\tvar _extendStatics = function extendStatics(d, b) {\n\t _extendStatics = Object.setPrototypeOf || {\n\t __proto__: []\n\t } instanceof Array && function (d, b) {\n\t d.__proto__ = b;\n\t } || function (d, b) {\n\t for (var p in b) {\n\t if (b.hasOwnProperty(p)) d[p] = b[p];\n\t }\n\t };\n\n\t return _extendStatics(d, b);\n\t};\n\n\tfunction __extends(d, b) {\n\t _extendStatics(d, b);\n\n\t function __() {\n\t this.constructor = d;\n\t }\n\n\t d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n\t}\n\n\tvar _assign = function __assign() {\n\t _assign = Object.assign || function __assign(t) {\n\t for (var s, i = 1, n = arguments.length; i < n; i++) {\n\t s = arguments[i];\n\n\t for (var p in s) {\n\t if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n\t }\n\t }\n\n\t return t;\n\t };\n\n\t return _assign.apply(this, arguments);\n\t};\n\tfunction __values(o) {\n\t var s = typeof Symbol === \"function\" && Symbol.iterator,\n\t m = s && o[s],\n\t i = 0;\n\t if (m) return m.call(o);\n\t if (o && typeof o.length === \"number\") return {\n\t next: function next() {\n\t if (o && i >= o.length) o = void 0;\n\t return {\n\t value: o && o[i++],\n\t done: !o\n\t };\n\t }\n\t };\n\t throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n\t}\n\tfunction __read(o, n) {\n\t var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n\t if (!m) return o;\n\t var i = m.call(o),\n\t r,\n\t ar = [],\n\t e;\n\n\t try {\n\t while ((n === void 0 || n-- > 0) && !(r = i.next()).done) {\n\t ar.push(r.value);\n\t }\n\t } catch (error) {\n\t e = {\n\t error: error\n\t };\n\t } finally {\n\t try {\n\t if (r && !r.done && (m = i[\"return\"])) m.call(i);\n\t } finally {\n\t if (e) throw e.error;\n\t }\n\t }\n\n\t return ar;\n\t}\n\tfunction __spread() {\n\t for (var ar = [], i = 0; i < arguments.length; i++) {\n\t ar = ar.concat(__read(arguments[i]));\n\t }\n\n\t return ar;\n\t}\n\n\t/** JSDoc */\n\t// eslint-disable-next-line import/export\n\tvar Severity;\n\n\t(function (Severity) {\n\t /** JSDoc */\n\t Severity[\"Fatal\"] = \"fatal\";\n\t /** JSDoc */\n\n\t Severity[\"Error\"] = \"error\";\n\t /** JSDoc */\n\n\t Severity[\"Warning\"] = \"warning\";\n\t /** JSDoc */\n\n\t Severity[\"Log\"] = \"log\";\n\t /** JSDoc */\n\n\t Severity[\"Info\"] = \"info\";\n\t /** JSDoc */\n\n\t Severity[\"Debug\"] = \"debug\";\n\t /** JSDoc */\n\n\t Severity[\"Critical\"] = \"critical\";\n\t})(Severity || (Severity = {})); // eslint-disable-next-line @typescript-eslint/no-namespace, import/export\n\n\n\t(function (Severity) {\n\t /**\n\t * Converts a string-based level into a {@link Severity}.\n\t *\n\t * @param level string representation of Severity\n\t * @returns Severity\n\t */\n\t function fromString(level) {\n\t switch (level) {\n\t case 'debug':\n\t return Severity.Debug;\n\n\t case 'info':\n\t return Severity.Info;\n\n\t case 'warn':\n\t case 'warning':\n\t return Severity.Warning;\n\n\t case 'error':\n\t return Severity.Error;\n\n\t case 'fatal':\n\t return Severity.Fatal;\n\n\t case 'critical':\n\t return Severity.Critical;\n\n\t case 'log':\n\t default:\n\t return Severity.Log;\n\t }\n\t }\n\n\t Severity.fromString = fromString;\n\t})(Severity || (Severity = {}));\n\n\t/** The status of an event. */\n\t// eslint-disable-next-line import/export\n\tvar Status;\n\n\t(function (Status) {\n\t /** The status could not be determined. */\n\t Status[\"Unknown\"] = \"unknown\";\n\t /** The event was skipped due to configuration or callbacks. */\n\n\t Status[\"Skipped\"] = \"skipped\";\n\t /** The event was sent to Sentry successfully. */\n\n\t Status[\"Success\"] = \"success\";\n\t /** The client is currently rate limited and will try again later. */\n\n\t Status[\"RateLimit\"] = \"rate_limit\";\n\t /** The event could not be processed. */\n\n\t Status[\"Invalid\"] = \"invalid\";\n\t /** A server-side error ocurred during submission. */\n\n\t Status[\"Failed\"] = \"failed\";\n\t})(Status || (Status = {})); // eslint-disable-next-line @typescript-eslint/no-namespace, import/export\n\n\n\t(function (Status) {\n\t /**\n\t * Converts a HTTP status code into a {@link Status}.\n\t *\n\t * @param code The HTTP response status code.\n\t * @returns The send status or {@link Status.Unknown}.\n\t */\n\t function fromHttpCode(code) {\n\t if (code >= 200 && code < 300) {\n\t return Status.Success;\n\t }\n\n\t if (code === 429) {\n\t return Status.RateLimit;\n\t }\n\n\t if (code >= 400 && code < 500) {\n\t return Status.Invalid;\n\t }\n\n\t if (code >= 500) {\n\t return Status.Failed;\n\t }\n\n\t return Status.Unknown;\n\t }\n\n\t Status.fromHttpCode = fromHttpCode;\n\t})(Status || (Status = {}));\n\n\tvar defineProperty$6 = objectDefineProperty.f;\n\n\tvar FunctionPrototype = Function.prototype;\n\tvar FunctionPrototypeToString = FunctionPrototype.toString;\n\tvar nameRE = /^\\s*function ([^ (]*)/;\n\tvar NAME = 'name';\n\n\t// Function instances `.name` property\n\t// https://tc39.github.io/ecma262/#sec-function-instances-name\n\tif (descriptors && !(NAME in FunctionPrototype)) {\n\t defineProperty$6(FunctionPrototype, NAME, {\n\t configurable: true,\n\t get: function () {\n\t try {\n\t return FunctionPrototypeToString.call(this).match(nameRE)[1];\n\t } catch (error) {\n\t return '';\n\t }\n\t }\n\t });\n\t}\n\n\tvar setPrototypeOf = Object.setPrototypeOf || ({\n\t __proto__: []\n\t} instanceof Array ? setProtoOf : mixinProperties);\n\t/**\n\t * setPrototypeOf polyfill using __proto__\n\t */\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\n\tfunction setProtoOf(obj, proto) {\n\t // @ts-ignore __proto__ does not exist on obj\n\t obj.__proto__ = proto;\n\t return obj;\n\t}\n\t/**\n\t * setPrototypeOf polyfill using mixin\n\t */\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\n\n\tfunction mixinProperties(obj, proto) {\n\t for (var prop in proto) {\n\t // eslint-disable-next-line no-prototype-builtins\n\t if (!obj.hasOwnProperty(prop)) {\n\t // @ts-ignore typescript complains about indexing so we remove\n\t obj[prop] = proto[prop];\n\t }\n\t }\n\n\t return obj;\n\t}\n\n\t/** An error emitted by Sentry SDKs and related utilities. */\n\n\tvar SentryError =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(SentryError, _super);\n\n\t function SentryError(message) {\n\t var _newTarget = this.constructor;\n\n\t var _this = _super.call(this, message) || this;\n\n\t _this.message = message;\n\t _this.name = _newTarget.prototype.constructor.name;\n\t setPrototypeOf(_this, _newTarget.prototype);\n\t return _this;\n\t }\n\n\t return SentryError;\n\t}(Error);\n\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\t/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\n\t/**\n\t * Checks whether given value's type is one of a few Error or Error-like\n\t * {@link isError}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\tfunction isError(wat) {\n\t switch (Object.prototype.toString.call(wat)) {\n\t case '[object Error]':\n\t return true;\n\n\t case '[object Exception]':\n\t return true;\n\n\t case '[object DOMException]':\n\t return true;\n\n\t default:\n\t return isInstanceOf(wat, Error);\n\t }\n\t}\n\t/**\n\t * Checks whether given value's type is ErrorEvent\n\t * {@link isErrorEvent}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isErrorEvent(wat) {\n\t return Object.prototype.toString.call(wat) === '[object ErrorEvent]';\n\t}\n\t/**\n\t * Checks whether given value's type is DOMError\n\t * {@link isDOMError}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isDOMError(wat) {\n\t return Object.prototype.toString.call(wat) === '[object DOMError]';\n\t}\n\t/**\n\t * Checks whether given value's type is DOMException\n\t * {@link isDOMException}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isDOMException(wat) {\n\t return Object.prototype.toString.call(wat) === '[object DOMException]';\n\t}\n\t/**\n\t * Checks whether given value's type is a string\n\t * {@link isString}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isString(wat) {\n\t return Object.prototype.toString.call(wat) === '[object String]';\n\t}\n\t/**\n\t * Checks whether given value's is a primitive (undefined, null, number, boolean, string)\n\t * {@link isPrimitive}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isPrimitive(wat) {\n\t return wat === null || _typeof(wat) !== 'object' && typeof wat !== 'function';\n\t}\n\t/**\n\t * Checks whether given value's type is an object literal\n\t * {@link isPlainObject}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isPlainObject(wat) {\n\t return Object.prototype.toString.call(wat) === '[object Object]';\n\t}\n\t/**\n\t * Checks whether given value's type is an Event instance\n\t * {@link isEvent}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isEvent(wat) {\n\t return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n\t}\n\t/**\n\t * Checks whether given value's type is an Element instance\n\t * {@link isElement}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isElement(wat) {\n\t return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n\t}\n\t/**\n\t * Checks whether given value's type is an regexp\n\t * {@link isRegExp}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isRegExp(wat) {\n\t return Object.prototype.toString.call(wat) === '[object RegExp]';\n\t}\n\t/**\n\t * Checks whether given value has a then function.\n\t * @param wat A value to be checked.\n\t */\n\n\tfunction isThenable$1(wat) {\n\t // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t return Boolean(wat && wat.then && typeof wat.then === 'function');\n\t}\n\t/**\n\t * Checks whether given value's type is a SyntheticEvent\n\t * {@link isSyntheticEvent}.\n\t *\n\t * @param wat A value to be checked.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isSyntheticEvent(wat) {\n\t return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n\t}\n\t/**\n\t * Checks whether given value's type is an instance of provided constructor.\n\t * {@link isInstanceOf}.\n\t *\n\t * @param wat A value to be checked.\n\t * @param base A constructor to be used in a check.\n\t * @returns A boolean representing the result.\n\t */\n\n\tfunction isInstanceOf(wat, base) {\n\t try {\n\t return wat instanceof base;\n\t } catch (_e) {\n\t return false;\n\t }\n\t}\n\n\t// @@match logic\n\tfixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n\t return [\n\t // `String.prototype.match` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.match\n\t function match(regexp) {\n\t var O = requireObjectCoercible(this);\n\t var matcher = regexp == undefined ? undefined : regexp[MATCH];\n\t return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n\t },\n\t // `RegExp.prototype[@@match]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n\t function (regexp) {\n\t var res = maybeCallNative(nativeMatch, regexp, this);\n\t if (res.done) return res.value;\n\n\t var rx = anObject(regexp);\n\t var S = String(this);\n\n\t if (!rx.global) return regexpExecAbstract(rx, S);\n\n\t var fullUnicode = rx.unicode;\n\t rx.lastIndex = 0;\n\t var A = [];\n\t var n = 0;\n\t var result;\n\t while ((result = regexpExecAbstract(rx, S)) !== null) {\n\t var matchStr = String(result[0]);\n\t A[n] = matchStr;\n\t if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n\t n++;\n\t }\n\t return n === 0 ? null : A;\n\t }\n\t ];\n\t});\n\n\tvar arrayBufferNative = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n\n\tvar defineProperty$7 = objectDefineProperty.f;\n\n\n\n\n\n\tvar Int8Array$1 = global_1.Int8Array;\n\tvar Int8ArrayPrototype = Int8Array$1 && Int8Array$1.prototype;\n\tvar Uint8ClampedArray = global_1.Uint8ClampedArray;\n\tvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\n\tvar TypedArray = Int8Array$1 && objectGetPrototypeOf(Int8Array$1);\n\tvar TypedArrayPrototype = Int8ArrayPrototype && objectGetPrototypeOf(Int8ArrayPrototype);\n\tvar ObjectPrototype$2 = Object.prototype;\n\tvar isPrototypeOf = ObjectPrototype$2.isPrototypeOf;\n\n\tvar TO_STRING_TAG$4 = wellKnownSymbol('toStringTag');\n\tvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n\t// Fixing native typed arrays in Opera Presto crashes the browser, see #595\n\tvar NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferNative && !!objectSetPrototypeOf && classof(global_1.opera) !== 'Opera';\n\tvar TYPED_ARRAY_TAG_REQIRED = false;\n\tvar NAME$1;\n\n\tvar TypedArrayConstructorsList = {\n\t Int8Array: 1,\n\t Uint8Array: 1,\n\t Uint8ClampedArray: 1,\n\t Int16Array: 2,\n\t Uint16Array: 2,\n\t Int32Array: 4,\n\t Uint32Array: 4,\n\t Float32Array: 4,\n\t Float64Array: 8\n\t};\n\n\tvar isView = function isView(it) {\n\t var klass = classof(it);\n\t return klass === 'DataView' || has(TypedArrayConstructorsList, klass);\n\t};\n\n\tvar isTypedArray = function (it) {\n\t return isObject(it) && has(TypedArrayConstructorsList, classof(it));\n\t};\n\n\tvar aTypedArray = function (it) {\n\t if (isTypedArray(it)) return it;\n\t throw TypeError('Target is not a typed array');\n\t};\n\n\tvar aTypedArrayConstructor = function (C) {\n\t if (objectSetPrototypeOf) {\n\t if (isPrototypeOf.call(TypedArray, C)) return C;\n\t } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME$1)) {\n\t var TypedArrayConstructor = global_1[ARRAY];\n\t if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n\t return C;\n\t }\n\t } throw TypeError('Target is not a typed array constructor');\n\t};\n\n\tvar exportTypedArrayMethod = function (KEY, property, forced) {\n\t if (!descriptors) return;\n\t if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n\t var TypedArrayConstructor = global_1[ARRAY];\n\t if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n\t delete TypedArrayConstructor.prototype[KEY];\n\t }\n\t }\n\t if (!TypedArrayPrototype[KEY] || forced) {\n\t redefine(TypedArrayPrototype, KEY, forced ? property\n\t : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n\t }\n\t};\n\n\tvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n\t var ARRAY, TypedArrayConstructor;\n\t if (!descriptors) return;\n\t if (objectSetPrototypeOf) {\n\t if (forced) for (ARRAY in TypedArrayConstructorsList) {\n\t TypedArrayConstructor = global_1[ARRAY];\n\t if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n\t delete TypedArrayConstructor[KEY];\n\t }\n\t }\n\t if (!TypedArray[KEY] || forced) {\n\t // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n\t try {\n\t return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array$1[KEY] || property);\n\t } catch (error) { /* empty */ }\n\t } else return;\n\t }\n\t for (ARRAY in TypedArrayConstructorsList) {\n\t TypedArrayConstructor = global_1[ARRAY];\n\t if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n\t redefine(TypedArrayConstructor, KEY, property);\n\t }\n\t }\n\t};\n\n\tfor (NAME$1 in TypedArrayConstructorsList) {\n\t if (!global_1[NAME$1]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n\t}\n\n\t// WebKit bug - typed arrays constructors prototype is Object.prototype\n\tif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n\t // eslint-disable-next-line no-shadow\n\t TypedArray = function TypedArray() {\n\t throw TypeError('Incorrect invocation');\n\t };\n\t if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME$1 in TypedArrayConstructorsList) {\n\t if (global_1[NAME$1]) objectSetPrototypeOf(global_1[NAME$1], TypedArray);\n\t }\n\t}\n\n\tif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype$2) {\n\t TypedArrayPrototype = TypedArray.prototype;\n\t if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME$1 in TypedArrayConstructorsList) {\n\t if (global_1[NAME$1]) objectSetPrototypeOf(global_1[NAME$1].prototype, TypedArrayPrototype);\n\t }\n\t}\n\n\t// WebKit bug - one more object in Uint8ClampedArray prototype chain\n\tif (NATIVE_ARRAY_BUFFER_VIEWS && objectGetPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n\t objectSetPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n\t}\n\n\tif (descriptors && !has(TypedArrayPrototype, TO_STRING_TAG$4)) {\n\t TYPED_ARRAY_TAG_REQIRED = true;\n\t defineProperty$7(TypedArrayPrototype, TO_STRING_TAG$4, { get: function () {\n\t return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n\t } });\n\t for (NAME$1 in TypedArrayConstructorsList) if (global_1[NAME$1]) {\n\t createNonEnumerableProperty(global_1[NAME$1], TYPED_ARRAY_TAG, NAME$1);\n\t }\n\t}\n\n\tvar arrayBufferViewCore = {\n\t NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n\t TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n\t aTypedArray: aTypedArray,\n\t aTypedArrayConstructor: aTypedArrayConstructor,\n\t exportTypedArrayMethod: exportTypedArrayMethod,\n\t exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n\t isView: isView,\n\t isTypedArray: isTypedArray,\n\t TypedArray: TypedArray,\n\t TypedArrayPrototype: TypedArrayPrototype\n\t};\n\n\t/* eslint-disable no-new */\n\n\n\n\tvar NATIVE_ARRAY_BUFFER_VIEWS$1 = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\n\n\tvar ArrayBuffer$1 = global_1.ArrayBuffer;\n\tvar Int8Array$2 = global_1.Int8Array;\n\n\tvar typedArrayConstructorsRequireWrappers = !NATIVE_ARRAY_BUFFER_VIEWS$1 || !fails(function () {\n\t Int8Array$2(1);\n\t}) || !fails(function () {\n\t new Int8Array$2(-1);\n\t}) || !checkCorrectnessOfIteration(function (iterable) {\n\t new Int8Array$2();\n\t new Int8Array$2(null);\n\t new Int8Array$2(1.5);\n\t new Int8Array$2(iterable);\n\t}, true) || fails(function () {\n\t // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n\t return new Int8Array$2(new ArrayBuffer$1(2), 1, undefined).length !== 1;\n\t});\n\n\t// `ToIndex` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toindex\n\tvar toIndex = function (it) {\n\t if (it === undefined) return 0;\n\t var number = toInteger(it);\n\t var length = toLength(number);\n\t if (number !== length) throw RangeError('Wrong length or index');\n\t return length;\n\t};\n\n\t// IEEE754 conversions based on https://github.com/feross/ieee754\n\t// eslint-disable-next-line no-shadow-restricted-names\n\tvar Infinity$1 = 1 / 0;\n\tvar abs = Math.abs;\n\tvar pow$1 = Math.pow;\n\tvar floor$4 = Math.floor;\n\tvar log = Math.log;\n\tvar LN2 = Math.LN2;\n\n\tvar pack = function (number, mantissaLength, bytes) {\n\t var buffer = new Array(bytes);\n\t var exponentLength = bytes * 8 - mantissaLength - 1;\n\t var eMax = (1 << exponentLength) - 1;\n\t var eBias = eMax >> 1;\n\t var rt = mantissaLength === 23 ? pow$1(2, -24) - pow$1(2, -77) : 0;\n\t var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n\t var index = 0;\n\t var exponent, mantissa, c;\n\t number = abs(number);\n\t // eslint-disable-next-line no-self-compare\n\t if (number != number || number === Infinity$1) {\n\t // eslint-disable-next-line no-self-compare\n\t mantissa = number != number ? 1 : 0;\n\t exponent = eMax;\n\t } else {\n\t exponent = floor$4(log(number) / LN2);\n\t if (number * (c = pow$1(2, -exponent)) < 1) {\n\t exponent--;\n\t c *= 2;\n\t }\n\t if (exponent + eBias >= 1) {\n\t number += rt / c;\n\t } else {\n\t number += rt * pow$1(2, 1 - eBias);\n\t }\n\t if (number * c >= 2) {\n\t exponent++;\n\t c /= 2;\n\t }\n\t if (exponent + eBias >= eMax) {\n\t mantissa = 0;\n\t exponent = eMax;\n\t } else if (exponent + eBias >= 1) {\n\t mantissa = (number * c - 1) * pow$1(2, mantissaLength);\n\t exponent = exponent + eBias;\n\t } else {\n\t mantissa = number * pow$1(2, eBias - 1) * pow$1(2, mantissaLength);\n\t exponent = 0;\n\t }\n\t }\n\t for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n\t exponent = exponent << mantissaLength | mantissa;\n\t exponentLength += mantissaLength;\n\t for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n\t buffer[--index] |= sign * 128;\n\t return buffer;\n\t};\n\n\tvar unpack = function (buffer, mantissaLength) {\n\t var bytes = buffer.length;\n\t var exponentLength = bytes * 8 - mantissaLength - 1;\n\t var eMax = (1 << exponentLength) - 1;\n\t var eBias = eMax >> 1;\n\t var nBits = exponentLength - 7;\n\t var index = bytes - 1;\n\t var sign = buffer[index--];\n\t var exponent = sign & 127;\n\t var mantissa;\n\t sign >>= 7;\n\t for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n\t mantissa = exponent & (1 << -nBits) - 1;\n\t exponent >>= -nBits;\n\t nBits += mantissaLength;\n\t for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n\t if (exponent === 0) {\n\t exponent = 1 - eBias;\n\t } else if (exponent === eMax) {\n\t return mantissa ? NaN : sign ? -Infinity$1 : Infinity$1;\n\t } else {\n\t mantissa = mantissa + pow$1(2, mantissaLength);\n\t exponent = exponent - eBias;\n\t } return (sign ? -1 : 1) * mantissa * pow$1(2, exponent - mantissaLength);\n\t};\n\n\tvar ieee754 = {\n\t pack: pack,\n\t unpack: unpack\n\t};\n\n\t// `Array.prototype.fill` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.fill\n\tvar arrayFill = function fill(value /* , start = 0, end = @length */) {\n\t var O = toObject(this);\n\t var length = toLength(O.length);\n\t var argumentsLength = arguments.length;\n\t var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n\t var end = argumentsLength > 2 ? arguments[2] : undefined;\n\t var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n\t while (endPos > index) O[index++] = value;\n\t return O;\n\t};\n\n\tvar getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;\n\tvar defineProperty$8 = objectDefineProperty.f;\n\n\n\n\n\tvar getInternalState$4 = internalState.get;\n\tvar setInternalState$7 = internalState.set;\n\tvar ARRAY_BUFFER = 'ArrayBuffer';\n\tvar DATA_VIEW = 'DataView';\n\tvar PROTOTYPE$2 = 'prototype';\n\tvar WRONG_LENGTH = 'Wrong length';\n\tvar WRONG_INDEX = 'Wrong index';\n\tvar NativeArrayBuffer = global_1[ARRAY_BUFFER];\n\tvar $ArrayBuffer = NativeArrayBuffer;\n\tvar $DataView = global_1[DATA_VIEW];\n\tvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE$2];\n\tvar ObjectPrototype$3 = Object.prototype;\n\tvar RangeError$1 = global_1.RangeError;\n\n\tvar packIEEE754 = ieee754.pack;\n\tvar unpackIEEE754 = ieee754.unpack;\n\n\tvar packInt8 = function (number) {\n\t return [number & 0xFF];\n\t};\n\n\tvar packInt16 = function (number) {\n\t return [number & 0xFF, number >> 8 & 0xFF];\n\t};\n\n\tvar packInt32 = function (number) {\n\t return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n\t};\n\n\tvar unpackInt32 = function (buffer) {\n\t return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n\t};\n\n\tvar packFloat32 = function (number) {\n\t return packIEEE754(number, 23, 4);\n\t};\n\n\tvar packFloat64 = function (number) {\n\t return packIEEE754(number, 52, 8);\n\t};\n\n\tvar addGetter = function (Constructor, key) {\n\t defineProperty$8(Constructor[PROTOTYPE$2], key, { get: function () { return getInternalState$4(this)[key]; } });\n\t};\n\n\tvar get$1 = function (view, count, index, isLittleEndian) {\n\t var intIndex = toIndex(index);\n\t var store = getInternalState$4(view);\n\t if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);\n\t var bytes = getInternalState$4(store.buffer).bytes;\n\t var start = intIndex + store.byteOffset;\n\t var pack = bytes.slice(start, start + count);\n\t return isLittleEndian ? pack : pack.reverse();\n\t};\n\n\tvar set$2 = function (view, count, index, conversion, value, isLittleEndian) {\n\t var intIndex = toIndex(index);\n\t var store = getInternalState$4(view);\n\t if (intIndex + count > store.byteLength) throw RangeError$1(WRONG_INDEX);\n\t var bytes = getInternalState$4(store.buffer).bytes;\n\t var start = intIndex + store.byteOffset;\n\t var pack = conversion(+value);\n\t for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n\t};\n\n\tif (!arrayBufferNative) {\n\t $ArrayBuffer = function ArrayBuffer(length) {\n\t anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n\t var byteLength = toIndex(length);\n\t setInternalState$7(this, {\n\t bytes: arrayFill.call(new Array(byteLength), 0),\n\t byteLength: byteLength\n\t });\n\t if (!descriptors) this.byteLength = byteLength;\n\t };\n\n\t $DataView = function DataView(buffer, byteOffset, byteLength) {\n\t anInstance(this, $DataView, DATA_VIEW);\n\t anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n\t var bufferLength = getInternalState$4(buffer).byteLength;\n\t var offset = toInteger(byteOffset);\n\t if (offset < 0 || offset > bufferLength) throw RangeError$1('Wrong offset');\n\t byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n\t if (offset + byteLength > bufferLength) throw RangeError$1(WRONG_LENGTH);\n\t setInternalState$7(this, {\n\t buffer: buffer,\n\t byteLength: byteLength,\n\t byteOffset: offset\n\t });\n\t if (!descriptors) {\n\t this.buffer = buffer;\n\t this.byteLength = byteLength;\n\t this.byteOffset = offset;\n\t }\n\t };\n\n\t if (descriptors) {\n\t addGetter($ArrayBuffer, 'byteLength');\n\t addGetter($DataView, 'buffer');\n\t addGetter($DataView, 'byteLength');\n\t addGetter($DataView, 'byteOffset');\n\t }\n\n\t redefineAll($DataView[PROTOTYPE$2], {\n\t getInt8: function getInt8(byteOffset) {\n\t return get$1(this, 1, byteOffset)[0] << 24 >> 24;\n\t },\n\t getUint8: function getUint8(byteOffset) {\n\t return get$1(this, 1, byteOffset)[0];\n\t },\n\t getInt16: function getInt16(byteOffset /* , littleEndian */) {\n\t var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n\t return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n\t },\n\t getUint16: function getUint16(byteOffset /* , littleEndian */) {\n\t var bytes = get$1(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n\t return bytes[1] << 8 | bytes[0];\n\t },\n\t getInt32: function getInt32(byteOffset /* , littleEndian */) {\n\t return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n\t },\n\t getUint32: function getUint32(byteOffset /* , littleEndian */) {\n\t return unpackInt32(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n\t },\n\t getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n\t return unpackIEEE754(get$1(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n\t },\n\t getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n\t return unpackIEEE754(get$1(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n\t },\n\t setInt8: function setInt8(byteOffset, value) {\n\t set$2(this, 1, byteOffset, packInt8, value);\n\t },\n\t setUint8: function setUint8(byteOffset, value) {\n\t set$2(this, 1, byteOffset, packInt8, value);\n\t },\n\t setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n\t },\n\t setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n\t set$2(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n\t }\n\t });\n\t} else {\n\t if (!fails(function () {\n\t NativeArrayBuffer(1);\n\t }) || !fails(function () {\n\t new NativeArrayBuffer(-1); // eslint-disable-line no-new\n\t }) || fails(function () {\n\t new NativeArrayBuffer(); // eslint-disable-line no-new\n\t new NativeArrayBuffer(1.5); // eslint-disable-line no-new\n\t new NativeArrayBuffer(NaN); // eslint-disable-line no-new\n\t return NativeArrayBuffer.name != ARRAY_BUFFER;\n\t })) {\n\t $ArrayBuffer = function ArrayBuffer(length) {\n\t anInstance(this, $ArrayBuffer);\n\t return new NativeArrayBuffer(toIndex(length));\n\t };\n\t var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE$2] = NativeArrayBuffer[PROTOTYPE$2];\n\t for (var keys$2 = getOwnPropertyNames$1(NativeArrayBuffer), j = 0, key; keys$2.length > j;) {\n\t if (!((key = keys$2[j++]) in $ArrayBuffer)) {\n\t createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n\t }\n\t }\n\t ArrayBufferPrototype.constructor = $ArrayBuffer;\n\t }\n\n\t // WebKit bug - the same parent prototype for typed arrays and data view\n\t if (objectSetPrototypeOf && objectGetPrototypeOf($DataViewPrototype) !== ObjectPrototype$3) {\n\t objectSetPrototypeOf($DataViewPrototype, ObjectPrototype$3);\n\t }\n\n\t // iOS Safari 7.x bug\n\t var testView = new $DataView(new $ArrayBuffer(2));\n\t var nativeSetInt8 = $DataViewPrototype.setInt8;\n\t testView.setInt8(0, 2147483648);\n\t testView.setInt8(1, 2147483649);\n\t if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n\t setInt8: function setInt8(byteOffset, value) {\n\t nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n\t },\n\t setUint8: function setUint8(byteOffset, value) {\n\t nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n\t }\n\t }, { unsafe: true });\n\t}\n\n\tsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\n\tsetToStringTag($DataView, DATA_VIEW);\n\n\tvar arrayBuffer = {\n\t ArrayBuffer: $ArrayBuffer,\n\t DataView: $DataView\n\t};\n\n\tvar toPositiveInteger = function (it) {\n\t var result = toInteger(it);\n\t if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n\t return result;\n\t};\n\n\tvar toOffset = function (it, BYTES) {\n\t var offset = toPositiveInteger(it);\n\t if (offset % BYTES) throw RangeError('Wrong offset');\n\t return offset;\n\t};\n\n\tvar aTypedArrayConstructor$1 = arrayBufferViewCore.aTypedArrayConstructor;\n\n\tvar typedArrayFrom = function from(source /* , mapfn, thisArg */) {\n\t var O = toObject(source);\n\t var argumentsLength = arguments.length;\n\t var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n\t var mapping = mapfn !== undefined;\n\t var iteratorMethod = getIteratorMethod(O);\n\t var i, length, result, step, iterator, next;\n\t if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n\t iterator = iteratorMethod.call(O);\n\t next = iterator.next;\n\t O = [];\n\t while (!(step = next.call(iterator)).done) {\n\t O.push(step.value);\n\t }\n\t }\n\t if (mapping && argumentsLength > 2) {\n\t mapfn = functionBindContext(mapfn, arguments[2], 2);\n\t }\n\t length = toLength(O.length);\n\t result = new (aTypedArrayConstructor$1(this))(length);\n\t for (i = 0; length > i; i++) {\n\t result[i] = mapping ? mapfn(O[i], i) : O[i];\n\t }\n\t return result;\n\t};\n\n\tvar typedArrayConstructor = createCommonjsModule(function (module) {\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\tvar getOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n\tvar forEach = arrayIteration.forEach;\n\n\n\n\n\n\n\tvar getInternalState = internalState.get;\n\tvar setInternalState = internalState.set;\n\tvar nativeDefineProperty = objectDefineProperty.f;\n\tvar nativeGetOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n\tvar round = Math.round;\n\tvar RangeError = global_1.RangeError;\n\tvar ArrayBuffer = arrayBuffer.ArrayBuffer;\n\tvar DataView = arrayBuffer.DataView;\n\tvar NATIVE_ARRAY_BUFFER_VIEWS = arrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\n\tvar TYPED_ARRAY_TAG = arrayBufferViewCore.TYPED_ARRAY_TAG;\n\tvar TypedArray = arrayBufferViewCore.TypedArray;\n\tvar TypedArrayPrototype = arrayBufferViewCore.TypedArrayPrototype;\n\tvar aTypedArrayConstructor = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar isTypedArray = arrayBufferViewCore.isTypedArray;\n\tvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n\tvar WRONG_LENGTH = 'Wrong length';\n\n\tvar fromList = function (C, list) {\n\t var index = 0;\n\t var length = list.length;\n\t var result = new (aTypedArrayConstructor(C))(length);\n\t while (length > index) result[index] = list[index++];\n\t return result;\n\t};\n\n\tvar addGetter = function (it, key) {\n\t nativeDefineProperty(it, key, { get: function () {\n\t return getInternalState(this)[key];\n\t } });\n\t};\n\n\tvar isArrayBuffer = function (it) {\n\t var klass;\n\t return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n\t};\n\n\tvar isTypedArrayIndex = function (target, key) {\n\t return isTypedArray(target)\n\t && typeof key != 'symbol'\n\t && key in target\n\t && String(+key) == String(key);\n\t};\n\n\tvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n\t return isTypedArrayIndex(target, key = toPrimitive(key, true))\n\t ? createPropertyDescriptor(2, target[key])\n\t : nativeGetOwnPropertyDescriptor(target, key);\n\t};\n\n\tvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n\t if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n\t && isObject(descriptor)\n\t && has(descriptor, 'value')\n\t && !has(descriptor, 'get')\n\t && !has(descriptor, 'set')\n\t // TODO: add validation descriptor w/o calling accessors\n\t && !descriptor.configurable\n\t && (!has(descriptor, 'writable') || descriptor.writable)\n\t && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n\t ) {\n\t target[key] = descriptor.value;\n\t return target;\n\t } return nativeDefineProperty(target, key, descriptor);\n\t};\n\n\tif (descriptors) {\n\t if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n\t objectGetOwnPropertyDescriptor.f = wrappedGetOwnPropertyDescriptor;\n\t objectDefineProperty.f = wrappedDefineProperty;\n\t addGetter(TypedArrayPrototype, 'buffer');\n\t addGetter(TypedArrayPrototype, 'byteOffset');\n\t addGetter(TypedArrayPrototype, 'byteLength');\n\t addGetter(TypedArrayPrototype, 'length');\n\t }\n\n\t _export({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n\t getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n\t defineProperty: wrappedDefineProperty\n\t });\n\n\t module.exports = function (TYPE, wrapper, CLAMPED) {\n\t var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n\t var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n\t var GETTER = 'get' + TYPE;\n\t var SETTER = 'set' + TYPE;\n\t var NativeTypedArrayConstructor = global_1[CONSTRUCTOR_NAME];\n\t var TypedArrayConstructor = NativeTypedArrayConstructor;\n\t var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n\t var exported = {};\n\n\t var getter = function (that, index) {\n\t var data = getInternalState(that);\n\t return data.view[GETTER](index * BYTES + data.byteOffset, true);\n\t };\n\n\t var setter = function (that, index, value) {\n\t var data = getInternalState(that);\n\t if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n\t data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n\t };\n\n\t var addElement = function (that, index) {\n\t nativeDefineProperty(that, index, {\n\t get: function () {\n\t return getter(this, index);\n\t },\n\t set: function (value) {\n\t return setter(this, index, value);\n\t },\n\t enumerable: true\n\t });\n\t };\n\n\t if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n\t TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n\t anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n\t var index = 0;\n\t var byteOffset = 0;\n\t var buffer, byteLength, length;\n\t if (!isObject(data)) {\n\t length = toIndex(data);\n\t byteLength = length * BYTES;\n\t buffer = new ArrayBuffer(byteLength);\n\t } else if (isArrayBuffer(data)) {\n\t buffer = data;\n\t byteOffset = toOffset(offset, BYTES);\n\t var $len = data.byteLength;\n\t if ($length === undefined) {\n\t if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n\t byteLength = $len - byteOffset;\n\t if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n\t } else {\n\t byteLength = toLength($length) * BYTES;\n\t if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n\t }\n\t length = byteLength / BYTES;\n\t } else if (isTypedArray(data)) {\n\t return fromList(TypedArrayConstructor, data);\n\t } else {\n\t return typedArrayFrom.call(TypedArrayConstructor, data);\n\t }\n\t setInternalState(that, {\n\t buffer: buffer,\n\t byteOffset: byteOffset,\n\t byteLength: byteLength,\n\t length: length,\n\t view: new DataView(buffer)\n\t });\n\t while (index < length) addElement(that, index++);\n\t });\n\n\t if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);\n\t TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = objectCreate(TypedArrayPrototype);\n\t } else if (typedArrayConstructorsRequireWrappers) {\n\t TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n\t anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n\t return inheritIfRequired(function () {\n\t if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n\t if (isArrayBuffer(data)) return $length !== undefined\n\t ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n\t : typedArrayOffset !== undefined\n\t ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n\t : new NativeTypedArrayConstructor(data);\n\t if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n\t return typedArrayFrom.call(TypedArrayConstructor, data);\n\t }(), dummy, TypedArrayConstructor);\n\t });\n\n\t if (objectSetPrototypeOf) objectSetPrototypeOf(TypedArrayConstructor, TypedArray);\n\t forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n\t if (!(key in TypedArrayConstructor)) {\n\t createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n\t }\n\t });\n\t TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n\t }\n\n\t if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n\t createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n\t }\n\n\t if (TYPED_ARRAY_TAG) {\n\t createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n\t }\n\n\t exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n\t _export({\n\t global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n\t }, exported);\n\n\t if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n\t createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n\t }\n\n\t if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n\t createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n\t }\n\n\t setSpecies(CONSTRUCTOR_NAME);\n\t };\n\t} else module.exports = function () { /* empty */ };\n\t});\n\n\t// `Uint16Array` constructor\n\t// https://tc39.github.io/ecma262/#sec-typedarray-objects\n\ttypedArrayConstructor('Uint16', function (init) {\n\t return function Uint16Array(data, byteOffset, length) {\n\t return init(this, data, byteOffset, length);\n\t };\n\t});\n\n\tvar min$4 = Math.min;\n\n\t// `Array.prototype.copyWithin` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\n\tvar arrayCopyWithin = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n\t var O = toObject(this);\n\t var len = toLength(O.length);\n\t var to = toAbsoluteIndex(target, len);\n\t var from = toAbsoluteIndex(start, len);\n\t var end = arguments.length > 2 ? arguments[2] : undefined;\n\t var count = min$4((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n\t var inc = 1;\n\t if (from < to && to < from + count) {\n\t inc = -1;\n\t from += count - 1;\n\t to += count - 1;\n\t }\n\t while (count-- > 0) {\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t to += inc;\n\t from += inc;\n\t } return O;\n\t};\n\n\tvar aTypedArray$1 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$1 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.copyWithin` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.copywithin\n\texportTypedArrayMethod$1('copyWithin', function copyWithin(target, start /* , end */) {\n\t return arrayCopyWithin.call(aTypedArray$1(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n\t});\n\n\tvar $every = arrayIteration.every;\n\n\tvar aTypedArray$2 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$2 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.every` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every\n\texportTypedArrayMethod$2('every', function every(callbackfn /* , thisArg */) {\n\t return $every(aTypedArray$2(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar aTypedArray$3 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$3 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.fill` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.fill\n\t// eslint-disable-next-line no-unused-vars\n\texportTypedArrayMethod$3('fill', function fill(value /* , start, end */) {\n\t return arrayFill.apply(aTypedArray$3(this), arguments);\n\t});\n\n\tvar $filter = arrayIteration.filter;\n\n\n\tvar aTypedArray$4 = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$2 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$4 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.filter\n\texportTypedArrayMethod$4('filter', function filter(callbackfn /* , thisArg */) {\n\t var list = $filter(aTypedArray$4(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t var C = speciesConstructor(this, this.constructor);\n\t var index = 0;\n\t var length = list.length;\n\t var result = new (aTypedArrayConstructor$2(C))(length);\n\t while (length > index) result[index] = list[index++];\n\t return result;\n\t});\n\n\tvar $find = arrayIteration.find;\n\n\tvar aTypedArray$5 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$5 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find\n\texportTypedArrayMethod$5('find', function find(predicate /* , thisArg */) {\n\t return $find(aTypedArray$5(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $findIndex = arrayIteration.findIndex;\n\n\tvar aTypedArray$6 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$6 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.findIndex` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findindex\n\texportTypedArrayMethod$6('findIndex', function findIndex(predicate /* , thisArg */) {\n\t return $findIndex(aTypedArray$6(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $forEach$2 = arrayIteration.forEach;\n\n\tvar aTypedArray$7 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$7 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.forEach` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.foreach\n\texportTypedArrayMethod$7('forEach', function forEach(callbackfn /* , thisArg */) {\n\t $forEach$2(aTypedArray$7(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $includes$1 = arrayIncludes.includes;\n\n\tvar aTypedArray$8 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$8 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.includes\n\texportTypedArrayMethod$8('includes', function includes(searchElement /* , fromIndex */) {\n\t return $includes$1(aTypedArray$8(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $indexOf$1 = arrayIncludes.indexOf;\n\n\tvar aTypedArray$9 = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$9 = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.indexof\n\texportTypedArrayMethod$9('indexOf', function indexOf(searchElement /* , fromIndex */) {\n\t return $indexOf$1(aTypedArray$9(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar ITERATOR$8 = wellKnownSymbol('iterator');\n\tvar Uint8Array = global_1.Uint8Array;\n\tvar arrayValues = es_array_iterator.values;\n\tvar arrayKeys = es_array_iterator.keys;\n\tvar arrayEntries = es_array_iterator.entries;\n\tvar aTypedArray$a = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$a = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR$8];\n\n\tvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n\t && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\n\tvar typedArrayValues = function values() {\n\t return arrayValues.call(aTypedArray$a(this));\n\t};\n\n\t// `%TypedArray%.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.entries\n\texportTypedArrayMethod$a('entries', function entries() {\n\t return arrayEntries.call(aTypedArray$a(this));\n\t});\n\t// `%TypedArray%.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.keys\n\texportTypedArrayMethod$a('keys', function keys() {\n\t return arrayKeys.call(aTypedArray$a(this));\n\t});\n\t// `%TypedArray%.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.values\n\texportTypedArrayMethod$a('values', typedArrayValues, !CORRECT_ITER_NAME);\n\t// `%TypedArray%.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype-@@iterator\n\texportTypedArrayMethod$a(ITERATOR$8, typedArrayValues, !CORRECT_ITER_NAME);\n\n\tvar aTypedArray$b = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$b = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $join = [].join;\n\n\t// `%TypedArray%.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.join\n\t// eslint-disable-next-line no-unused-vars\n\texportTypedArrayMethod$b('join', function join(separator) {\n\t return $join.apply(aTypedArray$b(this), arguments);\n\t});\n\n\tvar min$5 = Math.min;\n\tvar nativeLastIndexOf = [].lastIndexOf;\n\tvar NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\n\tvar STRICT_METHOD$3 = arrayMethodIsStrict('lastIndexOf');\n\t// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\n\tvar USES_TO_LENGTH$5 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\tvar FORCED$4 = NEGATIVE_ZERO$1 || !STRICT_METHOD$3 || !USES_TO_LENGTH$5;\n\n\t// `Array.prototype.lastIndexOf` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n\tvar arrayLastIndexOf = FORCED$4 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n\t // convert -0 to +0\n\t if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0;\n\t var O = toIndexedObject(this);\n\t var length = toLength(O.length);\n\t var index = length - 1;\n\t if (arguments.length > 1) index = min$5(index, toInteger(arguments[1]));\n\t if (index < 0) index = length + index;\n\t for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n\t return -1;\n\t} : nativeLastIndexOf;\n\n\tvar aTypedArray$c = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$c = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.lastIndexOf` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.lastindexof\n\t// eslint-disable-next-line no-unused-vars\n\texportTypedArrayMethod$c('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n\t return arrayLastIndexOf.apply(aTypedArray$c(this), arguments);\n\t});\n\n\tvar $map$1 = arrayIteration.map;\n\n\n\tvar aTypedArray$d = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$3 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$d = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.map` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.map\n\texportTypedArrayMethod$d('map', function map(mapfn /* , thisArg */) {\n\t return $map$1(aTypedArray$d(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n\t return new (aTypedArrayConstructor$3(speciesConstructor(O, O.constructor)))(length);\n\t });\n\t});\n\n\t// `Array.prototype.{ reduce, reduceRight }` methods implementation\n\tvar createMethod$3 = function (IS_RIGHT) {\n\t return function (that, callbackfn, argumentsLength, memo) {\n\t aFunction$1(callbackfn);\n\t var O = toObject(that);\n\t var self = indexedObject(O);\n\t var length = toLength(O.length);\n\t var index = IS_RIGHT ? length - 1 : 0;\n\t var i = IS_RIGHT ? -1 : 1;\n\t if (argumentsLength < 2) while (true) {\n\t if (index in self) {\n\t memo = self[index];\n\t index += i;\n\t break;\n\t }\n\t index += i;\n\t if (IS_RIGHT ? index < 0 : length <= index) {\n\t throw TypeError('Reduce of empty array with no initial value');\n\t }\n\t }\n\t for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n\t memo = callbackfn(memo, self[index], index, O);\n\t }\n\t return memo;\n\t };\n\t};\n\n\tvar arrayReduce = {\n\t // `Array.prototype.reduce` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n\t left: createMethod$3(false),\n\t // `Array.prototype.reduceRight` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n\t right: createMethod$3(true)\n\t};\n\n\tvar $reduce = arrayReduce.left;\n\n\tvar aTypedArray$e = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$e = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.reduce` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduce\n\texportTypedArrayMethod$e('reduce', function reduce(callbackfn /* , initialValue */) {\n\t return $reduce(aTypedArray$e(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar $reduceRight = arrayReduce.right;\n\n\tvar aTypedArray$f = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$f = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.reduceRicht` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright\n\texportTypedArrayMethod$f('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n\t return $reduceRight(aTypedArray$f(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar aTypedArray$g = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$g = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar floor$5 = Math.floor;\n\n\t// `%TypedArray%.prototype.reverse` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reverse\n\texportTypedArrayMethod$g('reverse', function reverse() {\n\t var that = this;\n\t var length = aTypedArray$g(that).length;\n\t var middle = floor$5(length / 2);\n\t var index = 0;\n\t var value;\n\t while (index < middle) {\n\t value = that[index];\n\t that[index++] = that[--length];\n\t that[length] = value;\n\t } return that;\n\t});\n\n\tvar aTypedArray$h = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$h = arrayBufferViewCore.exportTypedArrayMethod;\n\n\tvar FORCED$5 = fails(function () {\n\t // eslint-disable-next-line no-undef\n\t new Int8Array(1).set({});\n\t});\n\n\t// `%TypedArray%.prototype.set` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.set\n\texportTypedArrayMethod$h('set', function set(arrayLike /* , offset */) {\n\t aTypedArray$h(this);\n\t var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 1);\n\t var length = this.length;\n\t var src = toObject(arrayLike);\n\t var len = toLength(src.length);\n\t var index = 0;\n\t if (len + offset > length) throw RangeError('Wrong length');\n\t while (index < len) this[offset + index] = src[index++];\n\t}, FORCED$5);\n\n\tvar aTypedArray$i = arrayBufferViewCore.aTypedArray;\n\tvar aTypedArrayConstructor$4 = arrayBufferViewCore.aTypedArrayConstructor;\n\tvar exportTypedArrayMethod$i = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $slice = [].slice;\n\n\tvar FORCED$6 = fails(function () {\n\t // eslint-disable-next-line no-undef\n\t new Int8Array(1).slice();\n\t});\n\n\t// `%TypedArray%.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.slice\n\texportTypedArrayMethod$i('slice', function slice(start, end) {\n\t var list = $slice.call(aTypedArray$i(this), start, end);\n\t var C = speciesConstructor(this, this.constructor);\n\t var index = 0;\n\t var length = list.length;\n\t var result = new (aTypedArrayConstructor$4(C))(length);\n\t while (length > index) result[index] = list[index++];\n\t return result;\n\t}, FORCED$6);\n\n\tvar $some = arrayIteration.some;\n\n\tvar aTypedArray$j = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$j = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.some` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.some\n\texportTypedArrayMethod$j('some', function some(callbackfn /* , thisArg */) {\n\t return $some(aTypedArray$j(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t});\n\n\tvar aTypedArray$k = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$k = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $sort = [].sort;\n\n\t// `%TypedArray%.prototype.sort` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort\n\texportTypedArrayMethod$k('sort', function sort(comparefn) {\n\t return $sort.call(aTypedArray$k(this), comparefn);\n\t});\n\n\tvar aTypedArray$l = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$l = arrayBufferViewCore.exportTypedArrayMethod;\n\n\t// `%TypedArray%.prototype.subarray` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray\n\texportTypedArrayMethod$l('subarray', function subarray(begin, end) {\n\t var O = aTypedArray$l(this);\n\t var length = O.length;\n\t var beginIndex = toAbsoluteIndex(begin, length);\n\t return new (speciesConstructor(O, O.constructor))(\n\t O.buffer,\n\t O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n\t toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n\t );\n\t});\n\n\tvar Int8Array$3 = global_1.Int8Array;\n\tvar aTypedArray$m = arrayBufferViewCore.aTypedArray;\n\tvar exportTypedArrayMethod$m = arrayBufferViewCore.exportTypedArrayMethod;\n\tvar $toLocaleString = [].toLocaleString;\n\tvar $slice$1 = [].slice;\n\n\t// iOS Safari 6.x fails here\n\tvar TO_LOCALE_STRING_BUG = !!Int8Array$3 && fails(function () {\n\t $toLocaleString.call(new Int8Array$3(1));\n\t});\n\n\tvar FORCED$7 = fails(function () {\n\t return [1, 2].toLocaleString() != new Int8Array$3([1, 2]).toLocaleString();\n\t}) || !fails(function () {\n\t Int8Array$3.prototype.toLocaleString.call([1, 2]);\n\t});\n\n\t// `%TypedArray%.prototype.toLocaleString` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tolocalestring\n\texportTypedArrayMethod$m('toLocaleString', function toLocaleString() {\n\t return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice$1.call(aTypedArray$m(this)) : aTypedArray$m(this), arguments);\n\t}, FORCED$7);\n\n\tvar exportTypedArrayMethod$n = arrayBufferViewCore.exportTypedArrayMethod;\n\n\n\n\tvar Uint8Array$1 = global_1.Uint8Array;\n\tvar Uint8ArrayPrototype = Uint8Array$1 && Uint8Array$1.prototype || {};\n\tvar arrayToString = [].toString;\n\tvar arrayJoin = [].join;\n\n\tif (fails(function () { arrayToString.call({}); })) {\n\t arrayToString = function toString() {\n\t return arrayJoin.call(this);\n\t };\n\t}\n\n\tvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n\t// `%TypedArray%.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tostring\n\texportTypedArrayMethod$n('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n\n\t/**\n\t * Truncates given string to the maximum characters count\n\t *\n\t * @param str An object that contains serializable values\n\t * @param max Maximum number of characters in truncated string\n\t * @returns string Encoded\n\t */\n\n\tfunction truncate(str, max) {\n\t if (max === void 0) {\n\t max = 0;\n\t }\n\n\t if (typeof str !== 'string' || max === 0) {\n\t return str;\n\t }\n\n\t return str.length <= max ? str : str.substr(0, max) + \"...\";\n\t}\n\t/**\n\t * Join values in array\n\t * @param input array of values to be joined together\n\t * @param delimiter string to be placed in-between values\n\t * @returns Joined values\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\tfunction safeJoin(input, delimiter) {\n\t if (!Array.isArray(input)) {\n\t return '';\n\t }\n\n\t var output = []; // eslint-disable-next-line @typescript-eslint/prefer-for-of\n\n\t for (var i = 0; i < input.length; i++) {\n\t var value = input[i];\n\n\t try {\n\t output.push(String(value));\n\t } catch (e) {\n\t output.push('[value cannot be serialized]');\n\t }\n\t }\n\n\t return output.join(delimiter);\n\t}\n\t/**\n\t * Checks if the value matches a regex or includes the string\n\t * @param value The string value to be checked against\n\t * @param pattern Either a regex or a string that must be contained in value\n\t */\n\n\tfunction isMatchingPattern(value, pattern) {\n\t if (!isString(value)) {\n\t return false;\n\t }\n\n\t if (isRegExp(pattern)) {\n\t return pattern.test(value);\n\t }\n\n\t if (typeof pattern === 'string') {\n\t return value.indexOf(pattern) !== -1;\n\t }\n\n\t return false;\n\t}\n\n\t/**\n\t * Requires a module which is protected against bundler minification.\n\t *\n\t * @param request The module path to resolve\n\t */\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\tfunction dynamicRequire(mod, request) {\n\t // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t return mod.require(request);\n\t}\n\t/**\n\t * Checks whether we're in the Node.js or Browser environment\n\t *\n\t * @returns Answer to given question\n\t */\n\n\tfunction isNodeEnv() {\n\t return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n\t}\n\tvar fallbackGlobalObject = {};\n\t/**\n\t * Safely get global scope object\n\t *\n\t * @returns Global scope object\n\t */\n\n\tfunction getGlobalObject() {\n\t return isNodeEnv() ? global : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : fallbackGlobalObject;\n\t}\n\t/**\n\t * UUID4 generator\n\t *\n\t * @returns string Generated UUID4.\n\t */\n\n\tfunction uuid4() {\n\t var global = getGlobalObject();\n\t var crypto = global.crypto || global.msCrypto;\n\n\t if (!(crypto === void 0) && crypto.getRandomValues) {\n\t // Use window.crypto API if available\n\t var arr = new Uint16Array(8);\n\t crypto.getRandomValues(arr); // set 4 in byte 7\n\t // eslint-disable-next-line no-bitwise\n\n\t arr[3] = arr[3] & 0xfff | 0x4000; // set 2 most significant bits of byte 9 to '10'\n\t // eslint-disable-next-line no-bitwise\n\n\t arr[4] = arr[4] & 0x3fff | 0x8000;\n\n\t var pad = function pad(num) {\n\t var v = num.toString(16);\n\n\t while (v.length < 4) {\n\t v = \"0\" + v;\n\t }\n\n\t return v;\n\t };\n\n\t return pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]);\n\t } // http://stackoverflow.com/questions/105034/how-to-create-a-guid-uuid-in-javascript/2117523#2117523\n\n\n\t return 'xxxxxxxxxxxx4xxxyxxxxxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\n\t // eslint-disable-next-line no-bitwise\n\t var r = Math.random() * 16 | 0; // eslint-disable-next-line no-bitwise\n\n\t var v = c === 'x' ? r : r & 0x3 | 0x8;\n\t return v.toString(16);\n\t });\n\t}\n\t/**\n\t * Parses string form of URL into an object\n\t * // borrowed from https://tools.ietf.org/html/rfc3986#appendix-B\n\t * // intentionally using regex and not <a/> href parsing trick because React Native and other\n\t * // environments where DOM might not be available\n\t * @returns parsed URL object\n\t */\n\n\tfunction parseUrl(url) {\n\t if (!url) {\n\t return {};\n\t }\n\n\t var match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n\n\t if (!match) {\n\t return {};\n\t } // coerce to undefined values to empty string so we don't get 'undefined'\n\n\n\t var query = match[6] || '';\n\t var fragment = match[8] || '';\n\t return {\n\t host: match[4],\n\t path: match[5],\n\t protocol: match[2],\n\t relative: match[5] + query + fragment\n\t };\n\t}\n\t/**\n\t * Extracts either message or type+value from an event that can be used for user-facing logs\n\t * @returns event's description\n\t */\n\n\tfunction getEventDescription(event) {\n\t if (event.message) {\n\t return event.message;\n\t }\n\n\t if (event.exception && event.exception.values && event.exception.values[0]) {\n\t var exception = event.exception.values[0];\n\n\t if (exception.type && exception.value) {\n\t return exception.type + \": \" + exception.value;\n\t }\n\n\t return exception.type || exception.value || event.event_id || '<unknown>';\n\t }\n\n\t return event.event_id || '<unknown>';\n\t}\n\t/** JSDoc */\n\n\tfunction consoleSandbox(callback) {\n\t var global = getGlobalObject();\n\t var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n\n\t if (!('console' in global)) {\n\t return callback();\n\t }\n\n\t var originalConsole = global.console;\n\t var wrappedLevels = {}; // Restore all wrapped console methods\n\n\t levels.forEach(function (level) {\n\t if (level in global.console && originalConsole[level].__sentry_original__) {\n\t wrappedLevels[level] = originalConsole[level];\n\t originalConsole[level] = originalConsole[level].__sentry_original__;\n\t }\n\t }); // Perform callback manipulations\n\n\t var result = callback(); // Revert restoration to wrapped state\n\n\t Object.keys(wrappedLevels).forEach(function (level) {\n\t originalConsole[level] = wrappedLevels[level];\n\t });\n\t return result;\n\t}\n\t/**\n\t * Adds exception values, type and value to an synthetic Exception.\n\t * @param event The event to modify.\n\t * @param value Value of the exception.\n\t * @param type Type of the exception.\n\t * @hidden\n\t */\n\n\tfunction addExceptionTypeValue(event, value, type) {\n\t event.exception = event.exception || {};\n\t event.exception.values = event.exception.values || [];\n\t event.exception.values[0] = event.exception.values[0] || {};\n\t event.exception.values[0].value = event.exception.values[0].value || value || '';\n\t event.exception.values[0].type = event.exception.values[0].type || type || 'Error';\n\t}\n\t/**\n\t * Adds exception mechanism to a given event.\n\t * @param event The event to modify.\n\t * @param mechanism Mechanism of the mechanism.\n\t * @hidden\n\t */\n\n\tfunction addExceptionMechanism(event, mechanism) {\n\t if (mechanism === void 0) {\n\t mechanism = {};\n\t } // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?\n\n\n\t try {\n\t // @ts-ignore Type 'Mechanism | {}' is not assignable to type 'Mechanism | undefined'\n\t // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};\n\t Object.keys(mechanism).forEach(function (key) {\n\t // @ts-ignore Mechanism has no index signature\n\t // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n\t event.exception.values[0].mechanism[key] = mechanism[key];\n\t });\n\t } catch (_oO) {// no-empty\n\t }\n\t}\n\t/**\n\t * A safe form of location.href\n\t */\n\n\tfunction getLocationHref() {\n\t try {\n\t return document.location.href;\n\t } catch (oO) {\n\t return '';\n\t }\n\t}\n\t/**\n\t * Given a child DOM element, returns a query-selector statement describing that\n\t * and its ancestors\n\t * e.g. [HTMLElement] => body > div > input#foo.btn[name=baz]\n\t * @returns generated DOM path\n\t */\n\n\tfunction htmlTreeAsString(elem) {\n\t // try/catch both:\n\t // - accessing event.target (see getsentry/raven-js#838, #768)\n\t // - `htmlTreeAsString` because it's complex, and just accessing the DOM incorrectly\n\t // - can throw an exception in some circumstances.\n\t try {\n\t var currentElem = elem;\n\t var MAX_TRAVERSE_HEIGHT = 5;\n\t var MAX_OUTPUT_LEN = 80;\n\t var out = [];\n\t var height = 0;\n\t var len = 0;\n\t var separator = ' > ';\n\t var sepLength = separator.length;\n\t var nextStr = void 0; // eslint-disable-next-line no-plusplus\n\n\t while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n\t nextStr = _htmlElementAsString(currentElem); // bail out if\n\t // - nextStr is the 'html' element\n\t // - the length of the string that would be created exceeds MAX_OUTPUT_LEN\n\t // (ignore this limit if we are on the first iteration)\n\n\t if (nextStr === 'html' || height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN) {\n\t break;\n\t }\n\n\t out.push(nextStr);\n\t len += nextStr.length;\n\t currentElem = currentElem.parentNode;\n\t }\n\n\t return out.reverse().join(separator);\n\t } catch (_oO) {\n\t return '<unknown>';\n\t }\n\t}\n\t/**\n\t * Returns a simple, query-selector representation of a DOM element\n\t * e.g. [HTMLElement] => input#foo.btn[name=baz]\n\t * @returns generated DOM path\n\t */\n\n\tfunction _htmlElementAsString(el) {\n\t var elem = el;\n\t var out = [];\n\t var className;\n\t var classes;\n\t var key;\n\t var attr;\n\t var i;\n\n\t if (!elem || !elem.tagName) {\n\t return '';\n\t }\n\n\t out.push(elem.tagName.toLowerCase());\n\n\t if (elem.id) {\n\t out.push(\"#\" + elem.id);\n\t } // eslint-disable-next-line prefer-const\n\n\n\t className = elem.className;\n\n\t if (className && isString(className)) {\n\t classes = className.split(/\\s+/);\n\n\t for (i = 0; i < classes.length; i++) {\n\t out.push(\".\" + classes[i]);\n\t }\n\t }\n\n\t var allowedAttrs = ['type', 'name', 'title', 'alt'];\n\n\t for (i = 0; i < allowedAttrs.length; i++) {\n\t key = allowedAttrs[i];\n\t attr = elem.getAttribute(key);\n\n\t if (attr) {\n\t out.push(\"[\" + key + \"=\\\"\" + attr + \"\\\"]\");\n\t }\n\t }\n\n\t return out.join('');\n\t}\n\n\tvar INITIAL_TIME = Date.now();\n\tvar prevNow = 0;\n\tvar performanceFallback = {\n\t now: function now() {\n\t var now = Date.now() - INITIAL_TIME;\n\n\t if (now < prevNow) {\n\t now = prevNow;\n\t }\n\n\t prevNow = now;\n\t return now;\n\t },\n\t timeOrigin: INITIAL_TIME\n\t};\n\tvar crossPlatformPerformance = function () {\n\t if (isNodeEnv()) {\n\t try {\n\t var perfHooks = dynamicRequire(module, 'perf_hooks');\n\t return perfHooks.performance;\n\t } catch (_) {\n\t return performanceFallback;\n\t }\n\t }\n\n\t var performance = getGlobalObject().performance;\n\n\t if (!performance || !performance.now) {\n\t return performanceFallback;\n\t } // Polyfill for performance.timeOrigin.\n\t //\n\t // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n\t // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n\n\n\t if (performance.timeOrigin === undefined) {\n\t // As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a\n\t // valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME.\n\t // @ts-ignore ignored because timeOrigin is a readonly property but we want to override\n\t // eslint-disable-next-line deprecation/deprecation\n\t performance.timeOrigin = performance.timing && performance.timing.navigationStart || INITIAL_TIME;\n\t }\n\n\t return performance;\n\t}();\n\t/**\n\t * Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock.\n\t */\n\n\tfunction timestampWithMs() {\n\t return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000;\n\t} // https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\n\tvar defaultRetryAfter = 60 * 1000; // 60 seconds\n\n\t/**\n\t * Extracts Retry-After value from the request header or returns default value\n\t * @param now current unix timestamp\n\t * @param header string representation of 'Retry-After' header\n\t */\n\n\tfunction parseRetryAfterHeader(now, header) {\n\t if (!header) {\n\t return defaultRetryAfter;\n\t }\n\n\t var headerDelay = parseInt(\"\" + header, 10);\n\n\t if (!isNaN(headerDelay)) {\n\t return headerDelay * 1000;\n\t }\n\n\t var headerDate = Date.parse(\"\" + header);\n\n\t if (!isNaN(headerDate)) {\n\t return headerDate - now;\n\t }\n\n\t return defaultRetryAfter;\n\t}\n\tvar defaultFunctionName = '<anonymous>';\n\t/**\n\t * Safely extract function name from itself\n\t */\n\n\tfunction getFunctionName(fn) {\n\t try {\n\t if (!fn || typeof fn !== 'function') {\n\t return defaultFunctionName;\n\t }\n\n\t return fn.name || defaultFunctionName;\n\t } catch (e) {\n\t // Just accessing custom props in some Selenium environments\n\t // can cause a \"Permission denied\" exception (see raven-js#495).\n\t return defaultFunctionName;\n\t }\n\t}\n\n\tvar global$1 = getGlobalObject();\n\t/** Prefix for logging strings */\n\n\tvar PREFIX = 'Sentry Logger ';\n\t/** JSDoc */\n\n\tvar Logger =\n\t/** @class */\n\tfunction () {\n\t /** JSDoc */\n\t function Logger() {\n\t this._enabled = false;\n\t }\n\t /** JSDoc */\n\n\n\t Logger.prototype.disable = function () {\n\t this._enabled = false;\n\t };\n\t /** JSDoc */\n\n\n\t Logger.prototype.enable = function () {\n\t this._enabled = true;\n\t };\n\t /** JSDoc */\n\n\n\t Logger.prototype.log = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t if (!this._enabled) {\n\t return;\n\t }\n\n\t consoleSandbox(function () {\n\t global$1.console.log(PREFIX + \"[Log]: \" + args.join(' '));\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t Logger.prototype.warn = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t if (!this._enabled) {\n\t return;\n\t }\n\n\t consoleSandbox(function () {\n\t global$1.console.warn(PREFIX + \"[Warn]: \" + args.join(' '));\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t Logger.prototype.error = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t if (!this._enabled) {\n\t return;\n\t }\n\n\t consoleSandbox(function () {\n\t global$1.console.error(PREFIX + \"[Error]: \" + args.join(' '));\n\t });\n\t };\n\n\t return Logger;\n\t}(); // Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\n\n\n\tglobal$1.__SENTRY__ = global$1.__SENTRY__ || {};\n\tvar logger = global$1.__SENTRY__.logger || (global$1.__SENTRY__.logger = new Logger());\n\n\tvar HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('splice');\n\tvar USES_TO_LENGTH$6 = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n\tvar max$3 = Math.max;\n\tvar min$6 = Math.min;\n\tvar MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n\t// `Array.prototype.splice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n\t// with adding support of @@species\n\t_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 }, {\n\t splice: function splice(start, deleteCount /* , ...items */) {\n\t var O = toObject(this);\n\t var len = toLength(O.length);\n\t var actualStart = toAbsoluteIndex(start, len);\n\t var argumentsLength = arguments.length;\n\t var insertCount, actualDeleteCount, A, k, from, to;\n\t if (argumentsLength === 0) {\n\t insertCount = actualDeleteCount = 0;\n\t } else if (argumentsLength === 1) {\n\t insertCount = 0;\n\t actualDeleteCount = len - actualStart;\n\t } else {\n\t insertCount = argumentsLength - 2;\n\t actualDeleteCount = min$6(max$3(toInteger(deleteCount), 0), len - actualStart);\n\t }\n\t if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {\n\t throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n\t }\n\t A = arraySpeciesCreate(O, actualDeleteCount);\n\t for (k = 0; k < actualDeleteCount; k++) {\n\t from = actualStart + k;\n\t if (from in O) createProperty(A, k, O[from]);\n\t }\n\t A.length = actualDeleteCount;\n\t if (insertCount < actualDeleteCount) {\n\t for (k = actualStart; k < len - actualDeleteCount; k++) {\n\t from = k + actualDeleteCount;\n\t to = k + insertCount;\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t }\n\t for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n\t } else if (insertCount > actualDeleteCount) {\n\t for (k = len - actualDeleteCount; k > actualStart; k--) {\n\t from = k + actualDeleteCount - 1;\n\t to = k + insertCount - 1;\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t }\n\t }\n\t for (k = 0; k < insertCount; k++) {\n\t O[k + actualStart] = arguments[k + 2];\n\t }\n\t O.length = len - actualDeleteCount + insertCount;\n\t return A;\n\t }\n\t});\n\n\tvar freezing = !fails(function () {\n\t return Object.isExtensible(Object.preventExtensions({}));\n\t});\n\n\tvar internalMetadata = createCommonjsModule(function (module) {\n\tvar defineProperty = objectDefineProperty.f;\n\n\n\n\tvar METADATA = uid('meta');\n\tvar id = 0;\n\n\tvar isExtensible = Object.isExtensible || function () {\n\t return true;\n\t};\n\n\tvar setMetadata = function (it) {\n\t defineProperty(it, METADATA, { value: {\n\t objectID: 'O' + ++id, // object ID\n\t weakData: {} // weak collections IDs\n\t } });\n\t};\n\n\tvar fastKey = function (it, create) {\n\t // return a primitive with prefix\n\t if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\t if (!has(it, METADATA)) {\n\t // can't set metadata to uncaught frozen object\n\t if (!isExtensible(it)) return 'F';\n\t // not necessary to add metadata\n\t if (!create) return 'E';\n\t // add missing metadata\n\t setMetadata(it);\n\t // return object ID\n\t } return it[METADATA].objectID;\n\t};\n\n\tvar getWeakData = function (it, create) {\n\t if (!has(it, METADATA)) {\n\t // can't set metadata to uncaught frozen object\n\t if (!isExtensible(it)) return true;\n\t // not necessary to add metadata\n\t if (!create) return false;\n\t // add missing metadata\n\t setMetadata(it);\n\t // return the store of weak collections IDs\n\t } return it[METADATA].weakData;\n\t};\n\n\t// add metadata on freeze-family methods calling\n\tvar onFreeze = function (it) {\n\t if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n\t return it;\n\t};\n\n\tvar meta = module.exports = {\n\t REQUIRED: false,\n\t fastKey: fastKey,\n\t getWeakData: getWeakData,\n\t onFreeze: onFreeze\n\t};\n\n\thiddenKeys[METADATA] = true;\n\t});\n\tvar internalMetadata_1 = internalMetadata.REQUIRED;\n\tvar internalMetadata_2 = internalMetadata.fastKey;\n\tvar internalMetadata_3 = internalMetadata.getWeakData;\n\tvar internalMetadata_4 = internalMetadata.onFreeze;\n\n\tvar collection = function (CONSTRUCTOR_NAME, wrapper, common) {\n\t var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n\t var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n\t var ADDER = IS_MAP ? 'set' : 'add';\n\t var NativeConstructor = global_1[CONSTRUCTOR_NAME];\n\t var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n\t var Constructor = NativeConstructor;\n\t var exported = {};\n\n\t var fixMethod = function (KEY) {\n\t var nativeMethod = NativePrototype[KEY];\n\t redefine(NativePrototype, KEY,\n\t KEY == 'add' ? function add(value) {\n\t nativeMethod.call(this, value === 0 ? 0 : value);\n\t return this;\n\t } : KEY == 'delete' ? function (key) {\n\t return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : KEY == 'get' ? function get(key) {\n\t return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : KEY == 'has' ? function has(key) {\n\t return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : function set(key, value) {\n\t nativeMethod.call(this, key === 0 ? 0 : key, value);\n\t return this;\n\t }\n\t );\n\t };\n\n\t // eslint-disable-next-line max-len\n\t if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n\t new NativeConstructor().entries().next();\n\t })))) {\n\t // create collection constructor\n\t Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n\t internalMetadata.REQUIRED = true;\n\t } else if (isForced_1(CONSTRUCTOR_NAME, true)) {\n\t var instance = new Constructor();\n\t // early implementations not supports chaining\n\t var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n\t // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n\t var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n\t // most early implementations doesn't supports iterables, most modern - not close it correctly\n\t // eslint-disable-next-line no-new\n\t var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\n\t // for early implementations -0 and +0 not the same\n\t var BUGGY_ZERO = !IS_WEAK && fails(function () {\n\t // V8 ~ Chromium 42- fails only with 5+ elements\n\t var $instance = new NativeConstructor();\n\t var index = 5;\n\t while (index--) $instance[ADDER](index, index);\n\t return !$instance.has(-0);\n\t });\n\n\t if (!ACCEPT_ITERABLES) {\n\t Constructor = wrapper(function (dummy, iterable) {\n\t anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n\t var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n\t if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP);\n\t return that;\n\t });\n\t Constructor.prototype = NativePrototype;\n\t NativePrototype.constructor = Constructor;\n\t }\n\n\t if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n\t fixMethod('delete');\n\t fixMethod('has');\n\t IS_MAP && fixMethod('get');\n\t }\n\n\t if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n\t // weak collections should not contains .clear method\n\t if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n\t }\n\n\t exported[CONSTRUCTOR_NAME] = Constructor;\n\t _export({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n\t setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n\t if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n\t return Constructor;\n\t};\n\n\tvar getWeakData = internalMetadata.getWeakData;\n\n\n\n\n\n\n\n\n\tvar setInternalState$8 = internalState.set;\n\tvar internalStateGetterFor = internalState.getterFor;\n\tvar find$1 = arrayIteration.find;\n\tvar findIndex = arrayIteration.findIndex;\n\tvar id$1 = 0;\n\n\t// fallback for uncaught frozen keys\n\tvar uncaughtFrozenStore = function (store) {\n\t return store.frozen || (store.frozen = new UncaughtFrozenStore());\n\t};\n\n\tvar UncaughtFrozenStore = function () {\n\t this.entries = [];\n\t};\n\n\tvar findUncaughtFrozen = function (store, key) {\n\t return find$1(store.entries, function (it) {\n\t return it[0] === key;\n\t });\n\t};\n\n\tUncaughtFrozenStore.prototype = {\n\t get: function (key) {\n\t var entry = findUncaughtFrozen(this, key);\n\t if (entry) return entry[1];\n\t },\n\t has: function (key) {\n\t return !!findUncaughtFrozen(this, key);\n\t },\n\t set: function (key, value) {\n\t var entry = findUncaughtFrozen(this, key);\n\t if (entry) entry[1] = value;\n\t else this.entries.push([key, value]);\n\t },\n\t 'delete': function (key) {\n\t var index = findIndex(this.entries, function (it) {\n\t return it[0] === key;\n\t });\n\t if (~index) this.entries.splice(index, 1);\n\t return !!~index;\n\t }\n\t};\n\n\tvar collectionWeak = {\n\t getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n\t var C = wrapper(function (that, iterable) {\n\t anInstance(that, C, CONSTRUCTOR_NAME);\n\t setInternalState$8(that, {\n\t type: CONSTRUCTOR_NAME,\n\t id: id$1++,\n\t frozen: undefined\n\t });\n\t if (iterable != undefined) iterate_1(iterable, that[ADDER], that, IS_MAP);\n\t });\n\n\t var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n\t var define = function (that, key, value) {\n\t var state = getInternalState(that);\n\t var data = getWeakData(anObject(key), true);\n\t if (data === true) uncaughtFrozenStore(state).set(key, value);\n\t else data[state.id] = value;\n\t return that;\n\t };\n\n\t redefineAll(C.prototype, {\n\t // 23.3.3.2 WeakMap.prototype.delete(key)\n\t // 23.4.3.3 WeakSet.prototype.delete(value)\n\t 'delete': function (key) {\n\t var state = getInternalState(this);\n\t if (!isObject(key)) return false;\n\t var data = getWeakData(key);\n\t if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n\t return data && has(data, state.id) && delete data[state.id];\n\t },\n\t // 23.3.3.4 WeakMap.prototype.has(key)\n\t // 23.4.3.4 WeakSet.prototype.has(value)\n\t has: function has$1(key) {\n\t var state = getInternalState(this);\n\t if (!isObject(key)) return false;\n\t var data = getWeakData(key);\n\t if (data === true) return uncaughtFrozenStore(state).has(key);\n\t return data && has(data, state.id);\n\t }\n\t });\n\n\t redefineAll(C.prototype, IS_MAP ? {\n\t // 23.3.3.3 WeakMap.prototype.get(key)\n\t get: function get(key) {\n\t var state = getInternalState(this);\n\t if (isObject(key)) {\n\t var data = getWeakData(key);\n\t if (data === true) return uncaughtFrozenStore(state).get(key);\n\t return data ? data[state.id] : undefined;\n\t }\n\t },\n\t // 23.3.3.5 WeakMap.prototype.set(key, value)\n\t set: function set(key, value) {\n\t return define(this, key, value);\n\t }\n\t } : {\n\t // 23.4.3.1 WeakSet.prototype.add(value)\n\t add: function add(value) {\n\t return define(this, value, true);\n\t }\n\t });\n\n\t return C;\n\t }\n\t};\n\n\t// `WeakSet` constructor\n\t// https://tc39.github.io/ecma262/#sec-weakset-constructor\n\tcollection('WeakSet', function (init) {\n\t return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); };\n\t}, collectionWeak);\n\n\t/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n\t/* eslint-disable @typescript-eslint/no-explicit-any */\n\n\t/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n\n\t/**\n\t * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n\t */\n\tvar Memo =\n\t/** @class */\n\tfunction () {\n\t function Memo() {\n\t this._hasWeakSet = typeof WeakSet === 'function';\n\t this._inner = this._hasWeakSet ? new WeakSet() : [];\n\t }\n\t /**\n\t * Sets obj to remember.\n\t * @param obj Object to remember\n\t */\n\n\n\t Memo.prototype.memoize = function (obj) {\n\t if (this._hasWeakSet) {\n\t if (this._inner.has(obj)) {\n\t return true;\n\t }\n\n\t this._inner.add(obj);\n\n\t return false;\n\t } // eslint-disable-next-line @typescript-eslint/prefer-for-of\n\n\n\t for (var i = 0; i < this._inner.length; i++) {\n\t var value = this._inner[i];\n\n\t if (value === obj) {\n\t return true;\n\t }\n\t }\n\n\t this._inner.push(obj);\n\n\t return false;\n\t };\n\t /**\n\t * Removes object from internal storage.\n\t * @param obj Object to forget\n\t */\n\n\n\t Memo.prototype.unmemoize = function (obj) {\n\t if (this._hasWeakSet) {\n\t this._inner.delete(obj);\n\t } else {\n\t for (var i = 0; i < this._inner.length; i++) {\n\t if (this._inner[i] === obj) {\n\t this._inner.splice(i, 1);\n\n\t break;\n\t }\n\t }\n\t }\n\t };\n\n\t return Memo;\n\t}();\n\n\t// `URL.prototype.toJSON` method\n\t// https://url.spec.whatwg.org/#dom-url-tojson\n\t_export({ target: 'URL', proto: true, enumerable: true }, {\n\t toJSON: function toJSON() {\n\t return URL.prototype.toString.call(this);\n\t }\n\t});\n\n\t/**\n\t * Wrap a given object method with a higher-order function\n\t *\n\t * @param source An object that contains a method to be wrapped.\n\t * @param name A name of method to be wrapped.\n\t * @param replacement A function that should be used to wrap a given method.\n\t * @returns void\n\t */\n\n\tfunction fill(source, name, replacement) {\n\t if (!(name in source)) {\n\t return;\n\t }\n\n\t var original = source[name];\n\t var wrapped = replacement(original); // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n\t // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n\n\t if (typeof wrapped === 'function') {\n\t try {\n\t wrapped.prototype = wrapped.prototype || {};\n\t Object.defineProperties(wrapped, {\n\t __sentry_original__: {\n\t enumerable: false,\n\t value: original\n\t }\n\t });\n\t } catch (_Oo) {// This can throw if multiple fill happens on a global object like XMLHttpRequest\n\t // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n\t }\n\t }\n\n\t source[name] = wrapped;\n\t}\n\t/**\n\t * Encodes given object into url-friendly format\n\t *\n\t * @param object An object that contains serializable values\n\t * @returns string Encoded\n\t */\n\n\tfunction urlEncode(object) {\n\t return Object.keys(object).map(function (key) {\n\t return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]);\n\t }).join('&');\n\t}\n\t/**\n\t * Transforms any object into an object literal with all it's attributes\n\t * attached to it.\n\t *\n\t * @param value Initial source that we have to transform in order to be usable by the serializer\n\t */\n\n\tfunction getWalkSource(value) {\n\t if (isError(value)) {\n\t var error = value;\n\t var err = {\n\t message: error.message,\n\t name: error.name,\n\t stack: error.stack\n\t };\n\n\t for (var i in error) {\n\t if (Object.prototype.hasOwnProperty.call(error, i)) {\n\t err[i] = error[i];\n\t }\n\t }\n\n\t return err;\n\t }\n\n\t if (isEvent(value)) {\n\t var event_1 = value;\n\t var source = {};\n\t source.type = event_1.type; // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n\n\t try {\n\t source.target = isElement(event_1.target) ? htmlTreeAsString(event_1.target) : Object.prototype.toString.call(event_1.target);\n\t } catch (_oO) {\n\t source.target = '<unknown>';\n\t }\n\n\t try {\n\t source.currentTarget = isElement(event_1.currentTarget) ? htmlTreeAsString(event_1.currentTarget) : Object.prototype.toString.call(event_1.currentTarget);\n\t } catch (_oO) {\n\t source.currentTarget = '<unknown>';\n\t }\n\n\t if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n\t source.detail = event_1.detail;\n\t }\n\n\t for (var i in event_1) {\n\t if (Object.prototype.hasOwnProperty.call(event_1, i)) {\n\t source[i] = event_1;\n\t }\n\t }\n\n\t return source;\n\t }\n\n\t return value;\n\t}\n\t/** Calculates bytes size of input string */\n\n\n\tfunction utf8Length(value) {\n\t // eslint-disable-next-line no-bitwise\n\t return ~-encodeURI(value).split(/%..|./).length;\n\t}\n\t/** Calculates bytes size of input object */\n\n\n\tfunction jsonSize(value) {\n\t return utf8Length(JSON.stringify(value));\n\t}\n\t/** JSDoc */\n\n\n\tfunction normalizeToSize(object, // Default Node.js REPL depth\n\tdepth, // 100kB, as 200kB is max payload size, so half sounds reasonable\n\tmaxSize) {\n\t if (depth === void 0) {\n\t depth = 3;\n\t }\n\n\t if (maxSize === void 0) {\n\t maxSize = 100 * 1024;\n\t }\n\n\t var serialized = normalize$1(object, depth);\n\n\t if (jsonSize(serialized) > maxSize) {\n\t return normalizeToSize(object, depth - 1, maxSize);\n\t }\n\n\t return serialized;\n\t}\n\t/** Transforms any input value into a string form, either primitive value or a type of the input */\n\n\tfunction serializeValue(value) {\n\t var type = Object.prototype.toString.call(value); // Node.js REPL notation\n\n\t if (typeof value === 'string') {\n\t return value;\n\t }\n\n\t if (type === '[object Object]') {\n\t return '[Object]';\n\t }\n\n\t if (type === '[object Array]') {\n\t return '[Array]';\n\t }\n\n\t var normalized = normalizeValue(value);\n\t return isPrimitive(normalized) ? normalized : type;\n\t}\n\t/**\n\t * normalizeValue()\n\t *\n\t * Takes unserializable input and make it serializable friendly\n\t *\n\t * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n\t * - serializes Error objects\n\t * - filter global objects\n\t */\n\n\n\tfunction normalizeValue(value, key) {\n\t if (key === 'domain' && value && _typeof(value) === 'object' && value._events) {\n\t return '[Domain]';\n\t }\n\n\t if (key === 'domainEmitter') {\n\t return '[DomainEmitter]';\n\t }\n\n\t if (typeof global !== 'undefined' && value === global) {\n\t return '[Global]';\n\t }\n\n\t if (typeof window !== 'undefined' && value === window) {\n\t return '[Window]';\n\t }\n\n\t if (typeof document !== 'undefined' && value === document) {\n\t return '[Document]';\n\t } // React's SyntheticEvent thingy\n\n\n\t if (isSyntheticEvent(value)) {\n\t return '[SyntheticEvent]';\n\t }\n\n\t if (typeof value === 'number' && value !== value) {\n\t return '[NaN]';\n\t }\n\n\t if (value === void 0) {\n\t return '[undefined]';\n\t }\n\n\t if (typeof value === 'function') {\n\t return \"[Function: \" + getFunctionName(value) + \"]\";\n\t }\n\n\t return value;\n\t}\n\t/**\n\t * Walks an object to perform a normalization on it\n\t *\n\t * @param key of object that's walked in current iteration\n\t * @param value object to be walked\n\t * @param depth Optional number indicating how deep should walking be performed\n\t * @param memo Optional Memo class handling decycling\n\t */\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\n\tfunction walk(key, value, depth, memo) {\n\t if (depth === void 0) {\n\t depth = +Infinity;\n\t }\n\n\t if (memo === void 0) {\n\t memo = new Memo();\n\t } // If we reach the maximum depth, serialize whatever has left\n\n\n\t if (depth === 0) {\n\t return serializeValue(value);\n\t }\n\t /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\t // If value implements `toJSON` method, call it and return early\n\n\n\t if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n\t return value.toJSON();\n\t }\n\t /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\t // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n\n\n\t var normalized = normalizeValue(value, key);\n\n\t if (isPrimitive(normalized)) {\n\t return normalized;\n\t } // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n\n\n\t var source = getWalkSource(value); // Create an accumulator that will act as a parent for all future itterations of that branch\n\n\t var acc = Array.isArray(value) ? [] : {}; // If we already walked that branch, bail out, as it's circular reference\n\n\t if (memo.memoize(value)) {\n\t return '[Circular ~]';\n\t } // Walk all keys of the source\n\n\n\t for (var innerKey in source) {\n\t // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n\t if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n\t continue;\n\t } // Recursively walk through all the child nodes\n\n\n\t acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n\t } // Once walked through all the branches, remove the parent from memo storage\n\n\n\t memo.unmemoize(value); // Return accumulated values\n\n\t return acc;\n\t}\n\t/**\n\t * normalize()\n\t *\n\t * - Creates a copy to prevent original input mutation\n\t * - Skip non-enumerablers\n\t * - Calls `toJSON` if implemented\n\t * - Removes circular references\n\t * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n\t * - Translates known global objects/Classes to a string representations\n\t * - Takes care of Error objects serialization\n\t * - Optionally limit depth of final output\n\t */\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\tfunction normalize$1(input, depth) {\n\t try {\n\t return JSON.parse(JSON.stringify(input, function (key, value) {\n\t return walk(key, value, depth);\n\t }));\n\t } catch (_oO) {\n\t return '**non-serializable**';\n\t }\n\t}\n\t/**\n\t * Given any captured exception, extract its keys and create a sorted\n\t * and truncated list that will be used inside the event message.\n\t * eg. `Non-error exception captured with keys: foo, bar, baz`\n\t */\n\t// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\n\n\tfunction extractExceptionKeysForMessage(exception, maxLength) {\n\t if (maxLength === void 0) {\n\t maxLength = 40;\n\t }\n\n\t var keys = Object.keys(getWalkSource(exception));\n\t keys.sort();\n\n\t if (!keys.length) {\n\t return '[object has no keys]';\n\t }\n\n\t if (keys[0].length >= maxLength) {\n\t return truncate(keys[0], maxLength);\n\t }\n\n\t for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n\t var serialized = keys.slice(0, includedKeys).join(', ');\n\n\t if (serialized.length > maxLength) {\n\t continue;\n\t }\n\n\t if (includedKeys === keys.length) {\n\t return serialized;\n\t }\n\n\t return truncate(serialized, maxLength);\n\t }\n\n\t return '';\n\t}\n\n\tvar $filter$1 = arrayIteration.filter;\n\n\n\n\tvar HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('filter');\n\t// Edge 14- issue\n\tvar USES_TO_LENGTH$7 = arrayMethodUsesToLength('filter');\n\n\t// `Array.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t// with adding support of @@species\n\t_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$7 }, {\n\t filter: function filter(callbackfn /* , thisArg */) {\n\t return $filter$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\n\tvar NON_GENERIC = !!nativePromiseConstructor && fails(function () {\n\t nativePromiseConstructor.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n\t});\n\n\t// `Promise.prototype.finally` method\n\t// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n\t_export({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n\t 'finally': function (onFinally) {\n\t var C = speciesConstructor(this, getBuiltIn('Promise'));\n\t var isFunction = typeof onFinally == 'function';\n\t return this.then(\n\t isFunction ? function (x) {\n\t return promiseResolve(C, onFinally()).then(function () { return x; });\n\t } : onFinally,\n\t isFunction ? function (e) {\n\t return promiseResolve(C, onFinally()).then(function () { throw e; });\n\t } : onFinally\n\t );\n\t }\n\t});\n\n\t// patch native Promise.prototype for native async functions\n\tif ( typeof nativePromiseConstructor == 'function' && !nativePromiseConstructor.prototype['finally']) {\n\t redefine(nativePromiseConstructor.prototype, 'finally', getBuiltIn('Promise').prototype['finally']);\n\t}\n\n\t/** SyncPromise internal states */\n\n\tvar States;\n\n\t(function (States) {\n\t /** Pending */\n\t States[\"PENDING\"] = \"PENDING\";\n\t /** Resolved / OK */\n\n\t States[\"RESOLVED\"] = \"RESOLVED\";\n\t /** Rejected / Error */\n\n\t States[\"REJECTED\"] = \"REJECTED\";\n\t})(States || (States = {}));\n\t/**\n\t * Thenable class that behaves like a Promise and follows it's interface\n\t * but is not async internally\n\t */\n\n\n\tvar SyncPromise =\n\t/** @class */\n\tfunction () {\n\t function SyncPromise(executor) {\n\t var _this = this;\n\n\t this._state = States.PENDING;\n\t this._handlers = [];\n\t /** JSDoc */\n\n\t this._resolve = function (value) {\n\t _this._setResult(States.RESOLVED, value);\n\t };\n\t /** JSDoc */\n\n\n\t this._reject = function (reason) {\n\t _this._setResult(States.REJECTED, reason);\n\t };\n\t /** JSDoc */\n\n\n\t this._setResult = function (state, value) {\n\t if (_this._state !== States.PENDING) {\n\t return;\n\t }\n\n\t if (isThenable$1(value)) {\n\t value.then(_this._resolve, _this._reject);\n\t return;\n\t }\n\n\t _this._state = state;\n\t _this._value = value;\n\n\t _this._executeHandlers();\n\t }; // TODO: FIXME\n\n\t /** JSDoc */\n\n\n\t this._attachHandler = function (handler) {\n\t _this._handlers = _this._handlers.concat(handler);\n\n\t _this._executeHandlers();\n\t };\n\t /** JSDoc */\n\n\n\t this._executeHandlers = function () {\n\t if (_this._state === States.PENDING) {\n\t return;\n\t }\n\n\t var cachedHandlers = _this._handlers.slice();\n\n\t _this._handlers = [];\n\t cachedHandlers.forEach(function (handler) {\n\t if (handler.done) {\n\t return;\n\t }\n\n\t if (_this._state === States.RESOLVED) {\n\t if (handler.onfulfilled) {\n\t // eslint-disable-next-line @typescript-eslint/no-floating-promises\n\t handler.onfulfilled(_this._value);\n\t }\n\t }\n\n\t if (_this._state === States.REJECTED) {\n\t if (handler.onrejected) {\n\t handler.onrejected(_this._value);\n\t }\n\t }\n\n\t handler.done = true;\n\t });\n\t };\n\n\t try {\n\t executor(this._resolve, this._reject);\n\t } catch (e) {\n\t this._reject(e);\n\t }\n\t }\n\t /** JSDoc */\n\n\n\t SyncPromise.resolve = function (value) {\n\t return new SyncPromise(function (resolve) {\n\t resolve(value);\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.reject = function (reason) {\n\t return new SyncPromise(function (_, reject) {\n\t reject(reason);\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.all = function (collection) {\n\t return new SyncPromise(function (resolve, reject) {\n\t if (!Array.isArray(collection)) {\n\t reject(new TypeError(\"Promise.all requires an array as input.\"));\n\t return;\n\t }\n\n\t if (collection.length === 0) {\n\t resolve([]);\n\t return;\n\t }\n\n\t var counter = collection.length;\n\t var resolvedCollection = [];\n\t collection.forEach(function (item, index) {\n\t SyncPromise.resolve(item).then(function (value) {\n\t resolvedCollection[index] = value;\n\t counter -= 1;\n\n\t if (counter !== 0) {\n\t return;\n\t }\n\n\t resolve(resolvedCollection);\n\t }).then(null, reject);\n\t });\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.prototype.then = function (_onfulfilled, _onrejected) {\n\t var _this = this;\n\n\t return new SyncPromise(function (resolve, reject) {\n\t _this._attachHandler({\n\t done: false,\n\t onfulfilled: function onfulfilled(result) {\n\t if (!_onfulfilled) {\n\t // TODO: ¯\\_(ツ)_/¯\n\t // TODO: FIXME\n\t resolve(result);\n\t return;\n\t }\n\n\t try {\n\t resolve(_onfulfilled(result));\n\t return;\n\t } catch (e) {\n\t reject(e);\n\t return;\n\t }\n\t },\n\t onrejected: function onrejected(reason) {\n\t if (!_onrejected) {\n\t reject(reason);\n\t return;\n\t }\n\n\t try {\n\t resolve(_onrejected(reason));\n\t return;\n\t } catch (e) {\n\t reject(e);\n\t return;\n\t }\n\t }\n\t });\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.prototype.catch = function (onrejected) {\n\t return this.then(function (val) {\n\t return val;\n\t }, onrejected);\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.prototype.finally = function (onfinally) {\n\t var _this = this;\n\n\t return new SyncPromise(function (resolve, reject) {\n\t var val;\n\t var isRejected;\n\t return _this.then(function (value) {\n\t isRejected = false;\n\t val = value;\n\n\t if (onfinally) {\n\t onfinally();\n\t }\n\t }, function (reason) {\n\t isRejected = true;\n\t val = reason;\n\n\t if (onfinally) {\n\t onfinally();\n\t }\n\t }).then(function () {\n\t if (isRejected) {\n\t reject(val);\n\t return;\n\t }\n\n\t resolve(val);\n\t });\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t SyncPromise.prototype.toString = function () {\n\t return '[object SyncPromise]';\n\t };\n\n\t return SyncPromise;\n\t}();\n\n\t/** A simple queue that holds promises. */\n\n\tvar PromiseBuffer =\n\t/** @class */\n\tfunction () {\n\t function PromiseBuffer(_limit) {\n\t this._limit = _limit;\n\t /** Internal set of queued Promises */\n\n\t this._buffer = [];\n\t }\n\t /**\n\t * Says if the buffer is ready to take more requests\n\t */\n\n\n\t PromiseBuffer.prototype.isReady = function () {\n\t return this._limit === undefined || this.length() < this._limit;\n\t };\n\t /**\n\t * Add a promise to the queue.\n\t *\n\t * @param task Can be any PromiseLike<T>\n\t * @returns The original promise.\n\t */\n\n\n\t PromiseBuffer.prototype.add = function (task) {\n\t var _this = this;\n\n\t if (!this.isReady()) {\n\t return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n\t }\n\n\t if (this._buffer.indexOf(task) === -1) {\n\t this._buffer.push(task);\n\t }\n\n\t task.then(function () {\n\t return _this.remove(task);\n\t }).then(null, function () {\n\t return _this.remove(task).then(null, function () {// We have to add this catch here otherwise we have an unhandledPromiseRejection\n\t // because it's a new Promise chain.\n\t });\n\t });\n\t return task;\n\t };\n\t /**\n\t * Remove a promise to the queue.\n\t *\n\t * @param task Can be any PromiseLike<T>\n\t * @returns Removed promise.\n\t */\n\n\n\t PromiseBuffer.prototype.remove = function (task) {\n\t var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n\n\t return removedTask;\n\t };\n\t /**\n\t * This function returns the number of unresolved promises in the queue.\n\t */\n\n\n\t PromiseBuffer.prototype.length = function () {\n\t return this._buffer.length;\n\t };\n\t /**\n\t * This will drain the whole queue, returns true if queue is empty or drained.\n\t * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.\n\t *\n\t * @param timeout Number in ms to wait until it resolves with false.\n\t */\n\n\n\t PromiseBuffer.prototype.drain = function (timeout) {\n\t var _this = this;\n\n\t return new SyncPromise(function (resolve) {\n\t var capturedSetTimeout = setTimeout(function () {\n\t if (timeout && timeout > 0) {\n\t resolve(false);\n\t }\n\t }, timeout);\n\t SyncPromise.all(_this._buffer).then(function () {\n\t clearTimeout(capturedSetTimeout);\n\t resolve(true);\n\t }).then(null, function () {\n\t resolve(true);\n\t });\n\t });\n\t };\n\n\t return PromiseBuffer;\n\t}();\n\n\t/**\n\t * Tells whether current environment supports Fetch API\n\t * {@link supportsFetch}.\n\t *\n\t * @returns Answer to the given question.\n\t */\n\n\tfunction supportsFetch() {\n\t if (!('fetch' in getGlobalObject())) {\n\t return false;\n\t }\n\n\t try {\n\t new Headers();\n\t new Request('');\n\t new Response();\n\t return true;\n\t } catch (e) {\n\t return false;\n\t }\n\t}\n\t/**\n\t * isNativeFetch checks if the given function is a native implementation of fetch()\n\t */\n\t// eslint-disable-next-line @typescript-eslint/ban-types\n\n\tfunction isNativeFetch(func) {\n\t return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n\t}\n\t/**\n\t * Tells whether current environment supports Fetch API natively\n\t * {@link supportsNativeFetch}.\n\t *\n\t * @returns true if `window.fetch` is natively implemented, false otherwise\n\t */\n\n\n\tfunction supportsNativeFetch() {\n\t if (!supportsFetch()) {\n\t return false;\n\t }\n\n\t var global = getGlobalObject(); // Fast path to avoid DOM I/O\n\t // eslint-disable-next-line @typescript-eslint/unbound-method\n\n\t if (isNativeFetch(global.fetch)) {\n\t return true;\n\t } // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n\t // so create a \"pure\" iframe to see if that has native fetch\n\n\n\t var result = false;\n\t var doc = global.document; // eslint-disable-next-line deprecation/deprecation\n\n\t if (doc && typeof doc.createElement === \"function\") {\n\t try {\n\t var sandbox = doc.createElement('iframe');\n\t sandbox.hidden = true;\n\t doc.head.appendChild(sandbox);\n\n\t if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n\t // eslint-disable-next-line @typescript-eslint/unbound-method\n\t result = isNativeFetch(sandbox.contentWindow.fetch);\n\t }\n\n\t doc.head.removeChild(sandbox);\n\t } catch (err) {\n\t logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n\t }\n\t }\n\n\t return result;\n\t}\n\t/**\n\t * Tells whether current environment supports Referrer Policy API\n\t * {@link supportsReferrerPolicy}.\n\t *\n\t * @returns Answer to the given question.\n\t */\n\n\tfunction supportsReferrerPolicy() {\n\t // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n\t // https://caniuse.com/#feat=referrer-policy\n\t // It doesn't. And it throw exception instead of ignoring this parameter...\n\t // REF: https://github.com/getsentry/raven-js/issues/1233\n\t if (!supportsFetch()) {\n\t return false;\n\t }\n\n\t try {\n\t new Request('_', {\n\t referrerPolicy: 'origin'\n\t });\n\t return true;\n\t } catch (e) {\n\t return false;\n\t }\n\t}\n\t/**\n\t * Tells whether current environment supports History API\n\t * {@link supportsHistory}.\n\t *\n\t * @returns Answer to the given question.\n\t */\n\n\tfunction supportsHistory() {\n\t // NOTE: in Chrome App environment, touching history.pushState, *even inside\n\t // a try/catch block*, will cause Chrome to output an error to console.error\n\t // borrowed from: https://github.com/angular/angular.js/pull/13945/files\n\t var global = getGlobalObject();\n\t /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\t var chrome = global.chrome;\n\t var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n\t /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n\t var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n\t return !isChromePackagedApp && hasHistoryApi;\n\t}\n\n\tvar global$2 = getGlobalObject();\n\t/**\n\t * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n\t * - Console API\n\t * - Fetch API\n\t * - XHR API\n\t * - History API\n\t * - DOM API (click/typing)\n\t * - Error API\n\t * - UnhandledRejection API\n\t */\n\n\tvar handlers = {};\n\tvar instrumented = {};\n\t/** Instruments given API */\n\n\tfunction instrument(type) {\n\t if (instrumented[type]) {\n\t return;\n\t }\n\n\t instrumented[type] = true;\n\n\t switch (type) {\n\t case 'console':\n\t instrumentConsole();\n\t break;\n\n\t case 'dom':\n\t instrumentDOM();\n\t break;\n\n\t case 'xhr':\n\t instrumentXHR();\n\t break;\n\n\t case 'fetch':\n\t instrumentFetch();\n\t break;\n\n\t case 'history':\n\t instrumentHistory();\n\t break;\n\n\t case 'error':\n\t instrumentError();\n\t break;\n\n\t case 'unhandledrejection':\n\t instrumentUnhandledRejection();\n\t break;\n\n\t default:\n\t logger.warn('unknown instrumentation type:', type);\n\t }\n\t}\n\t/**\n\t * Add handler that will be called when given type of instrumentation triggers.\n\t * Use at your own risk, this might break without changelog notice, only used internally.\n\t * @hidden\n\t */\n\n\n\tfunction addInstrumentationHandler(handler) {\n\t if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {\n\t return;\n\t }\n\n\t handlers[handler.type] = handlers[handler.type] || [];\n\t handlers[handler.type].push(handler.callback);\n\t instrument(handler.type);\n\t}\n\t/** JSDoc */\n\n\tfunction triggerHandlers(type, data) {\n\t var e_1, _a;\n\n\t if (!type || !handlers[type]) {\n\t return;\n\t }\n\n\t try {\n\t for (var _b = __values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n\t var handler = _c.value;\n\n\t try {\n\t handler(data);\n\t } catch (e) {\n\t logger.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + getFunctionName(handler) + \"\\nError: \" + e);\n\t }\n\t }\n\t } catch (e_1_1) {\n\t e_1 = {\n\t error: e_1_1\n\t };\n\t } finally {\n\t try {\n\t if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n\t } finally {\n\t if (e_1) throw e_1.error;\n\t }\n\t }\n\t}\n\t/** JSDoc */\n\n\n\tfunction instrumentConsole() {\n\t if (!('console' in global$2)) {\n\t return;\n\t }\n\n\t ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {\n\t if (!(level in global$2.console)) {\n\t return;\n\t }\n\n\t fill(global$2.console, level, function (originalConsoleLevel) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t triggerHandlers('console', {\n\t args: args,\n\t level: level\n\t }); // this fails for some browsers. :(\n\n\t if (originalConsoleLevel) {\n\t Function.prototype.apply.call(originalConsoleLevel, global$2.console, args);\n\t }\n\t };\n\t });\n\t });\n\t}\n\t/** JSDoc */\n\n\n\tfunction instrumentFetch() {\n\t if (!supportsNativeFetch()) {\n\t return;\n\t }\n\n\t fill(global$2, 'fetch', function (originalFetch) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var commonHandlerData = {\n\t args: args,\n\t fetchData: {\n\t method: getFetchMethod(args),\n\t url: getFetchUrl(args)\n\t },\n\t startTimestamp: Date.now()\n\t };\n\t triggerHandlers('fetch', _assign({}, commonHandlerData)); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n\t return originalFetch.apply(global$2, args).then(function (response) {\n\t triggerHandlers('fetch', _assign(_assign({}, commonHandlerData), {\n\t endTimestamp: Date.now(),\n\t response: response\n\t }));\n\t return response;\n\t }, function (error) {\n\t triggerHandlers('fetch', _assign(_assign({}, commonHandlerData), {\n\t endTimestamp: Date.now(),\n\t error: error\n\t })); // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n\t // it means the sentry.javascript SDK caught an error invoking your application code.\n\t // This is expected behavior and NOT indicative of a bug with sentry.javascript.\n\n\t throw error;\n\t });\n\t };\n\t });\n\t}\n\t/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\n\t/** Extract `method` from fetch call arguments */\n\n\n\tfunction getFetchMethod(fetchArgs) {\n\t if (fetchArgs === void 0) {\n\t fetchArgs = [];\n\t }\n\n\t if ('Request' in global$2 && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n\t return String(fetchArgs[0].method).toUpperCase();\n\t }\n\n\t if (fetchArgs[1] && fetchArgs[1].method) {\n\t return String(fetchArgs[1].method).toUpperCase();\n\t }\n\n\t return 'GET';\n\t}\n\t/** Extract `url` from fetch call arguments */\n\n\n\tfunction getFetchUrl(fetchArgs) {\n\t if (fetchArgs === void 0) {\n\t fetchArgs = [];\n\t }\n\n\t if (typeof fetchArgs[0] === 'string') {\n\t return fetchArgs[0];\n\t }\n\n\t if ('Request' in global$2 && isInstanceOf(fetchArgs[0], Request)) {\n\t return fetchArgs[0].url;\n\t }\n\n\t return String(fetchArgs[0]);\n\t}\n\t/* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n\t/** JSDoc */\n\n\n\tfunction instrumentXHR() {\n\t if (!('XMLHttpRequest' in global$2)) {\n\t return;\n\t }\n\n\t var xhrproto = XMLHttpRequest.prototype;\n\t fill(xhrproto, 'open', function (originalOpen) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t } // eslint-disable-next-line @typescript-eslint/no-this-alias\n\n\n\t var xhr = this;\n\t var url = args[1];\n\t xhr.__sentry_xhr__ = {\n\t // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n\t url: args[1]\n\t }; // if Sentry key appears in URL, don't capture it as a request\n\t // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n\t if (isString(url) && xhr.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {\n\t xhr.__sentry_own_request__ = true;\n\t }\n\n\t var onreadystatechangeHandler = function onreadystatechangeHandler() {\n\t if (xhr.readyState === 4) {\n\t try {\n\t // touching statusCode in some platforms throws\n\t // an exception\n\t if (xhr.__sentry_xhr__) {\n\t xhr.__sentry_xhr__.status_code = xhr.status;\n\t }\n\t } catch (e) {\n\t /* do nothing */\n\t }\n\n\t triggerHandlers('xhr', {\n\t args: args,\n\t endTimestamp: Date.now(),\n\t startTimestamp: Date.now(),\n\t xhr: xhr\n\t });\n\t }\n\t };\n\n\t if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n\t fill(xhr, 'onreadystatechange', function (original) {\n\t return function () {\n\t var readyStateArgs = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t readyStateArgs[_i] = arguments[_i];\n\t }\n\n\t onreadystatechangeHandler();\n\t return original.apply(xhr, readyStateArgs);\n\t };\n\t });\n\t } else {\n\t xhr.addEventListener('readystatechange', onreadystatechangeHandler);\n\t }\n\n\t return originalOpen.apply(xhr, args);\n\t };\n\t });\n\t fill(xhrproto, 'send', function (originalSend) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t triggerHandlers('xhr', {\n\t args: args,\n\t startTimestamp: Date.now(),\n\t xhr: this\n\t });\n\t return originalSend.apply(this, args);\n\t };\n\t });\n\t}\n\n\tvar lastHref;\n\t/** JSDoc */\n\n\tfunction instrumentHistory() {\n\t if (!supportsHistory()) {\n\t return;\n\t }\n\n\t var oldOnPopState = global$2.onpopstate;\n\n\t global$2.onpopstate = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var to = global$2.location.href; // keep track of the current URL state, as we always receive only the updated state\n\n\t var from = lastHref;\n\t lastHref = to;\n\t triggerHandlers('history', {\n\t from: from,\n\t to: to\n\t });\n\n\t if (oldOnPopState) {\n\t return oldOnPopState.apply(this, args);\n\t }\n\t };\n\t /** @hidden */\n\n\n\t function historyReplacementFunction(originalHistoryFunction) {\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var url = args.length > 2 ? args[2] : undefined;\n\n\t if (url) {\n\t // coerce to string (this is what pushState does)\n\t var from = lastHref;\n\t var to = String(url); // keep track of the current URL state, as we always receive only the updated state\n\n\t lastHref = to;\n\t triggerHandlers('history', {\n\t from: from,\n\t to: to\n\t });\n\t }\n\n\t return originalHistoryFunction.apply(this, args);\n\t };\n\t }\n\n\t fill(global$2.history, 'pushState', historyReplacementFunction);\n\t fill(global$2.history, 'replaceState', historyReplacementFunction);\n\t}\n\t/** JSDoc */\n\n\n\tfunction instrumentDOM() {\n\t if (!('document' in global$2)) {\n\t return;\n\t } // Capture breadcrumbs from any click that is unhandled / bubbled up all the way\n\t // to the document. Do this before we instrument addEventListener.\n\n\n\t global$2.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);\n\t global$2.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false); // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.\n\n\t ['EventTarget', 'Node'].forEach(function (target) {\n\t /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n\t var proto = global$2[target] && global$2[target].prototype; // eslint-disable-next-line no-prototype-builtins\n\n\t if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n\t return;\n\t }\n\t /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n\n\n\t fill(proto, 'addEventListener', function (original) {\n\t return function (eventName, fn, options) {\n\t if (fn && fn.handleEvent) {\n\t if (eventName === 'click') {\n\t fill(fn, 'handleEvent', function (innerOriginal) {\n\t return function (event) {\n\t domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);\n\t return innerOriginal.call(this, event);\n\t };\n\t });\n\t }\n\n\t if (eventName === 'keypress') {\n\t fill(fn, 'handleEvent', function (innerOriginal) {\n\t return function (event) {\n\t keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);\n\t return innerOriginal.call(this, event);\n\t };\n\t });\n\t }\n\t } else {\n\t if (eventName === 'click') {\n\t domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);\n\t }\n\n\t if (eventName === 'keypress') {\n\t keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);\n\t }\n\t }\n\n\t return original.call(this, eventName, fn, options);\n\t };\n\t });\n\t fill(proto, 'removeEventListener', function (original) {\n\t return function (eventName, fn, options) {\n\t try {\n\t original.call(this, eventName, fn.__sentry_wrapped__, options);\n\t } catch (e) {// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n\t }\n\n\t return original.call(this, eventName, fn, options);\n\t };\n\t });\n\t });\n\t}\n\n\tvar debounceDuration = 1000;\n\tvar debounceTimer = 0;\n\tvar keypressTimeout;\n\tvar lastCapturedEvent;\n\t/**\n\t * Wraps addEventListener to capture UI breadcrumbs\n\t * @param name the event name (e.g. \"click\")\n\t * @param handler function that will be triggered\n\t * @param debounce decides whether it should wait till another event loop\n\t * @returns wrapped breadcrumb events handler\n\t * @hidden\n\t */\n\n\tfunction domEventHandler(name, handler, debounce) {\n\t if (debounce === void 0) {\n\t debounce = false;\n\t }\n\n\t return function (event) {\n\t // reset keypress timeout; e.g. triggering a 'click' after\n\t // a 'keypress' will reset the keypress debounce so that a new\n\t // set of keypresses can be recorded\n\t keypressTimeout = undefined; // It's possible this handler might trigger multiple times for the same\n\t // event (e.g. event propagation through node ancestors). Ignore if we've\n\t // already captured the event.\n\n\t if (!event || lastCapturedEvent === event) {\n\t return;\n\t }\n\n\t lastCapturedEvent = event;\n\n\t if (debounceTimer) {\n\t clearTimeout(debounceTimer);\n\t }\n\n\t if (debounce) {\n\t debounceTimer = setTimeout(function () {\n\t handler({\n\t event: event,\n\t name: name\n\t });\n\t });\n\t } else {\n\t handler({\n\t event: event,\n\t name: name\n\t });\n\t }\n\t };\n\t}\n\t/**\n\t * Wraps addEventListener to capture keypress UI events\n\t * @param handler function that will be triggered\n\t * @returns wrapped keypress events handler\n\t * @hidden\n\t */\n\n\n\tfunction keypressEventHandler(handler) {\n\t // TODO: if somehow user switches keypress target before\n\t // debounce timeout is triggered, we will only capture\n\t // a single breadcrumb from the FIRST target (acceptable?)\n\t return function (event) {\n\t var target;\n\n\t try {\n\t target = event.target;\n\t } catch (e) {\n\t // just accessing event properties can throw an exception in some rare circumstances\n\t // see: https://github.com/getsentry/raven-js/issues/838\n\t return;\n\t }\n\n\t var tagName = target && target.tagName; // only consider keypress events on actual input elements\n\t // this will disregard keypresses targeting body (e.g. tabbing\n\t // through elements, hotkeys, etc)\n\n\t if (!tagName || tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable) {\n\t return;\n\t } // record first keypress in a series, but ignore subsequent\n\t // keypresses until debounce clears\n\n\n\t if (!keypressTimeout) {\n\t domEventHandler('input', handler)(event);\n\t }\n\n\t clearTimeout(keypressTimeout);\n\t keypressTimeout = setTimeout(function () {\n\t keypressTimeout = undefined;\n\t }, debounceDuration);\n\t };\n\t}\n\n\tvar _oldOnErrorHandler = null;\n\t/** JSDoc */\n\n\tfunction instrumentError() {\n\t _oldOnErrorHandler = global$2.onerror;\n\n\t global$2.onerror = function (msg, url, line, column, error) {\n\t triggerHandlers('error', {\n\t column: column,\n\t error: error,\n\t line: line,\n\t msg: msg,\n\t url: url\n\t });\n\n\t if (_oldOnErrorHandler) {\n\t // eslint-disable-next-line prefer-rest-params\n\t return _oldOnErrorHandler.apply(this, arguments);\n\t }\n\n\t return false;\n\t };\n\t}\n\n\tvar _oldOnUnhandledRejectionHandler = null;\n\t/** JSDoc */\n\n\tfunction instrumentUnhandledRejection() {\n\t _oldOnUnhandledRejectionHandler = global$2.onunhandledrejection;\n\n\t global$2.onunhandledrejection = function (e) {\n\t triggerHandlers('unhandledrejection', e);\n\n\t if (_oldOnUnhandledRejectionHandler) {\n\t // eslint-disable-next-line prefer-rest-params\n\t return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n\t }\n\n\t return true;\n\t };\n\t}\n\n\t/** Regular expression used to parse a Dsn. */\n\n\tvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n\t/** Error message */\n\n\tvar ERROR_MESSAGE = 'Invalid Dsn';\n\t/** The Sentry Dsn, identifying a Sentry instance and project. */\n\n\tvar Dsn =\n\t/** @class */\n\tfunction () {\n\t /** Creates a new Dsn component */\n\t function Dsn(from) {\n\t if (typeof from === 'string') {\n\t this._fromString(from);\n\t } else {\n\t this._fromComponents(from);\n\t }\n\n\t this._validate();\n\t }\n\t /**\n\t * Renders the string representation of this Dsn.\n\t *\n\t * By default, this will render the public representation without the password\n\t * component. To get the deprecated private representation, set `withPassword`\n\t * to true.\n\t *\n\t * @param withPassword When set to true, the password will be included.\n\t */\n\n\n\t Dsn.prototype.toString = function (withPassword) {\n\t if (withPassword === void 0) {\n\t withPassword = false;\n\t }\n\n\t var _a = this,\n\t host = _a.host,\n\t path = _a.path,\n\t pass = _a.pass,\n\t port = _a.port,\n\t projectId = _a.projectId,\n\t protocol = _a.protocol,\n\t user = _a.user;\n\n\t return protocol + \"://\" + user + (withPassword && pass ? \":\" + pass : '') + (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId);\n\t };\n\t /** Parses a string into this Dsn. */\n\n\n\t Dsn.prototype._fromString = function (str) {\n\t var match = DSN_REGEX.exec(str);\n\n\t if (!match) {\n\t throw new SentryError(ERROR_MESSAGE);\n\t }\n\n\t var _a = __read(match.slice(1), 6),\n\t protocol = _a[0],\n\t user = _a[1],\n\t _b = _a[2],\n\t pass = _b === void 0 ? '' : _b,\n\t host = _a[3],\n\t _c = _a[4],\n\t port = _c === void 0 ? '' : _c,\n\t lastPath = _a[5];\n\n\t var path = '';\n\t var projectId = lastPath;\n\t var split = projectId.split('/');\n\n\t if (split.length > 1) {\n\t path = split.slice(0, -1).join('/');\n\t projectId = split.pop();\n\t }\n\n\t if (projectId) {\n\t var projectMatch = projectId.match(/^\\d+/);\n\n\t if (projectMatch) {\n\t projectId = projectMatch[0];\n\t }\n\t }\n\n\t this._fromComponents({\n\t host: host,\n\t pass: pass,\n\t path: path,\n\t projectId: projectId,\n\t port: port,\n\t protocol: protocol,\n\t user: user\n\t });\n\t };\n\t /** Maps Dsn components into this instance. */\n\n\n\t Dsn.prototype._fromComponents = function (components) {\n\t this.protocol = components.protocol;\n\t this.user = components.user;\n\t this.pass = components.pass || '';\n\t this.host = components.host;\n\t this.port = components.port || '';\n\t this.path = components.path || '';\n\t this.projectId = components.projectId;\n\t };\n\t /** Validates this Dsn and throws on error. */\n\n\n\t Dsn.prototype._validate = function () {\n\t var _this = this;\n\n\t ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {\n\t if (!_this[component]) {\n\t throw new SentryError(ERROR_MESSAGE + \": \" + component + \" missing\");\n\t }\n\t });\n\n\t if (!this.projectId.match(/^\\d+$/)) {\n\t throw new SentryError(ERROR_MESSAGE + \": Invalid projectId \" + this.projectId);\n\t }\n\n\t if (this.protocol !== 'http' && this.protocol !== 'https') {\n\t throw new SentryError(ERROR_MESSAGE + \": Invalid protocol \" + this.protocol);\n\t }\n\n\t if (this.port && isNaN(parseInt(this.port, 10))) {\n\t throw new SentryError(ERROR_MESSAGE + \": Invalid port \" + this.port);\n\t }\n\t };\n\n\t return Dsn;\n\t}();\n\n\t/**\n\t * Holds additional event information. {@link Scope.applyToEvent} will be\n\t * called by the client before an event will be sent.\n\t */\n\n\tvar Scope =\n\t/** @class */\n\tfunction () {\n\t function Scope() {\n\t /** Flag if notifiying is happening. */\n\t this._notifyingListeners = false;\n\t /** Callback for client to receive scope changes. */\n\n\t this._scopeListeners = [];\n\t /** Callback list that will be called after {@link applyToEvent}. */\n\n\t this._eventProcessors = [];\n\t /** Array of breadcrumbs. */\n\n\t this._breadcrumbs = [];\n\t /** User */\n\n\t this._user = {};\n\t /** Tags */\n\n\t this._tags = {};\n\t /** Extra */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\t this._extra = {};\n\t /** Contexts */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\t this._contexts = {};\n\t }\n\t /**\n\t * Inherit values from the parent scope.\n\t * @param scope to clone.\n\t */\n\n\n\t Scope.clone = function (scope) {\n\t var newScope = new Scope();\n\n\t if (scope) {\n\t newScope._breadcrumbs = __spread(scope._breadcrumbs);\n\t newScope._tags = _assign({}, scope._tags);\n\t newScope._extra = _assign({}, scope._extra);\n\t newScope._contexts = _assign({}, scope._contexts);\n\t newScope._user = scope._user;\n\t newScope._level = scope._level;\n\t newScope._span = scope._span;\n\t newScope._transactionName = scope._transactionName;\n\t newScope._fingerprint = scope._fingerprint;\n\t newScope._eventProcessors = __spread(scope._eventProcessors);\n\t }\n\n\t return newScope;\n\t };\n\t /**\n\t * Add internal on change listener. Used for sub SDKs that need to store the scope.\n\t * @hidden\n\t */\n\n\n\t Scope.prototype.addScopeListener = function (callback) {\n\t this._scopeListeners.push(callback);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.addEventProcessor = function (callback) {\n\t this._eventProcessors.push(callback);\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setUser = function (user) {\n\t this._user = user || {};\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setTags = function (tags) {\n\t this._tags = _assign(_assign({}, this._tags), tags);\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setTag = function (key, value) {\n\t var _a;\n\n\t this._tags = _assign(_assign({}, this._tags), (_a = {}, _a[key] = value, _a));\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setExtras = function (extras) {\n\t this._extra = _assign(_assign({}, this._extra), extras);\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setExtra = function (key, extra) {\n\t var _a;\n\n\t this._extra = _assign(_assign({}, this._extra), (_a = {}, _a[key] = extra, _a));\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setFingerprint = function (fingerprint) {\n\t this._fingerprint = fingerprint;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setLevel = function (level) {\n\t this._level = level;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setTransactionName = function (name) {\n\t this._transactionName = name;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * Can be removed in major version.\n\t * @deprecated in favor of {@link this.setTransactionName}\n\t */\n\n\n\t Scope.prototype.setTransaction = function (name) {\n\t return this.setTransactionName(name);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Scope.prototype.setContext = function (key, context) {\n\t var _a;\n\n\t this._contexts = _assign(_assign({}, this._contexts), (_a = {}, _a[key] = context, _a));\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.setSpan = function (span) {\n\t this._span = span;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.getSpan = function () {\n\t return this._span;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.getTransaction = function () {\n\t var span = this.getSpan();\n\n\t if (span && span.spanRecorder && span.spanRecorder.spans[0]) {\n\t return span.spanRecorder.spans[0];\n\t }\n\n\t return undefined;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.update = function (captureContext) {\n\t if (!captureContext) {\n\t return this;\n\t }\n\n\t if (typeof captureContext === 'function') {\n\t var updatedScope = captureContext(this);\n\t return updatedScope instanceof Scope ? updatedScope : this;\n\t }\n\n\t if (captureContext instanceof Scope) {\n\t this._tags = _assign(_assign({}, this._tags), captureContext._tags);\n\t this._extra = _assign(_assign({}, this._extra), captureContext._extra);\n\t this._contexts = _assign(_assign({}, this._contexts), captureContext._contexts);\n\n\t if (captureContext._user) {\n\t this._user = captureContext._user;\n\t }\n\n\t if (captureContext._level) {\n\t this._level = captureContext._level;\n\t }\n\n\t if (captureContext._fingerprint) {\n\t this._fingerprint = captureContext._fingerprint;\n\t }\n\t } else if (isPlainObject(captureContext)) {\n\t // eslint-disable-next-line no-param-reassign\n\t captureContext = captureContext;\n\t this._tags = _assign(_assign({}, this._tags), captureContext.tags);\n\t this._extra = _assign(_assign({}, this._extra), captureContext.extra);\n\t this._contexts = _assign(_assign({}, this._contexts), captureContext.contexts);\n\n\t if (captureContext.user) {\n\t this._user = captureContext.user;\n\t }\n\n\t if (captureContext.level) {\n\t this._level = captureContext.level;\n\t }\n\n\t if (captureContext.fingerprint) {\n\t this._fingerprint = captureContext.fingerprint;\n\t }\n\t }\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.clear = function () {\n\t this._breadcrumbs = [];\n\t this._tags = {};\n\t this._extra = {};\n\t this._user = {};\n\t this._contexts = {};\n\t this._level = undefined;\n\t this._transactionName = undefined;\n\t this._fingerprint = undefined;\n\t this._span = undefined;\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {\n\t var mergedBreadcrumb = _assign({\n\t timestamp: timestampWithMs()\n\t }, breadcrumb);\n\n\t this._breadcrumbs = maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0 ? __spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs) : __spread(this._breadcrumbs, [mergedBreadcrumb]);\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Scope.prototype.clearBreadcrumbs = function () {\n\t this._breadcrumbs = [];\n\n\t this._notifyScopeListeners();\n\n\t return this;\n\t };\n\t /**\n\t * Applies the current context and fingerprint to the event.\n\t * Note that breadcrumbs will be added by the client.\n\t * Also if the event has already breadcrumbs on it, we do not merge them.\n\t * @param event Event\n\t * @param hint May contain additional informartion about the original exception.\n\t * @hidden\n\t */\n\n\n\t Scope.prototype.applyToEvent = function (event, hint) {\n\t if (this._extra && Object.keys(this._extra).length) {\n\t event.extra = _assign(_assign({}, this._extra), event.extra);\n\t }\n\n\t if (this._tags && Object.keys(this._tags).length) {\n\t event.tags = _assign(_assign({}, this._tags), event.tags);\n\t }\n\n\t if (this._user && Object.keys(this._user).length) {\n\t event.user = _assign(_assign({}, this._user), event.user);\n\t }\n\n\t if (this._contexts && Object.keys(this._contexts).length) {\n\t event.contexts = _assign(_assign({}, this._contexts), event.contexts);\n\t }\n\n\t if (this._level) {\n\t event.level = this._level;\n\t }\n\n\t if (this._transactionName) {\n\t event.transaction = this._transactionName;\n\t } // We want to set the trace context for normal events only if there isn't already\n\t // a trace context on the event. There is a product feature in place where we link\n\t // errors with transaction and it relys on that.\n\n\n\t if (this._span) {\n\t event.contexts = _assign({\n\t trace: this._span.getTraceContext()\n\t }, event.contexts);\n\t }\n\n\t this._applyFingerprint(event);\n\n\t event.breadcrumbs = __spread(event.breadcrumbs || [], this._breadcrumbs);\n\t event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n\t return this._notifyEventProcessors(__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint);\n\t };\n\t /**\n\t * This will be called after {@link applyToEvent} is finished.\n\t */\n\n\n\t Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {\n\t var _this = this;\n\n\t if (index === void 0) {\n\t index = 0;\n\t }\n\n\t return new SyncPromise(function (resolve, reject) {\n\t var processor = processors[index];\n\n\t if (event === null || typeof processor !== 'function') {\n\t resolve(event);\n\t } else {\n\t var result = processor(_assign({}, event), hint);\n\n\t if (isThenable$1(result)) {\n\t result.then(function (final) {\n\t return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve);\n\t }).then(null, reject);\n\t } else {\n\t _this._notifyEventProcessors(processors, result, hint, index + 1).then(resolve).then(null, reject);\n\t }\n\t }\n\t });\n\t };\n\t /**\n\t * This will be called on every set call.\n\t */\n\n\n\t Scope.prototype._notifyScopeListeners = function () {\n\t var _this = this;\n\n\t if (!this._notifyingListeners) {\n\t this._notifyingListeners = true;\n\t setTimeout(function () {\n\t _this._scopeListeners.forEach(function (callback) {\n\t callback(_this);\n\t });\n\n\t _this._notifyingListeners = false;\n\t });\n\t }\n\t };\n\t /**\n\t * Applies fingerprint from the scope to the event if there's one,\n\t * uses message if there's one instead or get rid of empty fingerprint\n\t */\n\n\n\t Scope.prototype._applyFingerprint = function (event) {\n\t // Make sure it's an array first and we actually have something in place\n\t event.fingerprint = event.fingerprint ? Array.isArray(event.fingerprint) ? event.fingerprint : [event.fingerprint] : []; // If we have something on the scope, then merge it with event\n\n\t if (this._fingerprint) {\n\t event.fingerprint = event.fingerprint.concat(this._fingerprint);\n\t } // If we have no data at all, remove empty array default\n\n\n\t if (event.fingerprint && !event.fingerprint.length) {\n\t delete event.fingerprint;\n\t }\n\t };\n\n\t return Scope;\n\t}();\n\t/**\n\t * Retruns the global event processors.\n\t */\n\n\tfunction getGlobalEventProcessors() {\n\t var global = getGlobalObject();\n\t global.__SENTRY__ = global.__SENTRY__ || {};\n\t global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n\t return global.__SENTRY__.globalEventProcessors;\n\t}\n\t/**\n\t * Add a EventProcessor to be kept globally.\n\t * @param callback EventProcessor to add\n\t */\n\n\n\tfunction addGlobalEventProcessor(callback) {\n\t getGlobalEventProcessors().push(callback);\n\t}\n\n\t/**\n\t * API compatibility version of this hub.\n\t *\n\t * WARNING: This number should only be increased when the global interface\n\t * changes and new methods are introduced.\n\t *\n\t * @hidden\n\t */\n\n\tvar API_VERSION = 3;\n\t/**\n\t * Default maximum number of breadcrumbs added to an event. Can be overwritten\n\t * with {@link Options.maxBreadcrumbs}.\n\t */\n\n\tvar DEFAULT_BREADCRUMBS = 100;\n\t/**\n\t * Absolute maximum number of breadcrumbs added to an event. The\n\t * `maxBreadcrumbs` option cannot be higher than this value.\n\t */\n\n\tvar MAX_BREADCRUMBS = 100;\n\t/**\n\t * @inheritDoc\n\t */\n\n\tvar Hub =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * Creates a new instance of the hub, will push one {@link Layer} into the\n\t * internal stack on creation.\n\t *\n\t * @param client bound to the hub.\n\t * @param scope bound to the hub.\n\t * @param version number, higher number means higher priority.\n\t */\n\t function Hub(client, scope, _version) {\n\t if (scope === void 0) {\n\t scope = new Scope();\n\t }\n\n\t if (_version === void 0) {\n\t _version = API_VERSION;\n\t }\n\n\t this._version = _version;\n\t /** Is a {@link Layer}[] containing the client and scope */\n\n\t this._stack = [];\n\n\t this._stack.push({\n\t client: client,\n\t scope: scope\n\t });\n\n\t this.bindClient(client);\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.isOlderThan = function (version) {\n\t return this._version < version;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.bindClient = function (client) {\n\t var top = this.getStackTop();\n\t top.client = client;\n\n\t if (client && client.setupIntegrations) {\n\t client.setupIntegrations();\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.pushScope = function () {\n\t // We want to clone the content of prev scope\n\t var stack = this.getStack();\n\t var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;\n\t var scope = Scope.clone(parentScope);\n\t this.getStack().push({\n\t client: this.getClient(),\n\t scope: scope\n\t });\n\t return scope;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.popScope = function () {\n\t return this.getStack().pop() !== undefined;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.withScope = function (callback) {\n\t var scope = this.pushScope();\n\n\t try {\n\t callback(scope);\n\t } finally {\n\t this.popScope();\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.getClient = function () {\n\t return this.getStackTop().client;\n\t };\n\t /** Returns the scope of the top stack. */\n\n\n\t Hub.prototype.getScope = function () {\n\t return this.getStackTop().scope;\n\t };\n\t /** Returns the scope stack for domains or the process. */\n\n\n\t Hub.prototype.getStack = function () {\n\t return this._stack;\n\t };\n\t /** Returns the topmost scope layer in the order domain > local > process. */\n\n\n\t Hub.prototype.getStackTop = function () {\n\t return this._stack[this._stack.length - 1];\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\n\t Hub.prototype.captureException = function (exception, hint) {\n\t var eventId = this._lastEventId = uuid4();\n\t var finalHint = hint; // If there's no explicit hint provided, mimick the same thing that would happen\n\t // in the minimal itself to create a consistent behavior.\n\t // We don't do this in the client, as it's the lowest level API, and doing this,\n\t // would prevent user from having full control over direct calls.\n\n\t if (!hint) {\n\t var syntheticException = void 0;\n\n\t try {\n\t throw new Error('Sentry syntheticException');\n\t } catch (exception) {\n\t syntheticException = exception;\n\t }\n\n\t finalHint = {\n\t originalException: exception,\n\t syntheticException: syntheticException\n\t };\n\t }\n\n\t this._invokeClient('captureException', exception, _assign(_assign({}, finalHint), {\n\t event_id: eventId\n\t }));\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.captureMessage = function (message, level, hint) {\n\t var eventId = this._lastEventId = uuid4();\n\t var finalHint = hint; // If there's no explicit hint provided, mimick the same thing that would happen\n\t // in the minimal itself to create a consistent behavior.\n\t // We don't do this in the client, as it's the lowest level API, and doing this,\n\t // would prevent user from having full control over direct calls.\n\n\t if (!hint) {\n\t var syntheticException = void 0;\n\n\t try {\n\t throw new Error(message);\n\t } catch (exception) {\n\t syntheticException = exception;\n\t }\n\n\t finalHint = {\n\t originalException: message,\n\t syntheticException: syntheticException\n\t };\n\t }\n\n\t this._invokeClient('captureMessage', message, level, _assign(_assign({}, finalHint), {\n\t event_id: eventId\n\t }));\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.captureEvent = function (event, hint) {\n\t var eventId = this._lastEventId = uuid4();\n\n\t this._invokeClient('captureEvent', event, _assign(_assign({}, hint), {\n\t event_id: eventId\n\t }));\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.lastEventId = function () {\n\t return this._lastEventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope || !top.client) {\n\t return;\n\t } // eslint-disable-next-line @typescript-eslint/unbound-method\n\n\n\t var _a = top.client.getOptions && top.client.getOptions() || {},\n\t _b = _a.beforeBreadcrumb,\n\t beforeBreadcrumb = _b === void 0 ? null : _b,\n\t _c = _a.maxBreadcrumbs,\n\t maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;\n\n\t if (maxBreadcrumbs <= 0) {\n\t return;\n\t }\n\n\t var timestamp = timestampWithMs();\n\n\t var mergedBreadcrumb = _assign({\n\t timestamp: timestamp\n\t }, breadcrumb);\n\n\t var finalBreadcrumb = beforeBreadcrumb ? consoleSandbox(function () {\n\t return beforeBreadcrumb(mergedBreadcrumb, hint);\n\t }) : mergedBreadcrumb;\n\n\t if (finalBreadcrumb === null) {\n\t return;\n\t }\n\n\t top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setUser = function (user) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setUser(user);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setTags = function (tags) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setTags(tags);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setExtras = function (extras) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setExtras(extras);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setTag = function (key, value) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setTag(key, value);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.setExtra = function (key, extra) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setExtra(key, extra);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Hub.prototype.setContext = function (name, context) {\n\t var top = this.getStackTop();\n\n\t if (!top.scope) {\n\t return;\n\t }\n\n\t top.scope.setContext(name, context);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.configureScope = function (callback) {\n\t var top = this.getStackTop();\n\n\t if (top.scope && top.client) {\n\t callback(top.scope);\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.run = function (callback) {\n\t var oldHub = makeMain(this);\n\n\t try {\n\t callback(this);\n\t } finally {\n\t makeMain(oldHub);\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.getIntegration = function (integration) {\n\t var client = this.getClient();\n\n\t if (!client) {\n\t return null;\n\t }\n\n\t try {\n\t return client.getIntegration(integration);\n\t } catch (_oO) {\n\t logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Hub\");\n\t return null;\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.startSpan = function (context) {\n\t return this._callExtensionMethod('startSpan', context);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.startTransaction = function (context) {\n\t return this._callExtensionMethod('startTransaction', context);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Hub.prototype.traceHeaders = function () {\n\t return this._callExtensionMethod('traceHeaders');\n\t };\n\t /**\n\t * Internal helper function to call a method on the top client if it exists.\n\t *\n\t * @param method The method to call on the client.\n\t * @param args Arguments to pass to the client function.\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Hub.prototype._invokeClient = function (method) {\n\t var _a;\n\n\t var args = [];\n\n\t for (var _i = 1; _i < arguments.length; _i++) {\n\t args[_i - 1] = arguments[_i];\n\t }\n\n\t var top = this.getStackTop();\n\n\t if (top && top.client && top.client[method]) {\n\t // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n\t (_a = top.client)[method].apply(_a, __spread(args, [top.scope]));\n\t }\n\t };\n\t /**\n\t * Calls global extension method and binding current instance to the function call\n\t */\n\t // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Hub.prototype._callExtensionMethod = function (method) {\n\t var args = [];\n\n\t for (var _i = 1; _i < arguments.length; _i++) {\n\t args[_i - 1] = arguments[_i];\n\t }\n\n\t var carrier = getMainCarrier();\n\t var sentry = carrier.__SENTRY__;\n\n\t if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n\t return sentry.extensions[method].apply(this, args);\n\t }\n\n\t logger.warn(\"Extension method \" + method + \" couldn't be found, doing nothing.\");\n\t };\n\n\t return Hub;\n\t}();\n\t/** Returns the global shim registry. */\n\n\tfunction getMainCarrier() {\n\t var carrier = getGlobalObject();\n\t carrier.__SENTRY__ = carrier.__SENTRY__ || {\n\t extensions: {},\n\t hub: undefined\n\t };\n\t return carrier;\n\t}\n\t/**\n\t * Replaces the current main hub with the passed one on the global object\n\t *\n\t * @returns The old replaced hub\n\t */\n\n\tfunction makeMain(hub) {\n\t var registry = getMainCarrier();\n\t var oldHub = getHubFromCarrier(registry);\n\t setHubOnCarrier(registry, hub);\n\t return oldHub;\n\t}\n\t/**\n\t * Returns the default hub instance.\n\t *\n\t * If a hub is already registered in the global carrier but this module\n\t * contains a more recent version, it replaces the registered version.\n\t * Otherwise, the currently registered hub will be returned.\n\t */\n\n\tfunction getCurrentHub() {\n\t // Get main carrier (global for every environment)\n\t var registry = getMainCarrier(); // If there's no hub, or its an old API, assign a new one\n\n\t if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n\t setHubOnCarrier(registry, new Hub());\n\t } // Prefer domains over global if they are there (applicable only to Node environment)\n\n\n\t if (isNodeEnv()) {\n\t return getHubFromActiveDomain(registry);\n\t } // Return hub that lives on a global object\n\n\n\t return getHubFromCarrier(registry);\n\t}\n\t/**\n\t * Try to read the hub from an active domain, and fallback to the registry if one doesn't exist\n\t * @returns discovered hub\n\t */\n\n\tfunction getHubFromActiveDomain(registry) {\n\t try {\n\t var property = 'domain';\n\t var carrier = getMainCarrier();\n\t var sentry = carrier.__SENTRY__;\n\n\t if (!sentry || !sentry.extensions || !sentry.extensions[property]) {\n\t return getHubFromCarrier(registry);\n\t } // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t var domain = sentry.extensions[property]; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n\t var activeDomain = domain.active; // If there's no active domain, just return global hub\n\n\t if (!activeDomain) {\n\t return getHubFromCarrier(registry);\n\t } // If there's no hub on current domain, or it's an old API, assign a new one\n\n\n\t if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n\t var registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n\t setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n\t } // Return hub that lives on a domain\n\n\n\t return getHubFromCarrier(activeDomain);\n\t } catch (_Oo) {\n\t // Return hub that lives on a global object\n\t return getHubFromCarrier(registry);\n\t }\n\t}\n\t/**\n\t * This will tell whether a carrier has a hub on it or not\n\t * @param carrier object\n\t */\n\n\n\tfunction hasHubOnCarrier(carrier) {\n\t if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n\t return true;\n\t }\n\n\t return false;\n\t}\n\t/**\n\t * This will create a new {@link Hub} and add to the passed object on\n\t * __SENTRY__.hub.\n\t * @param carrier object\n\t * @hidden\n\t */\n\n\n\tfunction getHubFromCarrier(carrier) {\n\t if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n\t return carrier.__SENTRY__.hub;\n\t }\n\n\t carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n\t carrier.__SENTRY__.hub = new Hub();\n\t return carrier.__SENTRY__.hub;\n\t}\n\t/**\n\t * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n\t * @param carrier object\n\t * @param hub Hub\n\t */\n\n\tfunction setHubOnCarrier(carrier, hub) {\n\t if (!carrier) {\n\t return false;\n\t }\n\n\t carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n\t carrier.__SENTRY__.hub = hub;\n\t return true;\n\t}\n\n\t/**\n\t * This calls a function on the current hub.\n\t * @param method function to call on hub.\n\t * @param args to pass to function.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\tfunction callOnHub(method) {\n\t var args = [];\n\n\t for (var _i = 1; _i < arguments.length; _i++) {\n\t args[_i - 1] = arguments[_i];\n\t }\n\n\t var hub = getCurrentHub();\n\n\t if (hub && hub[method]) {\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t return hub[method].apply(hub, __spread(args));\n\t }\n\n\t throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n\t}\n\t/**\n\t * Captures an exception event and sends it to Sentry.\n\t *\n\t * @param exception An exception-like object.\n\t * @returns The generated eventId.\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\n\tfunction captureException(exception, captureContext) {\n\t var syntheticException;\n\n\t try {\n\t throw new Error('Sentry syntheticException');\n\t } catch (exception) {\n\t syntheticException = exception;\n\t }\n\n\t return callOnHub('captureException', exception, {\n\t captureContext: captureContext,\n\t originalException: exception,\n\t syntheticException: syntheticException\n\t });\n\t}\n\t/**\n\t * Creates a new scope with and executes the given operation within.\n\t * The scope is automatically removed once the operation\n\t * finishes or throws.\n\t *\n\t * This is essentially a convenience function for:\n\t *\n\t * pushScope();\n\t * callback();\n\t * popScope();\n\t *\n\t * @param callback that will be enclosed into push/popScope.\n\t */\n\n\tfunction withScope(callback) {\n\t callOnHub('withScope', callback);\n\t}\n\n\tvar SENTRY_API_VERSION = '7';\n\t/** Helper class to provide urls to different Sentry endpoints. */\n\n\tvar API =\n\t/** @class */\n\tfunction () {\n\t /** Create a new instance of API */\n\t function API(dsn) {\n\t this.dsn = dsn;\n\t this._dsnObject = new Dsn(dsn);\n\t }\n\t /** Returns the Dsn object. */\n\n\n\t API.prototype.getDsn = function () {\n\t return this._dsnObject;\n\t };\n\t /** Returns the prefix to construct Sentry ingestion API endpoints. */\n\n\n\t API.prototype.getBaseApiEndpoint = function () {\n\t var dsn = this._dsnObject;\n\t var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n\t var port = dsn.port ? \":\" + dsn.port : '';\n\t return protocol + \"//\" + dsn.host + port + (dsn.path ? \"/\" + dsn.path : '') + \"/api/\";\n\t };\n\t /** Returns the store endpoint URL. */\n\n\n\t API.prototype.getStoreEndpoint = function () {\n\t return this._getIngestEndpoint('store');\n\t };\n\t /**\n\t * Returns the store endpoint URL with auth in the query string.\n\t *\n\t * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n\t */\n\n\n\t API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n\t return this.getStoreEndpoint() + \"?\" + this._encodedAuth();\n\t };\n\t /**\n\t * Returns the envelope endpoint URL with auth in the query string.\n\t *\n\t * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n\t */\n\n\n\t API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () {\n\t return this._getEnvelopeEndpoint() + \"?\" + this._encodedAuth();\n\t };\n\t /** Returns only the path component for the store endpoint. */\n\n\n\t API.prototype.getStoreEndpointPath = function () {\n\t var dsn = this._dsnObject;\n\t return (dsn.path ? \"/\" + dsn.path : '') + \"/api/\" + dsn.projectId + \"/store/\";\n\t };\n\t /**\n\t * Returns an object that can be used in request headers.\n\t * This is needed for node and the old /store endpoint in sentry\n\t */\n\n\n\t API.prototype.getRequestHeaders = function (clientName, clientVersion) {\n\t var dsn = this._dsnObject;\n\t var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n\t header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n\t header.push(\"sentry_key=\" + dsn.user);\n\n\t if (dsn.pass) {\n\t header.push(\"sentry_secret=\" + dsn.pass);\n\t }\n\n\t return {\n\t 'Content-Type': 'application/json',\n\t 'X-Sentry-Auth': header.join(', ')\n\t };\n\t };\n\t /** Returns the url to the report dialog endpoint. */\n\n\n\t API.prototype.getReportDialogEndpoint = function (dialogOptions) {\n\t if (dialogOptions === void 0) {\n\t dialogOptions = {};\n\t }\n\n\t var dsn = this._dsnObject;\n\t var endpoint = this.getBaseApiEndpoint() + \"embed/error-page/\";\n\t var encodedOptions = [];\n\t encodedOptions.push(\"dsn=\" + dsn.toString());\n\n\t for (var key in dialogOptions) {\n\t if (key === 'user') {\n\t if (!dialogOptions.user) {\n\t continue;\n\t }\n\n\t if (dialogOptions.user.name) {\n\t encodedOptions.push(\"name=\" + encodeURIComponent(dialogOptions.user.name));\n\t }\n\n\t if (dialogOptions.user.email) {\n\t encodedOptions.push(\"email=\" + encodeURIComponent(dialogOptions.user.email));\n\t }\n\t } else {\n\t encodedOptions.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]));\n\t }\n\t }\n\n\t if (encodedOptions.length) {\n\t return endpoint + \"?\" + encodedOptions.join('&');\n\t }\n\n\t return endpoint;\n\t };\n\t /** Returns the envelope endpoint URL. */\n\n\n\t API.prototype._getEnvelopeEndpoint = function () {\n\t return this._getIngestEndpoint('envelope');\n\t };\n\t /** Returns the ingest API endpoint for target. */\n\n\n\t API.prototype._getIngestEndpoint = function (target) {\n\t var base = this.getBaseApiEndpoint();\n\t var dsn = this._dsnObject;\n\t return \"\" + base + dsn.projectId + \"/\" + target + \"/\";\n\t };\n\t /** Returns a URL-encoded string with auth config suitable for a query string. */\n\n\n\t API.prototype._encodedAuth = function () {\n\t var dsn = this._dsnObject;\n\t var auth = {\n\t // We send only the minimum set of required information. See\n\t // https://github.com/getsentry/sentry-javascript/issues/2572.\n\t sentry_key: dsn.user,\n\t sentry_version: SENTRY_API_VERSION\n\t };\n\t return urlEncode(auth);\n\t };\n\n\t return API;\n\t}();\n\n\tvar installedIntegrations = [];\n\t/** Gets integration to install */\n\n\tfunction getIntegrationsToSetup(options) {\n\t var defaultIntegrations = options.defaultIntegrations && __spread(options.defaultIntegrations) || [];\n\t var userIntegrations = options.integrations;\n\t var integrations = [];\n\n\t if (Array.isArray(userIntegrations)) {\n\t var userIntegrationsNames_1 = userIntegrations.map(function (i) {\n\t return i.name;\n\t });\n\t var pickedIntegrationsNames_1 = []; // Leave only unique default integrations, that were not overridden with provided user integrations\n\n\t defaultIntegrations.forEach(function (defaultIntegration) {\n\t if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 && pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {\n\t integrations.push(defaultIntegration);\n\t pickedIntegrationsNames_1.push(defaultIntegration.name);\n\t }\n\t }); // Don't add same user integration twice\n\n\t userIntegrations.forEach(function (userIntegration) {\n\t if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {\n\t integrations.push(userIntegration);\n\t pickedIntegrationsNames_1.push(userIntegration.name);\n\t }\n\t });\n\t } else if (typeof userIntegrations === 'function') {\n\t integrations = userIntegrations(defaultIntegrations);\n\t integrations = Array.isArray(integrations) ? integrations : [integrations];\n\t } else {\n\t integrations = __spread(defaultIntegrations);\n\t } // Make sure that if present, `Debug` integration will always run last\n\n\n\t var integrationsNames = integrations.map(function (i) {\n\t return i.name;\n\t });\n\t var alwaysLastToRun = 'Debug';\n\n\t if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n\t integrations.push.apply(integrations, __spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n\t }\n\n\t return integrations;\n\t}\n\t/** Setup given integration */\n\n\tfunction setupIntegration(integration) {\n\t if (installedIntegrations.indexOf(integration.name) !== -1) {\n\t return;\n\t }\n\n\t integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n\t installedIntegrations.push(integration.name);\n\t logger.log(\"Integration installed: \" + integration.name);\n\t}\n\t/**\n\t * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n\t * integrations are added unless they were already provided before.\n\t * @param integrations array of integration instances\n\t * @param withDefault should enable default integrations\n\t */\n\n\tfunction setupIntegrations(options) {\n\t var integrations = {};\n\t getIntegrationsToSetup(options).forEach(function (integration) {\n\t integrations[integration.name] = integration;\n\t setupIntegration(integration);\n\t });\n\t return integrations;\n\t}\n\n\t/**\n\t * Base implementation for all JavaScript SDK clients.\n\t *\n\t * Call the constructor with the corresponding backend constructor and options\n\t * specific to the client subclass. To access these options later, use\n\t * {@link Client.getOptions}. Also, the Backend instance is available via\n\t * {@link Client.getBackend}.\n\t *\n\t * If a Dsn is specified in the options, it will be parsed and stored. Use\n\t * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n\t * invalid, the constructor will throw a {@link SentryException}. Note that\n\t * without a valid Dsn, the SDK will not send any events to Sentry.\n\t *\n\t * Before sending an event via the backend, it is passed through\n\t * {@link BaseClient.prepareEvent} to add SDK information and scope data\n\t * (breadcrumbs and context). To add more custom information, override this\n\t * method and extend the resulting prepared event.\n\t *\n\t * To issue automatically created events (e.g. via instrumentation), use\n\t * {@link Client.captureEvent}. It will prepare the event and pass it through\n\t * the callback lifecycle. To issue auto-breadcrumbs, use\n\t * {@link Client.addBreadcrumb}.\n\t *\n\t * @example\n\t * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {\n\t * public constructor(options: NodeOptions) {\n\t * super(NodeBackend, options);\n\t * }\n\t *\n\t * // ...\n\t * }\n\t */\n\n\tvar BaseClient =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * Initializes this client instance.\n\t *\n\t * @param backendClass A constructor function to create the backend.\n\t * @param options Options for the client.\n\t */\n\t function BaseClient(backendClass, options) {\n\t /** Array of used integrations. */\n\t this._integrations = {};\n\t /** Is the client still processing a call? */\n\n\t this._processing = false;\n\t this._backend = new backendClass(options);\n\t this._options = options;\n\n\t if (options.dsn) {\n\t this._dsn = new Dsn(options.dsn);\n\t }\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\n\t BaseClient.prototype.captureException = function (exception, hint, scope) {\n\t var _this = this;\n\n\t var eventId = hint && hint.event_id;\n\t this._processing = true; // eslint-disable-next-line @typescript-eslint/no-floating-promises\n\n\t this._getBackend().eventFromException(exception, hint).then(function (event) {\n\t eventId = _this.captureEvent(event, hint, scope);\n\t });\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n\t var _this = this;\n\n\t var eventId = hint && hint.event_id;\n\t this._processing = true;\n\t var promisedEvent = isPrimitive(message) ? this._getBackend().eventFromMessage(\"\" + message, level, hint) : this._getBackend().eventFromException(message, hint); // eslint-disable-next-line @typescript-eslint/no-floating-promises\n\n\t promisedEvent.then(function (event) {\n\t eventId = _this.captureEvent(event, hint, scope);\n\t });\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.captureEvent = function (event, hint, scope) {\n\t var _this = this;\n\n\t var eventId = hint && hint.event_id;\n\t this._processing = true;\n\n\t this._processEvent(event, hint, scope).then(function (finalEvent) {\n\t // We need to check for finalEvent in case beforeSend returned null\n\t eventId = finalEvent && finalEvent.event_id;\n\t _this._processing = false;\n\t }).then(null, function (reason) {\n\t logger.error(reason);\n\t _this._processing = false;\n\t });\n\n\t return eventId;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.getDsn = function () {\n\t return this._dsn;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.getOptions = function () {\n\t return this._options;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.flush = function (timeout) {\n\t var _this = this;\n\n\t return this._isClientProcessing(timeout).then(function (status) {\n\t clearInterval(status.interval);\n\t return _this._getBackend().getTransport().close(timeout).then(function (transportFlushed) {\n\t return status.ready && transportFlushed;\n\t });\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.close = function (timeout) {\n\t var _this = this;\n\n\t return this.flush(timeout).then(function (result) {\n\t _this.getOptions().enabled = false;\n\t return result;\n\t });\n\t };\n\t /**\n\t * Sets up the integrations\n\t */\n\n\n\t BaseClient.prototype.setupIntegrations = function () {\n\t if (this._isEnabled()) {\n\t this._integrations = setupIntegrations(this._options);\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseClient.prototype.getIntegration = function (integration) {\n\t try {\n\t return this._integrations[integration.id] || null;\n\t } catch (_oO) {\n\t logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n\t return null;\n\t }\n\t };\n\t /** Waits for the client to be done with processing. */\n\n\n\t BaseClient.prototype._isClientProcessing = function (timeout) {\n\t var _this = this;\n\n\t return new SyncPromise(function (resolve) {\n\t var ticked = 0;\n\t var tick = 1;\n\t var interval = 0;\n\t clearInterval(interval);\n\t interval = setInterval(function () {\n\t if (!_this._processing) {\n\t resolve({\n\t interval: interval,\n\t ready: true\n\t });\n\t } else {\n\t ticked += tick;\n\n\t if (timeout && ticked >= timeout) {\n\t resolve({\n\t interval: interval,\n\t ready: false\n\t });\n\t }\n\t }\n\t }, tick);\n\t });\n\t };\n\t /** Returns the current backend. */\n\n\n\t BaseClient.prototype._getBackend = function () {\n\t return this._backend;\n\t };\n\t /** Determines whether this SDK is enabled and a valid Dsn is present. */\n\n\n\t BaseClient.prototype._isEnabled = function () {\n\t return this.getOptions().enabled !== false && this._dsn !== undefined;\n\t };\n\t /**\n\t * Adds common information to events.\n\t *\n\t * The information includes release and environment from `options`,\n\t * breadcrumbs and context (extra, tags and user) from the scope.\n\t *\n\t * Information that is already present in the event is never overwritten. For\n\t * nested objects, such as the context, keys are merged.\n\t *\n\t * @param event The original event.\n\t * @param hint May contain additional information about the original exception.\n\t * @param scope A scope containing event metadata.\n\t * @returns A new event with more information.\n\t */\n\n\n\t BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n\t var _this = this;\n\n\t var _a = this.getOptions().normalizeDepth,\n\t normalizeDepth = _a === void 0 ? 3 : _a;\n\n\t var prepared = _assign(_assign({}, event), {\n\t event_id: event.event_id || (hint && hint.event_id ? hint.event_id : uuid4()),\n\t timestamp: event.timestamp || timestampWithMs()\n\t });\n\n\t this._applyClientOptions(prepared);\n\n\t this._applyIntegrationsMetadata(prepared); // If we have scope given to us, use it as the base for further modifications.\n\t // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n\n\n\t var finalScope = scope;\n\n\t if (hint && hint.captureContext) {\n\t finalScope = Scope.clone(finalScope).update(hint.captureContext);\n\t } // We prepare the result here with a resolved Event.\n\n\n\t var result = SyncPromise.resolve(prepared); // This should be the last thing called, since we want that\n\t // {@link Hub.addEventProcessor} gets the finished prepared event.\n\n\t if (finalScope) {\n\t // In case we have a hub we reassign it.\n\t result = finalScope.applyToEvent(prepared, hint);\n\t }\n\n\t return result.then(function (evt) {\n\t if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n\t return _this._normalizeEvent(evt, normalizeDepth);\n\t }\n\n\t return evt;\n\t });\n\t };\n\t /**\n\t * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n\t * Normalized keys:\n\t * - `breadcrumbs.data`\n\t * - `user`\n\t * - `contexts`\n\t * - `extra`\n\t * @param event Event\n\t * @returns Normalized event\n\t */\n\n\n\t BaseClient.prototype._normalizeEvent = function (event, depth) {\n\t if (!event) {\n\t return null;\n\t }\n\n\t var normalized = _assign(_assign(_assign(_assign(_assign({}, event), event.breadcrumbs && {\n\t breadcrumbs: event.breadcrumbs.map(function (b) {\n\t return _assign(_assign({}, b), b.data && {\n\t data: normalize$1(b.data, depth)\n\t });\n\t })\n\t }), event.user && {\n\t user: normalize$1(event.user, depth)\n\t }), event.contexts && {\n\t contexts: normalize$1(event.contexts, depth)\n\t }), event.extra && {\n\t extra: normalize$1(event.extra, depth)\n\t }); // event.contexts.trace stores information about a Transaction. Similarly,\n\t // event.spans[] stores information about child Spans. Given that a\n\t // Transaction is conceptually a Span, normalization should apply to both\n\t // Transactions and Spans consistently.\n\t // For now the decision is to skip normalization of Transactions and Spans,\n\t // so this block overwrites the normalized event to add back the original\n\t // Transaction information prior to normalization.\n\n\n\t if (event.contexts && event.contexts.trace) {\n\t // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t normalized.contexts.trace = event.contexts.trace;\n\t }\n\n\t return normalized;\n\t };\n\t /**\n\t * Enhances event using the client configuration.\n\t * It takes care of all \"static\" values like environment, release and `dist`,\n\t * as well as truncating overly long values.\n\t * @param event event instance to be enhanced\n\t */\n\n\n\t BaseClient.prototype._applyClientOptions = function (event) {\n\t var _a = this.getOptions(),\n\t environment = _a.environment,\n\t release = _a.release,\n\t dist = _a.dist,\n\t _b = _a.maxValueLength,\n\t maxValueLength = _b === void 0 ? 250 : _b;\n\n\t if (event.environment === undefined && environment !== undefined) {\n\t event.environment = environment;\n\t }\n\n\t if (event.release === undefined && release !== undefined) {\n\t event.release = release;\n\t }\n\n\t if (event.dist === undefined && dist !== undefined) {\n\t event.dist = dist;\n\t }\n\n\t if (event.message) {\n\t event.message = truncate(event.message, maxValueLength);\n\t }\n\n\t var exception = event.exception && event.exception.values && event.exception.values[0];\n\n\t if (exception && exception.value) {\n\t exception.value = truncate(exception.value, maxValueLength);\n\t }\n\n\t var request = event.request;\n\n\t if (request && request.url) {\n\t request.url = truncate(request.url, maxValueLength);\n\t }\n\t };\n\t /**\n\t * This function adds all used integrations to the SDK info in the event.\n\t * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.\n\t */\n\n\n\t BaseClient.prototype._applyIntegrationsMetadata = function (event) {\n\t var sdkInfo = event.sdk;\n\t var integrationsArray = Object.keys(this._integrations);\n\n\t if (sdkInfo && integrationsArray.length > 0) {\n\t sdkInfo.integrations = integrationsArray;\n\t }\n\t };\n\t /**\n\t * Tells the backend to send this event\n\t * @param event The Sentry event to send\n\t */\n\n\n\t BaseClient.prototype._sendEvent = function (event) {\n\t this._getBackend().sendEvent(event);\n\t };\n\t /**\n\t * Processes an event (either error or message) and sends it to Sentry.\n\t *\n\t * This also adds breadcrumbs and context information to the event. However,\n\t * platform specific meta data (such as the User's IP address) must be added\n\t * by the SDK implementor.\n\t *\n\t *\n\t * @param event The event to send to Sentry.\n\t * @param hint May contain additional information about the original exception.\n\t * @param scope A scope containing event metadata.\n\t * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n\t */\n\n\n\t BaseClient.prototype._processEvent = function (event, hint, scope) {\n\t var _this = this; // eslint-disable-next-line @typescript-eslint/unbound-method\n\n\n\t var _a = this.getOptions(),\n\t beforeSend = _a.beforeSend,\n\t sampleRate = _a.sampleRate;\n\n\t if (!this._isEnabled()) {\n\t return SyncPromise.reject('SDK not enabled, will not send event.');\n\t }\n\n\t var isTransaction = event.type === 'transaction'; // 1.0 === 100% events are sent\n\t // 0.0 === 0% events are sent\n\t // Sampling for transaction happens somewhere else\n\n\t if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n\t return SyncPromise.reject('This event has been sampled, will not send event.');\n\t }\n\n\t return new SyncPromise(function (resolve, reject) {\n\t _this._prepareEvent(event, scope, hint).then(function (prepared) {\n\t if (prepared === null) {\n\t reject('An event processor returned null, will not send event.');\n\t return;\n\t }\n\n\t var finalEvent = prepared;\n\t var isInternalException = hint && hint.data && hint.data.__sentry__ === true; // We skip beforeSend in case of transactions\n\n\t if (isInternalException || !beforeSend || isTransaction) {\n\t _this._sendEvent(finalEvent);\n\n\t resolve(finalEvent);\n\t return;\n\t }\n\n\t var beforeSendResult = beforeSend(prepared, hint);\n\n\t if (typeof beforeSendResult === 'undefined') {\n\t logger.error('`beforeSend` method has to return `null` or a valid event.');\n\t } else if (isThenable$1(beforeSendResult)) {\n\t _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);\n\t } else {\n\t finalEvent = beforeSendResult;\n\n\t if (finalEvent === null) {\n\t logger.log('`beforeSend` returned `null`, will not send event.');\n\t resolve(null);\n\t return;\n\t } // From here on we are really async\n\n\n\t _this._sendEvent(finalEvent);\n\n\t resolve(finalEvent);\n\t }\n\t }).then(null, function (reason) {\n\t _this.captureException(reason, {\n\t data: {\n\t __sentry__: true\n\t },\n\t originalException: reason\n\t });\n\n\t reject(\"Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: \" + reason);\n\t });\n\t });\n\t };\n\t /**\n\t * Resolves before send Promise and calls resolve/reject on parent SyncPromise.\n\t */\n\n\n\t BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {\n\t var _this = this;\n\n\t beforeSend.then(function (processedEvent) {\n\t if (processedEvent === null) {\n\t reject('`beforeSend` returned `null`, will not send event.');\n\t return;\n\t } // From here on we are really async\n\n\n\t _this._sendEvent(processedEvent);\n\n\t resolve(processedEvent);\n\t }).then(null, function (e) {\n\t reject(\"beforeSend rejected with \" + e);\n\t });\n\t };\n\n\t return BaseClient;\n\t}();\n\n\t/** Noop transport */\n\n\tvar NoopTransport =\n\t/** @class */\n\tfunction () {\n\t function NoopTransport() {}\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t NoopTransport.prototype.sendEvent = function (_) {\n\t return SyncPromise.resolve({\n\t reason: \"NoopTransport: Event has been skipped because no Dsn is configured.\",\n\t status: Status.Skipped\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t NoopTransport.prototype.close = function (_) {\n\t return SyncPromise.resolve(true);\n\t };\n\n\t return NoopTransport;\n\t}();\n\n\t/**\n\t * This is the base implemention of a Backend.\n\t * @hidden\n\t */\n\n\tvar BaseBackend =\n\t/** @class */\n\tfunction () {\n\t /** Creates a new backend instance. */\n\t function BaseBackend(options) {\n\t this._options = options;\n\n\t if (!this._options.dsn) {\n\t logger.warn('No DSN provided, backend will not do anything.');\n\t }\n\n\t this._transport = this._setupTransport();\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\n\t BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n\t throw new SentryError('Backend has to implement `eventFromException` method');\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n\t throw new SentryError('Backend has to implement `eventFromMessage` method');\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseBackend.prototype.sendEvent = function (event) {\n\t this._transport.sendEvent(event).then(null, function (reason) {\n\t logger.error(\"Error while sending event: \" + reason);\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseBackend.prototype.getTransport = function () {\n\t return this._transport;\n\t };\n\t /**\n\t * Sets up the transport so it can be used later to send requests.\n\t */\n\n\n\t BaseBackend.prototype._setupTransport = function () {\n\t return new NoopTransport();\n\t };\n\n\t return BaseBackend;\n\t}();\n\n\t/** Creates a SentryRequest from an event. */\n\n\tfunction eventToSentryRequest(event, api) {\n\t var useEnvelope = event.type === 'transaction';\n\t var req = {\n\t body: JSON.stringify(event),\n\t url: useEnvelope ? api.getEnvelopeEndpointWithUrlEncodedAuth() : api.getStoreEndpointWithUrlEncodedAuth()\n\t }; // https://develop.sentry.dev/sdk/envelopes/\n\t // Since we don't need to manipulate envelopes nor store them, there is no\n\t // exported concept of an Envelope with operations including serialization and\n\t // deserialization. Instead, we only implement a minimal subset of the spec to\n\t // serialize events inline here.\n\n\t if (useEnvelope) {\n\t var envelopeHeaders = JSON.stringify({\n\t event_id: event.event_id,\n\t // We need to add * 1000 since we divide it by 1000 by default but JS works with ms precision\n\t // The reason we use timestampWithMs here is that all clocks across the SDK use the same clock\n\t sent_at: new Date(timestampWithMs() * 1000).toISOString()\n\t });\n\t var itemHeaders = JSON.stringify({\n\t type: event.type\n\t }); // The trailing newline is optional. We intentionally don't send it to avoid\n\t // sending unnecessary bytes.\n\t //\n\t // const envelope = `${envelopeHeaders}\\n${itemHeaders}\\n${req.body}\\n`;\n\n\t var envelope = envelopeHeaders + \"\\n\" + itemHeaders + \"\\n\" + req.body;\n\t req.body = envelope;\n\t }\n\n\t return req;\n\t}\n\n\t/**\n\t * Internal function to create a new SDK client instance. The client is\n\t * installed and then bound to the current scope.\n\t *\n\t * @param clientClass The client class to instanciate.\n\t * @param options Options to pass to the client.\n\t */\n\n\tfunction initAndBind(clientClass, options) {\n\t if (options.debug === true) {\n\t logger.enable();\n\t }\n\n\t var hub = getCurrentHub();\n\t var client = new clientClass(options);\n\t hub.bindClient(client);\n\t}\n\n\tvar originalFunctionToString;\n\t/** Patch toString calls to return proper name for wrapped functions */\n\n\tvar FunctionToString =\n\t/** @class */\n\tfunction () {\n\t function FunctionToString() {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = FunctionToString.id;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t FunctionToString.prototype.setupOnce = function () {\n\t // eslint-disable-next-line @typescript-eslint/unbound-method\n\t originalFunctionToString = Function.prototype.toString; // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\t Function.prototype.toString = function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var context = this.__sentry_original__ || this;\n\t return originalFunctionToString.apply(context, args);\n\t };\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t FunctionToString.id = 'FunctionToString';\n\t return FunctionToString;\n\t}();\n\n\tvar $some$1 = arrayIteration.some;\n\n\n\n\tvar STRICT_METHOD$4 = arrayMethodIsStrict('some');\n\tvar USES_TO_LENGTH$8 = arrayMethodUsesToLength('some');\n\n\t// `Array.prototype.some` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 || !USES_TO_LENGTH$8 }, {\n\t some: function some(callbackfn /* , thisArg */) {\n\t return $some$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// this is the result of a script being pulled in from an external domain and CORS.\n\n\tvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n\t/** Inbound filters configurable by the user */\n\n\tvar InboundFilters =\n\t/** @class */\n\tfunction () {\n\t function InboundFilters(_options) {\n\t if (_options === void 0) {\n\t _options = {};\n\t }\n\n\t this._options = _options;\n\t /**\n\t * @inheritDoc\n\t */\n\n\t this.name = InboundFilters.id;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t InboundFilters.prototype.setupOnce = function () {\n\t addGlobalEventProcessor(function (event) {\n\t var hub = getCurrentHub();\n\n\t if (!hub) {\n\t return event;\n\t }\n\n\t var self = hub.getIntegration(InboundFilters);\n\n\t if (self) {\n\t var client = hub.getClient();\n\t var clientOptions = client ? client.getOptions() : {};\n\n\t var options = self._mergeOptions(clientOptions);\n\n\t if (self._shouldDropEvent(event, options)) {\n\t return null;\n\t }\n\t }\n\n\t return event;\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._shouldDropEvent = function (event, options) {\n\t if (this._isSentryError(event, options)) {\n\t logger.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + getEventDescription(event));\n\t return true;\n\t }\n\n\t if (this._isIgnoredError(event, options)) {\n\t logger.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + getEventDescription(event));\n\t return true;\n\t }\n\n\t if (this._isDeniedUrl(event, options)) {\n\t logger.warn(\"Event dropped due to being matched by `denyUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n\t return true;\n\t }\n\n\t if (!this._isAllowedUrl(event, options)) {\n\t logger.warn(\"Event dropped due to not being matched by `allowUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n\t return true;\n\t }\n\n\t return false;\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._isSentryError = function (event, options) {\n\t if (!options.ignoreInternal) {\n\t return false;\n\t }\n\n\t try {\n\t return event && event.exception && event.exception.values && event.exception.values[0] && event.exception.values[0].type === 'SentryError' || false;\n\t } catch (_oO) {\n\t return false;\n\t }\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._isIgnoredError = function (event, options) {\n\t if (!options.ignoreErrors || !options.ignoreErrors.length) {\n\t return false;\n\t }\n\n\t return this._getPossibleEventMessages(event).some(function (message) {\n\t // Not sure why TypeScript complains here...\n\t return options.ignoreErrors.some(function (pattern) {\n\t return isMatchingPattern(message, pattern);\n\t });\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._isDeniedUrl = function (event, options) {\n\t // TODO: Use Glob instead?\n\t if (!options.denyUrls || !options.denyUrls.length) {\n\t return false;\n\t }\n\n\t var url = this._getEventFilterUrl(event);\n\n\t return !url ? false : options.denyUrls.some(function (pattern) {\n\t return isMatchingPattern(url, pattern);\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._isAllowedUrl = function (event, options) {\n\t // TODO: Use Glob instead?\n\t if (!options.allowUrls || !options.allowUrls.length) {\n\t return true;\n\t }\n\n\t var url = this._getEventFilterUrl(event);\n\n\t return !url ? true : options.allowUrls.some(function (pattern) {\n\t return isMatchingPattern(url, pattern);\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._mergeOptions = function (clientOptions) {\n\t if (clientOptions === void 0) {\n\t clientOptions = {};\n\t }\n\n\t return {\n\t allowUrls: __spread(this._options.whitelistUrls || [], this._options.allowUrls || [], clientOptions.whitelistUrls || [], clientOptions.allowUrls || []),\n\t denyUrls: __spread(this._options.blacklistUrls || [], this._options.denyUrls || [], clientOptions.blacklistUrls || [], clientOptions.denyUrls || []),\n\t ignoreErrors: __spread(this._options.ignoreErrors || [], clientOptions.ignoreErrors || [], DEFAULT_IGNORE_ERRORS),\n\t ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true\n\t };\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._getPossibleEventMessages = function (event) {\n\t if (event.message) {\n\t return [event.message];\n\t }\n\n\t if (event.exception) {\n\t try {\n\t var _a = event.exception.values && event.exception.values[0] || {},\n\t _b = _a.type,\n\t type = _b === void 0 ? '' : _b,\n\t _c = _a.value,\n\t value = _c === void 0 ? '' : _c;\n\n\t return [\"\" + value, type + \": \" + value];\n\t } catch (oO) {\n\t logger.error(\"Cannot extract message for event \" + getEventDescription(event));\n\t return [];\n\t }\n\t }\n\n\t return [];\n\t };\n\t /** JSDoc */\n\n\n\t InboundFilters.prototype._getEventFilterUrl = function (event) {\n\t try {\n\t if (event.stacktrace) {\n\t var frames_1 = event.stacktrace.frames;\n\t return frames_1 && frames_1[frames_1.length - 1].filename || null;\n\t }\n\n\t if (event.exception) {\n\t var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;\n\t return frames_2 && frames_2[frames_2.length - 1].filename || null;\n\t }\n\n\t return null;\n\t } catch (oO) {\n\t logger.error(\"Cannot extract url for event \" + getEventDescription(event));\n\t return null;\n\t }\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t InboundFilters.id = 'InboundFilters';\n\t return InboundFilters;\n\t}();\n\n\tvar UNKNOWN_FUNCTION = '?'; // Chromium based browsers: Chrome, Brave, new Opera, new Edge\n\n\tvar chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i; // gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n\t// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n\t// We need this specific case for now because we want no other regex to match.\n\n\tvar gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js))(?::(\\d+))?(?::(\\d+))?\\s*$/i;\n\tvar winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\n\tvar geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\n\tvar chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/; // Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\n\n\tvar reactMinifiedRegexp = /Minified React error #\\d+;/i;\n\t/** JSDoc */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n\n\tfunction computeStackTrace(ex) {\n\t var stack = null;\n\t var popSize = 0;\n\n\t if (ex) {\n\t if (typeof ex.framesToPop === 'number') {\n\t popSize = ex.framesToPop;\n\t } else if (reactMinifiedRegexp.test(ex.message)) {\n\t popSize = 1;\n\t }\n\t }\n\n\t try {\n\t // This must be tried first because Opera 10 *destroys*\n\t // its stacktrace property if you try to access the stack\n\t // property first!!\n\t stack = computeStackTraceFromStacktraceProp(ex);\n\n\t if (stack) {\n\t return popFrames(stack, popSize);\n\t }\n\t } catch (e) {// no-empty\n\t }\n\n\t try {\n\t stack = computeStackTraceFromStackProp(ex);\n\n\t if (stack) {\n\t return popFrames(stack, popSize);\n\t }\n\t } catch (e) {// no-empty\n\t }\n\n\t return {\n\t message: extractMessage(ex),\n\t name: ex && ex.name,\n\t stack: [],\n\t failed: true\n\t };\n\t}\n\t/** JSDoc */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any, complexity\n\n\tfunction computeStackTraceFromStackProp(ex) {\n\t if (!ex || !ex.stack) {\n\t return null;\n\t }\n\n\t var stack = [];\n\t var lines = ex.stack.split('\\n');\n\t var isEval;\n\t var submatch;\n\t var parts;\n\t var element;\n\n\t for (var i = 0; i < lines.length; ++i) {\n\t if (parts = chrome.exec(lines[i])) {\n\t var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n\n\t isEval = parts[2] && parts[2].indexOf('eval') === 0; // start of line\n\n\t if (isEval && (submatch = chromeEval.exec(parts[2]))) {\n\t // throw out eval line/column and use top-most line/column number\n\t parts[2] = submatch[1]; // url\n\n\t parts[3] = submatch[2]; // line\n\n\t parts[4] = submatch[3]; // column\n\t }\n\n\t element = {\n\t // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `\n\t // prefix here seems like the quickest solution for now.\n\t url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],\n\t func: parts[1] || UNKNOWN_FUNCTION,\n\t args: isNative ? [parts[2]] : [],\n\t line: parts[3] ? +parts[3] : null,\n\t column: parts[4] ? +parts[4] : null\n\t };\n\t } else if (parts = winjs.exec(lines[i])) {\n\t element = {\n\t url: parts[2],\n\t func: parts[1] || UNKNOWN_FUNCTION,\n\t args: [],\n\t line: +parts[3],\n\t column: parts[4] ? +parts[4] : null\n\t };\n\t } else if (parts = gecko.exec(lines[i])) {\n\t isEval = parts[3] && parts[3].indexOf(' > eval') > -1;\n\n\t if (isEval && (submatch = geckoEval.exec(parts[3]))) {\n\t // throw out eval line/column and use top-most line number\n\t parts[1] = parts[1] || \"eval\";\n\t parts[3] = submatch[1];\n\t parts[4] = submatch[2];\n\t parts[5] = ''; // no column when eval\n\t } else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\n\t // FireFox uses this awesome columnNumber property for its top frame\n\t // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n\t // so adding 1\n\t // NOTE: this hack doesn't work if top-most frame is eval\n\t stack[0].column = ex.columnNumber + 1;\n\t }\n\n\t element = {\n\t url: parts[3],\n\t func: parts[1] || UNKNOWN_FUNCTION,\n\t args: parts[2] ? parts[2].split(',') : [],\n\t line: parts[4] ? +parts[4] : null,\n\t column: parts[5] ? +parts[5] : null\n\t };\n\t } else {\n\t continue;\n\t }\n\n\t if (!element.func && element.line) {\n\t element.func = UNKNOWN_FUNCTION;\n\t }\n\n\t stack.push(element);\n\t }\n\n\t if (!stack.length) {\n\t return null;\n\t }\n\n\t return {\n\t message: extractMessage(ex),\n\t name: ex.name,\n\t stack: stack\n\t };\n\t}\n\t/** JSDoc */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\tfunction computeStackTraceFromStacktraceProp(ex) {\n\t if (!ex || !ex.stacktrace) {\n\t return null;\n\t } // Access and store the stacktrace property before doing ANYTHING\n\t // else to it because Opera is not very good at providing it\n\t // reliably in other circumstances.\n\n\n\t var stacktrace = ex.stacktrace;\n\t var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n\t var opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\((.*)\\))? in (.*):\\s*$/i;\n\t var lines = stacktrace.split('\\n');\n\t var stack = [];\n\t var parts;\n\n\t for (var line = 0; line < lines.length; line += 2) {\n\t var element = null;\n\n\t if (parts = opera10Regex.exec(lines[line])) {\n\t element = {\n\t url: parts[2],\n\t func: parts[3],\n\t args: [],\n\t line: +parts[1],\n\t column: null\n\t };\n\t } else if (parts = opera11Regex.exec(lines[line])) {\n\t element = {\n\t url: parts[6],\n\t func: parts[3] || parts[4],\n\t args: parts[5] ? parts[5].split(',') : [],\n\t line: +parts[1],\n\t column: +parts[2]\n\t };\n\t }\n\n\t if (element) {\n\t if (!element.func && element.line) {\n\t element.func = UNKNOWN_FUNCTION;\n\t }\n\n\t stack.push(element);\n\t }\n\t }\n\n\t if (!stack.length) {\n\t return null;\n\t }\n\n\t return {\n\t message: extractMessage(ex),\n\t name: ex.name,\n\t stack: stack\n\t };\n\t}\n\t/** Remove N number of frames from the stack */\n\n\n\tfunction popFrames(stacktrace, popSize) {\n\t try {\n\t return _assign(_assign({}, stacktrace), {\n\t stack: stacktrace.stack.slice(popSize)\n\t });\n\t } catch (e) {\n\t return stacktrace;\n\t }\n\t}\n\t/**\n\t * There are cases where stacktrace.message is an Event object\n\t * https://github.com/getsentry/sentry-javascript/issues/1949\n\t * In this specific case we try to extract stacktrace.message.error.message\n\t */\n\t// eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\tfunction extractMessage(ex) {\n\t var message = ex && ex.message;\n\n\t if (!message) {\n\t return 'No error message';\n\t }\n\n\t if (message.error && typeof message.error.message === 'string') {\n\t return message.error.message;\n\t }\n\n\t return message;\n\t}\n\n\tvar STACKTRACE_LIMIT = 50;\n\t/**\n\t * This function creates an exception from an TraceKitStackTrace\n\t * @param stacktrace TraceKitStackTrace that will be converted to an exception\n\t * @hidden\n\t */\n\n\tfunction exceptionFromStacktrace(stacktrace) {\n\t var frames = prepareFramesForEvent(stacktrace.stack);\n\t var exception = {\n\t type: stacktrace.name,\n\t value: stacktrace.message\n\t };\n\n\t if (frames && frames.length) {\n\t exception.stacktrace = {\n\t frames: frames\n\t };\n\t }\n\n\t if (exception.type === undefined && exception.value === '') {\n\t exception.value = 'Unrecoverable error caught';\n\t }\n\n\t return exception;\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction eventFromPlainObject(exception, syntheticException, rejection) {\n\t var event = {\n\t exception: {\n\t values: [{\n\t type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n\t value: \"Non-Error \" + (rejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + extractExceptionKeysForMessage(exception)\n\t }]\n\t },\n\t extra: {\n\t __serialized__: normalizeToSize(exception)\n\t }\n\t };\n\n\t if (syntheticException) {\n\t var stacktrace = computeStackTrace(syntheticException);\n\t var frames_1 = prepareFramesForEvent(stacktrace.stack);\n\t event.stacktrace = {\n\t frames: frames_1\n\t };\n\t }\n\n\t return event;\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction eventFromStacktrace(stacktrace) {\n\t var exception = exceptionFromStacktrace(stacktrace);\n\t return {\n\t exception: {\n\t values: [exception]\n\t }\n\t };\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction prepareFramesForEvent(stack) {\n\t if (!stack || !stack.length) {\n\t return [];\n\t }\n\n\t var localStack = stack;\n\t var firstFrameFunction = localStack[0].func || '';\n\t var lastFrameFunction = localStack[localStack.length - 1].func || ''; // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n\n\t if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n\t localStack = localStack.slice(1);\n\t } // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n\n\n\t if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n\t localStack = localStack.slice(0, -1);\n\t } // The frame where the crash happened, should be the last entry in the array\n\n\n\t return localStack.slice(0, STACKTRACE_LIMIT).map(function (frame) {\n\t return {\n\t colno: frame.column === null ? undefined : frame.column,\n\t filename: frame.url || localStack[0].url,\n\t function: frame.func || '?',\n\t in_app: true,\n\t lineno: frame.line === null ? undefined : frame.line\n\t };\n\t }).reverse();\n\t}\n\n\t/**\n\t * Builds and Event from a Exception\n\t * @hidden\n\t */\n\n\tfunction eventFromException(options, exception, hint) {\n\t var syntheticException = hint && hint.syntheticException || undefined;\n\t var event = eventFromUnknownInput(exception, syntheticException, {\n\t attachStacktrace: options.attachStacktrace\n\t });\n\t addExceptionMechanism(event, {\n\t handled: true,\n\t type: 'generic'\n\t });\n\t event.level = Severity.Error;\n\n\t if (hint && hint.event_id) {\n\t event.event_id = hint.event_id;\n\t }\n\n\t return SyncPromise.resolve(event);\n\t}\n\t/**\n\t * Builds and Event from a Message\n\t * @hidden\n\t */\n\n\tfunction eventFromMessage(options, message, level, hint) {\n\t if (level === void 0) {\n\t level = Severity.Info;\n\t }\n\n\t var syntheticException = hint && hint.syntheticException || undefined;\n\t var event = eventFromString(message, syntheticException, {\n\t attachStacktrace: options.attachStacktrace\n\t });\n\t event.level = level;\n\n\t if (hint && hint.event_id) {\n\t event.event_id = hint.event_id;\n\t }\n\n\t return SyncPromise.resolve(event);\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction eventFromUnknownInput(exception, syntheticException, options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t var event;\n\n\t if (isErrorEvent(exception) && exception.error) {\n\t // If it is an ErrorEvent with `error` property, extract it to get actual Error\n\t var errorEvent = exception; // eslint-disable-next-line no-param-reassign\n\n\t exception = errorEvent.error;\n\t event = eventFromStacktrace(computeStackTrace(exception));\n\t return event;\n\t }\n\n\t if (isDOMError(exception) || isDOMException(exception)) {\n\t // If it is a DOMError or DOMException (which are legacy APIs, but still supported in some browsers)\n\t // then we just extract the name and message, as they don't provide anything else\n\t // https://developer.mozilla.org/en-US/docs/Web/API/DOMError\n\t // https://developer.mozilla.org/en-US/docs/Web/API/DOMException\n\t var domException = exception;\n\t var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n\t var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n\t event = eventFromString(message, syntheticException, options);\n\t addExceptionTypeValue(event, message);\n\t return event;\n\t }\n\n\t if (isError(exception)) {\n\t // we have a real Error object, do nothing\n\t event = eventFromStacktrace(computeStackTrace(exception));\n\t return event;\n\t }\n\n\t if (isPlainObject(exception) || isEvent(exception)) {\n\t // If it is plain Object or Event, serialize it manually and extract options\n\t // This will allow us to group events based on top-level keys\n\t // which is much better than creating new group when any key/value change\n\t var objectException = exception;\n\t event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n\t addExceptionMechanism(event, {\n\t synthetic: true\n\t });\n\t return event;\n\t } // If none of previous checks were valid, then it means that it's not:\n\t // - an instance of DOMError\n\t // - an instance of DOMException\n\t // - an instance of Event\n\t // - an instance of Error\n\t // - a valid ErrorEvent (one with an error property)\n\t // - a plain Object\n\t //\n\t // So bail out and capture it as a simple message:\n\n\n\t event = eventFromString(exception, syntheticException, options);\n\t addExceptionTypeValue(event, \"\" + exception, undefined);\n\t addExceptionMechanism(event, {\n\t synthetic: true\n\t });\n\t return event;\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction eventFromString(input, syntheticException, options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t var event = {\n\t message: input\n\t };\n\n\t if (options.attachStacktrace && syntheticException) {\n\t var stacktrace = computeStackTrace(syntheticException);\n\t var frames_1 = prepareFramesForEvent(stacktrace.stack);\n\t event.stacktrace = {\n\t frames: frames_1\n\t };\n\t }\n\n\t return event;\n\t}\n\n\t/** Base Transport class implementation */\n\n\tvar BaseTransport =\n\t/** @class */\n\tfunction () {\n\t function BaseTransport(options) {\n\t this.options = options;\n\t /** A simple buffer holding all requests. */\n\n\t this._buffer = new PromiseBuffer(30);\n\t this._api = new API(this.options.dsn); // eslint-disable-next-line deprecation/deprecation\n\n\t this.url = this._api.getStoreEndpointWithUrlEncodedAuth();\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseTransport.prototype.sendEvent = function (_) {\n\t throw new SentryError('Transport Class has to implement `sendEvent` method');\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BaseTransport.prototype.close = function (timeout) {\n\t return this._buffer.drain(timeout);\n\t };\n\n\t return BaseTransport;\n\t}();\n\n\tvar global$3 = getGlobalObject();\n\t/** `fetch` based transport */\n\n\tvar FetchTransport =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(FetchTransport, _super);\n\n\t function FetchTransport() {\n\t var _this = _super !== null && _super.apply(this, arguments) || this;\n\t /** Locks transport after receiving 429 response */\n\n\n\t _this._disabledUntil = new Date(Date.now());\n\t return _this;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t FetchTransport.prototype.sendEvent = function (event) {\n\t var _this = this;\n\n\t if (new Date(Date.now()) < this._disabledUntil) {\n\t return Promise.reject({\n\t event: event,\n\t reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n\t status: 429\n\t });\n\t }\n\n\t var sentryReq = eventToSentryRequest(event, this._api);\n\t var options = {\n\t body: sentryReq.body,\n\t method: 'POST',\n\t // Despite all stars in the sky saying that Edge supports old draft syntax, aka 'never', 'always', 'origin' and 'default\n\t // https://caniuse.com/#feat=referrer-policy\n\t // It doesn't. And it throw exception instead of ignoring this parameter...\n\t // REF: https://github.com/getsentry/raven-js/issues/1233\n\t referrerPolicy: supportsReferrerPolicy() ? 'origin' : ''\n\t };\n\n\t if (this.options.fetchParameters !== undefined) {\n\t Object.assign(options, this.options.fetchParameters);\n\t }\n\n\t if (this.options.headers !== undefined) {\n\t options.headers = this.options.headers;\n\t }\n\n\t return this._buffer.add(new SyncPromise(function (resolve, reject) {\n\t global$3.fetch(sentryReq.url, options).then(function (response) {\n\t var status = Status.fromHttpCode(response.status);\n\n\t if (status === Status.Success) {\n\t resolve({\n\t status: status\n\t });\n\t return;\n\t }\n\n\t if (status === Status.RateLimit) {\n\t var now = Date.now();\n\t /**\n\t * \"The name is case-insensitive.\"\n\t * https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n\t */\n\n\t var retryAfterHeader = response.headers.get('Retry-After');\n\t _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, retryAfterHeader));\n\t logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n\t }\n\n\t reject(response);\n\t }).catch(reject);\n\t }));\n\t };\n\n\t return FetchTransport;\n\t}(BaseTransport);\n\n\t/** `XHR` based transport */\n\n\tvar XHRTransport =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(XHRTransport, _super);\n\n\t function XHRTransport() {\n\t var _this = _super !== null && _super.apply(this, arguments) || this;\n\t /** Locks transport after receiving 429 response */\n\n\n\t _this._disabledUntil = new Date(Date.now());\n\t return _this;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t XHRTransport.prototype.sendEvent = function (event) {\n\t var _this = this;\n\n\t if (new Date(Date.now()) < this._disabledUntil) {\n\t return Promise.reject({\n\t event: event,\n\t reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n\t status: 429\n\t });\n\t }\n\n\t var sentryReq = eventToSentryRequest(event, this._api);\n\t return this._buffer.add(new SyncPromise(function (resolve, reject) {\n\t var request = new XMLHttpRequest();\n\n\t request.onreadystatechange = function () {\n\t if (request.readyState !== 4) {\n\t return;\n\t }\n\n\t var status = Status.fromHttpCode(request.status);\n\n\t if (status === Status.Success) {\n\t resolve({\n\t status: status\n\t });\n\t return;\n\t }\n\n\t if (status === Status.RateLimit) {\n\t var now = Date.now();\n\t /**\n\t * \"The search for the header name is case-insensitive.\"\n\t * https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getResponseHeader\n\t */\n\n\t var retryAfterHeader = request.getResponseHeader('Retry-After');\n\t _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, retryAfterHeader));\n\t logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n\t }\n\n\t reject(request);\n\t };\n\n\t request.open('POST', sentryReq.url);\n\n\t for (var header in _this.options.headers) {\n\t if (_this.options.headers.hasOwnProperty(header)) {\n\t request.setRequestHeader(header, _this.options.headers[header]);\n\t }\n\t }\n\n\t request.send(sentryReq.body);\n\t }));\n\t };\n\n\t return XHRTransport;\n\t}(BaseTransport);\n\n\t/**\n\t * The Sentry Browser SDK Backend.\n\t * @hidden\n\t */\n\n\tvar BrowserBackend =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(BrowserBackend, _super);\n\n\t function BrowserBackend() {\n\t return _super !== null && _super.apply(this, arguments) || this;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserBackend.prototype.eventFromException = function (exception, hint) {\n\t return eventFromException(this._options, exception, hint);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n\t if (level === void 0) {\n\t level = Severity.Info;\n\t }\n\n\t return eventFromMessage(this._options, message, level, hint);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserBackend.prototype._setupTransport = function () {\n\t if (!this._options.dsn) {\n\t // We return the noop transport here in case there is no Dsn.\n\t return _super.prototype._setupTransport.call(this);\n\t }\n\n\t var transportOptions = _assign(_assign({}, this._options.transportOptions), {\n\t dsn: this._options.dsn\n\t });\n\n\t if (this._options.transport) {\n\t return new this._options.transport(transportOptions);\n\t }\n\n\t if (supportsFetch()) {\n\t return new FetchTransport(transportOptions);\n\t }\n\n\t return new XHRTransport(transportOptions);\n\t };\n\n\t return BrowserBackend;\n\t}(BaseBackend);\n\n\tvar ignoreOnError = 0;\n\t/**\n\t * @hidden\n\t */\n\n\tfunction shouldIgnoreOnError() {\n\t return ignoreOnError > 0;\n\t}\n\t/**\n\t * @hidden\n\t */\n\n\tfunction ignoreNextOnError() {\n\t // onerror should trigger before setTimeout\n\t ignoreOnError += 1;\n\t setTimeout(function () {\n\t ignoreOnError -= 1;\n\t });\n\t}\n\t/**\n\t * Instruments the given function and sends an event to Sentry every time the\n\t * function throws an exception.\n\t *\n\t * @param fn A function to wrap.\n\t * @returns The wrapped function.\n\t * @hidden\n\t */\n\n\tfunction wrap$1(fn, options, before) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t if (typeof fn !== 'function') {\n\t return fn;\n\t }\n\n\t try {\n\t // We don't wanna wrap it twice\n\t if (fn.__sentry__) {\n\t return fn;\n\t } // If this has already been wrapped in the past, return that wrapped function\n\n\n\t if (fn.__sentry_wrapped__) {\n\t return fn.__sentry_wrapped__;\n\t }\n\t } catch (e) {\n\t // Just accessing custom props in some Selenium environments\n\t // can cause a \"Permission denied\" exception (see raven-js#495).\n\t // Bail on wrapping and return the function as-is (defers to window.onerror).\n\t return fn;\n\t }\n\t /* eslint-disable prefer-rest-params */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t var sentryWrapped = function sentryWrapped() {\n\t var args = Array.prototype.slice.call(arguments);\n\n\t try {\n\t if (before && typeof before === 'function') {\n\t before.apply(this, arguments);\n\t } // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n\n\n\t var wrappedArguments = args.map(function (arg) {\n\t return wrap$1(arg, options);\n\t });\n\n\t if (fn.handleEvent) {\n\t // Attempt to invoke user-land function\n\t // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n\t // means the sentry.javascript SDK caught an error invoking your application code. This\n\t // is expected behavior and NOT indicative of a bug with sentry.javascript.\n\t // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t return fn.handleEvent.apply(this, wrappedArguments);\n\t } // Attempt to invoke user-land function\n\t // NOTE: If you are a Sentry user, and you are seeing this stack frame, it\n\t // means the sentry.javascript SDK caught an error invoking your application code. This\n\t // is expected behavior and NOT indicative of a bug with sentry.javascript.\n\n\n\t return fn.apply(this, wrappedArguments);\n\t } catch (ex) {\n\t ignoreNextOnError();\n\t withScope(function (scope) {\n\t scope.addEventProcessor(function (event) {\n\t var processedEvent = _assign({}, event);\n\n\t if (options.mechanism) {\n\t addExceptionTypeValue(processedEvent, undefined, undefined);\n\t addExceptionMechanism(processedEvent, options.mechanism);\n\t }\n\n\t processedEvent.extra = _assign(_assign({}, processedEvent.extra), {\n\t arguments: args\n\t });\n\t return processedEvent;\n\t });\n\t captureException(ex);\n\t });\n\t throw ex;\n\t }\n\t };\n\t /* eslint-enable prefer-rest-params */\n\t // Accessing some objects may throw\n\t // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n\n\n\t try {\n\t for (var property in fn) {\n\t if (Object.prototype.hasOwnProperty.call(fn, property)) {\n\t sentryWrapped[property] = fn[property];\n\t }\n\t }\n\t } catch (_oO) {} // eslint-disable-line no-empty\n\n\n\t fn.prototype = fn.prototype || {};\n\t sentryWrapped.prototype = fn.prototype;\n\t Object.defineProperty(fn, '__sentry_wrapped__', {\n\t enumerable: false,\n\t value: sentryWrapped\n\t }); // Signal that this function has been wrapped/filled already\n\t // for both debugging and to prevent it to being wrapped/filled twice\n\n\t Object.defineProperties(sentryWrapped, {\n\t __sentry__: {\n\t enumerable: false,\n\t value: true\n\t },\n\t __sentry_original__: {\n\t enumerable: false,\n\t value: fn\n\t }\n\t }); // Restore original function name (not all browsers allow that)\n\n\t try {\n\t var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n\n\t if (descriptor.configurable) {\n\t Object.defineProperty(sentryWrapped, 'name', {\n\t get: function get() {\n\t return fn.name;\n\t }\n\t });\n\t } // eslint-disable-next-line no-empty\n\n\t } catch (_oO) {}\n\n\t return sentryWrapped;\n\t}\n\t/**\n\t * Injects the Report Dialog script\n\t * @hidden\n\t */\n\n\tfunction injectReportDialog(options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t if (!options.eventId) {\n\t logger.error(\"Missing eventId option in showReportDialog call\");\n\t return;\n\t }\n\n\t if (!options.dsn) {\n\t logger.error(\"Missing dsn option in showReportDialog call\");\n\t return;\n\t }\n\n\t var script = document.createElement('script');\n\t script.async = true;\n\t script.src = new API(options.dsn).getReportDialogEndpoint(options);\n\n\t if (options.onLoad) {\n\t // eslint-disable-next-line @typescript-eslint/unbound-method\n\t script.onload = options.onLoad;\n\t }\n\n\t (document.head || document.body).appendChild(script);\n\t}\n\n\t/** Global handlers */\n\n\tvar GlobalHandlers =\n\t/** @class */\n\tfunction () {\n\t /** JSDoc */\n\t function GlobalHandlers(options) {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = GlobalHandlers.id;\n\t /** JSDoc */\n\n\t this._onErrorHandlerInstalled = false;\n\t /** JSDoc */\n\n\t this._onUnhandledRejectionHandlerInstalled = false;\n\t this._options = _assign({\n\t onerror: true,\n\t onunhandledrejection: true\n\t }, options);\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t GlobalHandlers.prototype.setupOnce = function () {\n\t Error.stackTraceLimit = 50;\n\n\t if (this._options.onerror) {\n\t logger.log('Global Handler attached: onerror');\n\n\t this._installGlobalOnErrorHandler();\n\t }\n\n\t if (this._options.onunhandledrejection) {\n\t logger.log('Global Handler attached: onunhandledrejection');\n\n\t this._installGlobalOnUnhandledRejectionHandler();\n\t }\n\t };\n\t /** JSDoc */\n\n\n\t GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {\n\t var _this = this;\n\n\t if (this._onErrorHandlerInstalled) {\n\t return;\n\t }\n\n\t addInstrumentationHandler({\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t callback: function callback(data) {\n\t var error = data.error;\n\t var currentHub = getCurrentHub();\n\t var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n\t var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n\t if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n\t return;\n\t }\n\n\t var client = currentHub.getClient();\n\t var event = isPrimitive(error) ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column) : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, {\n\t attachStacktrace: client && client.getOptions().attachStacktrace,\n\t rejection: false\n\t }), data.url, data.line, data.column);\n\t addExceptionMechanism(event, {\n\t handled: false,\n\t type: 'onerror'\n\t });\n\t currentHub.captureEvent(event, {\n\t originalException: error\n\t });\n\t },\n\t type: 'error'\n\t });\n\t this._onErrorHandlerInstalled = true;\n\t };\n\t /** JSDoc */\n\n\n\t GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {\n\t var _this = this;\n\n\t if (this._onUnhandledRejectionHandlerInstalled) {\n\t return;\n\t }\n\n\t addInstrumentationHandler({\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t callback: function callback(e) {\n\t var error = e; // dig the object of the rejection out of known event types\n\n\t try {\n\t // PromiseRejectionEvents store the object of the rejection under 'reason'\n\t // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n\t if ('reason' in e) {\n\t error = e.reason;\n\t } // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n\t // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n\t // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n\t // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n\t // https://github.com/getsentry/sentry-javascript/issues/2380\n\t else if ('detail' in e && 'reason' in e.detail) {\n\t error = e.detail.reason;\n\t }\n\t } catch (_oO) {// no-empty\n\t }\n\n\t var currentHub = getCurrentHub();\n\t var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n\t var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n\n\t if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n\t return true;\n\t }\n\n\t var client = currentHub.getClient();\n\t var event = isPrimitive(error) ? _this._eventFromIncompleteRejection(error) : eventFromUnknownInput(error, undefined, {\n\t attachStacktrace: client && client.getOptions().attachStacktrace,\n\t rejection: true\n\t });\n\t event.level = Severity.Error;\n\t addExceptionMechanism(event, {\n\t handled: false,\n\t type: 'onunhandledrejection'\n\t });\n\t currentHub.captureEvent(event, {\n\t originalException: error\n\t });\n\t return;\n\t },\n\t type: 'unhandledrejection'\n\t });\n\t this._onUnhandledRejectionHandlerInstalled = true;\n\t };\n\t /**\n\t * This function creates a stack from an old, error-less onerror handler.\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {\n\t var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i; // If 'message' is ErrorEvent, get real message from inside\n\n\t var message = isErrorEvent(msg) ? msg.message : msg;\n\t var name;\n\n\t if (isString(message)) {\n\t var groups = message.match(ERROR_TYPES_RE);\n\n\t if (groups) {\n\t name = groups[1];\n\t message = groups[2];\n\t }\n\t }\n\n\t var event = {\n\t exception: {\n\t values: [{\n\t type: name || 'Error',\n\t value: message\n\t }]\n\t }\n\t };\n\t return this._enhanceEventWithInitialFrame(event, url, line, column);\n\t };\n\t /**\n\t * This function creates an Event from an TraceKitStackTrace that has part of it missing.\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {\n\t return {\n\t exception: {\n\t values: [{\n\t type: 'UnhandledRejection',\n\t value: \"Non-Error promise rejection captured with value: \" + error\n\t }]\n\t }\n\t };\n\t };\n\t /** JSDoc */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {\n\t event.exception = event.exception || {};\n\t event.exception.values = event.exception.values || [];\n\t event.exception.values[0] = event.exception.values[0] || {};\n\t event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n\t event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n\t var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n\t var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n\t var filename = isString(url) && url.length > 0 ? url : getLocationHref();\n\n\t if (event.exception.values[0].stacktrace.frames.length === 0) {\n\t event.exception.values[0].stacktrace.frames.push({\n\t colno: colno,\n\t filename: filename,\n\t function: '?',\n\t in_app: true,\n\t lineno: lineno\n\t });\n\t }\n\n\t return event;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t GlobalHandlers.id = 'GlobalHandlers';\n\t return GlobalHandlers;\n\t}();\n\n\tvar DEFAULT_EVENT_TARGET = ['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'];\n\t/** Wrap timer functions and event targets to catch errors and provide better meta data */\n\n\tvar TryCatch =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * @inheritDoc\n\t */\n\t function TryCatch(options) {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = TryCatch.id;\n\t this._options = _assign({\n\t XMLHttpRequest: true,\n\t eventTarget: true,\n\t requestAnimationFrame: true,\n\t setInterval: true,\n\t setTimeout: true\n\t }, options);\n\t }\n\t /**\n\t * Wrap timer functions and event targets to catch errors\n\t * and provide better metadata.\n\t */\n\n\n\t TryCatch.prototype.setupOnce = function () {\n\t var global = getGlobalObject();\n\n\t if (this._options.setTimeout) {\n\t fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n\t }\n\n\t if (this._options.setInterval) {\n\t fill(global, 'setInterval', this._wrapTimeFunction.bind(this));\n\t }\n\n\t if (this._options.requestAnimationFrame) {\n\t fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n\t }\n\n\t if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {\n\t fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));\n\t }\n\n\t if (this._options.eventTarget) {\n\t var eventTarget = Array.isArray(this._options.eventTarget) ? this._options.eventTarget : DEFAULT_EVENT_TARGET;\n\t eventTarget.forEach(this._wrapEventTarget.bind(this));\n\t }\n\t };\n\t /** JSDoc */\n\n\n\t TryCatch.prototype._wrapTimeFunction = function (original) {\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t var originalCallback = args[0];\n\t args[0] = wrap$1(originalCallback, {\n\t mechanism: {\n\t data: {\n\t function: getFunctionName(original)\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t });\n\t return original.apply(this, args);\n\t };\n\t };\n\t /** JSDoc */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t TryCatch.prototype._wrapRAF = function (original) {\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t return function (callback) {\n\t // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\t return original.call(this, wrap$1(callback, {\n\t mechanism: {\n\t data: {\n\t function: 'requestAnimationFrame',\n\t handler: getFunctionName(original)\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t }));\n\t };\n\t };\n\t /** JSDoc */\n\n\n\t TryCatch.prototype._wrapEventTarget = function (target) {\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t var global = getGlobalObject(); // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n\t var proto = global[target] && global[target].prototype; // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n\n\t if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n\t return;\n\t }\n\n\t fill(proto, 'addEventListener', function (original) {\n\t return function (eventName, fn, options) {\n\t try {\n\t if (typeof fn.handleEvent === 'function') {\n\t fn.handleEvent = wrap$1(fn.handleEvent.bind(fn), {\n\t mechanism: {\n\t data: {\n\t function: 'handleEvent',\n\t handler: getFunctionName(fn),\n\t target: target\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t });\n\t }\n\t } catch (err) {// can sometimes get 'Permission denied to access property \"handle Event'\n\t }\n\n\t return original.call(this, eventName, // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t wrap$1(fn, {\n\t mechanism: {\n\t data: {\n\t function: 'addEventListener',\n\t handler: getFunctionName(fn),\n\t target: target\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t }), options);\n\t };\n\t });\n\t fill(proto, 'removeEventListener', function (original) {\n\t return function (eventName, fn, options) {\n\t /**\n\t * There are 2 possible scenarios here:\n\t *\n\t * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n\t * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n\t * as a pass-through, and call original `removeEventListener` with it.\n\t *\n\t * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n\t * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n\t * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n\t * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n\t * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n\t *\n\t * When someone adds a handler prior to initialization, and then do it again, but after,\n\t * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n\t * to get rid of the initial handler and it'd stick there forever.\n\t */\n\t try {\n\t original.call(this, eventName, fn.__sentry_wrapped__, options);\n\t } catch (e) {// ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n\t }\n\n\t return original.call(this, eventName, fn, options);\n\t };\n\t });\n\t };\n\t /** JSDoc */\n\n\n\t TryCatch.prototype._wrapXHR = function (originalSend) {\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t return function () {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t } // eslint-disable-next-line @typescript-eslint/no-this-alias\n\n\n\t var xhr = this;\n\t var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n\t xmlHttpRequestProps.forEach(function (prop) {\n\t if (prop in xhr && typeof xhr[prop] === 'function') {\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\t fill(xhr, prop, function (original) {\n\t var wrapOptions = {\n\t mechanism: {\n\t data: {\n\t function: prop,\n\t handler: getFunctionName(original)\n\t },\n\t handled: true,\n\t type: 'instrument'\n\t }\n\t }; // If Instrument integration has been called before TryCatch, get the name of original function\n\n\t if (original.__sentry_original__) {\n\t wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__);\n\t } // Otherwise wrap directly\n\n\n\t return wrap$1(original, wrapOptions);\n\t });\n\t }\n\t });\n\t return originalSend.apply(this, args);\n\t };\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t TryCatch.id = 'TryCatch';\n\t return TryCatch;\n\t}();\n\n\t/**\n\t * Default Breadcrumbs instrumentations\n\t * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n\t */\n\n\tvar Breadcrumbs =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * @inheritDoc\n\t */\n\t function Breadcrumbs(options) {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = Breadcrumbs.id;\n\t this._options = _assign({\n\t console: true,\n\t dom: true,\n\t fetch: true,\n\t history: true,\n\t sentry: true,\n\t xhr: true\n\t }, options);\n\t }\n\t /**\n\t * Create a breadcrumb of `sentry` from the events themselves\n\t */\n\n\n\t Breadcrumbs.prototype.addSentryBreadcrumb = function (event) {\n\t if (!this._options.sentry) {\n\t return;\n\t }\n\n\t getCurrentHub().addBreadcrumb({\n\t category: \"sentry.\" + (event.type === 'transaction' ? 'transaction' : 'event'),\n\t event_id: event.event_id,\n\t level: event.level,\n\t message: getEventDescription(event)\n\t }, {\n\t event: event\n\t });\n\t };\n\t /**\n\t * Instrument browser built-ins w/ breadcrumb capturing\n\t * - Console API\n\t * - DOM API (click/typing)\n\t * - XMLHttpRequest API\n\t * - Fetch API\n\t * - History API\n\t */\n\n\n\t Breadcrumbs.prototype.setupOnce = function () {\n\t var _this = this;\n\n\t if (this._options.console) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._consoleBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'console'\n\t });\n\t }\n\n\t if (this._options.dom) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._domBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'dom'\n\t });\n\t }\n\n\t if (this._options.xhr) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._xhrBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'xhr'\n\t });\n\t }\n\n\t if (this._options.fetch) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._fetchBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'fetch'\n\t });\n\t }\n\n\t if (this._options.history) {\n\t addInstrumentationHandler({\n\t callback: function callback() {\n\t var args = [];\n\n\t for (var _i = 0; _i < arguments.length; _i++) {\n\t args[_i] = arguments[_i];\n\t }\n\n\t _this._historyBreadcrumb.apply(_this, __spread(args));\n\t },\n\t type: 'history'\n\t });\n\t }\n\t };\n\t /**\n\t * Creates breadcrumbs from console API calls\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {\n\t var breadcrumb = {\n\t category: 'console',\n\t data: {\n\t arguments: handlerData.args,\n\t logger: 'console'\n\t },\n\t level: Severity.fromString(handlerData.level),\n\t message: safeJoin(handlerData.args, ' ')\n\t };\n\n\t if (handlerData.level === 'assert') {\n\t if (handlerData.args[0] === false) {\n\t breadcrumb.message = \"Assertion failed: \" + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');\n\t breadcrumb.data.arguments = handlerData.args.slice(1);\n\t } else {\n\t // Don't capture a breadcrumb for passed assertions\n\t return;\n\t }\n\t }\n\n\t getCurrentHub().addBreadcrumb(breadcrumb, {\n\t input: handlerData.args,\n\t level: handlerData.level\n\t });\n\t };\n\t /**\n\t * Creates breadcrumbs from DOM API calls\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {\n\t var target; // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n\n\t try {\n\t target = handlerData.event.target ? htmlTreeAsString(handlerData.event.target) : htmlTreeAsString(handlerData.event);\n\t } catch (e) {\n\t target = '<unknown>';\n\t }\n\n\t if (target.length === 0) {\n\t return;\n\t }\n\n\t getCurrentHub().addBreadcrumb({\n\t category: \"ui.\" + handlerData.name,\n\t message: target\n\t }, {\n\t event: handlerData.event,\n\t name: handlerData.name\n\t });\n\t };\n\t /**\n\t * Creates breadcrumbs from XHR API calls\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {\n\t if (handlerData.endTimestamp) {\n\t // We only capture complete, non-sentry requests\n\t if (handlerData.xhr.__sentry_own_request__) {\n\t return;\n\t }\n\n\t getCurrentHub().addBreadcrumb({\n\t category: 'xhr',\n\t data: handlerData.xhr.__sentry_xhr__,\n\t type: 'http'\n\t }, {\n\t xhr: handlerData.xhr\n\t });\n\t return;\n\t }\n\t };\n\t /**\n\t * Creates breadcrumbs from fetch API calls\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {\n\t // We only capture complete fetch requests\n\t if (!handlerData.endTimestamp) {\n\t return;\n\t }\n\n\t if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n\t // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n\t return;\n\t }\n\n\t if (handlerData.error) {\n\t getCurrentHub().addBreadcrumb({\n\t category: 'fetch',\n\t data: handlerData.fetchData,\n\t level: Severity.Error,\n\t type: 'http'\n\t }, {\n\t data: handlerData.error,\n\t input: handlerData.args\n\t });\n\t } else {\n\t getCurrentHub().addBreadcrumb({\n\t category: 'fetch',\n\t data: _assign(_assign({}, handlerData.fetchData), {\n\t status_code: handlerData.response.status\n\t }),\n\t type: 'http'\n\t }, {\n\t input: handlerData.args,\n\t response: handlerData.response\n\t });\n\t }\n\t };\n\t /**\n\t * Creates breadcrumbs from history API calls\n\t */\n\t // eslint-disable-next-line @typescript-eslint/no-explicit-any\n\n\n\t Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {\n\t var global = getGlobalObject();\n\t var from = handlerData.from;\n\t var to = handlerData.to;\n\t var parsedLoc = parseUrl(global.location.href);\n\t var parsedFrom = parseUrl(from);\n\t var parsedTo = parseUrl(to); // Initial pushState doesn't provide `from` information\n\n\t if (!parsedFrom.path) {\n\t parsedFrom = parsedLoc;\n\t } // Use only the path component of the URL if the URL matches the current\n\t // document (almost all the time when using pushState)\n\n\n\t if (parsedLoc.protocol === parsedTo.protocol && parsedLoc.host === parsedTo.host) {\n\t to = parsedTo.relative;\n\t }\n\n\t if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n\t from = parsedFrom.relative;\n\t }\n\n\t getCurrentHub().addBreadcrumb({\n\t category: 'navigation',\n\t data: {\n\t from: from,\n\t to: to\n\t }\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t Breadcrumbs.id = 'Breadcrumbs';\n\t return Breadcrumbs;\n\t}();\n\n\tvar DEFAULT_KEY = 'cause';\n\tvar DEFAULT_LIMIT = 5;\n\t/** Adds SDK info to an event. */\n\n\tvar LinkedErrors =\n\t/** @class */\n\tfunction () {\n\t /**\n\t * @inheritDoc\n\t */\n\t function LinkedErrors(options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t this.name = LinkedErrors.id;\n\t this._key = options.key || DEFAULT_KEY;\n\t this._limit = options.limit || DEFAULT_LIMIT;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t LinkedErrors.prototype.setupOnce = function () {\n\t addGlobalEventProcessor(function (event, hint) {\n\t var self = getCurrentHub().getIntegration(LinkedErrors);\n\n\t if (self) {\n\t return self._handler(event, hint);\n\t }\n\n\t return event;\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t LinkedErrors.prototype._handler = function (event, hint) {\n\t if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n\t return event;\n\t }\n\n\t var linkedErrors = this._walkErrorTree(hint.originalException, this._key);\n\n\t event.exception.values = __spread(linkedErrors, event.exception.values);\n\t return event;\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {\n\t if (stack === void 0) {\n\t stack = [];\n\t }\n\n\t if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) {\n\t return stack;\n\t }\n\n\t var stacktrace = computeStackTrace(error[key]);\n\t var exception = exceptionFromStacktrace(stacktrace);\n\t return this._walkErrorTree(error[key], key, __spread([exception], stack));\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t LinkedErrors.id = 'LinkedErrors';\n\t return LinkedErrors;\n\t}();\n\n\tvar global$4 = getGlobalObject();\n\t/** UserAgent */\n\n\tvar UserAgent =\n\t/** @class */\n\tfunction () {\n\t function UserAgent() {\n\t /**\n\t * @inheritDoc\n\t */\n\t this.name = UserAgent.id;\n\t }\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t UserAgent.prototype.setupOnce = function () {\n\t addGlobalEventProcessor(function (event) {\n\t if (getCurrentHub().getIntegration(UserAgent)) {\n\t if (!global$4.navigator || !global$4.location) {\n\t return event;\n\t }\n\n\t var request = event.request || {};\n\t request.url = request.url || global$4.location.href;\n\t request.headers = request.headers || {};\n\t request.headers['User-Agent'] = global$4.navigator.userAgent;\n\t return _assign(_assign({}, event), {\n\t request: request\n\t });\n\t }\n\n\t return event;\n\t });\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t UserAgent.id = 'UserAgent';\n\t return UserAgent;\n\t}();\n\n\tvar SDK_NAME = 'sentry.javascript.browser';\n\tvar SDK_VERSION = '5.22.3';\n\n\t/**\n\t * The Sentry Browser SDK Client.\n\t *\n\t * @see BrowserOptions for documentation on configuration options.\n\t * @see SentryClient for usage documentation.\n\t */\n\n\tvar BrowserClient =\n\t/** @class */\n\tfunction (_super) {\n\t __extends(BrowserClient, _super);\n\t /**\n\t * Creates a new Browser SDK instance.\n\t *\n\t * @param options Configuration options for this SDK.\n\t */\n\n\n\t function BrowserClient(options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t return _super.call(this, BrowserBackend, options) || this;\n\t }\n\t /**\n\t * Show a report dialog to the user to send feedback to a specific event.\n\t *\n\t * @param options Set individual options for the dialog\n\t */\n\n\n\t BrowserClient.prototype.showReportDialog = function (options) {\n\t if (options === void 0) {\n\t options = {};\n\t } // doesn't work without a document (React Native)\n\n\n\t var document = getGlobalObject().document;\n\n\t if (!document) {\n\t return;\n\t }\n\n\t if (!this._isEnabled()) {\n\t logger.error('Trying to call showReportDialog with Sentry Client disabled');\n\t return;\n\t }\n\n\t injectReportDialog(_assign(_assign({}, options), {\n\t dsn: options.dsn || this.getDsn()\n\t }));\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n\t event.platform = event.platform || 'javascript';\n\t event.sdk = _assign(_assign({}, event.sdk), {\n\t name: SDK_NAME,\n\t packages: __spread(event.sdk && event.sdk.packages || [], [{\n\t name: 'npm:@sentry/browser',\n\t version: SDK_VERSION\n\t }]),\n\t version: SDK_VERSION\n\t });\n\t return _super.prototype._prepareEvent.call(this, event, scope, hint);\n\t };\n\t /**\n\t * @inheritDoc\n\t */\n\n\n\t BrowserClient.prototype._sendEvent = function (event) {\n\t var integration = this.getIntegration(Breadcrumbs);\n\n\t if (integration) {\n\t integration.addSentryBreadcrumb(event);\n\t }\n\n\t _super.prototype._sendEvent.call(this, event);\n\t };\n\n\t return BrowserClient;\n\t}(BaseClient);\n\n\tvar defaultIntegrations = [new InboundFilters(), new FunctionToString(), new TryCatch(), new Breadcrumbs(), new GlobalHandlers(), new LinkedErrors(), new UserAgent()];\n\t/**\n\t * The Sentry Browser SDK Client.\n\t *\n\t * To use this SDK, call the {@link init} function as early as possible when\n\t * loading the web page. To set context information or send manual events, use\n\t * the provided methods.\n\t *\n\t * @example\n\t *\n\t * ```\n\t *\n\t * import { init } from '@sentry/browser';\n\t *\n\t * init({\n\t * dsn: '__DSN__',\n\t * // ...\n\t * });\n\t * ```\n\t *\n\t * @example\n\t * ```\n\t *\n\t * import { configureScope } from '@sentry/browser';\n\t * configureScope((scope: Scope) => {\n\t * scope.setExtra({ battery: 0.7 });\n\t * scope.setTag({ user_mode: 'admin' });\n\t * scope.setUser({ id: '4711' });\n\t * });\n\t * ```\n\t *\n\t * @example\n\t * ```\n\t *\n\t * import { addBreadcrumb } from '@sentry/browser';\n\t * addBreadcrumb({\n\t * message: 'My Breadcrumb',\n\t * // ...\n\t * });\n\t * ```\n\t *\n\t * @example\n\t *\n\t * ```\n\t *\n\t * import * as Sentry from '@sentry/browser';\n\t * Sentry.captureMessage('Hello, world!');\n\t * Sentry.captureException(new Error('Good bye'));\n\t * Sentry.captureEvent({\n\t * message: 'Manual',\n\t * stacktrace: [\n\t * // ...\n\t * ],\n\t * });\n\t * ```\n\t *\n\t * @see {@link BrowserOptions} for documentation on configuration options.\n\t */\n\n\tfunction init(options) {\n\t if (options === void 0) {\n\t options = {};\n\t }\n\n\t if (options.defaultIntegrations === undefined) {\n\t options.defaultIntegrations = defaultIntegrations;\n\t }\n\n\t if (options.release === undefined) {\n\t var window_1 = getGlobalObject(); // This supports the variable that sentry-webpack-plugin injects\n\n\t if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n\t options.release = window_1.SENTRY_RELEASE.id;\n\t }\n\t }\n\n\t initAndBind(BrowserClient, options);\n\t}\n\n\tvar $find$1 = arrayIteration.find;\n\n\n\n\tvar FIND = 'find';\n\tvar SKIPS_HOLES = true;\n\n\tvar USES_TO_LENGTH$9 = arrayMethodUsesToLength(FIND);\n\n\t// Shouldn't skip holes\n\tif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n\t// `Array.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t_export({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH$9 }, {\n\t find: function find(callbackfn /* , that = undefined */) {\n\t return $find$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables(FIND);\n\n\t// a string of all valid unicode whitespaces\n\t// eslint-disable-next-line max-len\n\tvar whitespaces = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\tvar whitespace = '[' + whitespaces + ']';\n\tvar ltrim = RegExp('^' + whitespace + whitespace + '*');\n\tvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n\t// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\n\tvar createMethod$4 = function (TYPE) {\n\t return function ($this) {\n\t var string = String(requireObjectCoercible($this));\n\t if (TYPE & 1) string = string.replace(ltrim, '');\n\t if (TYPE & 2) string = string.replace(rtrim, '');\n\t return string;\n\t };\n\t};\n\n\tvar stringTrim = {\n\t // `String.prototype.{ trimLeft, trimStart }` methods\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n\t start: createMethod$4(1),\n\t // `String.prototype.{ trimRight, trimEnd }` methods\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n\t end: createMethod$4(2),\n\t // `String.prototype.trim` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t trim: createMethod$4(3)\n\t};\n\n\tvar getOwnPropertyNames$2 = objectGetOwnPropertyNames.f;\n\tvar getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;\n\tvar defineProperty$9 = objectDefineProperty.f;\n\tvar trim = stringTrim.trim;\n\n\tvar NUMBER = 'Number';\n\tvar NativeNumber = global_1[NUMBER];\n\tvar NumberPrototype = NativeNumber.prototype;\n\n\t// Opera ~12 has broken Object#toString\n\tvar BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;\n\n\t// `ToNumber` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tonumber\n\tvar toNumber = function (argument) {\n\t var it = toPrimitive(argument, false);\n\t var first, third, radix, maxCode, digits, length, index, code;\n\t if (typeof it == 'string' && it.length > 2) {\n\t it = trim(it);\n\t first = it.charCodeAt(0);\n\t if (first === 43 || first === 45) {\n\t third = it.charCodeAt(2);\n\t if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n\t } else if (first === 48) {\n\t switch (it.charCodeAt(1)) {\n\t case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i\n\t case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n\t default: return +it;\n\t }\n\t digits = it.slice(2);\n\t length = digits.length;\n\t for (index = 0; index < length; index++) {\n\t code = digits.charCodeAt(index);\n\t // parseInt parses a string to a first unavailable symbol\n\t // but ToNumber should return NaN if a string contains unavailable symbols\n\t if (code < 48 || code > maxCode) return NaN;\n\t } return parseInt(digits, radix);\n\t }\n\t } return +it;\n\t};\n\n\t// `Number` constructor\n\t// https://tc39.github.io/ecma262/#sec-number-constructor\n\tif (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n\t var NumberWrapper = function Number(value) {\n\t var it = arguments.length < 1 ? 0 : value;\n\t var dummy = this;\n\t return dummy instanceof NumberWrapper\n\t // check on 1..constructor(foo) case\n\t && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)\n\t ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n\t };\n\t for (var keys$3 = descriptors ? getOwnPropertyNames$2(NativeNumber) : (\n\t // ES3:\n\t 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n\t // ES2015 (in case, if modules with ES2015 Number statics required before):\n\t 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n\t 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n\t ).split(','), j$1 = 0, key$1; keys$3.length > j$1; j$1++) {\n\t if (has(NativeNumber, key$1 = keys$3[j$1]) && !has(NumberWrapper, key$1)) {\n\t defineProperty$9(NumberWrapper, key$1, getOwnPropertyDescriptor$3(NativeNumber, key$1));\n\t }\n\t }\n\t NumberWrapper.prototype = NumberPrototype;\n\t NumberPrototype.constructor = NumberWrapper;\n\t redefine(global_1, NUMBER, NumberWrapper);\n\t}\n\n\t// `Number.isNaN` method\n\t// https://tc39.github.io/ecma262/#sec-number.isnan\n\t_export({ target: 'Number', stat: true }, {\n\t isNaN: function isNaN(number) {\n\t // eslint-disable-next-line no-self-compare\n\t return number != number;\n\t }\n\t});\n\n\tvar propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\n\t// `Object.{ entries, values }` methods implementation\n\tvar createMethod$5 = function (TO_ENTRIES) {\n\t return function (it) {\n\t var O = toIndexedObject(it);\n\t var keys = objectKeys(O);\n\t var length = keys.length;\n\t var i = 0;\n\t var result = [];\n\t var key;\n\t while (length > i) {\n\t key = keys[i++];\n\t if (!descriptors || propertyIsEnumerable.call(O, key)) {\n\t result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n\t }\n\t }\n\t return result;\n\t };\n\t};\n\n\tvar objectToArray = {\n\t // `Object.entries` method\n\t // https://tc39.github.io/ecma262/#sec-object.entries\n\t entries: createMethod$5(true),\n\t // `Object.values` method\n\t // https://tc39.github.io/ecma262/#sec-object.values\n\t values: createMethod$5(false)\n\t};\n\n\tvar $entries = objectToArray.entries;\n\n\t// `Object.entries` method\n\t// https://tc39.github.io/ecma262/#sec-object.entries\n\t_export({ target: 'Object', stat: true }, {\n\t entries: function entries(O) {\n\t return $entries(O);\n\t }\n\t});\n\n\tfunction _classCallCheck$1(e, t) {\n\t if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n\t}\n\n\tfunction _defineProperties$1(e, t) {\n\t for (var n = 0; n < t.length; n++) {\n\t var r = t[n];\n\t r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n\t }\n\t}\n\n\tfunction _createClass$1(e, t, n) {\n\t return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n\t}\n\n\tfunction _defineProperty$1(e, t, n) {\n\t return t in e ? Object.defineProperty(e, t, {\n\t value: n,\n\t enumerable: !0,\n\t configurable: !0,\n\t writable: !0\n\t }) : e[t] = n, e;\n\t}\n\n\tfunction _slicedToArray$1(e, t) {\n\t return _arrayWithHoles$1(e) || _iterableToArrayLimit$1(e, t) || _nonIterableRest$1();\n\t}\n\n\tfunction _arrayWithHoles$1(e) {\n\t if (Array.isArray(e)) return e;\n\t}\n\n\tfunction _iterableToArrayLimit$1(e, t) {\n\t var n = [],\n\t r = !0,\n\t o = !1,\n\t i = void 0;\n\n\t try {\n\t for (var s, a = e[Symbol.iterator](); !(r = (s = a.next()).done) && (n.push(s.value), !t || n.length !== t); r = !0) {\n\t ;\n\t }\n\t } catch (e) {\n\t o = !0, i = e;\n\t } finally {\n\t try {\n\t r || null == a.return || a.return();\n\t } finally {\n\t if (o) throw i;\n\t }\n\t }\n\n\t return n;\n\t}\n\n\tfunction _nonIterableRest$1() {\n\t throw new TypeError(\"Invalid attempt to destructure non-iterable instance\");\n\t}\n\n\tvar getConstructor = function getConstructor(e) {\n\t return null != e ? e.constructor : null;\n\t},\n\t instanceOf = function instanceOf(e, t) {\n\t return !!(e && t && e instanceof t);\n\t},\n\t isNullOrUndefined = function isNullOrUndefined(e) {\n\t return null == e;\n\t},\n\t isObject$1 = function isObject(e) {\n\t return getConstructor(e) === Object;\n\t},\n\t isNumber = function isNumber(e) {\n\t return getConstructor(e) === Number && !Number.isNaN(e);\n\t},\n\t isString$1 = function isString(e) {\n\t return getConstructor(e) === String;\n\t},\n\t isBoolean = function isBoolean(e) {\n\t return getConstructor(e) === Boolean;\n\t},\n\t isFunction = function isFunction(e) {\n\t return getConstructor(e) === Function;\n\t},\n\t isArray$1 = function isArray(e) {\n\t return Array.isArray(e);\n\t},\n\t isNodeList = function isNodeList(e) {\n\t return instanceOf(e, NodeList);\n\t},\n\t isElement$1 = function isElement(e) {\n\t return instanceOf(e, Element);\n\t},\n\t isEvent$1 = function isEvent(e) {\n\t return instanceOf(e, Event);\n\t},\n\t isEmpty = function isEmpty(e) {\n\t return isNullOrUndefined(e) || (isString$1(e) || isArray$1(e) || isNodeList(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n\t},\n\t is = {\n\t nullOrUndefined: isNullOrUndefined,\n\t object: isObject$1,\n\t number: isNumber,\n\t string: isString$1,\n\t boolean: isBoolean,\n\t function: isFunction,\n\t array: isArray$1,\n\t nodeList: isNodeList,\n\t element: isElement$1,\n\t event: isEvent$1,\n\t empty: isEmpty\n\t},\n\t constants = {\n\t facebook: {\n\t domain: \"facebook.com\",\n\t url: function url(e) {\n\t return \"https://graph.facebook.com/?id=\".concat(e, \"&fields=og_object{engagement}\");\n\t },\n\t shareCount: function shareCount(e) {\n\t return e.og_object.engagement.count;\n\t },\n\t popup: {\n\t width: 640,\n\t height: 360\n\t }\n\t },\n\t twitter: {\n\t domain: \"twitter.com\",\n\t url: function url() {\n\t return null;\n\t },\n\t shareCount: function shareCount() {\n\t return null;\n\t },\n\t popup: {\n\t width: 640,\n\t height: 240\n\t }\n\t },\n\t pinterest: {\n\t domain: \"pinterest.com\",\n\t url: function url(e) {\n\t return \"https://widgets.pinterest.com/v1/urls/count.json?url=\".concat(e);\n\t },\n\t shareCount: function shareCount(e) {\n\t return e.count;\n\t },\n\t popup: {\n\t width: 830,\n\t height: 700\n\t }\n\t },\n\t github: {\n\t domain: \"github.com\",\n\t url: function url(e, t) {\n\t return \"https://api.github.com/repos/\".concat(e).concat(is.string(t) ? \"?access_token=\".concat(t) : \"\");\n\t },\n\t shareCount: function shareCount(e) {\n\t return e.data.stargazers_count;\n\t }\n\t },\n\t youtube: {\n\t domain: \"youtube.com\",\n\t url: function url(e, t) {\n\t return \"https://www.googleapis.com/youtube/v3/channels?part=statistics&id=\".concat(e, \"&key=\").concat(t);\n\t },\n\t shareCount: function shareCount(e) {\n\t if (!is.empty(e.error)) return null;\n\n\t var t = _slicedToArray$1(e.items, 1)[0];\n\n\t return is.empty(t) ? null : t.statistics.subscriberCount;\n\t }\n\t }\n\t},\n\t defaults = {\n\t debug: !1,\n\t wrapper: {\n\t className: \"shr\"\n\t },\n\t count: {\n\t className: \"shr__count\",\n\t displayZero: !1,\n\t format: !0,\n\t position: \"after\",\n\t increment: !0\n\t },\n\t tokens: {\n\t github: \"\",\n\t youtube: \"\"\n\t },\n\t storage: {\n\t enabled: !0,\n\t key: \"shr\",\n\t ttl: 3e5\n\t }\n\t};\n\n\tfunction getJSONP(e) {\n\t return new Promise(function (t, n) {\n\t var r = \"jsonp_callback_\".concat(Math.round(1e5 * Math.random())),\n\t o = document.createElement(\"script\");\n\t o.addEventListener(\"error\", function (e) {\n\t return n(e);\n\t }), window[r] = function (e) {\n\t delete window[r], document.body.removeChild(o), t(e);\n\t };\n\t var i = new URL(e);\n\t i.searchParams.set(\"callback\", r), o.setAttribute(\"src\", i.toString()), document.body.appendChild(o);\n\t });\n\t}\n\n\tvar noop = function noop() {},\n\t Console = function () {\n\t function e() {\n\t var t = !!(0 < arguments.length && void 0 !== arguments[0]) && arguments[0];\n\t _classCallCheck$1(this, e), this.enabled = window.console && t, this.enabled && this.log(\"Debugging enabled\");\n\t }\n\n\t return _createClass$1(e, [{\n\t key: \"log\",\n\t get: function get() {\n\t return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n\t }\n\t }, {\n\t key: \"warn\",\n\t get: function get() {\n\t return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n\t }\n\t }, {\n\t key: \"error\",\n\t get: function get() {\n\t return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n\t }\n\t }]), e;\n\t}();\n\n\tfunction matches(e, t) {\n\t return function () {\n\t return Array.from(document.querySelectorAll(t)).includes(this);\n\t }.call(e, t);\n\t}\n\n\tfunction wrap$2(e, t) {\n\t var n = e.length ? e : [e];\n\t Array.from(n).reverse().forEach(function (e, n) {\n\t var r = 0 < n ? t.cloneNode(!0) : t,\n\t o = e.parentNode,\n\t i = e.nextSibling;\n\t r.appendChild(e), i ? o.insertBefore(r, i) : o.appendChild(r);\n\t });\n\t}\n\n\tfunction setAttributes(e, t) {\n\t !is.element(e) || is.empty(t) || Object.entries(t).filter(function (e) {\n\t var t = _slicedToArray$1(e, 2)[1];\n\n\t return !is.nullOrUndefined(t);\n\t }).forEach(function (t) {\n\t var n = _slicedToArray$1(t, 2),\n\t r = n[0],\n\t o = n[1];\n\n\t return e.setAttribute(r, o);\n\t });\n\t}\n\n\tfunction createElement(e, t, n) {\n\t var r = document.createElement(e);\n\t return is.object(t) && setAttributes(r, t), is.string(n) && (r.innerText = n), r;\n\t}\n\n\tfunction formatNumber(e) {\n\t var t = /\\./.test(1.1.toLocaleString()) ? \".\" : \",\",\n\t n = new RegExp(\"\\\\\".concat(t, \"\\\\d+$\"));\n\t return Math.round(e).toLocaleString().replace(n, \"\");\n\t}\n\n\tfunction extend() {\n\t for (var e = 0 < arguments.length && void 0 !== arguments[0] ? arguments[0] : {}, t = arguments.length, n = Array(1 < t ? t - 1 : 0), r = 1; r < t; r++) {\n\t n[r - 1] = arguments[r];\n\t }\n\n\t if (!n.length) return e;\n\t var o = n.shift();\n\t return is.object(o) ? (Object.keys(o).forEach(function (t) {\n\t is.object(o[t]) ? (!Object.keys(e).includes(t) && Object.assign(e, _defineProperty$1({}, t, {})), extend(e[t], o[t])) : Object.assign(e, _defineProperty$1({}, t, o[t]));\n\t }), extend.apply(void 0, [e].concat(n))) : e;\n\t}\n\n\tvar Storage = function () {\n\t function e(t, n) {\n\t var r = !(2 < arguments.length && void 0 !== arguments[2]) || arguments[2];\n\t _classCallCheck$1(this, e), this.enabled = r && e.supported, this.key = t, this.ttl = n;\n\t }\n\n\t return _createClass$1(e, [{\n\t key: \"get\",\n\t value: function value(t) {\n\t if (!e.supported || !this.enabled) return null;\n\t var n = window.localStorage.getItem(this.key);\n\t if (is.empty(n)) return null;\n\t var r = window.localStorage.getItem(\"\".concat(this.key, \"_ttl\"));\n\t if (is.empty(r) || r < Date.now()) return null;\n\t var o = JSON.parse(n);\n\t return is.string(t) && t.length ? o[t] : o;\n\t }\n\t }, {\n\t key: \"set\",\n\t value: function value(t) {\n\t if (e.supported && this.enabled && is.object(t)) {\n\t var n = this.get();\n\t is.empty(n) && (n = {}), extend(n, t), window.localStorage.setItem(this.key, JSON.stringify(n)), window.localStorage.setItem(\"\".concat(this.key, \"_ttl\"), Date.now() + this.ttl);\n\t }\n\t }\n\t }], [{\n\t key: \"supported\",\n\t get: function get() {\n\t try {\n\t return \"localStorage\" in window && (window.localStorage.setItem(\"___test\", \"___test\"), window.localStorage.removeItem(\"___test\"), !0);\n\t } catch (e) {\n\t return !1;\n\t }\n\t }\n\t }]), e;\n\t}();\n\n\tfunction getDomain(e) {\n\t var t = new URL(e).hostname,\n\t n = t.split(\".\"),\n\t r = n.length;\n\t return 2 < r && (t = \"\".concat(n[r - 2], \".\").concat(n[r - 1]), 2 === n[r - 2].length && 2 === n[r - 1].length && (t = \"\".concat(n[r - 3], \".\").concat(t))), t;\n\t}\n\n\tvar Shr = function () {\n\t function e(t, n) {\n\t var r = this;\n\t _classCallCheck$1(this, e), this.elements = {\n\t count: null,\n\t trigger: null,\n\t popup: null\n\t }, is.element(t) ? this.elements.trigger = t : is.string(t) && (this.elements.trigger = document.querySelector(t)), is.element(this.elements.trigger) && is.empty(this.elements.trigger.shr) && (this.config = extend({}, defaults, n, {\n\t networks: constants\n\t }), this.console = new Console(this.config.debug), this.storage = new Storage(this.config.storage.key, this.config.storage.ttl, this.config.storage.enabled), this.getCount().then(function (e) {\n\t return r.updateDisplay(e);\n\t }).catch(function () {}), this.listeners(!0), this.elements.trigger.shr = this);\n\t }\n\n\t return _createClass$1(e, [{\n\t key: \"destroy\",\n\t value: function value() {\n\t this.listeners(!1);\n\t }\n\t }, {\n\t key: \"listeners\",\n\t value: function value() {\n\t var e = this,\n\t t = !!(0 < arguments.length && void 0 !== arguments[0]) && arguments[0] ? \"addEventListener\" : \"removeEventListener\";\n\t this.elements.trigger[t](\"click\", function (t) {\n\t return e.share(t);\n\t }, !1);\n\t }\n\t }, {\n\t key: \"share\",\n\t value: function value(e) {\n\t var t = this;\n\t this.openPopup(e);\n\t var n = this.config.count.increment;\n\t this.getCount().then(function (e) {\n\t return t.updateDisplay(e, n);\n\t }).catch(function () {});\n\t }\n\t }, {\n\t key: \"openPopup\",\n\t value: function value(e) {\n\t if (!is.empty(this.network) && this.networkConfig.popup) {\n\t is.event(e) && e.preventDefault();\n\t var t = this.networkConfig.popup,\n\t n = t.width,\n\t r = t.height,\n\t o = \"shr-popup--\".concat(this.network);\n\t if (this.popup && !this.popup.closed) this.popup.focus(), this.console.log(\"Popup re-focused.\");else {\n\t var i = void 0 === window.screenLeft ? window.screen.left : window.screenLeft,\n\t s = void 0 === window.screenTop ? window.screen.top : window.screenTop,\n\t a = window.screen.width / 2 - n / 2 + i,\n\t c = window.screen.height / 2 - r / 2 + s;\n\t this.popup = window.open(this.href, o, \"top=\".concat(c, \",left=\").concat(a, \",width=\").concat(n, \",height=\").concat(r)), !this.popup || this.popup.closed || !is.boolean(this.popup.closed) ? this.console.error(\"Popup blocked.\") : (this.popup.focus(), this.console.log(\"Popup opened.\"));\n\t }\n\t }\n\t }\n\t }, {\n\t key: \"getCount\",\n\t value: function value() {\n\t var e = this,\n\t t = !(0 < arguments.length && void 0 !== arguments[0]) || arguments[0];\n\t return new Promise(function (n, r) {\n\t var o = e.apiUrl;\n\t if (is.empty(o)) r(new Error(\"No URL available for \".concat(e.network, \".\")));else {\n\t if (t) {\n\t var i = e.storage.get(e.target);\n\n\t if (!is.empty(i) && Object.keys(i).includes(e.network)) {\n\t var s = i[e.network];\n\t return n(is.number(s) ? s : 0), void e.console.log(\"getCount for '\".concat(e.target, \"' for '\").concat(e.network, \"' resolved from cache.\"));\n\t }\n\t }\n\n\t getJSONP(o).then(function (t) {\n\t var r = 0,\n\t o = e.elements.trigger.getAttribute(\"data-shr-display\");\n\t r = is.empty(o) ? e.networkConfig.shareCount(t) : t[o], is.empty(r) ? r = 0 : (r = parseInt(r, 10), !is.number(r) && (r = 0)), e.storage.set(_defineProperty$1({}, e.target, _defineProperty$1({}, e.network, r))), n(r);\n\t }).catch(r);\n\t }\n\t });\n\t }\n\t }, {\n\t key: \"updateDisplay\",\n\t value: function value(e) {\n\t var t = !!(1 < arguments.length && void 0 !== arguments[1]) && arguments[1],\n\t n = this.config,\n\t r = n.count,\n\t o = n.wrapper,\n\t i = t ? e + 1 : e,\n\t s = r.position.toLowerCase();\n\n\t if (0 < i || r.displayZero) {\n\t var a = function a(e) {\n\t return Math.round(i / e * 10) / 10;\n\t },\n\t c = formatNumber(i);\n\n\t r.format && (1e6 < i ? c = \"\".concat(a(1e6), \"M\") : 1e3 < i && (c = \"\".concat(a(1e3), \"K\"))), is.element(this.elements.count) ? this.elements.count.textContent = c : (wrap$2(this.elements.trigger, createElement(\"span\", {\n\t class: o.className\n\t })), this.elements.count = createElement(\"span\", {\n\t class: \"\".concat(r.className, \" \").concat(r.className, \"--\").concat(s)\n\t }, c), this.elements.trigger.insertAdjacentElement(\"after\" === s ? \"afterend\" : \"beforebegin\", this.elements.count));\n\t }\n\t }\n\t }, {\n\t key: \"href\",\n\t get: function get() {\n\t return is.element(this.elements.trigger) ? this.elements.trigger.href : null;\n\t }\n\t }, {\n\t key: \"network\",\n\t get: function get() {\n\t var e = this;\n\t if (!is.element(this.elements.trigger)) return null;\n\t var t = this.config.networks;\n\t return Object.keys(t).find(function (n) {\n\t return getDomain(e.href) === t[n].domain;\n\t });\n\t }\n\t }, {\n\t key: \"networkConfig\",\n\t get: function get() {\n\t return is.empty(this.network) ? null : this.config.networks[this.network];\n\t }\n\t }, {\n\t key: \"target\",\n\t get: function get() {\n\t if (is.empty(this.network)) return null;\n\t var e = new URL(this.href);\n\n\t switch (this.network) {\n\t case \"facebook\":\n\t return e.searchParams.get(\"u\");\n\n\t case \"github\":\n\t return e.pathname.substring(1);\n\n\t case \"youtube\":\n\t return e.pathname.split(\"/\").pop();\n\n\t default:\n\t return e.searchParams.get(\"url\");\n\t }\n\t }\n\t }, {\n\t key: \"apiUrl\",\n\t get: function get() {\n\t if (is.empty(this.network)) return null;\n\t var e = this.config.tokens;\n\n\t switch (this.network) {\n\t case \"github\":\n\t return this.networkConfig.url(this.target, e.github);\n\n\t case \"youtube\":\n\t return this.networkConfig.url(this.target, e.youtube);\n\n\t default:\n\t return this.networkConfig.url(encodeURIComponent(this.target));\n\t }\n\t }\n\t }], [{\n\t key: \"setup\",\n\t value: function value(t) {\n\t var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n\t r = null;\n\t if (is.string(t) ? r = Array.from(document.querySelectorAll(t)) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\t var o = Object.assign({}, defaults, n);\n\t is.string(t) && o.watch && new MutationObserver(function (n) {\n\t Array.from(n).forEach(function (n) {\n\t Array.from(n.addedNodes).forEach(function (n) {\n\t is.element(n) && matches(n, t) && new e(n, o);\n\t });\n\t });\n\t }).observe(document.body, {\n\t childList: !0,\n\t subtree: !0\n\t });\n\t return r.map(function (t) {\n\t return new e(t, n);\n\t });\n\t }\n\t }]), e;\n\t}();\n\n\tvar check$1 = function (it) {\n\t return it && it.Math == Math && it;\n\t};\n\n\t// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n\tvar global_1$1 =\n\t // eslint-disable-next-line no-undef\n\t check$1(typeof globalThis == 'object' && globalThis) ||\n\t check$1(typeof window == 'object' && window) ||\n\t check$1(typeof self == 'object' && self) ||\n\t check$1(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\n\t // eslint-disable-next-line no-new-func\n\t (function () { return this; })() || Function('return this')();\n\n\tvar fails$1 = function (exec) {\n\t try {\n\t return !!exec();\n\t } catch (error) {\n\t return true;\n\t }\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar descriptors$1 = !fails$1(function () {\n\t return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n\t});\n\n\tvar nativePropertyIsEnumerable$2 = {}.propertyIsEnumerable;\n\tvar getOwnPropertyDescriptor$4 = Object.getOwnPropertyDescriptor;\n\n\t// Nashorn ~ JDK8 bug\n\tvar NASHORN_BUG$1 = getOwnPropertyDescriptor$4 && !nativePropertyIsEnumerable$2.call({ 1: 2 }, 1);\n\n\t// `Object.prototype.propertyIsEnumerable` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n\tvar f$8 = NASHORN_BUG$1 ? function propertyIsEnumerable(V) {\n\t var descriptor = getOwnPropertyDescriptor$4(this, V);\n\t return !!descriptor && descriptor.enumerable;\n\t} : nativePropertyIsEnumerable$2;\n\n\tvar objectPropertyIsEnumerable$1 = {\n\t\tf: f$8\n\t};\n\n\tvar createPropertyDescriptor$1 = function (bitmap, value) {\n\t return {\n\t enumerable: !(bitmap & 1),\n\t configurable: !(bitmap & 2),\n\t writable: !(bitmap & 4),\n\t value: value\n\t };\n\t};\n\n\tvar toString$2 = {}.toString;\n\n\tvar classofRaw$1 = function (it) {\n\t return toString$2.call(it).slice(8, -1);\n\t};\n\n\tvar split$1 = ''.split;\n\n\t// fallback for non-array-like ES3 and non-enumerable old V8 strings\n\tvar indexedObject$1 = fails$1(function () {\n\t // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n\t // eslint-disable-next-line no-prototype-builtins\n\t return !Object('z').propertyIsEnumerable(0);\n\t}) ? function (it) {\n\t return classofRaw$1(it) == 'String' ? split$1.call(it, '') : Object(it);\n\t} : Object;\n\n\t// `RequireObjectCoercible` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n\tvar requireObjectCoercible$1 = function (it) {\n\t if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n\t return it;\n\t};\n\n\t// toObject with fallback for non-array-like ES3 strings\n\n\n\n\tvar toIndexedObject$1 = function (it) {\n\t return indexedObject$1(requireObjectCoercible$1(it));\n\t};\n\n\tvar isObject$2 = function (it) {\n\t return typeof it === 'object' ? it !== null : typeof it === 'function';\n\t};\n\n\t// `ToPrimitive` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toprimitive\n\t// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n\t// and the second argument - flag - preferred type is a string\n\tvar toPrimitive$1 = function (input, PREFERRED_STRING) {\n\t if (!isObject$2(input)) return input;\n\t var fn, val;\n\t if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject$2(val = fn.call(input))) return val;\n\t if (typeof (fn = input.valueOf) == 'function' && !isObject$2(val = fn.call(input))) return val;\n\t if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject$2(val = fn.call(input))) return val;\n\t throw TypeError(\"Can't convert object to primitive value\");\n\t};\n\n\tvar hasOwnProperty$1 = {}.hasOwnProperty;\n\n\tvar has$2 = function (it, key) {\n\t return hasOwnProperty$1.call(it, key);\n\t};\n\n\tvar document$3 = global_1$1.document;\n\t// typeof document.createElement is 'object' in old IE\n\tvar EXISTS$1 = isObject$2(document$3) && isObject$2(document$3.createElement);\n\n\tvar documentCreateElement$1 = function (it) {\n\t return EXISTS$1 ? document$3.createElement(it) : {};\n\t};\n\n\t// Thank's IE8 for his funny defineProperty\n\tvar ie8DomDefine$1 = !descriptors$1 && !fails$1(function () {\n\t return Object.defineProperty(documentCreateElement$1('div'), 'a', {\n\t get: function () { return 7; }\n\t }).a != 7;\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor$3 = Object.getOwnPropertyDescriptor;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\tvar f$9 = descriptors$1 ? nativeGetOwnPropertyDescriptor$3 : function getOwnPropertyDescriptor(O, P) {\n\t O = toIndexedObject$1(O);\n\t P = toPrimitive$1(P, true);\n\t if (ie8DomDefine$1) try {\n\t return nativeGetOwnPropertyDescriptor$3(O, P);\n\t } catch (error) { /* empty */ }\n\t if (has$2(O, P)) return createPropertyDescriptor$1(!objectPropertyIsEnumerable$1.f.call(O, P), O[P]);\n\t};\n\n\tvar objectGetOwnPropertyDescriptor$1 = {\n\t\tf: f$9\n\t};\n\n\tvar anObject$1 = function (it) {\n\t if (!isObject$2(it)) {\n\t throw TypeError(String(it) + ' is not an object');\n\t } return it;\n\t};\n\n\tvar nativeDefineProperty$2 = Object.defineProperty;\n\n\t// `Object.defineProperty` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperty\n\tvar f$a = descriptors$1 ? nativeDefineProperty$2 : function defineProperty(O, P, Attributes) {\n\t anObject$1(O);\n\t P = toPrimitive$1(P, true);\n\t anObject$1(Attributes);\n\t if (ie8DomDefine$1) try {\n\t return nativeDefineProperty$2(O, P, Attributes);\n\t } catch (error) { /* empty */ }\n\t if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n\t if ('value' in Attributes) O[P] = Attributes.value;\n\t return O;\n\t};\n\n\tvar objectDefineProperty$1 = {\n\t\tf: f$a\n\t};\n\n\tvar createNonEnumerableProperty$1 = descriptors$1 ? function (object, key, value) {\n\t return objectDefineProperty$1.f(object, key, createPropertyDescriptor$1(1, value));\n\t} : function (object, key, value) {\n\t object[key] = value;\n\t return object;\n\t};\n\n\tvar setGlobal$1 = function (key, value) {\n\t try {\n\t createNonEnumerableProperty$1(global_1$1, key, value);\n\t } catch (error) {\n\t global_1$1[key] = value;\n\t } return value;\n\t};\n\n\tvar SHARED$1 = '__core-js_shared__';\n\tvar store$2 = global_1$1[SHARED$1] || setGlobal$1(SHARED$1, {});\n\n\tvar sharedStore$1 = store$2;\n\n\tvar functionToString$1 = Function.toString;\n\n\t// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\n\tif (typeof sharedStore$1.inspectSource != 'function') {\n\t sharedStore$1.inspectSource = function (it) {\n\t return functionToString$1.call(it);\n\t };\n\t}\n\n\tvar inspectSource$1 = sharedStore$1.inspectSource;\n\n\tvar WeakMap$3 = global_1$1.WeakMap;\n\n\tvar nativeWeakMap$1 = typeof WeakMap$3 === 'function' && /native code/.test(inspectSource$1(WeakMap$3));\n\n\tvar isPure$1 = false;\n\n\tvar shared$1 = createCommonjsModule(function (module) {\n\t(module.exports = function (key, value) {\n\t return sharedStore$1[key] || (sharedStore$1[key] = value !== undefined ? value : {});\n\t})('versions', []).push({\n\t version: '3.7.0',\n\t mode: 'global',\n\t copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n\t});\n\t});\n\n\tvar id$2 = 0;\n\tvar postfix$1 = Math.random();\n\n\tvar uid$1 = function (key) {\n\t return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id$2 + postfix$1).toString(36);\n\t};\n\n\tvar keys$4 = shared$1('keys');\n\n\tvar sharedKey$1 = function (key) {\n\t return keys$4[key] || (keys$4[key] = uid$1(key));\n\t};\n\n\tvar hiddenKeys$2 = {};\n\n\tvar WeakMap$4 = global_1$1.WeakMap;\n\tvar set$3, get$2, has$3;\n\n\tvar enforce$1 = function (it) {\n\t return has$3(it) ? get$2(it) : set$3(it, {});\n\t};\n\n\tvar getterFor$1 = function (TYPE) {\n\t return function (it) {\n\t var state;\n\t if (!isObject$2(it) || (state = get$2(it)).type !== TYPE) {\n\t throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n\t } return state;\n\t };\n\t};\n\n\tif (nativeWeakMap$1) {\n\t var store$3 = sharedStore$1.state || (sharedStore$1.state = new WeakMap$4());\n\t var wmget$1 = store$3.get;\n\t var wmhas$1 = store$3.has;\n\t var wmset$1 = store$3.set;\n\t set$3 = function (it, metadata) {\n\t metadata.facade = it;\n\t wmset$1.call(store$3, it, metadata);\n\t return metadata;\n\t };\n\t get$2 = function (it) {\n\t return wmget$1.call(store$3, it) || {};\n\t };\n\t has$3 = function (it) {\n\t return wmhas$1.call(store$3, it);\n\t };\n\t} else {\n\t var STATE$1 = sharedKey$1('state');\n\t hiddenKeys$2[STATE$1] = true;\n\t set$3 = function (it, metadata) {\n\t metadata.facade = it;\n\t createNonEnumerableProperty$1(it, STATE$1, metadata);\n\t return metadata;\n\t };\n\t get$2 = function (it) {\n\t return has$2(it, STATE$1) ? it[STATE$1] : {};\n\t };\n\t has$3 = function (it) {\n\t return has$2(it, STATE$1);\n\t };\n\t}\n\n\tvar internalState$1 = {\n\t set: set$3,\n\t get: get$2,\n\t has: has$3,\n\t enforce: enforce$1,\n\t getterFor: getterFor$1\n\t};\n\n\tvar redefine$1 = createCommonjsModule(function (module) {\n\tvar getInternalState = internalState$1.get;\n\tvar enforceInternalState = internalState$1.enforce;\n\tvar TEMPLATE = String(String).split('String');\n\n\t(module.exports = function (O, key, value, options) {\n\t var unsafe = options ? !!options.unsafe : false;\n\t var simple = options ? !!options.enumerable : false;\n\t var noTargetGet = options ? !!options.noTargetGet : false;\n\t var state;\n\t if (typeof value == 'function') {\n\t if (typeof key == 'string' && !has$2(value, 'name')) {\n\t createNonEnumerableProperty$1(value, 'name', key);\n\t }\n\t state = enforceInternalState(value);\n\t if (!state.source) {\n\t state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n\t }\n\t }\n\t if (O === global_1$1) {\n\t if (simple) O[key] = value;\n\t else setGlobal$1(key, value);\n\t return;\n\t } else if (!unsafe) {\n\t delete O[key];\n\t } else if (!noTargetGet && O[key]) {\n\t simple = true;\n\t }\n\t if (simple) O[key] = value;\n\t else createNonEnumerableProperty$1(O, key, value);\n\t// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n\t})(Function.prototype, 'toString', function toString() {\n\t return typeof this == 'function' && getInternalState(this).source || inspectSource$1(this);\n\t});\n\t});\n\n\tvar path$1 = global_1$1;\n\n\tvar aFunction$2 = function (variable) {\n\t return typeof variable == 'function' ? variable : undefined;\n\t};\n\n\tvar getBuiltIn$1 = function (namespace, method) {\n\t return arguments.length < 2 ? aFunction$2(path$1[namespace]) || aFunction$2(global_1$1[namespace])\n\t : path$1[namespace] && path$1[namespace][method] || global_1$1[namespace] && global_1$1[namespace][method];\n\t};\n\n\tvar ceil$1 = Math.ceil;\n\tvar floor$6 = Math.floor;\n\n\t// `ToInteger` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tointeger\n\tvar toInteger$1 = function (argument) {\n\t return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor$6 : ceil$1)(argument);\n\t};\n\n\tvar min$7 = Math.min;\n\n\t// `ToLength` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tolength\n\tvar toLength$1 = function (argument) {\n\t return argument > 0 ? min$7(toInteger$1(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n\t};\n\n\tvar max$4 = Math.max;\n\tvar min$8 = Math.min;\n\n\t// Helper for a popular repeating case of the spec:\n\t// Let integer be ? ToInteger(index).\n\t// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\n\tvar toAbsoluteIndex$1 = function (index, length) {\n\t var integer = toInteger$1(index);\n\t return integer < 0 ? max$4(integer + length, 0) : min$8(integer, length);\n\t};\n\n\t// `Array.prototype.{ indexOf, includes }` methods implementation\n\tvar createMethod$6 = function (IS_INCLUDES) {\n\t return function ($this, el, fromIndex) {\n\t var O = toIndexedObject$1($this);\n\t var length = toLength$1(O.length);\n\t var index = toAbsoluteIndex$1(fromIndex, length);\n\t var value;\n\t // Array#includes uses SameValueZero equality algorithm\n\t // eslint-disable-next-line no-self-compare\n\t if (IS_INCLUDES && el != el) while (length > index) {\n\t value = O[index++];\n\t // eslint-disable-next-line no-self-compare\n\t if (value != value) return true;\n\t // Array#indexOf ignores holes, Array#includes - not\n\t } else for (;length > index; index++) {\n\t if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n\t } return !IS_INCLUDES && -1;\n\t };\n\t};\n\n\tvar arrayIncludes$1 = {\n\t // `Array.prototype.includes` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t includes: createMethod$6(true),\n\t // `Array.prototype.indexOf` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t indexOf: createMethod$6(false)\n\t};\n\n\tvar indexOf$1 = arrayIncludes$1.indexOf;\n\n\n\tvar objectKeysInternal$1 = function (object, names) {\n\t var O = toIndexedObject$1(object);\n\t var i = 0;\n\t var result = [];\n\t var key;\n\t for (key in O) !has$2(hiddenKeys$2, key) && has$2(O, key) && result.push(key);\n\t // Don't enum bug & hidden keys\n\t while (names.length > i) if (has$2(O, key = names[i++])) {\n\t ~indexOf$1(result, key) || result.push(key);\n\t }\n\t return result;\n\t};\n\n\t// IE8- don't enum bug keys\n\tvar enumBugKeys$1 = [\n\t 'constructor',\n\t 'hasOwnProperty',\n\t 'isPrototypeOf',\n\t 'propertyIsEnumerable',\n\t 'toLocaleString',\n\t 'toString',\n\t 'valueOf'\n\t];\n\n\tvar hiddenKeys$3 = enumBugKeys$1.concat('length', 'prototype');\n\n\t// `Object.getOwnPropertyNames` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\tvar f$b = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n\t return objectKeysInternal$1(O, hiddenKeys$3);\n\t};\n\n\tvar objectGetOwnPropertyNames$1 = {\n\t\tf: f$b\n\t};\n\n\tvar f$c = Object.getOwnPropertySymbols;\n\n\tvar objectGetOwnPropertySymbols$1 = {\n\t\tf: f$c\n\t};\n\n\t// all object keys, includes non-enumerable and symbols\n\tvar ownKeys$2 = getBuiltIn$1('Reflect', 'ownKeys') || function ownKeys(it) {\n\t var keys = objectGetOwnPropertyNames$1.f(anObject$1(it));\n\t var getOwnPropertySymbols = objectGetOwnPropertySymbols$1.f;\n\t return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n\t};\n\n\tvar copyConstructorProperties$1 = function (target, source) {\n\t var keys = ownKeys$2(source);\n\t var defineProperty = objectDefineProperty$1.f;\n\t var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor$1.f;\n\t for (var i = 0; i < keys.length; i++) {\n\t var key = keys[i];\n\t if (!has$2(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n\t }\n\t};\n\n\tvar replacement$1 = /#|\\.prototype\\./;\n\n\tvar isForced$1 = function (feature, detection) {\n\t var value = data$1[normalize$2(feature)];\n\t return value == POLYFILL$1 ? true\n\t : value == NATIVE$1 ? false\n\t : typeof detection == 'function' ? fails$1(detection)\n\t : !!detection;\n\t};\n\n\tvar normalize$2 = isForced$1.normalize = function (string) {\n\t return String(string).replace(replacement$1, '.').toLowerCase();\n\t};\n\n\tvar data$1 = isForced$1.data = {};\n\tvar NATIVE$1 = isForced$1.NATIVE = 'N';\n\tvar POLYFILL$1 = isForced$1.POLYFILL = 'P';\n\n\tvar isForced_1$1 = isForced$1;\n\n\tvar getOwnPropertyDescriptor$5 = objectGetOwnPropertyDescriptor$1.f;\n\n\n\n\n\n\n\t/*\n\t options.target - name of the target object\n\t options.global - target is the global object\n\t options.stat - export as static methods of target\n\t options.proto - export as prototype methods of target\n\t options.real - real prototype method for the `pure` version\n\t options.forced - export even if the native feature is available\n\t options.bind - bind methods to the target, required for the `pure` version\n\t options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n\t options.unsafe - use the simple assignment of property instead of delete + defineProperty\n\t options.sham - add a flag to not completely full polyfills\n\t options.enumerable - export as enumerable property\n\t options.noTargetGet - prevent calling a getter on target\n\t*/\n\tvar _export$1 = function (options, source) {\n\t var TARGET = options.target;\n\t var GLOBAL = options.global;\n\t var STATIC = options.stat;\n\t var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n\t if (GLOBAL) {\n\t target = global_1$1;\n\t } else if (STATIC) {\n\t target = global_1$1[TARGET] || setGlobal$1(TARGET, {});\n\t } else {\n\t target = (global_1$1[TARGET] || {}).prototype;\n\t }\n\t if (target) for (key in source) {\n\t sourceProperty = source[key];\n\t if (options.noTargetGet) {\n\t descriptor = getOwnPropertyDescriptor$5(target, key);\n\t targetProperty = descriptor && descriptor.value;\n\t } else targetProperty = target[key];\n\t FORCED = isForced_1$1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n\t // contained in target\n\t if (!FORCED && targetProperty !== undefined) {\n\t if (typeof sourceProperty === typeof targetProperty) continue;\n\t copyConstructorProperties$1(sourceProperty, targetProperty);\n\t }\n\t // add a flag to not completely full polyfills\n\t if (options.sham || (targetProperty && targetProperty.sham)) {\n\t createNonEnumerableProperty$1(sourceProperty, 'sham', true);\n\t }\n\t // extend global\n\t redefine$1(target, key, sourceProperty, options);\n\t }\n\t};\n\n\t// `IsArray` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isarray\n\tvar isArray$2 = Array.isArray || function isArray(arg) {\n\t return classofRaw$1(arg) == 'Array';\n\t};\n\n\t// `ToObject` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-toobject\n\tvar toObject$1 = function (argument) {\n\t return Object(requireObjectCoercible$1(argument));\n\t};\n\n\tvar createProperty$1 = function (object, key, value) {\n\t var propertyKey = toPrimitive$1(key);\n\t if (propertyKey in object) objectDefineProperty$1.f(object, propertyKey, createPropertyDescriptor$1(0, value));\n\t else object[propertyKey] = value;\n\t};\n\n\tvar nativeSymbol$1 = !!Object.getOwnPropertySymbols && !fails$1(function () {\n\t // Chrome 38 Symbol has incorrect toString conversion\n\t // eslint-disable-next-line no-undef\n\t return !String(Symbol());\n\t});\n\n\tvar useSymbolAsUid$1 = nativeSymbol$1\n\t // eslint-disable-next-line no-undef\n\t && !Symbol.sham\n\t // eslint-disable-next-line no-undef\n\t && typeof Symbol.iterator == 'symbol';\n\n\tvar WellKnownSymbolsStore$2 = shared$1('wks');\n\tvar Symbol$2 = global_1$1.Symbol;\n\tvar createWellKnownSymbol$1 = useSymbolAsUid$1 ? Symbol$2 : Symbol$2 && Symbol$2.withoutSetter || uid$1;\n\n\tvar wellKnownSymbol$1 = function (name) {\n\t if (!has$2(WellKnownSymbolsStore$2, name)) {\n\t if (nativeSymbol$1 && has$2(Symbol$2, name)) WellKnownSymbolsStore$2[name] = Symbol$2[name];\n\t else WellKnownSymbolsStore$2[name] = createWellKnownSymbol$1('Symbol.' + name);\n\t } return WellKnownSymbolsStore$2[name];\n\t};\n\n\tvar SPECIES$7 = wellKnownSymbol$1('species');\n\n\t// `ArraySpeciesCreate` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n\tvar arraySpeciesCreate$1 = function (originalArray, length) {\n\t var C;\n\t if (isArray$2(originalArray)) {\n\t C = originalArray.constructor;\n\t // cross-realm fallback\n\t if (typeof C == 'function' && (C === Array || isArray$2(C.prototype))) C = undefined;\n\t else if (isObject$2(C)) {\n\t C = C[SPECIES$7];\n\t if (C === null) C = undefined;\n\t }\n\t } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n\t};\n\n\tvar engineUserAgent$1 = getBuiltIn$1('navigator', 'userAgent') || '';\n\n\tvar process$5 = global_1$1.process;\n\tvar versions$1 = process$5 && process$5.versions;\n\tvar v8$1 = versions$1 && versions$1.v8;\n\tvar match$1, version$1;\n\n\tif (v8$1) {\n\t match$1 = v8$1.split('.');\n\t version$1 = match$1[0] + match$1[1];\n\t} else if (engineUserAgent$1) {\n\t match$1 = engineUserAgent$1.match(/Edge\\/(\\d+)/);\n\t if (!match$1 || match$1[1] >= 74) {\n\t match$1 = engineUserAgent$1.match(/Chrome\\/(\\d+)/);\n\t if (match$1) version$1 = match$1[1];\n\t }\n\t}\n\n\tvar engineV8Version$1 = version$1 && +version$1;\n\n\tvar SPECIES$8 = wellKnownSymbol$1('species');\n\n\tvar arrayMethodHasSpeciesSupport$1 = function (METHOD_NAME) {\n\t // We can't use this feature detection in V8 since it causes\n\t // deoptimization and serious performance degradation\n\t // https://github.com/zloirock/core-js/issues/677\n\t return engineV8Version$1 >= 51 || !fails$1(function () {\n\t var array = [];\n\t var constructor = array.constructor = {};\n\t constructor[SPECIES$8] = function () {\n\t return { foo: 1 };\n\t };\n\t return array[METHOD_NAME](Boolean).foo !== 1;\n\t });\n\t};\n\n\tvar IS_CONCAT_SPREADABLE$1 = wellKnownSymbol$1('isConcatSpreadable');\n\tvar MAX_SAFE_INTEGER$2 = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_INDEX_EXCEEDED$1 = 'Maximum allowed index exceeded';\n\n\t// We can't use this feature detection in V8 since it causes\n\t// deoptimization and serious performance degradation\n\t// https://github.com/zloirock/core-js/issues/679\n\tvar IS_CONCAT_SPREADABLE_SUPPORT$1 = engineV8Version$1 >= 51 || !fails$1(function () {\n\t var array = [];\n\t array[IS_CONCAT_SPREADABLE$1] = false;\n\t return array.concat()[0] !== array;\n\t});\n\n\tvar SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport$1('concat');\n\n\tvar isConcatSpreadable$1 = function (O) {\n\t if (!isObject$2(O)) return false;\n\t var spreadable = O[IS_CONCAT_SPREADABLE$1];\n\t return spreadable !== undefined ? !!spreadable : isArray$2(O);\n\t};\n\n\tvar FORCED$8 = !IS_CONCAT_SPREADABLE_SUPPORT$1 || !SPECIES_SUPPORT$1;\n\n\t// `Array.prototype.concat` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n\t// with adding support of @@isConcatSpreadable and @@species\n\t_export$1({ target: 'Array', proto: true, forced: FORCED$8 }, {\n\t concat: function concat(arg) { // eslint-disable-line no-unused-vars\n\t var O = toObject$1(this);\n\t var A = arraySpeciesCreate$1(O, 0);\n\t var n = 0;\n\t var i, k, length, len, E;\n\t for (i = -1, length = arguments.length; i < length; i++) {\n\t E = i === -1 ? O : arguments[i];\n\t if (isConcatSpreadable$1(E)) {\n\t len = toLength$1(E.length);\n\t if (n + len > MAX_SAFE_INTEGER$2) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED$1);\n\t for (k = 0; k < len; k++, n++) if (k in E) createProperty$1(A, n, E[k]);\n\t } else {\n\t if (n >= MAX_SAFE_INTEGER$2) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED$1);\n\t createProperty$1(A, n++, E);\n\t }\n\t }\n\t A.length = n;\n\t return A;\n\t }\n\t});\n\n\tvar aFunction$3 = function (it) {\n\t if (typeof it != 'function') {\n\t throw TypeError(String(it) + ' is not a function');\n\t } return it;\n\t};\n\n\t// optional / simple context binding\n\tvar functionBindContext$1 = function (fn, that, length) {\n\t aFunction$3(fn);\n\t if (that === undefined) return fn;\n\t switch (length) {\n\t case 0: return function () {\n\t return fn.call(that);\n\t };\n\t case 1: return function (a) {\n\t return fn.call(that, a);\n\t };\n\t case 2: return function (a, b) {\n\t return fn.call(that, a, b);\n\t };\n\t case 3: return function (a, b, c) {\n\t return fn.call(that, a, b, c);\n\t };\n\t }\n\t return function (/* ...args */) {\n\t return fn.apply(that, arguments);\n\t };\n\t};\n\n\tvar push$1 = [].push;\n\n\t// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n\tvar createMethod$7 = function (TYPE) {\n\t var IS_MAP = TYPE == 1;\n\t var IS_FILTER = TYPE == 2;\n\t var IS_SOME = TYPE == 3;\n\t var IS_EVERY = TYPE == 4;\n\t var IS_FIND_INDEX = TYPE == 6;\n\t var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n\t return function ($this, callbackfn, that, specificCreate) {\n\t var O = toObject$1($this);\n\t var self = indexedObject$1(O);\n\t var boundFunction = functionBindContext$1(callbackfn, that, 3);\n\t var length = toLength$1(self.length);\n\t var index = 0;\n\t var create = specificCreate || arraySpeciesCreate$1;\n\t var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n\t var value, result;\n\t for (;length > index; index++) if (NO_HOLES || index in self) {\n\t value = self[index];\n\t result = boundFunction(value, index, O);\n\t if (TYPE) {\n\t if (IS_MAP) target[index] = result; // map\n\t else if (result) switch (TYPE) {\n\t case 3: return true; // some\n\t case 5: return value; // find\n\t case 6: return index; // findIndex\n\t case 2: push$1.call(target, value); // filter\n\t } else if (IS_EVERY) return false; // every\n\t }\n\t }\n\t return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n\t };\n\t};\n\n\tvar arrayIteration$1 = {\n\t // `Array.prototype.forEach` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t forEach: createMethod$7(0),\n\t // `Array.prototype.map` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t map: createMethod$7(1),\n\t // `Array.prototype.filter` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t filter: createMethod$7(2),\n\t // `Array.prototype.some` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t some: createMethod$7(3),\n\t // `Array.prototype.every` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.every\n\t every: createMethod$7(4),\n\t // `Array.prototype.find` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t find: createMethod$7(5),\n\t // `Array.prototype.findIndex` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n\t findIndex: createMethod$7(6)\n\t};\n\n\tvar defineProperty$a = Object.defineProperty;\n\tvar cache$1 = {};\n\n\tvar thrower$1 = function (it) { throw it; };\n\n\tvar arrayMethodUsesToLength$1 = function (METHOD_NAME, options) {\n\t if (has$2(cache$1, METHOD_NAME)) return cache$1[METHOD_NAME];\n\t if (!options) options = {};\n\t var method = [][METHOD_NAME];\n\t var ACCESSORS = has$2(options, 'ACCESSORS') ? options.ACCESSORS : false;\n\t var argument0 = has$2(options, 0) ? options[0] : thrower$1;\n\t var argument1 = has$2(options, 1) ? options[1] : undefined;\n\n\t return cache$1[METHOD_NAME] = !!method && !fails$1(function () {\n\t if (ACCESSORS && !descriptors$1) return true;\n\t var O = { length: -1 };\n\n\t if (ACCESSORS) defineProperty$a(O, 1, { enumerable: true, get: thrower$1 });\n\t else O[1] = 1;\n\n\t method.call(O, argument0, argument1);\n\t });\n\t};\n\n\tvar $filter$2 = arrayIteration$1.filter;\n\n\n\n\tvar HAS_SPECIES_SUPPORT$4 = arrayMethodHasSpeciesSupport$1('filter');\n\t// Edge 14- issue\n\tvar USES_TO_LENGTH$a = arrayMethodUsesToLength$1('filter');\n\n\t// `Array.prototype.filter` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n\t// with adding support of @@species\n\t_export$1({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$4 || !USES_TO_LENGTH$a }, {\n\t filter: function filter(callbackfn /* , thisArg */) {\n\t return $filter$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\tvar objectKeys$1 = Object.keys || function keys(O) {\n\t return objectKeysInternal$1(O, enumBugKeys$1);\n\t};\n\n\t// `Object.defineProperties` method\n\t// https://tc39.github.io/ecma262/#sec-object.defineproperties\n\tvar objectDefineProperties$1 = descriptors$1 ? Object.defineProperties : function defineProperties(O, Properties) {\n\t anObject$1(O);\n\t var keys = objectKeys$1(Properties);\n\t var length = keys.length;\n\t var index = 0;\n\t var key;\n\t while (length > index) objectDefineProperty$1.f(O, key = keys[index++], Properties[key]);\n\t return O;\n\t};\n\n\tvar html$1 = getBuiltIn$1('document', 'documentElement');\n\n\tvar GT$1 = '>';\n\tvar LT$1 = '<';\n\tvar PROTOTYPE$3 = 'prototype';\n\tvar SCRIPT$1 = 'script';\n\tvar IE_PROTO$2 = sharedKey$1('IE_PROTO');\n\n\tvar EmptyConstructor$1 = function () { /* empty */ };\n\n\tvar scriptTag$1 = function (content) {\n\t return LT$1 + SCRIPT$1 + GT$1 + content + LT$1 + '/' + SCRIPT$1 + GT$1;\n\t};\n\n\t// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\n\tvar NullProtoObjectViaActiveX$1 = function (activeXDocument) {\n\t activeXDocument.write(scriptTag$1(''));\n\t activeXDocument.close();\n\t var temp = activeXDocument.parentWindow.Object;\n\t activeXDocument = null; // avoid memory leak\n\t return temp;\n\t};\n\n\t// Create object with fake `null` prototype: use iframe Object with cleared prototype\n\tvar NullProtoObjectViaIFrame$1 = function () {\n\t // Thrash, waste and sodomy: IE GC bug\n\t var iframe = documentCreateElement$1('iframe');\n\t var JS = 'java' + SCRIPT$1 + ':';\n\t var iframeDocument;\n\t iframe.style.display = 'none';\n\t html$1.appendChild(iframe);\n\t // https://github.com/zloirock/core-js/issues/475\n\t iframe.src = String(JS);\n\t iframeDocument = iframe.contentWindow.document;\n\t iframeDocument.open();\n\t iframeDocument.write(scriptTag$1('document.F=Object'));\n\t iframeDocument.close();\n\t return iframeDocument.F;\n\t};\n\n\t// Check for document.domain and active x support\n\t// No need to use active x approach when document.domain is not set\n\t// see https://github.com/es-shims/es5-shim/issues/150\n\t// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n\t// avoid IE GC bug\n\tvar activeXDocument$1;\n\tvar NullProtoObject$1 = function () {\n\t try {\n\t /* global ActiveXObject */\n\t activeXDocument$1 = document.domain && new ActiveXObject('htmlfile');\n\t } catch (error) { /* ignore */ }\n\t NullProtoObject$1 = activeXDocument$1 ? NullProtoObjectViaActiveX$1(activeXDocument$1) : NullProtoObjectViaIFrame$1();\n\t var length = enumBugKeys$1.length;\n\t while (length--) delete NullProtoObject$1[PROTOTYPE$3][enumBugKeys$1[length]];\n\t return NullProtoObject$1();\n\t};\n\n\thiddenKeys$2[IE_PROTO$2] = true;\n\n\t// `Object.create` method\n\t// https://tc39.github.io/ecma262/#sec-object.create\n\tvar objectCreate$1 = Object.create || function create(O, Properties) {\n\t var result;\n\t if (O !== null) {\n\t EmptyConstructor$1[PROTOTYPE$3] = anObject$1(O);\n\t result = new EmptyConstructor$1();\n\t EmptyConstructor$1[PROTOTYPE$3] = null;\n\t // add \"__proto__\" for Object.getPrototypeOf polyfill\n\t result[IE_PROTO$2] = O;\n\t } else result = NullProtoObject$1();\n\t return Properties === undefined ? result : objectDefineProperties$1(result, Properties);\n\t};\n\n\tvar UNSCOPABLES$1 = wellKnownSymbol$1('unscopables');\n\tvar ArrayPrototype$2 = Array.prototype;\n\n\t// Array.prototype[@@unscopables]\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\tif (ArrayPrototype$2[UNSCOPABLES$1] == undefined) {\n\t objectDefineProperty$1.f(ArrayPrototype$2, UNSCOPABLES$1, {\n\t configurable: true,\n\t value: objectCreate$1(null)\n\t });\n\t}\n\n\t// add a key to Array.prototype[@@unscopables]\n\tvar addToUnscopables$1 = function (key) {\n\t ArrayPrototype$2[UNSCOPABLES$1][key] = true;\n\t};\n\n\tvar $find$2 = arrayIteration$1.find;\n\n\n\n\tvar FIND$1 = 'find';\n\tvar SKIPS_HOLES$1 = true;\n\n\tvar USES_TO_LENGTH$b = arrayMethodUsesToLength$1(FIND$1);\n\n\t// Shouldn't skip holes\n\tif (FIND$1 in []) Array(1)[FIND$1](function () { SKIPS_HOLES$1 = false; });\n\n\t// `Array.prototype.find` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.find\n\t_export$1({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 || !USES_TO_LENGTH$b }, {\n\t find: function find(callbackfn /* , that = undefined */) {\n\t return $find$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables$1(FIND$1);\n\n\tvar iteratorClose = function (iterator) {\n\t var returnMethod = iterator['return'];\n\t if (returnMethod !== undefined) {\n\t return anObject$1(returnMethod.call(iterator)).value;\n\t }\n\t};\n\n\t// call something on iterator step with safe closing on error\n\tvar callWithSafeIterationClosing$1 = function (iterator, fn, value, ENTRIES) {\n\t try {\n\t return ENTRIES ? fn(anObject$1(value)[0], value[1]) : fn(value);\n\t // 7.4.6 IteratorClose(iterator, completion)\n\t } catch (error) {\n\t iteratorClose(iterator);\n\t throw error;\n\t }\n\t};\n\n\tvar iterators$1 = {};\n\n\tvar ITERATOR$9 = wellKnownSymbol$1('iterator');\n\tvar ArrayPrototype$3 = Array.prototype;\n\n\t// check on default Array iterator\n\tvar isArrayIteratorMethod$1 = function (it) {\n\t return it !== undefined && (iterators$1.Array === it || ArrayPrototype$3[ITERATOR$9] === it);\n\t};\n\n\tvar TO_STRING_TAG$5 = wellKnownSymbol$1('toStringTag');\n\tvar test$1 = {};\n\n\ttest$1[TO_STRING_TAG$5] = 'z';\n\n\tvar toStringTagSupport$1 = String(test$1) === '[object z]';\n\n\tvar TO_STRING_TAG$6 = wellKnownSymbol$1('toStringTag');\n\t// ES3 wrong here\n\tvar CORRECT_ARGUMENTS$1 = classofRaw$1(function () { return arguments; }()) == 'Arguments';\n\n\t// fallback for IE11 Script Access Denied error\n\tvar tryGet$1 = function (it, key) {\n\t try {\n\t return it[key];\n\t } catch (error) { /* empty */ }\n\t};\n\n\t// getting tag from ES6+ `Object.prototype.toString`\n\tvar classof$1 = toStringTagSupport$1 ? classofRaw$1 : function (it) {\n\t var O, tag, result;\n\t return it === undefined ? 'Undefined' : it === null ? 'Null'\n\t // @@toStringTag case\n\t : typeof (tag = tryGet$1(O = Object(it), TO_STRING_TAG$6)) == 'string' ? tag\n\t // builtinTag case\n\t : CORRECT_ARGUMENTS$1 ? classofRaw$1(O)\n\t // ES3 arguments fallback\n\t : (result = classofRaw$1(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n\t};\n\n\tvar ITERATOR$a = wellKnownSymbol$1('iterator');\n\n\tvar getIteratorMethod$1 = function (it) {\n\t if (it != undefined) return it[ITERATOR$a]\n\t || it['@@iterator']\n\t || iterators$1[classof$1(it)];\n\t};\n\n\t// `Array.from` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\tvar arrayFrom$1 = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n\t var O = toObject$1(arrayLike);\n\t var C = typeof this == 'function' ? this : Array;\n\t var argumentsLength = arguments.length;\n\t var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n\t var mapping = mapfn !== undefined;\n\t var iteratorMethod = getIteratorMethod$1(O);\n\t var index = 0;\n\t var length, result, step, iterator, next, value;\n\t if (mapping) mapfn = functionBindContext$1(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n\t // if the target is not iterable or it's an array with the default iterator - use a simple case\n\t if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod$1(iteratorMethod))) {\n\t iterator = iteratorMethod.call(O);\n\t next = iterator.next;\n\t result = new C();\n\t for (;!(step = next.call(iterator)).done; index++) {\n\t value = mapping ? callWithSafeIterationClosing$1(iterator, mapfn, [step.value, index], true) : step.value;\n\t createProperty$1(result, index, value);\n\t }\n\t } else {\n\t length = toLength$1(O.length);\n\t result = new C(length);\n\t for (;length > index; index++) {\n\t value = mapping ? mapfn(O[index], index) : O[index];\n\t createProperty$1(result, index, value);\n\t }\n\t }\n\t result.length = index;\n\t return result;\n\t};\n\n\tvar ITERATOR$b = wellKnownSymbol$1('iterator');\n\tvar SAFE_CLOSING$1 = false;\n\n\ttry {\n\t var called$1 = 0;\n\t var iteratorWithReturn$1 = {\n\t next: function () {\n\t return { done: !!called$1++ };\n\t },\n\t 'return': function () {\n\t SAFE_CLOSING$1 = true;\n\t }\n\t };\n\t iteratorWithReturn$1[ITERATOR$b] = function () {\n\t return this;\n\t };\n\t // eslint-disable-next-line no-throw-literal\n\t Array.from(iteratorWithReturn$1, function () { throw 2; });\n\t} catch (error) { /* empty */ }\n\n\tvar checkCorrectnessOfIteration$1 = function (exec, SKIP_CLOSING) {\n\t if (!SKIP_CLOSING && !SAFE_CLOSING$1) return false;\n\t var ITERATION_SUPPORT = false;\n\t try {\n\t var object = {};\n\t object[ITERATOR$b] = function () {\n\t return {\n\t next: function () {\n\t return { done: ITERATION_SUPPORT = true };\n\t }\n\t };\n\t };\n\t exec(object);\n\t } catch (error) { /* empty */ }\n\t return ITERATION_SUPPORT;\n\t};\n\n\tvar INCORRECT_ITERATION$2 = !checkCorrectnessOfIteration$1(function (iterable) {\n\t Array.from(iterable);\n\t});\n\n\t// `Array.from` method\n\t// https://tc39.github.io/ecma262/#sec-array.from\n\t_export$1({ target: 'Array', stat: true, forced: INCORRECT_ITERATION$2 }, {\n\t from: arrayFrom$1\n\t});\n\n\tvar $includes$2 = arrayIncludes$1.includes;\n\n\n\n\tvar USES_TO_LENGTH$c = arrayMethodUsesToLength$1('indexOf', { ACCESSORS: true, 1: 0 });\n\n\t// `Array.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n\t_export$1({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$c }, {\n\t includes: function includes(el /* , fromIndex = 0 */) {\n\t return $includes$2(this, el, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables$1('includes');\n\n\tvar correctPrototypeGetter$1 = !fails$1(function () {\n\t function F() { /* empty */ }\n\t F.prototype.constructor = null;\n\t return Object.getPrototypeOf(new F()) !== F.prototype;\n\t});\n\n\tvar IE_PROTO$3 = sharedKey$1('IE_PROTO');\n\tvar ObjectPrototype$4 = Object.prototype;\n\n\t// `Object.getPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.getprototypeof\n\tvar objectGetPrototypeOf$1 = correctPrototypeGetter$1 ? Object.getPrototypeOf : function (O) {\n\t O = toObject$1(O);\n\t if (has$2(O, IE_PROTO$3)) return O[IE_PROTO$3];\n\t if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n\t return O.constructor.prototype;\n\t } return O instanceof Object ? ObjectPrototype$4 : null;\n\t};\n\n\tvar ITERATOR$c = wellKnownSymbol$1('iterator');\n\tvar BUGGY_SAFARI_ITERATORS$2 = false;\n\n\tvar returnThis$3 = function () { return this; };\n\n\t// `%IteratorPrototype%` object\n\t// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\n\tvar IteratorPrototype$3, PrototypeOfArrayIteratorPrototype$1, arrayIterator$1;\n\n\tif ([].keys) {\n\t arrayIterator$1 = [].keys();\n\t // Safari 8 has buggy iterators w/o `next`\n\t if (!('next' in arrayIterator$1)) BUGGY_SAFARI_ITERATORS$2 = true;\n\t else {\n\t PrototypeOfArrayIteratorPrototype$1 = objectGetPrototypeOf$1(objectGetPrototypeOf$1(arrayIterator$1));\n\t if (PrototypeOfArrayIteratorPrototype$1 !== Object.prototype) IteratorPrototype$3 = PrototypeOfArrayIteratorPrototype$1;\n\t }\n\t}\n\n\tif (IteratorPrototype$3 == undefined) IteratorPrototype$3 = {};\n\n\t// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n\tif ( !has$2(IteratorPrototype$3, ITERATOR$c)) {\n\t createNonEnumerableProperty$1(IteratorPrototype$3, ITERATOR$c, returnThis$3);\n\t}\n\n\tvar iteratorsCore$1 = {\n\t IteratorPrototype: IteratorPrototype$3,\n\t BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS$2\n\t};\n\n\tvar defineProperty$b = objectDefineProperty$1.f;\n\n\n\n\tvar TO_STRING_TAG$7 = wellKnownSymbol$1('toStringTag');\n\n\tvar setToStringTag$1 = function (it, TAG, STATIC) {\n\t if (it && !has$2(it = STATIC ? it : it.prototype, TO_STRING_TAG$7)) {\n\t defineProperty$b(it, TO_STRING_TAG$7, { configurable: true, value: TAG });\n\t }\n\t};\n\n\tvar IteratorPrototype$4 = iteratorsCore$1.IteratorPrototype;\n\n\n\n\n\n\tvar returnThis$4 = function () { return this; };\n\n\tvar createIteratorConstructor$1 = function (IteratorConstructor, NAME, next) {\n\t var TO_STRING_TAG = NAME + ' Iterator';\n\t IteratorConstructor.prototype = objectCreate$1(IteratorPrototype$4, { next: createPropertyDescriptor$1(1, next) });\n\t setToStringTag$1(IteratorConstructor, TO_STRING_TAG, false);\n\t iterators$1[TO_STRING_TAG] = returnThis$4;\n\t return IteratorConstructor;\n\t};\n\n\tvar aPossiblePrototype$1 = function (it) {\n\t if (!isObject$2(it) && it !== null) {\n\t throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n\t } return it;\n\t};\n\n\t// `Object.setPrototypeOf` method\n\t// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n\t// Works with __proto__ only. Old v8 can't work with null proto objects.\n\t/* eslint-disable no-proto */\n\tvar objectSetPrototypeOf$1 = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n\t var CORRECT_SETTER = false;\n\t var test = {};\n\t var setter;\n\t try {\n\t setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n\t setter.call(test, []);\n\t CORRECT_SETTER = test instanceof Array;\n\t } catch (error) { /* empty */ }\n\t return function setPrototypeOf(O, proto) {\n\t anObject$1(O);\n\t aPossiblePrototype$1(proto);\n\t if (CORRECT_SETTER) setter.call(O, proto);\n\t else O.__proto__ = proto;\n\t return O;\n\t };\n\t}() : undefined);\n\n\tvar IteratorPrototype$5 = iteratorsCore$1.IteratorPrototype;\n\tvar BUGGY_SAFARI_ITERATORS$3 = iteratorsCore$1.BUGGY_SAFARI_ITERATORS;\n\tvar ITERATOR$d = wellKnownSymbol$1('iterator');\n\tvar KEYS$1 = 'keys';\n\tvar VALUES$1 = 'values';\n\tvar ENTRIES$1 = 'entries';\n\n\tvar returnThis$5 = function () { return this; };\n\n\tvar defineIterator$1 = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n\t createIteratorConstructor$1(IteratorConstructor, NAME, next);\n\n\t var getIterationMethod = function (KIND) {\n\t if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n\t if (!BUGGY_SAFARI_ITERATORS$3 && KIND in IterablePrototype) return IterablePrototype[KIND];\n\t switch (KIND) {\n\t case KEYS$1: return function keys() { return new IteratorConstructor(this, KIND); };\n\t case VALUES$1: return function values() { return new IteratorConstructor(this, KIND); };\n\t case ENTRIES$1: return function entries() { return new IteratorConstructor(this, KIND); };\n\t } return function () { return new IteratorConstructor(this); };\n\t };\n\n\t var TO_STRING_TAG = NAME + ' Iterator';\n\t var INCORRECT_VALUES_NAME = false;\n\t var IterablePrototype = Iterable.prototype;\n\t var nativeIterator = IterablePrototype[ITERATOR$d]\n\t || IterablePrototype['@@iterator']\n\t || DEFAULT && IterablePrototype[DEFAULT];\n\t var defaultIterator = !BUGGY_SAFARI_ITERATORS$3 && nativeIterator || getIterationMethod(DEFAULT);\n\t var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n\t var CurrentIteratorPrototype, methods, KEY;\n\n\t // fix native\n\t if (anyNativeIterator) {\n\t CurrentIteratorPrototype = objectGetPrototypeOf$1(anyNativeIterator.call(new Iterable()));\n\t if (IteratorPrototype$5 !== Object.prototype && CurrentIteratorPrototype.next) {\n\t if ( objectGetPrototypeOf$1(CurrentIteratorPrototype) !== IteratorPrototype$5) {\n\t if (objectSetPrototypeOf$1) {\n\t objectSetPrototypeOf$1(CurrentIteratorPrototype, IteratorPrototype$5);\n\t } else if (typeof CurrentIteratorPrototype[ITERATOR$d] != 'function') {\n\t createNonEnumerableProperty$1(CurrentIteratorPrototype, ITERATOR$d, returnThis$5);\n\t }\n\t }\n\t // Set @@toStringTag to native iterators\n\t setToStringTag$1(CurrentIteratorPrototype, TO_STRING_TAG, true);\n\t }\n\t }\n\n\t // fix Array#{values, @@iterator}.name in V8 / FF\n\t if (DEFAULT == VALUES$1 && nativeIterator && nativeIterator.name !== VALUES$1) {\n\t INCORRECT_VALUES_NAME = true;\n\t defaultIterator = function values() { return nativeIterator.call(this); };\n\t }\n\n\t // define iterator\n\t if ( IterablePrototype[ITERATOR$d] !== defaultIterator) {\n\t createNonEnumerableProperty$1(IterablePrototype, ITERATOR$d, defaultIterator);\n\t }\n\t iterators$1[NAME] = defaultIterator;\n\n\t // export additional methods\n\t if (DEFAULT) {\n\t methods = {\n\t values: getIterationMethod(VALUES$1),\n\t keys: IS_SET ? defaultIterator : getIterationMethod(KEYS$1),\n\t entries: getIterationMethod(ENTRIES$1)\n\t };\n\t if (FORCED) for (KEY in methods) {\n\t if (BUGGY_SAFARI_ITERATORS$3 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n\t redefine$1(IterablePrototype, KEY, methods[KEY]);\n\t }\n\t } else _export$1({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$3 || INCORRECT_VALUES_NAME }, methods);\n\t }\n\n\t return methods;\n\t};\n\n\tvar ARRAY_ITERATOR$1 = 'Array Iterator';\n\tvar setInternalState$9 = internalState$1.set;\n\tvar getInternalState$5 = internalState$1.getterFor(ARRAY_ITERATOR$1);\n\n\t// `Array.prototype.entries` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n\t// `Array.prototype.keys` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n\t// `Array.prototype.values` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.values\n\t// `Array.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n\t// `CreateArrayIterator` internal method\n\t// https://tc39.github.io/ecma262/#sec-createarrayiterator\n\tvar es_array_iterator$1 = defineIterator$1(Array, 'Array', function (iterated, kind) {\n\t setInternalState$9(this, {\n\t type: ARRAY_ITERATOR$1,\n\t target: toIndexedObject$1(iterated), // target\n\t index: 0, // next index\n\t kind: kind // kind\n\t });\n\t// `%ArrayIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n\t}, function () {\n\t var state = getInternalState$5(this);\n\t var target = state.target;\n\t var kind = state.kind;\n\t var index = state.index++;\n\t if (!target || index >= target.length) {\n\t state.target = undefined;\n\t return { value: undefined, done: true };\n\t }\n\t if (kind == 'keys') return { value: index, done: false };\n\t if (kind == 'values') return { value: target[index], done: false };\n\t return { value: [index, target[index]], done: false };\n\t}, 'values');\n\n\t// argumentsList[@@iterator] is %ArrayProto_values%\n\t// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n\t// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\n\titerators$1.Arguments = iterators$1.Array;\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables$1('keys');\n\taddToUnscopables$1('values');\n\taddToUnscopables$1('entries');\n\n\tvar arrayMethodIsStrict$1 = function (METHOD_NAME, argument) {\n\t var method = [][METHOD_NAME];\n\t return !!method && fails$1(function () {\n\t // eslint-disable-next-line no-useless-call,no-throw-literal\n\t method.call(null, argument || function () { throw 1; }, 1);\n\t });\n\t};\n\n\tvar nativeJoin$1 = [].join;\n\n\tvar ES3_STRINGS$1 = indexedObject$1 != Object;\n\tvar STRICT_METHOD$5 = arrayMethodIsStrict$1('join', ',');\n\n\t// `Array.prototype.join` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.join\n\t_export$1({ target: 'Array', proto: true, forced: ES3_STRINGS$1 || !STRICT_METHOD$5 }, {\n\t join: function join(separator) {\n\t return nativeJoin$1.call(toIndexedObject$1(this), separator === undefined ? ',' : separator);\n\t }\n\t});\n\n\tvar $map$2 = arrayIteration$1.map;\n\n\n\n\tvar HAS_SPECIES_SUPPORT$5 = arrayMethodHasSpeciesSupport$1('map');\n\t// FF49- issue\n\tvar USES_TO_LENGTH$d = arrayMethodUsesToLength$1('map');\n\n\t// `Array.prototype.map` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.map\n\t// with adding support of @@species\n\t_export$1({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$5 || !USES_TO_LENGTH$d }, {\n\t map: function map(callbackfn /* , thisArg */) {\n\t return $map$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// makes subclassing work correct for wrapped built-ins\n\tvar inheritIfRequired$1 = function ($this, dummy, Wrapper) {\n\t var NewTarget, NewTargetPrototype;\n\t if (\n\t // it can work only with native `setPrototypeOf`\n\t objectSetPrototypeOf$1 &&\n\t // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n\t typeof (NewTarget = dummy.constructor) == 'function' &&\n\t NewTarget !== Wrapper &&\n\t isObject$2(NewTargetPrototype = NewTarget.prototype) &&\n\t NewTargetPrototype !== Wrapper.prototype\n\t ) objectSetPrototypeOf$1($this, NewTargetPrototype);\n\t return $this;\n\t};\n\n\t// a string of all valid unicode whitespaces\n\t// eslint-disable-next-line max-len\n\tvar whitespaces$1 = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n\tvar whitespace$1 = '[' + whitespaces$1 + ']';\n\tvar ltrim$1 = RegExp('^' + whitespace$1 + whitespace$1 + '*');\n\tvar rtrim$1 = RegExp(whitespace$1 + whitespace$1 + '*$');\n\n\t// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\n\tvar createMethod$8 = function (TYPE) {\n\t return function ($this) {\n\t var string = String(requireObjectCoercible$1($this));\n\t if (TYPE & 1) string = string.replace(ltrim$1, '');\n\t if (TYPE & 2) string = string.replace(rtrim$1, '');\n\t return string;\n\t };\n\t};\n\n\tvar stringTrim$1 = {\n\t // `String.prototype.{ trimLeft, trimStart }` methods\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n\t start: createMethod$8(1),\n\t // `String.prototype.{ trimRight, trimEnd }` methods\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n\t end: createMethod$8(2),\n\t // `String.prototype.trim` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t trim: createMethod$8(3)\n\t};\n\n\tvar getOwnPropertyNames$3 = objectGetOwnPropertyNames$1.f;\n\tvar getOwnPropertyDescriptor$6 = objectGetOwnPropertyDescriptor$1.f;\n\tvar defineProperty$c = objectDefineProperty$1.f;\n\tvar trim$1 = stringTrim$1.trim;\n\n\tvar NUMBER$1 = 'Number';\n\tvar NativeNumber$1 = global_1$1[NUMBER$1];\n\tvar NumberPrototype$1 = NativeNumber$1.prototype;\n\n\t// Opera ~12 has broken Object#toString\n\tvar BROKEN_CLASSOF$1 = classofRaw$1(objectCreate$1(NumberPrototype$1)) == NUMBER$1;\n\n\t// `ToNumber` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-tonumber\n\tvar toNumber$1 = function (argument) {\n\t var it = toPrimitive$1(argument, false);\n\t var first, third, radix, maxCode, digits, length, index, code;\n\t if (typeof it == 'string' && it.length > 2) {\n\t it = trim$1(it);\n\t first = it.charCodeAt(0);\n\t if (first === 43 || first === 45) {\n\t third = it.charCodeAt(2);\n\t if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n\t } else if (first === 48) {\n\t switch (it.charCodeAt(1)) {\n\t case 66: case 98: radix = 2; maxCode = 49; break; // fast equal of /^0b[01]+$/i\n\t case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n\t default: return +it;\n\t }\n\t digits = it.slice(2);\n\t length = digits.length;\n\t for (index = 0; index < length; index++) {\n\t code = digits.charCodeAt(index);\n\t // parseInt parses a string to a first unavailable symbol\n\t // but ToNumber should return NaN if a string contains unavailable symbols\n\t if (code < 48 || code > maxCode) return NaN;\n\t } return parseInt(digits, radix);\n\t }\n\t } return +it;\n\t};\n\n\t// `Number` constructor\n\t// https://tc39.github.io/ecma262/#sec-number-constructor\n\tif (isForced_1$1(NUMBER$1, !NativeNumber$1(' 0o1') || !NativeNumber$1('0b1') || NativeNumber$1('+0x1'))) {\n\t var NumberWrapper$1 = function Number(value) {\n\t var it = arguments.length < 1 ? 0 : value;\n\t var dummy = this;\n\t return dummy instanceof NumberWrapper$1\n\t // check on 1..constructor(foo) case\n\t && (BROKEN_CLASSOF$1 ? fails$1(function () { NumberPrototype$1.valueOf.call(dummy); }) : classofRaw$1(dummy) != NUMBER$1)\n\t ? inheritIfRequired$1(new NativeNumber$1(toNumber$1(it)), dummy, NumberWrapper$1) : toNumber$1(it);\n\t };\n\t for (var keys$5 = descriptors$1 ? getOwnPropertyNames$3(NativeNumber$1) : (\n\t // ES3:\n\t 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n\t // ES2015 (in case, if modules with ES2015 Number statics required before):\n\t 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n\t 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n\t ).split(','), j$2 = 0, key$2; keys$5.length > j$2; j$2++) {\n\t if (has$2(NativeNumber$1, key$2 = keys$5[j$2]) && !has$2(NumberWrapper$1, key$2)) {\n\t defineProperty$c(NumberWrapper$1, key$2, getOwnPropertyDescriptor$6(NativeNumber$1, key$2));\n\t }\n\t }\n\t NumberWrapper$1.prototype = NumberPrototype$1;\n\t NumberPrototype$1.constructor = NumberWrapper$1;\n\t redefine$1(global_1$1, NUMBER$1, NumberWrapper$1);\n\t}\n\n\tvar FAILS_ON_PRIMITIVES$2 = fails$1(function () { objectKeys$1(1); });\n\n\t// `Object.keys` method\n\t// https://tc39.github.io/ecma262/#sec-object.keys\n\t_export$1({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES$2 }, {\n\t keys: function keys(it) {\n\t return objectKeys$1(toObject$1(it));\n\t }\n\t});\n\n\t// `Object.prototype.toString` method implementation\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tvar objectToString$1 = toStringTagSupport$1 ? {}.toString : function toString() {\n\t return '[object ' + classof$1(this) + ']';\n\t};\n\n\t// `Object.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n\tif (!toStringTagSupport$1) {\n\t redefine$1(Object.prototype, 'toString', objectToString$1, { unsafe: true });\n\t}\n\n\tvar propertyIsEnumerable$1 = objectPropertyIsEnumerable$1.f;\n\n\t// `Object.{ entries, values }` methods implementation\n\tvar createMethod$9 = function (TO_ENTRIES) {\n\t return function (it) {\n\t var O = toIndexedObject$1(it);\n\t var keys = objectKeys$1(O);\n\t var length = keys.length;\n\t var i = 0;\n\t var result = [];\n\t var key;\n\t while (length > i) {\n\t key = keys[i++];\n\t if (!descriptors$1 || propertyIsEnumerable$1.call(O, key)) {\n\t result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n\t }\n\t }\n\t return result;\n\t };\n\t};\n\n\tvar objectToArray$1 = {\n\t // `Object.entries` method\n\t // https://tc39.github.io/ecma262/#sec-object.entries\n\t entries: createMethod$9(true),\n\t // `Object.values` method\n\t // https://tc39.github.io/ecma262/#sec-object.values\n\t values: createMethod$9(false)\n\t};\n\n\tvar $values = objectToArray$1.values;\n\n\t// `Object.values` method\n\t// https://tc39.github.io/ecma262/#sec-object.values\n\t_export$1({ target: 'Object', stat: true }, {\n\t values: function values(O) {\n\t return $values(O);\n\t }\n\t});\n\n\t// `RegExp.prototype.flags` getter implementation\n\t// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n\tvar regexpFlags$1 = function () {\n\t var that = anObject$1(this);\n\t var result = '';\n\t if (that.global) result += 'g';\n\t if (that.ignoreCase) result += 'i';\n\t if (that.multiline) result += 'm';\n\t if (that.dotAll) result += 's';\n\t if (that.unicode) result += 'u';\n\t if (that.sticky) result += 'y';\n\t return result;\n\t};\n\n\t// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n\t// so we use an intermediate function.\n\tfunction RE$1(s, f) {\n\t return RegExp(s, f);\n\t}\n\n\tvar UNSUPPORTED_Y$3 = fails$1(function () {\n\t // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n\t var re = RE$1('a', 'y');\n\t re.lastIndex = 2;\n\t return re.exec('abcd') != null;\n\t});\n\n\tvar BROKEN_CARET$1 = fails$1(function () {\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n\t var re = RE$1('^r', 'gy');\n\t re.lastIndex = 2;\n\t return re.exec('str') != null;\n\t});\n\n\tvar regexpStickyHelpers$1 = {\n\t\tUNSUPPORTED_Y: UNSUPPORTED_Y$3,\n\t\tBROKEN_CARET: BROKEN_CARET$1\n\t};\n\n\tvar nativeExec$1 = RegExp.prototype.exec;\n\t// This always refers to the native implementation, because the\n\t// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n\t// which loads this file before patching the method.\n\tvar nativeReplace$1 = String.prototype.replace;\n\n\tvar patchedExec$1 = nativeExec$1;\n\n\tvar UPDATES_LAST_INDEX_WRONG$1 = (function () {\n\t var re1 = /a/;\n\t var re2 = /b*/g;\n\t nativeExec$1.call(re1, 'a');\n\t nativeExec$1.call(re2, 'a');\n\t return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n\t})();\n\n\tvar UNSUPPORTED_Y$4 = regexpStickyHelpers$1.UNSUPPORTED_Y || regexpStickyHelpers$1.BROKEN_CARET;\n\n\t// nonparticipating capturing group, copied from es5-shim's String#split patch.\n\tvar NPCG_INCLUDED$1 = /()??/.exec('')[1] !== undefined;\n\n\tvar PATCH$1 = UPDATES_LAST_INDEX_WRONG$1 || NPCG_INCLUDED$1 || UNSUPPORTED_Y$4;\n\n\tif (PATCH$1) {\n\t patchedExec$1 = function exec(str) {\n\t var re = this;\n\t var lastIndex, reCopy, match, i;\n\t var sticky = UNSUPPORTED_Y$4 && re.sticky;\n\t var flags = regexpFlags$1.call(re);\n\t var source = re.source;\n\t var charsAdded = 0;\n\t var strCopy = str;\n\n\t if (sticky) {\n\t flags = flags.replace('y', '');\n\t if (flags.indexOf('g') === -1) {\n\t flags += 'g';\n\t }\n\n\t strCopy = String(str).slice(re.lastIndex);\n\t // Support anchored sticky behavior.\n\t if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n\t source = '(?: ' + source + ')';\n\t strCopy = ' ' + strCopy;\n\t charsAdded++;\n\t }\n\t // ^(? + rx + ) is needed, in combination with some str slicing, to\n\t // simulate the 'y' flag.\n\t reCopy = new RegExp('^(?:' + source + ')', flags);\n\t }\n\n\t if (NPCG_INCLUDED$1) {\n\t reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n\t }\n\t if (UPDATES_LAST_INDEX_WRONG$1) lastIndex = re.lastIndex;\n\n\t match = nativeExec$1.call(sticky ? reCopy : re, strCopy);\n\n\t if (sticky) {\n\t if (match) {\n\t match.input = match.input.slice(charsAdded);\n\t match[0] = match[0].slice(charsAdded);\n\t match.index = re.lastIndex;\n\t re.lastIndex += match[0].length;\n\t } else re.lastIndex = 0;\n\t } else if (UPDATES_LAST_INDEX_WRONG$1 && match) {\n\t re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n\t }\n\t if (NPCG_INCLUDED$1 && match && match.length > 1) {\n\t // Fix browsers whose `exec` methods don't consistently return `undefined`\n\t // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n\t nativeReplace$1.call(match[0], reCopy, function () {\n\t for (i = 1; i < arguments.length - 2; i++) {\n\t if (arguments[i] === undefined) match[i] = undefined;\n\t }\n\t });\n\t }\n\n\t return match;\n\t };\n\t}\n\n\tvar regexpExec$1 = patchedExec$1;\n\n\t_export$1({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec$1 }, {\n\t exec: regexpExec$1\n\t});\n\n\tvar TO_STRING$1 = 'toString';\n\tvar RegExpPrototype$2 = RegExp.prototype;\n\tvar nativeToString$1 = RegExpPrototype$2[TO_STRING$1];\n\n\tvar NOT_GENERIC$1 = fails$1(function () { return nativeToString$1.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n\t// FF44- RegExp#toString has a wrong name\n\tvar INCORRECT_NAME$1 = nativeToString$1.name != TO_STRING$1;\n\n\t// `RegExp.prototype.toString` method\n\t// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\n\tif (NOT_GENERIC$1 || INCORRECT_NAME$1) {\n\t redefine$1(RegExp.prototype, TO_STRING$1, function toString() {\n\t var R = anObject$1(this);\n\t var p = String(R.source);\n\t var rf = R.flags;\n\t var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype$2) ? regexpFlags$1.call(R) : rf);\n\t return '/' + p + '/' + f;\n\t }, { unsafe: true });\n\t}\n\n\tvar MATCH$3 = wellKnownSymbol$1('match');\n\n\t// `IsRegExp` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-isregexp\n\tvar isRegexp$1 = function (it) {\n\t var isRegExp;\n\t return isObject$2(it) && ((isRegExp = it[MATCH$3]) !== undefined ? !!isRegExp : classofRaw$1(it) == 'RegExp');\n\t};\n\n\tvar notARegexp$1 = function (it) {\n\t if (isRegexp$1(it)) {\n\t throw TypeError(\"The method doesn't accept regular expressions\");\n\t } return it;\n\t};\n\n\tvar MATCH$4 = wellKnownSymbol$1('match');\n\n\tvar correctIsRegexpLogic$1 = function (METHOD_NAME) {\n\t var regexp = /./;\n\t try {\n\t '/./'[METHOD_NAME](regexp);\n\t } catch (error1) {\n\t try {\n\t regexp[MATCH$4] = false;\n\t return '/./'[METHOD_NAME](regexp);\n\t } catch (error2) { /* empty */ }\n\t } return false;\n\t};\n\n\t// `String.prototype.includes` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n\t_export$1({ target: 'String', proto: true, forced: !correctIsRegexpLogic$1('includes') }, {\n\t includes: function includes(searchString /* , position = 0 */) {\n\t return !!~String(requireObjectCoercible$1(this))\n\t .indexOf(notARegexp$1(searchString), arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// `String.prototype.{ codePointAt, at }` methods implementation\n\tvar createMethod$a = function (CONVERT_TO_STRING) {\n\t return function ($this, pos) {\n\t var S = String(requireObjectCoercible$1($this));\n\t var position = toInteger$1(pos);\n\t var size = S.length;\n\t var first, second;\n\t if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n\t first = S.charCodeAt(position);\n\t return first < 0xD800 || first > 0xDBFF || position + 1 === size\n\t || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n\t ? CONVERT_TO_STRING ? S.charAt(position) : first\n\t : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n\t };\n\t};\n\n\tvar stringMultibyte$1 = {\n\t // `String.prototype.codePointAt` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n\t codeAt: createMethod$a(false),\n\t // `String.prototype.at` method\n\t // https://github.com/mathiasbynens/String.prototype.at\n\t charAt: createMethod$a(true)\n\t};\n\n\tvar charAt$2 = stringMultibyte$1.charAt;\n\n\n\n\tvar STRING_ITERATOR$1 = 'String Iterator';\n\tvar setInternalState$a = internalState$1.set;\n\tvar getInternalState$6 = internalState$1.getterFor(STRING_ITERATOR$1);\n\n\t// `String.prototype[@@iterator]` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\n\tdefineIterator$1(String, 'String', function (iterated) {\n\t setInternalState$a(this, {\n\t type: STRING_ITERATOR$1,\n\t string: String(iterated),\n\t index: 0\n\t });\n\t// `%StringIteratorPrototype%.next` method\n\t// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n\t}, function next() {\n\t var state = getInternalState$6(this);\n\t var string = state.string;\n\t var index = state.index;\n\t var point;\n\t if (index >= string.length) return { value: undefined, done: true };\n\t point = charAt$2(string, index);\n\t state.index += point.length;\n\t return { value: point, done: false };\n\t});\n\n\t// TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\n\n\n\n\n\tvar SPECIES$9 = wellKnownSymbol$1('species');\n\n\tvar REPLACE_SUPPORTS_NAMED_GROUPS$1 = !fails$1(function () {\n\t // #replace needs built-in support for named groups.\n\t // #match works fine because it just return the exec results, even if it has\n\t // a \"grops\" property.\n\t var re = /./;\n\t re.exec = function () {\n\t var result = [];\n\t result.groups = { a: '7' };\n\t return result;\n\t };\n\t return ''.replace(re, '$<a>') !== '7';\n\t});\n\n\t// IE <= 11 replaces $0 with the whole match, as if it was $&\n\t// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\n\tvar REPLACE_KEEPS_$0$1 = (function () {\n\t return 'a'.replace(/./, '$0') === '$0';\n\t})();\n\n\tvar REPLACE$1 = wellKnownSymbol$1('replace');\n\t// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\n\tvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE$1 = (function () {\n\t if (/./[REPLACE$1]) {\n\t return /./[REPLACE$1]('a', '$0') === '';\n\t }\n\t return false;\n\t})();\n\n\t// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n\t// Weex JS has frozen built-in prototypes, so use try / catch wrapper\n\tvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC$1 = !fails$1(function () {\n\t var re = /(?:)/;\n\t var originalExec = re.exec;\n\t re.exec = function () { return originalExec.apply(this, arguments); };\n\t var result = 'ab'.split(re);\n\t return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n\t});\n\n\tvar fixRegexpWellKnownSymbolLogic$1 = function (KEY, length, exec, sham) {\n\t var SYMBOL = wellKnownSymbol$1(KEY);\n\n\t var DELEGATES_TO_SYMBOL = !fails$1(function () {\n\t // String methods call symbol-named RegEp methods\n\t var O = {};\n\t O[SYMBOL] = function () { return 7; };\n\t return ''[KEY](O) != 7;\n\t });\n\n\t var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails$1(function () {\n\t // Symbol-named RegExp methods call .exec\n\t var execCalled = false;\n\t var re = /a/;\n\n\t if (KEY === 'split') {\n\t // We can't use real regex here since it causes deoptimization\n\t // and serious performance degradation in V8\n\t // https://github.com/zloirock/core-js/issues/306\n\t re = {};\n\t // RegExp[@@split] doesn't call the regex's exec method, but first creates\n\t // a new one. We need to return the patched regex when creating the new one.\n\t re.constructor = {};\n\t re.constructor[SPECIES$9] = function () { return re; };\n\t re.flags = '';\n\t re[SYMBOL] = /./[SYMBOL];\n\t }\n\n\t re.exec = function () { execCalled = true; return null; };\n\n\t re[SYMBOL]('');\n\t return !execCalled;\n\t });\n\n\t if (\n\t !DELEGATES_TO_SYMBOL ||\n\t !DELEGATES_TO_EXEC ||\n\t (KEY === 'replace' && !(\n\t REPLACE_SUPPORTS_NAMED_GROUPS$1 &&\n\t REPLACE_KEEPS_$0$1 &&\n\t !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE$1\n\t )) ||\n\t (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC$1)\n\t ) {\n\t var nativeRegExpMethod = /./[SYMBOL];\n\t var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n\t if (regexp.exec === regexpExec$1) {\n\t if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n\t // The native String method already delegates to @@method (this\n\t // polyfilled function), leasing to infinite recursion.\n\t // We avoid it by directly calling the native @@method method.\n\t return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n\t }\n\t return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n\t }\n\t return { done: false };\n\t }, {\n\t REPLACE_KEEPS_$0: REPLACE_KEEPS_$0$1,\n\t REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE$1\n\t });\n\t var stringMethod = methods[0];\n\t var regexMethod = methods[1];\n\n\t redefine$1(String.prototype, KEY, stringMethod);\n\t redefine$1(RegExp.prototype, SYMBOL, length == 2\n\t // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n\t // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n\t ? function (string, arg) { return regexMethod.call(string, this, arg); }\n\t // 21.2.5.6 RegExp.prototype[@@match](string)\n\t // 21.2.5.9 RegExp.prototype[@@search](string)\n\t : function (string) { return regexMethod.call(string, this); }\n\t );\n\t }\n\n\t if (sham) createNonEnumerableProperty$1(RegExp.prototype[SYMBOL], 'sham', true);\n\t};\n\n\t// `SameValue` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-samevalue\n\tvar sameValue$1 = Object.is || function is(x, y) {\n\t // eslint-disable-next-line no-self-compare\n\t return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n\t};\n\n\t// `RegExpExec` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-regexpexec\n\tvar regexpExecAbstract$1 = function (R, S) {\n\t var exec = R.exec;\n\t if (typeof exec === 'function') {\n\t var result = exec.call(R, S);\n\t if (typeof result !== 'object') {\n\t throw TypeError('RegExp exec method returned something other than an Object or null');\n\t }\n\t return result;\n\t }\n\n\t if (classofRaw$1(R) !== 'RegExp') {\n\t throw TypeError('RegExp#exec called on incompatible receiver');\n\t }\n\n\t return regexpExec$1.call(R, S);\n\t};\n\n\t// @@search logic\n\tfixRegexpWellKnownSymbolLogic$1('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n\t return [\n\t // `String.prototype.search` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.search\n\t function search(regexp) {\n\t var O = requireObjectCoercible$1(this);\n\t var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n\t return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n\t },\n\t // `RegExp.prototype[@@search]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n\t function (regexp) {\n\t var res = maybeCallNative(nativeSearch, regexp, this);\n\t if (res.done) return res.value;\n\n\t var rx = anObject$1(regexp);\n\t var S = String(this);\n\n\t var previousLastIndex = rx.lastIndex;\n\t if (!sameValue$1(previousLastIndex, 0)) rx.lastIndex = 0;\n\t var result = regexpExecAbstract$1(rx, S);\n\t if (!sameValue$1(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n\t return result === null ? -1 : result.index;\n\t }\n\t ];\n\t});\n\n\tvar redefineAll$1 = function (target, src, options) {\n\t for (var key in src) redefine$1(target, key, src[key], options);\n\t return target;\n\t};\n\n\tvar freezing$1 = !fails$1(function () {\n\t return Object.isExtensible(Object.preventExtensions({}));\n\t});\n\n\tvar internalMetadata$1 = createCommonjsModule(function (module) {\n\tvar defineProperty = objectDefineProperty$1.f;\n\n\n\n\tvar METADATA = uid$1('meta');\n\tvar id = 0;\n\n\tvar isExtensible = Object.isExtensible || function () {\n\t return true;\n\t};\n\n\tvar setMetadata = function (it) {\n\t defineProperty(it, METADATA, { value: {\n\t objectID: 'O' + ++id, // object ID\n\t weakData: {} // weak collections IDs\n\t } });\n\t};\n\n\tvar fastKey = function (it, create) {\n\t // return a primitive with prefix\n\t if (!isObject$2(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n\t if (!has$2(it, METADATA)) {\n\t // can't set metadata to uncaught frozen object\n\t if (!isExtensible(it)) return 'F';\n\t // not necessary to add metadata\n\t if (!create) return 'E';\n\t // add missing metadata\n\t setMetadata(it);\n\t // return object ID\n\t } return it[METADATA].objectID;\n\t};\n\n\tvar getWeakData = function (it, create) {\n\t if (!has$2(it, METADATA)) {\n\t // can't set metadata to uncaught frozen object\n\t if (!isExtensible(it)) return true;\n\t // not necessary to add metadata\n\t if (!create) return false;\n\t // add missing metadata\n\t setMetadata(it);\n\t // return the store of weak collections IDs\n\t } return it[METADATA].weakData;\n\t};\n\n\t// add metadata on freeze-family methods calling\n\tvar onFreeze = function (it) {\n\t if (freezing$1 && meta.REQUIRED && isExtensible(it) && !has$2(it, METADATA)) setMetadata(it);\n\t return it;\n\t};\n\n\tvar meta = module.exports = {\n\t REQUIRED: false,\n\t fastKey: fastKey,\n\t getWeakData: getWeakData,\n\t onFreeze: onFreeze\n\t};\n\n\thiddenKeys$2[METADATA] = true;\n\t});\n\tvar internalMetadata_1$1 = internalMetadata$1.REQUIRED;\n\tvar internalMetadata_2$1 = internalMetadata$1.fastKey;\n\tvar internalMetadata_3$1 = internalMetadata$1.getWeakData;\n\tvar internalMetadata_4$1 = internalMetadata$1.onFreeze;\n\n\tvar Result = function (stopped, result) {\n\t this.stopped = stopped;\n\t this.result = result;\n\t};\n\n\tvar iterate = function (iterable, unboundFunction, options) {\n\t var that = options && options.that;\n\t var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n\t var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n\t var INTERRUPTED = !!(options && options.INTERRUPTED);\n\t var fn = functionBindContext$1(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n\t var iterator, iterFn, index, length, result, next, step;\n\n\t var stop = function (condition) {\n\t if (iterator) iteratorClose(iterator);\n\t return new Result(true, condition);\n\t };\n\n\t var callFn = function (value) {\n\t if (AS_ENTRIES) {\n\t anObject$1(value);\n\t return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n\t } return INTERRUPTED ? fn(value, stop) : fn(value);\n\t };\n\n\t if (IS_ITERATOR) {\n\t iterator = iterable;\n\t } else {\n\t iterFn = getIteratorMethod$1(iterable);\n\t if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n\t // optimisation for array iterators\n\t if (isArrayIteratorMethod$1(iterFn)) {\n\t for (index = 0, length = toLength$1(iterable.length); length > index; index++) {\n\t result = callFn(iterable[index]);\n\t if (result && result instanceof Result) return result;\n\t } return new Result(false);\n\t }\n\t iterator = iterFn.call(iterable);\n\t }\n\n\t next = iterator.next;\n\t while (!(step = next.call(iterator)).done) {\n\t try {\n\t result = callFn(step.value);\n\t } catch (error) {\n\t iteratorClose(iterator);\n\t throw error;\n\t }\n\t if (typeof result == 'object' && result && result instanceof Result) return result;\n\t } return new Result(false);\n\t};\n\n\tvar anInstance$1 = function (it, Constructor, name) {\n\t if (!(it instanceof Constructor)) {\n\t throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n\t } return it;\n\t};\n\n\tvar collection$1 = function (CONSTRUCTOR_NAME, wrapper, common) {\n\t var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n\t var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n\t var ADDER = IS_MAP ? 'set' : 'add';\n\t var NativeConstructor = global_1$1[CONSTRUCTOR_NAME];\n\t var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n\t var Constructor = NativeConstructor;\n\t var exported = {};\n\n\t var fixMethod = function (KEY) {\n\t var nativeMethod = NativePrototype[KEY];\n\t redefine$1(NativePrototype, KEY,\n\t KEY == 'add' ? function add(value) {\n\t nativeMethod.call(this, value === 0 ? 0 : value);\n\t return this;\n\t } : KEY == 'delete' ? function (key) {\n\t return IS_WEAK && !isObject$2(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : KEY == 'get' ? function get(key) {\n\t return IS_WEAK && !isObject$2(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : KEY == 'has' ? function has(key) {\n\t return IS_WEAK && !isObject$2(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n\t } : function set(key, value) {\n\t nativeMethod.call(this, key === 0 ? 0 : key, value);\n\t return this;\n\t }\n\t );\n\t };\n\n\t // eslint-disable-next-line max-len\n\t if (isForced_1$1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails$1(function () {\n\t new NativeConstructor().entries().next();\n\t })))) {\n\t // create collection constructor\n\t Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n\t internalMetadata$1.REQUIRED = true;\n\t } else if (isForced_1$1(CONSTRUCTOR_NAME, true)) {\n\t var instance = new Constructor();\n\t // early implementations not supports chaining\n\t var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n\t // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n\t var THROWS_ON_PRIMITIVES = fails$1(function () { instance.has(1); });\n\t // most early implementations doesn't supports iterables, most modern - not close it correctly\n\t // eslint-disable-next-line no-new\n\t var ACCEPT_ITERABLES = checkCorrectnessOfIteration$1(function (iterable) { new NativeConstructor(iterable); });\n\t // for early implementations -0 and +0 not the same\n\t var BUGGY_ZERO = !IS_WEAK && fails$1(function () {\n\t // V8 ~ Chromium 42- fails only with 5+ elements\n\t var $instance = new NativeConstructor();\n\t var index = 5;\n\t while (index--) $instance[ADDER](index, index);\n\t return !$instance.has(-0);\n\t });\n\n\t if (!ACCEPT_ITERABLES) {\n\t Constructor = wrapper(function (dummy, iterable) {\n\t anInstance$1(dummy, Constructor, CONSTRUCTOR_NAME);\n\t var that = inheritIfRequired$1(new NativeConstructor(), dummy, Constructor);\n\t if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n\t return that;\n\t });\n\t Constructor.prototype = NativePrototype;\n\t NativePrototype.constructor = Constructor;\n\t }\n\n\t if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n\t fixMethod('delete');\n\t fixMethod('has');\n\t IS_MAP && fixMethod('get');\n\t }\n\n\t if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n\t // weak collections should not contains .clear method\n\t if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n\t }\n\n\t exported[CONSTRUCTOR_NAME] = Constructor;\n\t _export$1({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n\t setToStringTag$1(Constructor, CONSTRUCTOR_NAME);\n\n\t if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n\t return Constructor;\n\t};\n\n\tvar getWeakData$1 = internalMetadata$1.getWeakData;\n\n\n\n\n\n\n\n\n\tvar setInternalState$b = internalState$1.set;\n\tvar internalStateGetterFor$1 = internalState$1.getterFor;\n\tvar find$2 = arrayIteration$1.find;\n\tvar findIndex$1 = arrayIteration$1.findIndex;\n\tvar id$3 = 0;\n\n\t// fallback for uncaught frozen keys\n\tvar uncaughtFrozenStore$1 = function (store) {\n\t return store.frozen || (store.frozen = new UncaughtFrozenStore$1());\n\t};\n\n\tvar UncaughtFrozenStore$1 = function () {\n\t this.entries = [];\n\t};\n\n\tvar findUncaughtFrozen$1 = function (store, key) {\n\t return find$2(store.entries, function (it) {\n\t return it[0] === key;\n\t });\n\t};\n\n\tUncaughtFrozenStore$1.prototype = {\n\t get: function (key) {\n\t var entry = findUncaughtFrozen$1(this, key);\n\t if (entry) return entry[1];\n\t },\n\t has: function (key) {\n\t return !!findUncaughtFrozen$1(this, key);\n\t },\n\t set: function (key, value) {\n\t var entry = findUncaughtFrozen$1(this, key);\n\t if (entry) entry[1] = value;\n\t else this.entries.push([key, value]);\n\t },\n\t 'delete': function (key) {\n\t var index = findIndex$1(this.entries, function (it) {\n\t return it[0] === key;\n\t });\n\t if (~index) this.entries.splice(index, 1);\n\t return !!~index;\n\t }\n\t};\n\n\tvar collectionWeak$1 = {\n\t getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n\t var C = wrapper(function (that, iterable) {\n\t anInstance$1(that, C, CONSTRUCTOR_NAME);\n\t setInternalState$b(that, {\n\t type: CONSTRUCTOR_NAME,\n\t id: id$3++,\n\t frozen: undefined\n\t });\n\t if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n\t });\n\n\t var getInternalState = internalStateGetterFor$1(CONSTRUCTOR_NAME);\n\n\t var define = function (that, key, value) {\n\t var state = getInternalState(that);\n\t var data = getWeakData$1(anObject$1(key), true);\n\t if (data === true) uncaughtFrozenStore$1(state).set(key, value);\n\t else data[state.id] = value;\n\t return that;\n\t };\n\n\t redefineAll$1(C.prototype, {\n\t // 23.3.3.2 WeakMap.prototype.delete(key)\n\t // 23.4.3.3 WeakSet.prototype.delete(value)\n\t 'delete': function (key) {\n\t var state = getInternalState(this);\n\t if (!isObject$2(key)) return false;\n\t var data = getWeakData$1(key);\n\t if (data === true) return uncaughtFrozenStore$1(state)['delete'](key);\n\t return data && has$2(data, state.id) && delete data[state.id];\n\t },\n\t // 23.3.3.4 WeakMap.prototype.has(key)\n\t // 23.4.3.4 WeakSet.prototype.has(value)\n\t has: function has(key) {\n\t var state = getInternalState(this);\n\t if (!isObject$2(key)) return false;\n\t var data = getWeakData$1(key);\n\t if (data === true) return uncaughtFrozenStore$1(state).has(key);\n\t return data && has$2(data, state.id);\n\t }\n\t });\n\n\t redefineAll$1(C.prototype, IS_MAP ? {\n\t // 23.3.3.3 WeakMap.prototype.get(key)\n\t get: function get(key) {\n\t var state = getInternalState(this);\n\t if (isObject$2(key)) {\n\t var data = getWeakData$1(key);\n\t if (data === true) return uncaughtFrozenStore$1(state).get(key);\n\t return data ? data[state.id] : undefined;\n\t }\n\t },\n\t // 23.3.3.5 WeakMap.prototype.set(key, value)\n\t set: function set(key, value) {\n\t return define(this, key, value);\n\t }\n\t } : {\n\t // 23.4.3.1 WeakSet.prototype.add(value)\n\t add: function add(value) {\n\t return define(this, value, true);\n\t }\n\t });\n\n\t return C;\n\t }\n\t};\n\n\tvar es_weakMap = createCommonjsModule(function (module) {\n\n\n\n\n\n\n\tvar enforceIternalState = internalState$1.enforce;\n\n\n\tvar IS_IE11 = !global_1$1.ActiveXObject && 'ActiveXObject' in global_1$1;\n\tvar isExtensible = Object.isExtensible;\n\tvar InternalWeakMap;\n\n\tvar wrapper = function (init) {\n\t return function WeakMap() {\n\t return init(this, arguments.length ? arguments[0] : undefined);\n\t };\n\t};\n\n\t// `WeakMap` constructor\n\t// https://tc39.github.io/ecma262/#sec-weakmap-constructor\n\tvar $WeakMap = module.exports = collection$1('WeakMap', wrapper, collectionWeak$1);\n\n\t// IE11 WeakMap frozen keys fix\n\t// We can't use feature detection because it crash some old IE builds\n\t// https://github.com/zloirock/core-js/issues/485\n\tif (nativeWeakMap$1 && IS_IE11) {\n\t InternalWeakMap = collectionWeak$1.getConstructor(wrapper, 'WeakMap', true);\n\t internalMetadata$1.REQUIRED = true;\n\t var WeakMapPrototype = $WeakMap.prototype;\n\t var nativeDelete = WeakMapPrototype['delete'];\n\t var nativeHas = WeakMapPrototype.has;\n\t var nativeGet = WeakMapPrototype.get;\n\t var nativeSet = WeakMapPrototype.set;\n\t redefineAll$1(WeakMapPrototype, {\n\t 'delete': function (key) {\n\t if (isObject$2(key) && !isExtensible(key)) {\n\t var state = enforceIternalState(this);\n\t if (!state.frozen) state.frozen = new InternalWeakMap();\n\t return nativeDelete.call(this, key) || state.frozen['delete'](key);\n\t } return nativeDelete.call(this, key);\n\t },\n\t has: function has(key) {\n\t if (isObject$2(key) && !isExtensible(key)) {\n\t var state = enforceIternalState(this);\n\t if (!state.frozen) state.frozen = new InternalWeakMap();\n\t return nativeHas.call(this, key) || state.frozen.has(key);\n\t } return nativeHas.call(this, key);\n\t },\n\t get: function get(key) {\n\t if (isObject$2(key) && !isExtensible(key)) {\n\t var state = enforceIternalState(this);\n\t if (!state.frozen) state.frozen = new InternalWeakMap();\n\t return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n\t } return nativeGet.call(this, key);\n\t },\n\t set: function set(key, value) {\n\t if (isObject$2(key) && !isExtensible(key)) {\n\t var state = enforceIternalState(this);\n\t if (!state.frozen) state.frozen = new InternalWeakMap();\n\t nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n\t } else nativeSet.call(this, key, value);\n\t return this;\n\t }\n\t });\n\t}\n\t});\n\n\t// iterable DOM collections\n\t// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\n\tvar domIterables$1 = {\n\t CSSRuleList: 0,\n\t CSSStyleDeclaration: 0,\n\t CSSValueList: 0,\n\t ClientRectList: 0,\n\t DOMRectList: 0,\n\t DOMStringList: 0,\n\t DOMTokenList: 1,\n\t DataTransferItemList: 0,\n\t FileList: 0,\n\t HTMLAllCollection: 0,\n\t HTMLCollection: 0,\n\t HTMLFormElement: 0,\n\t HTMLSelectElement: 0,\n\t MediaList: 0,\n\t MimeTypeArray: 0,\n\t NamedNodeMap: 0,\n\t NodeList: 1,\n\t PaintRequestList: 0,\n\t Plugin: 0,\n\t PluginArray: 0,\n\t SVGLengthList: 0,\n\t SVGNumberList: 0,\n\t SVGPathSegList: 0,\n\t SVGPointList: 0,\n\t SVGStringList: 0,\n\t SVGTransformList: 0,\n\t SourceBufferList: 0,\n\t StyleSheetList: 0,\n\t TextTrackCueList: 0,\n\t TextTrackList: 0,\n\t TouchList: 0\n\t};\n\n\tvar ITERATOR$e = wellKnownSymbol$1('iterator');\n\tvar TO_STRING_TAG$8 = wellKnownSymbol$1('toStringTag');\n\tvar ArrayValues$1 = es_array_iterator$1.values;\n\n\tfor (var COLLECTION_NAME$2 in domIterables$1) {\n\t var Collection$2 = global_1$1[COLLECTION_NAME$2];\n\t var CollectionPrototype$2 = Collection$2 && Collection$2.prototype;\n\t if (CollectionPrototype$2) {\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$2[ITERATOR$e] !== ArrayValues$1) try {\n\t createNonEnumerableProperty$1(CollectionPrototype$2, ITERATOR$e, ArrayValues$1);\n\t } catch (error) {\n\t CollectionPrototype$2[ITERATOR$e] = ArrayValues$1;\n\t }\n\t if (!CollectionPrototype$2[TO_STRING_TAG$8]) {\n\t createNonEnumerableProperty$1(CollectionPrototype$2, TO_STRING_TAG$8, COLLECTION_NAME$2);\n\t }\n\t if (domIterables$1[COLLECTION_NAME$2]) for (var METHOD_NAME$1 in es_array_iterator$1) {\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$2[METHOD_NAME$1] !== es_array_iterator$1[METHOD_NAME$1]) try {\n\t createNonEnumerableProperty$1(CollectionPrototype$2, METHOD_NAME$1, es_array_iterator$1[METHOD_NAME$1]);\n\t } catch (error) {\n\t CollectionPrototype$2[METHOD_NAME$1] = es_array_iterator$1[METHOD_NAME$1];\n\t }\n\t }\n\t }\n\t}\n\n\tvar $every$1 = arrayIteration$1.every;\n\n\n\n\tvar STRICT_METHOD$6 = arrayMethodIsStrict$1('every');\n\tvar USES_TO_LENGTH$e = arrayMethodUsesToLength$1('every');\n\n\t// `Array.prototype.every` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.every\n\t_export$1({ target: 'Array', proto: true, forced: !STRICT_METHOD$6 || !USES_TO_LENGTH$e }, {\n\t every: function every(callbackfn /* , thisArg */) {\n\t return $every$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tvar $forEach$3 = arrayIteration$1.forEach;\n\n\n\n\tvar STRICT_METHOD$7 = arrayMethodIsStrict$1('forEach');\n\tvar USES_TO_LENGTH$f = arrayMethodUsesToLength$1('forEach');\n\n\t// `Array.prototype.forEach` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\tvar arrayForEach$1 = (!STRICT_METHOD$7 || !USES_TO_LENGTH$f) ? function forEach(callbackfn /* , thisArg */) {\n\t return $forEach$3(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t} : [].forEach;\n\n\t// `Array.prototype.forEach` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n\t_export$1({ target: 'Array', proto: true, forced: [].forEach != arrayForEach$1 }, {\n\t forEach: arrayForEach$1\n\t});\n\n\tvar $indexOf$2 = arrayIncludes$1.indexOf;\n\n\n\n\tvar nativeIndexOf$1 = [].indexOf;\n\n\tvar NEGATIVE_ZERO$2 = !!nativeIndexOf$1 && 1 / [1].indexOf(1, -0) < 0;\n\tvar STRICT_METHOD$8 = arrayMethodIsStrict$1('indexOf');\n\tvar USES_TO_LENGTH$g = arrayMethodUsesToLength$1('indexOf', { ACCESSORS: true, 1: 0 });\n\n\t// `Array.prototype.indexOf` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n\t_export$1({ target: 'Array', proto: true, forced: NEGATIVE_ZERO$2 || !STRICT_METHOD$8 || !USES_TO_LENGTH$g }, {\n\t indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n\t return NEGATIVE_ZERO$2\n\t // convert -0 to +0\n\t ? nativeIndexOf$1.apply(this, arguments) || 0\n\t : $indexOf$2(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tvar nativeAssign$1 = Object.assign;\n\tvar defineProperty$d = Object.defineProperty;\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\tvar objectAssign$1 = !nativeAssign$1 || fails$1(function () {\n\t // should have correct order of operations (Edge bug)\n\t if (descriptors$1 && nativeAssign$1({ b: 1 }, nativeAssign$1(defineProperty$d({}, 'a', {\n\t enumerable: true,\n\t get: function () {\n\t defineProperty$d(this, 'b', {\n\t value: 3,\n\t enumerable: false\n\t });\n\t }\n\t }), { b: 2 })).b !== 1) return true;\n\t // should work with symbols and should have deterministic property order (V8 bug)\n\t var A = {};\n\t var B = {};\n\t // eslint-disable-next-line no-undef\n\t var symbol = Symbol();\n\t var alphabet = 'abcdefghijklmnopqrst';\n\t A[symbol] = 7;\n\t alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n\t return nativeAssign$1({}, A)[symbol] != 7 || objectKeys$1(nativeAssign$1({}, B)).join('') != alphabet;\n\t}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n\t var T = toObject$1(target);\n\t var argumentsLength = arguments.length;\n\t var index = 1;\n\t var getOwnPropertySymbols = objectGetOwnPropertySymbols$1.f;\n\t var propertyIsEnumerable = objectPropertyIsEnumerable$1.f;\n\t while (argumentsLength > index) {\n\t var S = indexedObject$1(arguments[index++]);\n\t var keys = getOwnPropertySymbols ? objectKeys$1(S).concat(getOwnPropertySymbols(S)) : objectKeys$1(S);\n\t var length = keys.length;\n\t var j = 0;\n\t var key;\n\t while (length > j) {\n\t key = keys[j++];\n\t if (!descriptors$1 || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n\t }\n\t } return T;\n\t} : nativeAssign$1;\n\n\t// `Object.assign` method\n\t// https://tc39.github.io/ecma262/#sec-object.assign\n\t_export$1({ target: 'Object', stat: true, forced: Object.assign !== objectAssign$1 }, {\n\t assign: objectAssign$1\n\t});\n\n\tvar SPECIES$a = wellKnownSymbol$1('species');\n\n\t// `SpeciesConstructor` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-speciesconstructor\n\tvar speciesConstructor$1 = function (O, defaultConstructor) {\n\t var C = anObject$1(O).constructor;\n\t var S;\n\t return C === undefined || (S = anObject$1(C)[SPECIES$a]) == undefined ? defaultConstructor : aFunction$3(S);\n\t};\n\n\tvar charAt$3 = stringMultibyte$1.charAt;\n\n\t// `AdvanceStringIndex` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-advancestringindex\n\tvar advanceStringIndex$1 = function (S, index, unicode) {\n\t return index + (unicode ? charAt$3(S, index).length : 1);\n\t};\n\n\tvar arrayPush$1 = [].push;\n\tvar min$9 = Math.min;\n\tvar MAX_UINT32$1 = 0xFFFFFFFF;\n\n\t// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n\tvar SUPPORTS_Y$1 = !fails$1(function () { return !RegExp(MAX_UINT32$1, 'y'); });\n\n\t// @@split logic\n\tfixRegexpWellKnownSymbolLogic$1('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n\t var internalSplit;\n\t if (\n\t 'abbc'.split(/(b)*/)[1] == 'c' ||\n\t 'test'.split(/(?:)/, -1).length != 4 ||\n\t 'ab'.split(/(?:ab)*/).length != 2 ||\n\t '.'.split(/(.?)(.?)/).length != 4 ||\n\t '.'.split(/()()/).length > 1 ||\n\t ''.split(/.?/).length\n\t ) {\n\t // based on es5-shim implementation, need to rework it\n\t internalSplit = function (separator, limit) {\n\t var string = String(requireObjectCoercible$1(this));\n\t var lim = limit === undefined ? MAX_UINT32$1 : limit >>> 0;\n\t if (lim === 0) return [];\n\t if (separator === undefined) return [string];\n\t // If `separator` is not a regex, use native split\n\t if (!isRegexp$1(separator)) {\n\t return nativeSplit.call(string, separator, lim);\n\t }\n\t var output = [];\n\t var flags = (separator.ignoreCase ? 'i' : '') +\n\t (separator.multiline ? 'm' : '') +\n\t (separator.unicode ? 'u' : '') +\n\t (separator.sticky ? 'y' : '');\n\t var lastLastIndex = 0;\n\t // Make `global` and avoid `lastIndex` issues by working with a copy\n\t var separatorCopy = new RegExp(separator.source, flags + 'g');\n\t var match, lastIndex, lastLength;\n\t while (match = regexpExec$1.call(separatorCopy, string)) {\n\t lastIndex = separatorCopy.lastIndex;\n\t if (lastIndex > lastLastIndex) {\n\t output.push(string.slice(lastLastIndex, match.index));\n\t if (match.length > 1 && match.index < string.length) arrayPush$1.apply(output, match.slice(1));\n\t lastLength = match[0].length;\n\t lastLastIndex = lastIndex;\n\t if (output.length >= lim) break;\n\t }\n\t if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // Avoid an infinite loop\n\t }\n\t if (lastLastIndex === string.length) {\n\t if (lastLength || !separatorCopy.test('')) output.push('');\n\t } else output.push(string.slice(lastLastIndex));\n\t return output.length > lim ? output.slice(0, lim) : output;\n\t };\n\t // Chakra, V8\n\t } else if ('0'.split(undefined, 0).length) {\n\t internalSplit = function (separator, limit) {\n\t return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n\t };\n\t } else internalSplit = nativeSplit;\n\n\t return [\n\t // `String.prototype.split` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.split\n\t function split(separator, limit) {\n\t var O = requireObjectCoercible$1(this);\n\t var splitter = separator == undefined ? undefined : separator[SPLIT];\n\t return splitter !== undefined\n\t ? splitter.call(separator, O, limit)\n\t : internalSplit.call(String(O), separator, limit);\n\t },\n\t // `RegExp.prototype[@@split]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n\t //\n\t // NOTE: This cannot be properly polyfilled in engines that don't support\n\t // the 'y' flag.\n\t function (regexp, limit) {\n\t var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n\t if (res.done) return res.value;\n\n\t var rx = anObject$1(regexp);\n\t var S = String(this);\n\t var C = speciesConstructor$1(rx, RegExp);\n\n\t var unicodeMatching = rx.unicode;\n\t var flags = (rx.ignoreCase ? 'i' : '') +\n\t (rx.multiline ? 'm' : '') +\n\t (rx.unicode ? 'u' : '') +\n\t (SUPPORTS_Y$1 ? 'y' : 'g');\n\n\t // ^(? + rx + ) is needed, in combination with some S slicing, to\n\t // simulate the 'y' flag.\n\t var splitter = new C(SUPPORTS_Y$1 ? rx : '^(?:' + rx.source + ')', flags);\n\t var lim = limit === undefined ? MAX_UINT32$1 : limit >>> 0;\n\t if (lim === 0) return [];\n\t if (S.length === 0) return regexpExecAbstract$1(splitter, S) === null ? [S] : [];\n\t var p = 0;\n\t var q = 0;\n\t var A = [];\n\t while (q < S.length) {\n\t splitter.lastIndex = SUPPORTS_Y$1 ? q : 0;\n\t var z = regexpExecAbstract$1(splitter, SUPPORTS_Y$1 ? S : S.slice(q));\n\t var e;\n\t if (\n\t z === null ||\n\t (e = min$9(toLength$1(splitter.lastIndex + (SUPPORTS_Y$1 ? 0 : q)), S.length)) === p\n\t ) {\n\t q = advanceStringIndex$1(S, q, unicodeMatching);\n\t } else {\n\t A.push(S.slice(p, q));\n\t if (A.length === lim) return A;\n\t for (var i = 1; i <= z.length - 1; i++) {\n\t A.push(z[i]);\n\t if (A.length === lim) return A;\n\t }\n\t q = p = e;\n\t }\n\t }\n\t A.push(S.slice(p));\n\t return A;\n\t }\n\t ];\n\t}, !SUPPORTS_Y$1);\n\n\tvar non = '\\u200B\\u0085\\u180E';\n\n\t// check that a method works with the correct list\n\t// of whitespaces and has a correct name\n\tvar stringTrimForced = function (METHOD_NAME) {\n\t return fails$1(function () {\n\t return !!whitespaces$1[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces$1[METHOD_NAME].name !== METHOD_NAME;\n\t });\n\t};\n\n\tvar $trim = stringTrim$1.trim;\n\n\n\t// `String.prototype.trim` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n\t_export$1({ target: 'String', proto: true, forced: stringTrimForced('trim') }, {\n\t trim: function trim() {\n\t return $trim(this);\n\t }\n\t});\n\n\tfor (var COLLECTION_NAME$3 in domIterables$1) {\n\t var Collection$3 = global_1$1[COLLECTION_NAME$3];\n\t var CollectionPrototype$3 = Collection$3 && Collection$3.prototype;\n\t // some Chrome versions have non-configurable methods on DOMTokenList\n\t if (CollectionPrototype$3 && CollectionPrototype$3.forEach !== arrayForEach$1) try {\n\t createNonEnumerableProperty$1(CollectionPrototype$3, 'forEach', arrayForEach$1);\n\t } catch (error) {\n\t CollectionPrototype$3.forEach = arrayForEach$1;\n\t }\n\t}\n\n\tvar ITERATOR$f = wellKnownSymbol$1('iterator');\n\n\tvar nativeUrl$1 = !fails$1(function () {\n\t var url = new URL('b?a=1&b=2&c=3', 'http://a');\n\t var searchParams = url.searchParams;\n\t var result = '';\n\t url.pathname = 'c%20d';\n\t searchParams.forEach(function (value, key) {\n\t searchParams['delete']('b');\n\t result += key + value;\n\t });\n\t return (isPure$1 && !url.toJSON)\n\t || !searchParams.sort\n\t || url.href !== 'http://a/c%20d?a=1&c=3'\n\t || searchParams.get('c') !== '3'\n\t || String(new URLSearchParams('?a=1')) !== 'a=1'\n\t || !searchParams[ITERATOR$f]\n\t // throws in Edge\n\t || new URL('https://a@b').username !== 'a'\n\t || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n\t // not punycoded in Edge\n\t || new URL('http://тест').host !== 'xn--e1aybc'\n\t // not escaped in Chrome 62-\n\t || new URL('http://a#б').hash !== '#%D0%B1'\n\t // fails in Chrome 66-\n\t || result !== 'a1c3'\n\t // throws in Safari\n\t || new URL('http://x', undefined).host !== 'x';\n\t});\n\n\t// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\n\tvar maxInt$1 = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n\tvar base$1 = 36;\n\tvar tMin$1 = 1;\n\tvar tMax$1 = 26;\n\tvar skew$1 = 38;\n\tvar damp$1 = 700;\n\tvar initialBias$1 = 72;\n\tvar initialN$1 = 128; // 0x80\n\tvar delimiter$1 = '-'; // '\\x2D'\n\tvar regexNonASCII$1 = /[^\\0-\\u007E]/; // non-ASCII chars\n\tvar regexSeparators$1 = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n\tvar OVERFLOW_ERROR$1 = 'Overflow: input needs wider integers to process';\n\tvar baseMinusTMin$1 = base$1 - tMin$1;\n\tvar floor$7 = Math.floor;\n\tvar stringFromCharCode$1 = String.fromCharCode;\n\n\t/**\n\t * Creates an array containing the numeric code points of each Unicode\n\t * character in the string. While JavaScript uses UCS-2 internally,\n\t * this function will convert a pair of surrogate halves (each of which\n\t * UCS-2 exposes as separate characters) into a single code point,\n\t * matching UTF-16.\n\t */\n\tvar ucs2decode$1 = function (string) {\n\t var output = [];\n\t var counter = 0;\n\t var length = string.length;\n\t while (counter < length) {\n\t var value = string.charCodeAt(counter++);\n\t if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n\t // It's a high surrogate, and there is a next character.\n\t var extra = string.charCodeAt(counter++);\n\t if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n\t output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n\t } else {\n\t // It's an unmatched surrogate; only append this code unit, in case the\n\t // next code unit is the high surrogate of a surrogate pair.\n\t output.push(value);\n\t counter--;\n\t }\n\t } else {\n\t output.push(value);\n\t }\n\t }\n\t return output;\n\t};\n\n\t/**\n\t * Converts a digit/integer into a basic code point.\n\t */\n\tvar digitToBasic$1 = function (digit) {\n\t // 0..25 map to ASCII a..z or A..Z\n\t // 26..35 map to ASCII 0..9\n\t return digit + 22 + 75 * (digit < 26);\n\t};\n\n\t/**\n\t * Bias adaptation function as per section 3.4 of RFC 3492.\n\t * https://tools.ietf.org/html/rfc3492#section-3.4\n\t */\n\tvar adapt$1 = function (delta, numPoints, firstTime) {\n\t var k = 0;\n\t delta = firstTime ? floor$7(delta / damp$1) : delta >> 1;\n\t delta += floor$7(delta / numPoints);\n\t for (; delta > baseMinusTMin$1 * tMax$1 >> 1; k += base$1) {\n\t delta = floor$7(delta / baseMinusTMin$1);\n\t }\n\t return floor$7(k + (baseMinusTMin$1 + 1) * delta / (delta + skew$1));\n\t};\n\n\t/**\n\t * Converts a string of Unicode symbols (e.g. a domain name label) to a\n\t * Punycode string of ASCII-only symbols.\n\t */\n\t// eslint-disable-next-line max-statements\n\tvar encode$1 = function (input) {\n\t var output = [];\n\n\t // Convert the input in UCS-2 to an array of Unicode code points.\n\t input = ucs2decode$1(input);\n\n\t // Cache the length.\n\t var inputLength = input.length;\n\n\t // Initialize the state.\n\t var n = initialN$1;\n\t var delta = 0;\n\t var bias = initialBias$1;\n\t var i, currentValue;\n\n\t // Handle the basic code points.\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue < 0x80) {\n\t output.push(stringFromCharCode$1(currentValue));\n\t }\n\t }\n\n\t var basicLength = output.length; // number of basic code points.\n\t var handledCPCount = basicLength; // number of code points that have been handled;\n\n\t // Finish the basic string with a delimiter unless it's empty.\n\t if (basicLength) {\n\t output.push(delimiter$1);\n\t }\n\n\t // Main encoding loop:\n\t while (handledCPCount < inputLength) {\n\t // All non-basic code points < n have been handled already. Find the next larger one:\n\t var m = maxInt$1;\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue >= n && currentValue < m) {\n\t m = currentValue;\n\t }\n\t }\n\n\t // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n\t var handledCPCountPlusOne = handledCPCount + 1;\n\t if (m - n > floor$7((maxInt$1 - delta) / handledCPCountPlusOne)) {\n\t throw RangeError(OVERFLOW_ERROR$1);\n\t }\n\n\t delta += (m - n) * handledCPCountPlusOne;\n\t n = m;\n\n\t for (i = 0; i < input.length; i++) {\n\t currentValue = input[i];\n\t if (currentValue < n && ++delta > maxInt$1) {\n\t throw RangeError(OVERFLOW_ERROR$1);\n\t }\n\t if (currentValue == n) {\n\t // Represent delta as a generalized variable-length integer.\n\t var q = delta;\n\t for (var k = base$1; /* no condition */; k += base$1) {\n\t var t = k <= bias ? tMin$1 : (k >= bias + tMax$1 ? tMax$1 : k - bias);\n\t if (q < t) break;\n\t var qMinusT = q - t;\n\t var baseMinusT = base$1 - t;\n\t output.push(stringFromCharCode$1(digitToBasic$1(t + qMinusT % baseMinusT)));\n\t q = floor$7(qMinusT / baseMinusT);\n\t }\n\n\t output.push(stringFromCharCode$1(digitToBasic$1(q)));\n\t bias = adapt$1(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n\t delta = 0;\n\t ++handledCPCount;\n\t }\n\t }\n\n\t ++delta;\n\t ++n;\n\t }\n\t return output.join('');\n\t};\n\n\tvar stringPunycodeToAscii$1 = function (input) {\n\t var encoded = [];\n\t var labels = input.toLowerCase().replace(regexSeparators$1, '\\u002E').split('.');\n\t var i, label;\n\t for (i = 0; i < labels.length; i++) {\n\t label = labels[i];\n\t encoded.push(regexNonASCII$1.test(label) ? 'xn--' + encode$1(label) : label);\n\t }\n\t return encoded.join('.');\n\t};\n\n\tvar getIterator$1 = function (it) {\n\t var iteratorMethod = getIteratorMethod$1(it);\n\t if (typeof iteratorMethod != 'function') {\n\t throw TypeError(String(it) + ' is not iterable');\n\t } return anObject$1(iteratorMethod.call(it));\n\t};\n\n\t// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\tvar $fetch$2 = getBuiltIn$1('fetch');\n\tvar Headers$2 = getBuiltIn$1('Headers');\n\tvar ITERATOR$g = wellKnownSymbol$1('iterator');\n\tvar URL_SEARCH_PARAMS$1 = 'URLSearchParams';\n\tvar URL_SEARCH_PARAMS_ITERATOR$1 = URL_SEARCH_PARAMS$1 + 'Iterator';\n\tvar setInternalState$c = internalState$1.set;\n\tvar getInternalParamsState$1 = internalState$1.getterFor(URL_SEARCH_PARAMS$1);\n\tvar getInternalIteratorState$1 = internalState$1.getterFor(URL_SEARCH_PARAMS_ITERATOR$1);\n\n\tvar plus$1 = /\\+/g;\n\tvar sequences$1 = Array(4);\n\n\tvar percentSequence$1 = function (bytes) {\n\t return sequences$1[bytes - 1] || (sequences$1[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n\t};\n\n\tvar percentDecode$1 = function (sequence) {\n\t try {\n\t return decodeURIComponent(sequence);\n\t } catch (error) {\n\t return sequence;\n\t }\n\t};\n\n\tvar deserialize$1 = function (it) {\n\t var result = it.replace(plus$1, ' ');\n\t var bytes = 4;\n\t try {\n\t return decodeURIComponent(result);\n\t } catch (error) {\n\t while (bytes) {\n\t result = result.replace(percentSequence$1(bytes--), percentDecode$1);\n\t }\n\t return result;\n\t }\n\t};\n\n\tvar find$3 = /[!'()~]|%20/g;\n\n\tvar replace$1 = {\n\t '!': '%21',\n\t \"'\": '%27',\n\t '(': '%28',\n\t ')': '%29',\n\t '~': '%7E',\n\t '%20': '+'\n\t};\n\n\tvar replacer$1 = function (match) {\n\t return replace$1[match];\n\t};\n\n\tvar serialize$1 = function (it) {\n\t return encodeURIComponent(it).replace(find$3, replacer$1);\n\t};\n\n\tvar parseSearchParams$1 = function (result, query) {\n\t if (query) {\n\t var attributes = query.split('&');\n\t var index = 0;\n\t var attribute, entry;\n\t while (index < attributes.length) {\n\t attribute = attributes[index++];\n\t if (attribute.length) {\n\t entry = attribute.split('=');\n\t result.push({\n\t key: deserialize$1(entry.shift()),\n\t value: deserialize$1(entry.join('='))\n\t });\n\t }\n\t }\n\t }\n\t};\n\n\tvar updateSearchParams$1 = function (query) {\n\t this.entries.length = 0;\n\t parseSearchParams$1(this.entries, query);\n\t};\n\n\tvar validateArgumentsLength$1 = function (passed, required) {\n\t if (passed < required) throw TypeError('Not enough arguments');\n\t};\n\n\tvar URLSearchParamsIterator$1 = createIteratorConstructor$1(function Iterator(params, kind) {\n\t setInternalState$c(this, {\n\t type: URL_SEARCH_PARAMS_ITERATOR$1,\n\t iterator: getIterator$1(getInternalParamsState$1(params).entries),\n\t kind: kind\n\t });\n\t}, 'Iterator', function next() {\n\t var state = getInternalIteratorState$1(this);\n\t var kind = state.kind;\n\t var step = state.iterator.next();\n\t var entry = step.value;\n\t if (!step.done) {\n\t step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n\t } return step;\n\t});\n\n\t// `URLSearchParams` constructor\n\t// https://url.spec.whatwg.org/#interface-urlsearchparams\n\tvar URLSearchParamsConstructor$1 = function URLSearchParams(/* init */) {\n\t anInstance$1(this, URLSearchParamsConstructor$1, URL_SEARCH_PARAMS$1);\n\t var init = arguments.length > 0 ? arguments[0] : undefined;\n\t var that = this;\n\t var entries = [];\n\t var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n\t setInternalState$c(that, {\n\t type: URL_SEARCH_PARAMS$1,\n\t entries: entries,\n\t updateURL: function () { /* empty */ },\n\t updateSearchParams: updateSearchParams$1\n\t });\n\n\t if (init !== undefined) {\n\t if (isObject$2(init)) {\n\t iteratorMethod = getIteratorMethod$1(init);\n\t if (typeof iteratorMethod === 'function') {\n\t iterator = iteratorMethod.call(init);\n\t next = iterator.next;\n\t while (!(step = next.call(iterator)).done) {\n\t entryIterator = getIterator$1(anObject$1(step.value));\n\t entryNext = entryIterator.next;\n\t if (\n\t (first = entryNext.call(entryIterator)).done ||\n\t (second = entryNext.call(entryIterator)).done ||\n\t !entryNext.call(entryIterator).done\n\t ) throw TypeError('Expected sequence with length 2');\n\t entries.push({ key: first.value + '', value: second.value + '' });\n\t }\n\t } else for (key in init) if (has$2(init, key)) entries.push({ key: key, value: init[key] + '' });\n\t } else {\n\t parseSearchParams$1(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n\t }\n\t }\n\t};\n\n\tvar URLSearchParamsPrototype$1 = URLSearchParamsConstructor$1.prototype;\n\n\tredefineAll$1(URLSearchParamsPrototype$1, {\n\t // `URLSearchParams.prototype.append` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n\t append: function append(name, value) {\n\t validateArgumentsLength$1(arguments.length, 2);\n\t var state = getInternalParamsState$1(this);\n\t state.entries.push({ key: name + '', value: value + '' });\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.delete` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n\t 'delete': function (name) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var state = getInternalParamsState$1(this);\n\t var entries = state.entries;\n\t var key = name + '';\n\t var index = 0;\n\t while (index < entries.length) {\n\t if (entries[index].key === key) entries.splice(index, 1);\n\t else index++;\n\t }\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.get` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n\t get: function get(name) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var entries = getInternalParamsState$1(this).entries;\n\t var key = name + '';\n\t var index = 0;\n\t for (; index < entries.length; index++) {\n\t if (entries[index].key === key) return entries[index].value;\n\t }\n\t return null;\n\t },\n\t // `URLSearchParams.prototype.getAll` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n\t getAll: function getAll(name) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var entries = getInternalParamsState$1(this).entries;\n\t var key = name + '';\n\t var result = [];\n\t var index = 0;\n\t for (; index < entries.length; index++) {\n\t if (entries[index].key === key) result.push(entries[index].value);\n\t }\n\t return result;\n\t },\n\t // `URLSearchParams.prototype.has` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n\t has: function has(name) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var entries = getInternalParamsState$1(this).entries;\n\t var key = name + '';\n\t var index = 0;\n\t while (index < entries.length) {\n\t if (entries[index++].key === key) return true;\n\t }\n\t return false;\n\t },\n\t // `URLSearchParams.prototype.set` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n\t set: function set(name, value) {\n\t validateArgumentsLength$1(arguments.length, 1);\n\t var state = getInternalParamsState$1(this);\n\t var entries = state.entries;\n\t var found = false;\n\t var key = name + '';\n\t var val = value + '';\n\t var index = 0;\n\t var entry;\n\t for (; index < entries.length; index++) {\n\t entry = entries[index];\n\t if (entry.key === key) {\n\t if (found) entries.splice(index--, 1);\n\t else {\n\t found = true;\n\t entry.value = val;\n\t }\n\t }\n\t }\n\t if (!found) entries.push({ key: key, value: val });\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.sort` method\n\t // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n\t sort: function sort() {\n\t var state = getInternalParamsState$1(this);\n\t var entries = state.entries;\n\t // Array#sort is not stable in some engines\n\t var slice = entries.slice();\n\t var entry, entriesIndex, sliceIndex;\n\t entries.length = 0;\n\t for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n\t entry = slice[sliceIndex];\n\t for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n\t if (entries[entriesIndex].key > entry.key) {\n\t entries.splice(entriesIndex, 0, entry);\n\t break;\n\t }\n\t }\n\t if (entriesIndex === sliceIndex) entries.push(entry);\n\t }\n\t state.updateURL();\n\t },\n\t // `URLSearchParams.prototype.forEach` method\n\t forEach: function forEach(callback /* , thisArg */) {\n\t var entries = getInternalParamsState$1(this).entries;\n\t var boundFunction = functionBindContext$1(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n\t var index = 0;\n\t var entry;\n\t while (index < entries.length) {\n\t entry = entries[index++];\n\t boundFunction(entry.value, entry.key, this);\n\t }\n\t },\n\t // `URLSearchParams.prototype.keys` method\n\t keys: function keys() {\n\t return new URLSearchParamsIterator$1(this, 'keys');\n\t },\n\t // `URLSearchParams.prototype.values` method\n\t values: function values() {\n\t return new URLSearchParamsIterator$1(this, 'values');\n\t },\n\t // `URLSearchParams.prototype.entries` method\n\t entries: function entries() {\n\t return new URLSearchParamsIterator$1(this, 'entries');\n\t }\n\t}, { enumerable: true });\n\n\t// `URLSearchParams.prototype[@@iterator]` method\n\tredefine$1(URLSearchParamsPrototype$1, ITERATOR$g, URLSearchParamsPrototype$1.entries);\n\n\t// `URLSearchParams.prototype.toString` method\n\t// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\n\tredefine$1(URLSearchParamsPrototype$1, 'toString', function toString() {\n\t var entries = getInternalParamsState$1(this).entries;\n\t var result = [];\n\t var index = 0;\n\t var entry;\n\t while (index < entries.length) {\n\t entry = entries[index++];\n\t result.push(serialize$1(entry.key) + '=' + serialize$1(entry.value));\n\t } return result.join('&');\n\t}, { enumerable: true });\n\n\tsetToStringTag$1(URLSearchParamsConstructor$1, URL_SEARCH_PARAMS$1);\n\n\t_export$1({ global: true, forced: !nativeUrl$1 }, {\n\t URLSearchParams: URLSearchParamsConstructor$1\n\t});\n\n\t// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n\t// https://github.com/zloirock/core-js/issues/674\n\tif (!nativeUrl$1 && typeof $fetch$2 == 'function' && typeof Headers$2 == 'function') {\n\t _export$1({ global: true, enumerable: true, forced: true }, {\n\t fetch: function fetch(input /* , init */) {\n\t var args = [input];\n\t var init, body, headers;\n\t if (arguments.length > 1) {\n\t init = arguments[1];\n\t if (isObject$2(init)) {\n\t body = init.body;\n\t if (classof$1(body) === URL_SEARCH_PARAMS$1) {\n\t headers = init.headers ? new Headers$2(init.headers) : new Headers$2();\n\t if (!headers.has('content-type')) {\n\t headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n\t }\n\t init = objectCreate$1(init, {\n\t body: createPropertyDescriptor$1(0, String(body)),\n\t headers: createPropertyDescriptor$1(0, headers)\n\t });\n\t }\n\t }\n\t args.push(init);\n\t } return $fetch$2.apply(this, args);\n\t }\n\t });\n\t}\n\n\tvar web_urlSearchParams$1 = {\n\t URLSearchParams: URLSearchParamsConstructor$1,\n\t getState: getInternalParamsState$1\n\t};\n\n\t// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\tvar codeAt$1 = stringMultibyte$1.codeAt;\n\n\n\n\n\n\tvar NativeURL$1 = global_1$1.URL;\n\tvar URLSearchParams$2 = web_urlSearchParams$1.URLSearchParams;\n\tvar getInternalSearchParamsState$1 = web_urlSearchParams$1.getState;\n\tvar setInternalState$d = internalState$1.set;\n\tvar getInternalURLState$1 = internalState$1.getterFor('URL');\n\tvar floor$8 = Math.floor;\n\tvar pow$2 = Math.pow;\n\n\tvar INVALID_AUTHORITY$1 = 'Invalid authority';\n\tvar INVALID_SCHEME$1 = 'Invalid scheme';\n\tvar INVALID_HOST$1 = 'Invalid host';\n\tvar INVALID_PORT$1 = 'Invalid port';\n\n\tvar ALPHA$1 = /[A-Za-z]/;\n\tvar ALPHANUMERIC$1 = /[\\d+-.A-Za-z]/;\n\tvar DIGIT$1 = /\\d/;\n\tvar HEX_START$1 = /^(0x|0X)/;\n\tvar OCT$1 = /^[0-7]+$/;\n\tvar DEC$1 = /^\\d+$/;\n\tvar HEX$1 = /^[\\dA-Fa-f]+$/;\n\t// eslint-disable-next-line no-control-regex\n\tvar FORBIDDEN_HOST_CODE_POINT$1 = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n\t// eslint-disable-next-line no-control-regex\n\tvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT$1 = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n\t// eslint-disable-next-line no-control-regex\n\tvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE$1 = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n\t// eslint-disable-next-line no-control-regex\n\tvar TAB_AND_NEW_LINE$1 = /[\\u0009\\u000A\\u000D]/g;\n\tvar EOF$1;\n\n\tvar parseHost$1 = function (url, input) {\n\t var result, codePoints, index;\n\t if (input.charAt(0) == '[') {\n\t if (input.charAt(input.length - 1) != ']') return INVALID_HOST$1;\n\t result = parseIPv6$1(input.slice(1, -1));\n\t if (!result) return INVALID_HOST$1;\n\t url.host = result;\n\t // opaque host\n\t } else if (!isSpecial$1(url)) {\n\t if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT$1.test(input)) return INVALID_HOST$1;\n\t result = '';\n\t codePoints = arrayFrom$1(input);\n\t for (index = 0; index < codePoints.length; index++) {\n\t result += percentEncode$1(codePoints[index], C0ControlPercentEncodeSet$1);\n\t }\n\t url.host = result;\n\t } else {\n\t input = stringPunycodeToAscii$1(input);\n\t if (FORBIDDEN_HOST_CODE_POINT$1.test(input)) return INVALID_HOST$1;\n\t result = parseIPv4$1(input);\n\t if (result === null) return INVALID_HOST$1;\n\t url.host = result;\n\t }\n\t};\n\n\tvar parseIPv4$1 = function (input) {\n\t var parts = input.split('.');\n\t var partsLength, numbers, index, part, radix, number, ipv4;\n\t if (parts.length && parts[parts.length - 1] == '') {\n\t parts.pop();\n\t }\n\t partsLength = parts.length;\n\t if (partsLength > 4) return input;\n\t numbers = [];\n\t for (index = 0; index < partsLength; index++) {\n\t part = parts[index];\n\t if (part == '') return input;\n\t radix = 10;\n\t if (part.length > 1 && part.charAt(0) == '0') {\n\t radix = HEX_START$1.test(part) ? 16 : 8;\n\t part = part.slice(radix == 8 ? 1 : 2);\n\t }\n\t if (part === '') {\n\t number = 0;\n\t } else {\n\t if (!(radix == 10 ? DEC$1 : radix == 8 ? OCT$1 : HEX$1).test(part)) return input;\n\t number = parseInt(part, radix);\n\t }\n\t numbers.push(number);\n\t }\n\t for (index = 0; index < partsLength; index++) {\n\t number = numbers[index];\n\t if (index == partsLength - 1) {\n\t if (number >= pow$2(256, 5 - partsLength)) return null;\n\t } else if (number > 255) return null;\n\t }\n\t ipv4 = numbers.pop();\n\t for (index = 0; index < numbers.length; index++) {\n\t ipv4 += numbers[index] * pow$2(256, 3 - index);\n\t }\n\t return ipv4;\n\t};\n\n\t// eslint-disable-next-line max-statements\n\tvar parseIPv6$1 = function (input) {\n\t var address = [0, 0, 0, 0, 0, 0, 0, 0];\n\t var pieceIndex = 0;\n\t var compress = null;\n\t var pointer = 0;\n\t var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n\t var char = function () {\n\t return input.charAt(pointer);\n\t };\n\n\t if (char() == ':') {\n\t if (input.charAt(1) != ':') return;\n\t pointer += 2;\n\t pieceIndex++;\n\t compress = pieceIndex;\n\t }\n\t while (char()) {\n\t if (pieceIndex == 8) return;\n\t if (char() == ':') {\n\t if (compress !== null) return;\n\t pointer++;\n\t pieceIndex++;\n\t compress = pieceIndex;\n\t continue;\n\t }\n\t value = length = 0;\n\t while (length < 4 && HEX$1.test(char())) {\n\t value = value * 16 + parseInt(char(), 16);\n\t pointer++;\n\t length++;\n\t }\n\t if (char() == '.') {\n\t if (length == 0) return;\n\t pointer -= length;\n\t if (pieceIndex > 6) return;\n\t numbersSeen = 0;\n\t while (char()) {\n\t ipv4Piece = null;\n\t if (numbersSeen > 0) {\n\t if (char() == '.' && numbersSeen < 4) pointer++;\n\t else return;\n\t }\n\t if (!DIGIT$1.test(char())) return;\n\t while (DIGIT$1.test(char())) {\n\t number = parseInt(char(), 10);\n\t if (ipv4Piece === null) ipv4Piece = number;\n\t else if (ipv4Piece == 0) return;\n\t else ipv4Piece = ipv4Piece * 10 + number;\n\t if (ipv4Piece > 255) return;\n\t pointer++;\n\t }\n\t address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n\t numbersSeen++;\n\t if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n\t }\n\t if (numbersSeen != 4) return;\n\t break;\n\t } else if (char() == ':') {\n\t pointer++;\n\t if (!char()) return;\n\t } else if (char()) return;\n\t address[pieceIndex++] = value;\n\t }\n\t if (compress !== null) {\n\t swaps = pieceIndex - compress;\n\t pieceIndex = 7;\n\t while (pieceIndex != 0 && swaps > 0) {\n\t swap = address[pieceIndex];\n\t address[pieceIndex--] = address[compress + swaps - 1];\n\t address[compress + --swaps] = swap;\n\t }\n\t } else if (pieceIndex != 8) return;\n\t return address;\n\t};\n\n\tvar findLongestZeroSequence$1 = function (ipv6) {\n\t var maxIndex = null;\n\t var maxLength = 1;\n\t var currStart = null;\n\t var currLength = 0;\n\t var index = 0;\n\t for (; index < 8; index++) {\n\t if (ipv6[index] !== 0) {\n\t if (currLength > maxLength) {\n\t maxIndex = currStart;\n\t maxLength = currLength;\n\t }\n\t currStart = null;\n\t currLength = 0;\n\t } else {\n\t if (currStart === null) currStart = index;\n\t ++currLength;\n\t }\n\t }\n\t if (currLength > maxLength) {\n\t maxIndex = currStart;\n\t maxLength = currLength;\n\t }\n\t return maxIndex;\n\t};\n\n\tvar serializeHost$1 = function (host) {\n\t var result, index, compress, ignore0;\n\t // ipv4\n\t if (typeof host == 'number') {\n\t result = [];\n\t for (index = 0; index < 4; index++) {\n\t result.unshift(host % 256);\n\t host = floor$8(host / 256);\n\t } return result.join('.');\n\t // ipv6\n\t } else if (typeof host == 'object') {\n\t result = '';\n\t compress = findLongestZeroSequence$1(host);\n\t for (index = 0; index < 8; index++) {\n\t if (ignore0 && host[index] === 0) continue;\n\t if (ignore0) ignore0 = false;\n\t if (compress === index) {\n\t result += index ? ':' : '::';\n\t ignore0 = true;\n\t } else {\n\t result += host[index].toString(16);\n\t if (index < 7) result += ':';\n\t }\n\t }\n\t return '[' + result + ']';\n\t } return host;\n\t};\n\n\tvar C0ControlPercentEncodeSet$1 = {};\n\tvar fragmentPercentEncodeSet$1 = objectAssign$1({}, C0ControlPercentEncodeSet$1, {\n\t ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n\t});\n\tvar pathPercentEncodeSet$1 = objectAssign$1({}, fragmentPercentEncodeSet$1, {\n\t '#': 1, '?': 1, '{': 1, '}': 1\n\t});\n\tvar userinfoPercentEncodeSet$1 = objectAssign$1({}, pathPercentEncodeSet$1, {\n\t '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n\t});\n\n\tvar percentEncode$1 = function (char, set) {\n\t var code = codeAt$1(char, 0);\n\t return code > 0x20 && code < 0x7F && !has$2(set, char) ? char : encodeURIComponent(char);\n\t};\n\n\tvar specialSchemes$1 = {\n\t ftp: 21,\n\t file: null,\n\t http: 80,\n\t https: 443,\n\t ws: 80,\n\t wss: 443\n\t};\n\n\tvar isSpecial$1 = function (url) {\n\t return has$2(specialSchemes$1, url.scheme);\n\t};\n\n\tvar includesCredentials$1 = function (url) {\n\t return url.username != '' || url.password != '';\n\t};\n\n\tvar cannotHaveUsernamePasswordPort$1 = function (url) {\n\t return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n\t};\n\n\tvar isWindowsDriveLetter$1 = function (string, normalized) {\n\t var second;\n\t return string.length == 2 && ALPHA$1.test(string.charAt(0))\n\t && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n\t};\n\n\tvar startsWithWindowsDriveLetter$1 = function (string) {\n\t var third;\n\t return string.length > 1 && isWindowsDriveLetter$1(string.slice(0, 2)) && (\n\t string.length == 2 ||\n\t ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n\t );\n\t};\n\n\tvar shortenURLsPath$1 = function (url) {\n\t var path = url.path;\n\t var pathSize = path.length;\n\t if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter$1(path[0], true))) {\n\t path.pop();\n\t }\n\t};\n\n\tvar isSingleDot$1 = function (segment) {\n\t return segment === '.' || segment.toLowerCase() === '%2e';\n\t};\n\n\tvar isDoubleDot$1 = function (segment) {\n\t segment = segment.toLowerCase();\n\t return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n\t};\n\n\t// States:\n\tvar SCHEME_START$1 = {};\n\tvar SCHEME$1 = {};\n\tvar NO_SCHEME$1 = {};\n\tvar SPECIAL_RELATIVE_OR_AUTHORITY$1 = {};\n\tvar PATH_OR_AUTHORITY$1 = {};\n\tvar RELATIVE$1 = {};\n\tvar RELATIVE_SLASH$1 = {};\n\tvar SPECIAL_AUTHORITY_SLASHES$1 = {};\n\tvar SPECIAL_AUTHORITY_IGNORE_SLASHES$1 = {};\n\tvar AUTHORITY$1 = {};\n\tvar HOST$1 = {};\n\tvar HOSTNAME$1 = {};\n\tvar PORT$1 = {};\n\tvar FILE$1 = {};\n\tvar FILE_SLASH$1 = {};\n\tvar FILE_HOST$1 = {};\n\tvar PATH_START$1 = {};\n\tvar PATH$1 = {};\n\tvar CANNOT_BE_A_BASE_URL_PATH$1 = {};\n\tvar QUERY$1 = {};\n\tvar FRAGMENT$1 = {};\n\n\t// eslint-disable-next-line max-statements\n\tvar parseURL$1 = function (url, input, stateOverride, base) {\n\t var state = stateOverride || SCHEME_START$1;\n\t var pointer = 0;\n\t var buffer = '';\n\t var seenAt = false;\n\t var seenBracket = false;\n\t var seenPasswordToken = false;\n\t var codePoints, char, bufferCodePoints, failure;\n\n\t if (!stateOverride) {\n\t url.scheme = '';\n\t url.username = '';\n\t url.password = '';\n\t url.host = null;\n\t url.port = null;\n\t url.path = [];\n\t url.query = null;\n\t url.fragment = null;\n\t url.cannotBeABaseURL = false;\n\t input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE$1, '');\n\t }\n\n\t input = input.replace(TAB_AND_NEW_LINE$1, '');\n\n\t codePoints = arrayFrom$1(input);\n\n\t while (pointer <= codePoints.length) {\n\t char = codePoints[pointer];\n\t switch (state) {\n\t case SCHEME_START$1:\n\t if (char && ALPHA$1.test(char)) {\n\t buffer += char.toLowerCase();\n\t state = SCHEME$1;\n\t } else if (!stateOverride) {\n\t state = NO_SCHEME$1;\n\t continue;\n\t } else return INVALID_SCHEME$1;\n\t break;\n\n\t case SCHEME$1:\n\t if (char && (ALPHANUMERIC$1.test(char) || char == '+' || char == '-' || char == '.')) {\n\t buffer += char.toLowerCase();\n\t } else if (char == ':') {\n\t if (stateOverride && (\n\t (isSpecial$1(url) != has$2(specialSchemes$1, buffer)) ||\n\t (buffer == 'file' && (includesCredentials$1(url) || url.port !== null)) ||\n\t (url.scheme == 'file' && !url.host)\n\t )) return;\n\t url.scheme = buffer;\n\t if (stateOverride) {\n\t if (isSpecial$1(url) && specialSchemes$1[url.scheme] == url.port) url.port = null;\n\t return;\n\t }\n\t buffer = '';\n\t if (url.scheme == 'file') {\n\t state = FILE$1;\n\t } else if (isSpecial$1(url) && base && base.scheme == url.scheme) {\n\t state = SPECIAL_RELATIVE_OR_AUTHORITY$1;\n\t } else if (isSpecial$1(url)) {\n\t state = SPECIAL_AUTHORITY_SLASHES$1;\n\t } else if (codePoints[pointer + 1] == '/') {\n\t state = PATH_OR_AUTHORITY$1;\n\t pointer++;\n\t } else {\n\t url.cannotBeABaseURL = true;\n\t url.path.push('');\n\t state = CANNOT_BE_A_BASE_URL_PATH$1;\n\t }\n\t } else if (!stateOverride) {\n\t buffer = '';\n\t state = NO_SCHEME$1;\n\t pointer = 0;\n\t continue;\n\t } else return INVALID_SCHEME$1;\n\t break;\n\n\t case NO_SCHEME$1:\n\t if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME$1;\n\t if (base.cannotBeABaseURL && char == '#') {\n\t url.scheme = base.scheme;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t url.cannotBeABaseURL = true;\n\t state = FRAGMENT$1;\n\t break;\n\t }\n\t state = base.scheme == 'file' ? FILE$1 : RELATIVE$1;\n\t continue;\n\n\t case SPECIAL_RELATIVE_OR_AUTHORITY$1:\n\t if (char == '/' && codePoints[pointer + 1] == '/') {\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES$1;\n\t pointer++;\n\t } else {\n\t state = RELATIVE$1;\n\t continue;\n\t } break;\n\n\t case PATH_OR_AUTHORITY$1:\n\t if (char == '/') {\n\t state = AUTHORITY$1;\n\t break;\n\t } else {\n\t state = PATH$1;\n\t continue;\n\t }\n\n\t case RELATIVE$1:\n\t url.scheme = base.scheme;\n\t if (char == EOF$1) {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t } else if (char == '/' || (char == '\\\\' && isSpecial$1(url))) {\n\t state = RELATIVE_SLASH$1;\n\t } else if (char == '?') {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (char == '#') {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t url.path = base.path.slice();\n\t url.path.pop();\n\t state = PATH$1;\n\t continue;\n\t } break;\n\n\t case RELATIVE_SLASH$1:\n\t if (isSpecial$1(url) && (char == '/' || char == '\\\\')) {\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES$1;\n\t } else if (char == '/') {\n\t state = AUTHORITY$1;\n\t } else {\n\t url.username = base.username;\n\t url.password = base.password;\n\t url.host = base.host;\n\t url.port = base.port;\n\t state = PATH$1;\n\t continue;\n\t } break;\n\n\t case SPECIAL_AUTHORITY_SLASHES$1:\n\t state = SPECIAL_AUTHORITY_IGNORE_SLASHES$1;\n\t if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n\t pointer++;\n\t break;\n\n\t case SPECIAL_AUTHORITY_IGNORE_SLASHES$1:\n\t if (char != '/' && char != '\\\\') {\n\t state = AUTHORITY$1;\n\t continue;\n\t } break;\n\n\t case AUTHORITY$1:\n\t if (char == '@') {\n\t if (seenAt) buffer = '%40' + buffer;\n\t seenAt = true;\n\t bufferCodePoints = arrayFrom$1(buffer);\n\t for (var i = 0; i < bufferCodePoints.length; i++) {\n\t var codePoint = bufferCodePoints[i];\n\t if (codePoint == ':' && !seenPasswordToken) {\n\t seenPasswordToken = true;\n\t continue;\n\t }\n\t var encodedCodePoints = percentEncode$1(codePoint, userinfoPercentEncodeSet$1);\n\t if (seenPasswordToken) url.password += encodedCodePoints;\n\t else url.username += encodedCodePoints;\n\t }\n\t buffer = '';\n\t } else if (\n\t char == EOF$1 || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial$1(url))\n\t ) {\n\t if (seenAt && buffer == '') return INVALID_AUTHORITY$1;\n\t pointer -= arrayFrom$1(buffer).length + 1;\n\t buffer = '';\n\t state = HOST$1;\n\t } else buffer += char;\n\t break;\n\n\t case HOST$1:\n\t case HOSTNAME$1:\n\t if (stateOverride && url.scheme == 'file') {\n\t state = FILE_HOST$1;\n\t continue;\n\t } else if (char == ':' && !seenBracket) {\n\t if (buffer == '') return INVALID_HOST$1;\n\t failure = parseHost$1(url, buffer);\n\t if (failure) return failure;\n\t buffer = '';\n\t state = PORT$1;\n\t if (stateOverride == HOSTNAME$1) return;\n\t } else if (\n\t char == EOF$1 || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial$1(url))\n\t ) {\n\t if (isSpecial$1(url) && buffer == '') return INVALID_HOST$1;\n\t if (stateOverride && buffer == '' && (includesCredentials$1(url) || url.port !== null)) return;\n\t failure = parseHost$1(url, buffer);\n\t if (failure) return failure;\n\t buffer = '';\n\t state = PATH_START$1;\n\t if (stateOverride) return;\n\t continue;\n\t } else {\n\t if (char == '[') seenBracket = true;\n\t else if (char == ']') seenBracket = false;\n\t buffer += char;\n\t } break;\n\n\t case PORT$1:\n\t if (DIGIT$1.test(char)) {\n\t buffer += char;\n\t } else if (\n\t char == EOF$1 || char == '/' || char == '?' || char == '#' ||\n\t (char == '\\\\' && isSpecial$1(url)) ||\n\t stateOverride\n\t ) {\n\t if (buffer != '') {\n\t var port = parseInt(buffer, 10);\n\t if (port > 0xFFFF) return INVALID_PORT$1;\n\t url.port = (isSpecial$1(url) && port === specialSchemes$1[url.scheme]) ? null : port;\n\t buffer = '';\n\t }\n\t if (stateOverride) return;\n\t state = PATH_START$1;\n\t continue;\n\t } else return INVALID_PORT$1;\n\t break;\n\n\t case FILE$1:\n\t url.scheme = 'file';\n\t if (char == '/' || char == '\\\\') state = FILE_SLASH$1;\n\t else if (base && base.scheme == 'file') {\n\t if (char == EOF$1) {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t } else if (char == '?') {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (char == '#') {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t url.query = base.query;\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else {\n\t if (!startsWithWindowsDriveLetter$1(codePoints.slice(pointer).join(''))) {\n\t url.host = base.host;\n\t url.path = base.path.slice();\n\t shortenURLsPath$1(url);\n\t }\n\t state = PATH$1;\n\t continue;\n\t }\n\t } else {\n\t state = PATH$1;\n\t continue;\n\t } break;\n\n\t case FILE_SLASH$1:\n\t if (char == '/' || char == '\\\\') {\n\t state = FILE_HOST$1;\n\t break;\n\t }\n\t if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter$1(codePoints.slice(pointer).join(''))) {\n\t if (isWindowsDriveLetter$1(base.path[0], true)) url.path.push(base.path[0]);\n\t else url.host = base.host;\n\t }\n\t state = PATH$1;\n\t continue;\n\n\t case FILE_HOST$1:\n\t if (char == EOF$1 || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n\t if (!stateOverride && isWindowsDriveLetter$1(buffer)) {\n\t state = PATH$1;\n\t } else if (buffer == '') {\n\t url.host = '';\n\t if (stateOverride) return;\n\t state = PATH_START$1;\n\t } else {\n\t failure = parseHost$1(url, buffer);\n\t if (failure) return failure;\n\t if (url.host == 'localhost') url.host = '';\n\t if (stateOverride) return;\n\t buffer = '';\n\t state = PATH_START$1;\n\t } continue;\n\t } else buffer += char;\n\t break;\n\n\t case PATH_START$1:\n\t if (isSpecial$1(url)) {\n\t state = PATH$1;\n\t if (char != '/' && char != '\\\\') continue;\n\t } else if (!stateOverride && char == '?') {\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (!stateOverride && char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else if (char != EOF$1) {\n\t state = PATH$1;\n\t if (char != '/') continue;\n\t } break;\n\n\t case PATH$1:\n\t if (\n\t char == EOF$1 || char == '/' ||\n\t (char == '\\\\' && isSpecial$1(url)) ||\n\t (!stateOverride && (char == '?' || char == '#'))\n\t ) {\n\t if (isDoubleDot$1(buffer)) {\n\t shortenURLsPath$1(url);\n\t if (char != '/' && !(char == '\\\\' && isSpecial$1(url))) {\n\t url.path.push('');\n\t }\n\t } else if (isSingleDot$1(buffer)) {\n\t if (char != '/' && !(char == '\\\\' && isSpecial$1(url))) {\n\t url.path.push('');\n\t }\n\t } else {\n\t if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter$1(buffer)) {\n\t if (url.host) url.host = '';\n\t buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n\t }\n\t url.path.push(buffer);\n\t }\n\t buffer = '';\n\t if (url.scheme == 'file' && (char == EOF$1 || char == '?' || char == '#')) {\n\t while (url.path.length > 1 && url.path[0] === '') {\n\t url.path.shift();\n\t }\n\t }\n\t if (char == '?') {\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t }\n\t } else {\n\t buffer += percentEncode$1(char, pathPercentEncodeSet$1);\n\t } break;\n\n\t case CANNOT_BE_A_BASE_URL_PATH$1:\n\t if (char == '?') {\n\t url.query = '';\n\t state = QUERY$1;\n\t } else if (char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else if (char != EOF$1) {\n\t url.path[0] += percentEncode$1(char, C0ControlPercentEncodeSet$1);\n\t } break;\n\n\t case QUERY$1:\n\t if (!stateOverride && char == '#') {\n\t url.fragment = '';\n\t state = FRAGMENT$1;\n\t } else if (char != EOF$1) {\n\t if (char == \"'\" && isSpecial$1(url)) url.query += '%27';\n\t else if (char == '#') url.query += '%23';\n\t else url.query += percentEncode$1(char, C0ControlPercentEncodeSet$1);\n\t } break;\n\n\t case FRAGMENT$1:\n\t if (char != EOF$1) url.fragment += percentEncode$1(char, fragmentPercentEncodeSet$1);\n\t break;\n\t }\n\n\t pointer++;\n\t }\n\t};\n\n\t// `URL` constructor\n\t// https://url.spec.whatwg.org/#url-class\n\tvar URLConstructor$1 = function URL(url /* , base */) {\n\t var that = anInstance$1(this, URLConstructor$1, 'URL');\n\t var base = arguments.length > 1 ? arguments[1] : undefined;\n\t var urlString = String(url);\n\t var state = setInternalState$d(that, { type: 'URL' });\n\t var baseState, failure;\n\t if (base !== undefined) {\n\t if (base instanceof URLConstructor$1) baseState = getInternalURLState$1(base);\n\t else {\n\t failure = parseURL$1(baseState = {}, String(base));\n\t if (failure) throw TypeError(failure);\n\t }\n\t }\n\t failure = parseURL$1(state, urlString, null, baseState);\n\t if (failure) throw TypeError(failure);\n\t var searchParams = state.searchParams = new URLSearchParams$2();\n\t var searchParamsState = getInternalSearchParamsState$1(searchParams);\n\t searchParamsState.updateSearchParams(state.query);\n\t searchParamsState.updateURL = function () {\n\t state.query = String(searchParams) || null;\n\t };\n\t if (!descriptors$1) {\n\t that.href = serializeURL$1.call(that);\n\t that.origin = getOrigin$1.call(that);\n\t that.protocol = getProtocol$1.call(that);\n\t that.username = getUsername$1.call(that);\n\t that.password = getPassword$1.call(that);\n\t that.host = getHost$1.call(that);\n\t that.hostname = getHostname$1.call(that);\n\t that.port = getPort$1.call(that);\n\t that.pathname = getPathname$1.call(that);\n\t that.search = getSearch$1.call(that);\n\t that.searchParams = getSearchParams$1.call(that);\n\t that.hash = getHash$1.call(that);\n\t }\n\t};\n\n\tvar URLPrototype$1 = URLConstructor$1.prototype;\n\n\tvar serializeURL$1 = function () {\n\t var url = getInternalURLState$1(this);\n\t var scheme = url.scheme;\n\t var username = url.username;\n\t var password = url.password;\n\t var host = url.host;\n\t var port = url.port;\n\t var path = url.path;\n\t var query = url.query;\n\t var fragment = url.fragment;\n\t var output = scheme + ':';\n\t if (host !== null) {\n\t output += '//';\n\t if (includesCredentials$1(url)) {\n\t output += username + (password ? ':' + password : '') + '@';\n\t }\n\t output += serializeHost$1(host);\n\t if (port !== null) output += ':' + port;\n\t } else if (scheme == 'file') output += '//';\n\t output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t if (query !== null) output += '?' + query;\n\t if (fragment !== null) output += '#' + fragment;\n\t return output;\n\t};\n\n\tvar getOrigin$1 = function () {\n\t var url = getInternalURLState$1(this);\n\t var scheme = url.scheme;\n\t var port = url.port;\n\t if (scheme == 'blob') try {\n\t return new URL(scheme.path[0]).origin;\n\t } catch (error) {\n\t return 'null';\n\t }\n\t if (scheme == 'file' || !isSpecial$1(url)) return 'null';\n\t return scheme + '://' + serializeHost$1(url.host) + (port !== null ? ':' + port : '');\n\t};\n\n\tvar getProtocol$1 = function () {\n\t return getInternalURLState$1(this).scheme + ':';\n\t};\n\n\tvar getUsername$1 = function () {\n\t return getInternalURLState$1(this).username;\n\t};\n\n\tvar getPassword$1 = function () {\n\t return getInternalURLState$1(this).password;\n\t};\n\n\tvar getHost$1 = function () {\n\t var url = getInternalURLState$1(this);\n\t var host = url.host;\n\t var port = url.port;\n\t return host === null ? ''\n\t : port === null ? serializeHost$1(host)\n\t : serializeHost$1(host) + ':' + port;\n\t};\n\n\tvar getHostname$1 = function () {\n\t var host = getInternalURLState$1(this).host;\n\t return host === null ? '' : serializeHost$1(host);\n\t};\n\n\tvar getPort$1 = function () {\n\t var port = getInternalURLState$1(this).port;\n\t return port === null ? '' : String(port);\n\t};\n\n\tvar getPathname$1 = function () {\n\t var url = getInternalURLState$1(this);\n\t var path = url.path;\n\t return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n\t};\n\n\tvar getSearch$1 = function () {\n\t var query = getInternalURLState$1(this).query;\n\t return query ? '?' + query : '';\n\t};\n\n\tvar getSearchParams$1 = function () {\n\t return getInternalURLState$1(this).searchParams;\n\t};\n\n\tvar getHash$1 = function () {\n\t var fragment = getInternalURLState$1(this).fragment;\n\t return fragment ? '#' + fragment : '';\n\t};\n\n\tvar accessorDescriptor$1 = function (getter, setter) {\n\t return { get: getter, set: setter, configurable: true, enumerable: true };\n\t};\n\n\tif (descriptors$1) {\n\t objectDefineProperties$1(URLPrototype$1, {\n\t // `URL.prototype.href` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-href\n\t href: accessorDescriptor$1(serializeURL$1, function (href) {\n\t var url = getInternalURLState$1(this);\n\t var urlString = String(href);\n\t var failure = parseURL$1(url, urlString);\n\t if (failure) throw TypeError(failure);\n\t getInternalSearchParamsState$1(url.searchParams).updateSearchParams(url.query);\n\t }),\n\t // `URL.prototype.origin` getter\n\t // https://url.spec.whatwg.org/#dom-url-origin\n\t origin: accessorDescriptor$1(getOrigin$1),\n\t // `URL.prototype.protocol` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-protocol\n\t protocol: accessorDescriptor$1(getProtocol$1, function (protocol) {\n\t var url = getInternalURLState$1(this);\n\t parseURL$1(url, String(protocol) + ':', SCHEME_START$1);\n\t }),\n\t // `URL.prototype.username` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-username\n\t username: accessorDescriptor$1(getUsername$1, function (username) {\n\t var url = getInternalURLState$1(this);\n\t var codePoints = arrayFrom$1(String(username));\n\t if (cannotHaveUsernamePasswordPort$1(url)) return;\n\t url.username = '';\n\t for (var i = 0; i < codePoints.length; i++) {\n\t url.username += percentEncode$1(codePoints[i], userinfoPercentEncodeSet$1);\n\t }\n\t }),\n\t // `URL.prototype.password` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-password\n\t password: accessorDescriptor$1(getPassword$1, function (password) {\n\t var url = getInternalURLState$1(this);\n\t var codePoints = arrayFrom$1(String(password));\n\t if (cannotHaveUsernamePasswordPort$1(url)) return;\n\t url.password = '';\n\t for (var i = 0; i < codePoints.length; i++) {\n\t url.password += percentEncode$1(codePoints[i], userinfoPercentEncodeSet$1);\n\t }\n\t }),\n\t // `URL.prototype.host` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-host\n\t host: accessorDescriptor$1(getHost$1, function (host) {\n\t var url = getInternalURLState$1(this);\n\t if (url.cannotBeABaseURL) return;\n\t parseURL$1(url, String(host), HOST$1);\n\t }),\n\t // `URL.prototype.hostname` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-hostname\n\t hostname: accessorDescriptor$1(getHostname$1, function (hostname) {\n\t var url = getInternalURLState$1(this);\n\t if (url.cannotBeABaseURL) return;\n\t parseURL$1(url, String(hostname), HOSTNAME$1);\n\t }),\n\t // `URL.prototype.port` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-port\n\t port: accessorDescriptor$1(getPort$1, function (port) {\n\t var url = getInternalURLState$1(this);\n\t if (cannotHaveUsernamePasswordPort$1(url)) return;\n\t port = String(port);\n\t if (port == '') url.port = null;\n\t else parseURL$1(url, port, PORT$1);\n\t }),\n\t // `URL.prototype.pathname` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-pathname\n\t pathname: accessorDescriptor$1(getPathname$1, function (pathname) {\n\t var url = getInternalURLState$1(this);\n\t if (url.cannotBeABaseURL) return;\n\t url.path = [];\n\t parseURL$1(url, pathname + '', PATH_START$1);\n\t }),\n\t // `URL.prototype.search` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-search\n\t search: accessorDescriptor$1(getSearch$1, function (search) {\n\t var url = getInternalURLState$1(this);\n\t search = String(search);\n\t if (search == '') {\n\t url.query = null;\n\t } else {\n\t if ('?' == search.charAt(0)) search = search.slice(1);\n\t url.query = '';\n\t parseURL$1(url, search, QUERY$1);\n\t }\n\t getInternalSearchParamsState$1(url.searchParams).updateSearchParams(url.query);\n\t }),\n\t // `URL.prototype.searchParams` getter\n\t // https://url.spec.whatwg.org/#dom-url-searchparams\n\t searchParams: accessorDescriptor$1(getSearchParams$1),\n\t // `URL.prototype.hash` accessors pair\n\t // https://url.spec.whatwg.org/#dom-url-hash\n\t hash: accessorDescriptor$1(getHash$1, function (hash) {\n\t var url = getInternalURLState$1(this);\n\t hash = String(hash);\n\t if (hash == '') {\n\t url.fragment = null;\n\t return;\n\t }\n\t if ('#' == hash.charAt(0)) hash = hash.slice(1);\n\t url.fragment = '';\n\t parseURL$1(url, hash, FRAGMENT$1);\n\t })\n\t });\n\t}\n\n\t// `URL.prototype.toJSON` method\n\t// https://url.spec.whatwg.org/#dom-url-tojson\n\tredefine$1(URLPrototype$1, 'toJSON', function toJSON() {\n\t return serializeURL$1.call(this);\n\t}, { enumerable: true });\n\n\t// `URL.prototype.toString` method\n\t// https://url.spec.whatwg.org/#URL-stringification-behavior\n\tredefine$1(URLPrototype$1, 'toString', function toString() {\n\t return serializeURL$1.call(this);\n\t}, { enumerable: true });\n\n\tif (NativeURL$1) {\n\t var nativeCreateObjectURL$1 = NativeURL$1.createObjectURL;\n\t var nativeRevokeObjectURL$1 = NativeURL$1.revokeObjectURL;\n\t // `URL.createObjectURL` method\n\t // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n\t // eslint-disable-next-line no-unused-vars\n\t if (nativeCreateObjectURL$1) redefine$1(URLConstructor$1, 'createObjectURL', function createObjectURL(blob) {\n\t return nativeCreateObjectURL$1.apply(NativeURL$1, arguments);\n\t });\n\t // `URL.revokeObjectURL` method\n\t // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n\t // eslint-disable-next-line no-unused-vars\n\t if (nativeRevokeObjectURL$1) redefine$1(URLConstructor$1, 'revokeObjectURL', function revokeObjectURL(url) {\n\t return nativeRevokeObjectURL$1.apply(NativeURL$1, arguments);\n\t });\n\t}\n\n\tsetToStringTag$1(URLConstructor$1, 'URL');\n\n\t_export$1({ global: true, forced: !nativeUrl$1, sham: !descriptors$1 }, {\n\t URL: URLConstructor$1\n\t});\n\n\tvar $some$2 = arrayIteration$1.some;\n\n\n\n\tvar STRICT_METHOD$9 = arrayMethodIsStrict$1('some');\n\tvar USES_TO_LENGTH$h = arrayMethodUsesToLength$1('some');\n\n\t// `Array.prototype.some` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.some\n\t_export$1({ target: 'Array', proto: true, forced: !STRICT_METHOD$9 || !USES_TO_LENGTH$h }, {\n\t some: function some(callbackfn /* , thisArg */) {\n\t return $some$2(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// `thisNumberValue` abstract operation\n\t// https://tc39.github.io/ecma262/#sec-thisnumbervalue\n\tvar thisNumberValue = function (value) {\n\t if (typeof value != 'number' && classofRaw$1(value) != 'Number') {\n\t throw TypeError('Incorrect invocation');\n\t }\n\t return +value;\n\t};\n\n\t// `String.prototype.repeat` method implementation\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n\tvar stringRepeat = ''.repeat || function repeat(count) {\n\t var str = String(requireObjectCoercible$1(this));\n\t var result = '';\n\t var n = toInteger$1(count);\n\t if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n\t for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n\t return result;\n\t};\n\n\tvar nativeToFixed = 1.0.toFixed;\n\tvar floor$9 = Math.floor;\n\n\tvar pow$3 = function (x, n, acc) {\n\t return n === 0 ? acc : n % 2 === 1 ? pow$3(x, n - 1, acc * x) : pow$3(x * x, n / 2, acc);\n\t};\n\n\tvar log$1 = function (x) {\n\t var n = 0;\n\t var x2 = x;\n\t while (x2 >= 4096) {\n\t n += 12;\n\t x2 /= 4096;\n\t }\n\t while (x2 >= 2) {\n\t n += 1;\n\t x2 /= 2;\n\t } return n;\n\t};\n\n\tvar FORCED$9 = nativeToFixed && (\n\t 0.00008.toFixed(3) !== '0.000' ||\n\t 0.9.toFixed(0) !== '1' ||\n\t 1.255.toFixed(2) !== '1.25' ||\n\t 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n\t) || !fails$1(function () {\n\t // V8 ~ Android 4.3-\n\t nativeToFixed.call({});\n\t});\n\n\t// `Number.prototype.toFixed` method\n\t// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n\t_export$1({ target: 'Number', proto: true, forced: FORCED$9 }, {\n\t // eslint-disable-next-line max-statements\n\t toFixed: function toFixed(fractionDigits) {\n\t var number = thisNumberValue(this);\n\t var fractDigits = toInteger$1(fractionDigits);\n\t var data = [0, 0, 0, 0, 0, 0];\n\t var sign = '';\n\t var result = '0';\n\t var e, z, j, k;\n\n\t var multiply = function (n, c) {\n\t var index = -1;\n\t var c2 = c;\n\t while (++index < 6) {\n\t c2 += n * data[index];\n\t data[index] = c2 % 1e7;\n\t c2 = floor$9(c2 / 1e7);\n\t }\n\t };\n\n\t var divide = function (n) {\n\t var index = 6;\n\t var c = 0;\n\t while (--index >= 0) {\n\t c += data[index];\n\t data[index] = floor$9(c / n);\n\t c = (c % n) * 1e7;\n\t }\n\t };\n\n\t var dataToString = function () {\n\t var index = 6;\n\t var s = '';\n\t while (--index >= 0) {\n\t if (s !== '' || index === 0 || data[index] !== 0) {\n\t var t = String(data[index]);\n\t s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;\n\t }\n\t } return s;\n\t };\n\n\t if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n\t // eslint-disable-next-line no-self-compare\n\t if (number != number) return 'NaN';\n\t if (number <= -1e21 || number >= 1e21) return String(number);\n\t if (number < 0) {\n\t sign = '-';\n\t number = -number;\n\t }\n\t if (number > 1e-21) {\n\t e = log$1(number * pow$3(2, 69, 1)) - 69;\n\t z = e < 0 ? number * pow$3(2, -e, 1) : number / pow$3(2, e, 1);\n\t z *= 0x10000000000000;\n\t e = 52 - e;\n\t if (e > 0) {\n\t multiply(0, z);\n\t j = fractDigits;\n\t while (j >= 7) {\n\t multiply(1e7, 0);\n\t j -= 7;\n\t }\n\t multiply(pow$3(10, j, 1), 0);\n\t j = e - 1;\n\t while (j >= 23) {\n\t divide(1 << 23);\n\t j -= 23;\n\t }\n\t divide(1 << j);\n\t multiply(1, 1);\n\t divide(2);\n\t result = dataToString();\n\t } else {\n\t multiply(0, z);\n\t multiply(1 << -e, 0);\n\t result = dataToString() + stringRepeat.call('0', fractDigits);\n\t }\n\t }\n\t if (fractDigits > 0) {\n\t k = result.length;\n\t result = sign + (k <= fractDigits\n\t ? '0.' + stringRepeat.call('0', fractDigits - k) + result\n\t : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n\t } else {\n\t result = sign + result;\n\t } return result;\n\t }\n\t});\n\n\tvar $entries$1 = objectToArray$1.entries;\n\n\t// `Object.entries` method\n\t// https://tc39.github.io/ecma262/#sec-object.entries\n\t_export$1({ target: 'Object', stat: true }, {\n\t entries: function entries(O) {\n\t return $entries$1(O);\n\t }\n\t});\n\n\tvar max$5 = Math.max;\n\tvar min$a = Math.min;\n\tvar floor$a = Math.floor;\n\tvar SUBSTITUTION_SYMBOLS$1 = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\n\tvar SUBSTITUTION_SYMBOLS_NO_NAMED$1 = /\\$([$&'`]|\\d\\d?)/g;\n\n\tvar maybeToString$1 = function (it) {\n\t return it === undefined ? it : String(it);\n\t};\n\n\t// @@replace logic\n\tfixRegexpWellKnownSymbolLogic$1('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n\t var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n\t var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n\t var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n\t return [\n\t // `String.prototype.replace` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n\t function replace(searchValue, replaceValue) {\n\t var O = requireObjectCoercible$1(this);\n\t var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n\t return replacer !== undefined\n\t ? replacer.call(searchValue, O, replaceValue)\n\t : nativeReplace.call(String(O), searchValue, replaceValue);\n\t },\n\t // `RegExp.prototype[@@replace]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n\t function (regexp, replaceValue) {\n\t if (\n\t (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n\t (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n\t ) {\n\t var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n\t if (res.done) return res.value;\n\t }\n\n\t var rx = anObject$1(regexp);\n\t var S = String(this);\n\n\t var functionalReplace = typeof replaceValue === 'function';\n\t if (!functionalReplace) replaceValue = String(replaceValue);\n\n\t var global = rx.global;\n\t if (global) {\n\t var fullUnicode = rx.unicode;\n\t rx.lastIndex = 0;\n\t }\n\t var results = [];\n\t while (true) {\n\t var result = regexpExecAbstract$1(rx, S);\n\t if (result === null) break;\n\n\t results.push(result);\n\t if (!global) break;\n\n\t var matchStr = String(result[0]);\n\t if (matchStr === '') rx.lastIndex = advanceStringIndex$1(S, toLength$1(rx.lastIndex), fullUnicode);\n\t }\n\n\t var accumulatedResult = '';\n\t var nextSourcePosition = 0;\n\t for (var i = 0; i < results.length; i++) {\n\t result = results[i];\n\n\t var matched = String(result[0]);\n\t var position = max$5(min$a(toInteger$1(result.index), S.length), 0);\n\t var captures = [];\n\t // NOTE: This is equivalent to\n\t // captures = result.slice(1).map(maybeToString)\n\t // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n\t // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n\t // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n\t for (var j = 1; j < result.length; j++) captures.push(maybeToString$1(result[j]));\n\t var namedCaptures = result.groups;\n\t if (functionalReplace) {\n\t var replacerArgs = [matched].concat(captures, position, S);\n\t if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n\t var replacement = String(replaceValue.apply(undefined, replacerArgs));\n\t } else {\n\t replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n\t }\n\t if (position >= nextSourcePosition) {\n\t accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n\t nextSourcePosition = position + matched.length;\n\t }\n\t }\n\t return accumulatedResult + S.slice(nextSourcePosition);\n\t }\n\t ];\n\n\t // https://tc39.github.io/ecma262/#sec-getsubstitution\n\t function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n\t var tailPos = position + matched.length;\n\t var m = captures.length;\n\t var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED$1;\n\t if (namedCaptures !== undefined) {\n\t namedCaptures = toObject$1(namedCaptures);\n\t symbols = SUBSTITUTION_SYMBOLS$1;\n\t }\n\t return nativeReplace.call(replacement, symbols, function (match, ch) {\n\t var capture;\n\t switch (ch.charAt(0)) {\n\t case '$': return '$';\n\t case '&': return matched;\n\t case '`': return str.slice(0, position);\n\t case \"'\": return str.slice(tailPos);\n\t case '<':\n\t capture = namedCaptures[ch.slice(1, -1)];\n\t break;\n\t default: // \\d\\d?\n\t var n = +ch;\n\t if (n === 0) return match;\n\t if (n > m) {\n\t var f = floor$a(n / 10);\n\t if (f === 0) return match;\n\t if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n\t return match;\n\t }\n\t capture = captures[n - 1];\n\t }\n\t return capture === undefined ? '' : capture;\n\t });\n\t }\n\t});\n\n\tvar nativeGetOwnPropertyNames$2 = objectGetOwnPropertyNames$1.f;\n\n\tvar toString$3 = {}.toString;\n\n\tvar windowNames$1 = typeof window == 'object' && window && Object.getOwnPropertyNames\n\t ? Object.getOwnPropertyNames(window) : [];\n\n\tvar getWindowNames$1 = function (it) {\n\t try {\n\t return nativeGetOwnPropertyNames$2(it);\n\t } catch (error) {\n\t return windowNames$1.slice();\n\t }\n\t};\n\n\t// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n\tvar f$d = function getOwnPropertyNames(it) {\n\t return windowNames$1 && toString$3.call(it) == '[object Window]'\n\t ? getWindowNames$1(it)\n\t : nativeGetOwnPropertyNames$2(toIndexedObject$1(it));\n\t};\n\n\tvar objectGetOwnPropertyNamesExternal$1 = {\n\t\tf: f$d\n\t};\n\n\tvar f$e = wellKnownSymbol$1;\n\n\tvar wellKnownSymbolWrapped$1 = {\n\t\tf: f$e\n\t};\n\n\tvar defineProperty$e = objectDefineProperty$1.f;\n\n\tvar defineWellKnownSymbol$1 = function (NAME) {\n\t var Symbol = path$1.Symbol || (path$1.Symbol = {});\n\t if (!has$2(Symbol, NAME)) defineProperty$e(Symbol, NAME, {\n\t value: wellKnownSymbolWrapped$1.f(NAME)\n\t });\n\t};\n\n\tvar $forEach$4 = arrayIteration$1.forEach;\n\n\tvar HIDDEN$1 = sharedKey$1('hidden');\n\tvar SYMBOL$1 = 'Symbol';\n\tvar PROTOTYPE$4 = 'prototype';\n\tvar TO_PRIMITIVE$1 = wellKnownSymbol$1('toPrimitive');\n\tvar setInternalState$e = internalState$1.set;\n\tvar getInternalState$7 = internalState$1.getterFor(SYMBOL$1);\n\tvar ObjectPrototype$5 = Object[PROTOTYPE$4];\n\tvar $Symbol$1 = global_1$1.Symbol;\n\tvar $stringify$1 = getBuiltIn$1('JSON', 'stringify');\n\tvar nativeGetOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor$1.f;\n\tvar nativeDefineProperty$3 = objectDefineProperty$1.f;\n\tvar nativeGetOwnPropertyNames$3 = objectGetOwnPropertyNamesExternal$1.f;\n\tvar nativePropertyIsEnumerable$3 = objectPropertyIsEnumerable$1.f;\n\tvar AllSymbols$1 = shared$1('symbols');\n\tvar ObjectPrototypeSymbols$1 = shared$1('op-symbols');\n\tvar StringToSymbolRegistry$1 = shared$1('string-to-symbol-registry');\n\tvar SymbolToStringRegistry$1 = shared$1('symbol-to-string-registry');\n\tvar WellKnownSymbolsStore$3 = shared$1('wks');\n\tvar QObject$1 = global_1$1.QObject;\n\t// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n\tvar USE_SETTER$1 = !QObject$1 || !QObject$1[PROTOTYPE$4] || !QObject$1[PROTOTYPE$4].findChild;\n\n\t// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n\tvar setSymbolDescriptor$1 = descriptors$1 && fails$1(function () {\n\t return objectCreate$1(nativeDefineProperty$3({}, 'a', {\n\t get: function () { return nativeDefineProperty$3(this, 'a', { value: 7 }).a; }\n\t })).a != 7;\n\t}) ? function (O, P, Attributes) {\n\t var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$4(ObjectPrototype$5, P);\n\t if (ObjectPrototypeDescriptor) delete ObjectPrototype$5[P];\n\t nativeDefineProperty$3(O, P, Attributes);\n\t if (ObjectPrototypeDescriptor && O !== ObjectPrototype$5) {\n\t nativeDefineProperty$3(ObjectPrototype$5, P, ObjectPrototypeDescriptor);\n\t }\n\t} : nativeDefineProperty$3;\n\n\tvar wrap$3 = function (tag, description) {\n\t var symbol = AllSymbols$1[tag] = objectCreate$1($Symbol$1[PROTOTYPE$4]);\n\t setInternalState$e(symbol, {\n\t type: SYMBOL$1,\n\t tag: tag,\n\t description: description\n\t });\n\t if (!descriptors$1) symbol.description = description;\n\t return symbol;\n\t};\n\n\tvar isSymbol$1 = useSymbolAsUid$1 ? function (it) {\n\t return typeof it == 'symbol';\n\t} : function (it) {\n\t return Object(it) instanceof $Symbol$1;\n\t};\n\n\tvar $defineProperty$1 = function defineProperty(O, P, Attributes) {\n\t if (O === ObjectPrototype$5) $defineProperty$1(ObjectPrototypeSymbols$1, P, Attributes);\n\t anObject$1(O);\n\t var key = toPrimitive$1(P, true);\n\t anObject$1(Attributes);\n\t if (has$2(AllSymbols$1, key)) {\n\t if (!Attributes.enumerable) {\n\t if (!has$2(O, HIDDEN$1)) nativeDefineProperty$3(O, HIDDEN$1, createPropertyDescriptor$1(1, {}));\n\t O[HIDDEN$1][key] = true;\n\t } else {\n\t if (has$2(O, HIDDEN$1) && O[HIDDEN$1][key]) O[HIDDEN$1][key] = false;\n\t Attributes = objectCreate$1(Attributes, { enumerable: createPropertyDescriptor$1(0, false) });\n\t } return setSymbolDescriptor$1(O, key, Attributes);\n\t } return nativeDefineProperty$3(O, key, Attributes);\n\t};\n\n\tvar $defineProperties$1 = function defineProperties(O, Properties) {\n\t anObject$1(O);\n\t var properties = toIndexedObject$1(Properties);\n\t var keys = objectKeys$1(properties).concat($getOwnPropertySymbols$1(properties));\n\t $forEach$4(keys, function (key) {\n\t if (!descriptors$1 || $propertyIsEnumerable$1.call(properties, key)) $defineProperty$1(O, key, properties[key]);\n\t });\n\t return O;\n\t};\n\n\tvar $create$1 = function create(O, Properties) {\n\t return Properties === undefined ? objectCreate$1(O) : $defineProperties$1(objectCreate$1(O), Properties);\n\t};\n\n\tvar $propertyIsEnumerable$1 = function propertyIsEnumerable(V) {\n\t var P = toPrimitive$1(V, true);\n\t var enumerable = nativePropertyIsEnumerable$3.call(this, P);\n\t if (this === ObjectPrototype$5 && has$2(AllSymbols$1, P) && !has$2(ObjectPrototypeSymbols$1, P)) return false;\n\t return enumerable || !has$2(this, P) || !has$2(AllSymbols$1, P) || has$2(this, HIDDEN$1) && this[HIDDEN$1][P] ? enumerable : true;\n\t};\n\n\tvar $getOwnPropertyDescriptor$1 = function getOwnPropertyDescriptor(O, P) {\n\t var it = toIndexedObject$1(O);\n\t var key = toPrimitive$1(P, true);\n\t if (it === ObjectPrototype$5 && has$2(AllSymbols$1, key) && !has$2(ObjectPrototypeSymbols$1, key)) return;\n\t var descriptor = nativeGetOwnPropertyDescriptor$4(it, key);\n\t if (descriptor && has$2(AllSymbols$1, key) && !(has$2(it, HIDDEN$1) && it[HIDDEN$1][key])) {\n\t descriptor.enumerable = true;\n\t }\n\t return descriptor;\n\t};\n\n\tvar $getOwnPropertyNames$1 = function getOwnPropertyNames(O) {\n\t var names = nativeGetOwnPropertyNames$3(toIndexedObject$1(O));\n\t var result = [];\n\t $forEach$4(names, function (key) {\n\t if (!has$2(AllSymbols$1, key) && !has$2(hiddenKeys$2, key)) result.push(key);\n\t });\n\t return result;\n\t};\n\n\tvar $getOwnPropertySymbols$1 = function getOwnPropertySymbols(O) {\n\t var IS_OBJECT_PROTOTYPE = O === ObjectPrototype$5;\n\t var names = nativeGetOwnPropertyNames$3(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols$1 : toIndexedObject$1(O));\n\t var result = [];\n\t $forEach$4(names, function (key) {\n\t if (has$2(AllSymbols$1, key) && (!IS_OBJECT_PROTOTYPE || has$2(ObjectPrototype$5, key))) {\n\t result.push(AllSymbols$1[key]);\n\t }\n\t });\n\t return result;\n\t};\n\n\t// `Symbol` constructor\n\t// https://tc39.github.io/ecma262/#sec-symbol-constructor\n\tif (!nativeSymbol$1) {\n\t $Symbol$1 = function Symbol() {\n\t if (this instanceof $Symbol$1) throw TypeError('Symbol is not a constructor');\n\t var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n\t var tag = uid$1(description);\n\t var setter = function (value) {\n\t if (this === ObjectPrototype$5) setter.call(ObjectPrototypeSymbols$1, value);\n\t if (has$2(this, HIDDEN$1) && has$2(this[HIDDEN$1], tag)) this[HIDDEN$1][tag] = false;\n\t setSymbolDescriptor$1(this, tag, createPropertyDescriptor$1(1, value));\n\t };\n\t if (descriptors$1 && USE_SETTER$1) setSymbolDescriptor$1(ObjectPrototype$5, tag, { configurable: true, set: setter });\n\t return wrap$3(tag, description);\n\t };\n\n\t redefine$1($Symbol$1[PROTOTYPE$4], 'toString', function toString() {\n\t return getInternalState$7(this).tag;\n\t });\n\n\t redefine$1($Symbol$1, 'withoutSetter', function (description) {\n\t return wrap$3(uid$1(description), description);\n\t });\n\n\t objectPropertyIsEnumerable$1.f = $propertyIsEnumerable$1;\n\t objectDefineProperty$1.f = $defineProperty$1;\n\t objectGetOwnPropertyDescriptor$1.f = $getOwnPropertyDescriptor$1;\n\t objectGetOwnPropertyNames$1.f = objectGetOwnPropertyNamesExternal$1.f = $getOwnPropertyNames$1;\n\t objectGetOwnPropertySymbols$1.f = $getOwnPropertySymbols$1;\n\n\t wellKnownSymbolWrapped$1.f = function (name) {\n\t return wrap$3(wellKnownSymbol$1(name), name);\n\t };\n\n\t if (descriptors$1) {\n\t // https://github.com/tc39/proposal-Symbol-description\n\t nativeDefineProperty$3($Symbol$1[PROTOTYPE$4], 'description', {\n\t configurable: true,\n\t get: function description() {\n\t return getInternalState$7(this).description;\n\t }\n\t });\n\t {\n\t redefine$1(ObjectPrototype$5, 'propertyIsEnumerable', $propertyIsEnumerable$1, { unsafe: true });\n\t }\n\t }\n\t}\n\n\t_export$1({ global: true, wrap: true, forced: !nativeSymbol$1, sham: !nativeSymbol$1 }, {\n\t Symbol: $Symbol$1\n\t});\n\n\t$forEach$4(objectKeys$1(WellKnownSymbolsStore$3), function (name) {\n\t defineWellKnownSymbol$1(name);\n\t});\n\n\t_export$1({ target: SYMBOL$1, stat: true, forced: !nativeSymbol$1 }, {\n\t // `Symbol.for` method\n\t // https://tc39.github.io/ecma262/#sec-symbol.for\n\t 'for': function (key) {\n\t var string = String(key);\n\t if (has$2(StringToSymbolRegistry$1, string)) return StringToSymbolRegistry$1[string];\n\t var symbol = $Symbol$1(string);\n\t StringToSymbolRegistry$1[string] = symbol;\n\t SymbolToStringRegistry$1[symbol] = string;\n\t return symbol;\n\t },\n\t // `Symbol.keyFor` method\n\t // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n\t keyFor: function keyFor(sym) {\n\t if (!isSymbol$1(sym)) throw TypeError(sym + ' is not a symbol');\n\t if (has$2(SymbolToStringRegistry$1, sym)) return SymbolToStringRegistry$1[sym];\n\t },\n\t useSetter: function () { USE_SETTER$1 = true; },\n\t useSimple: function () { USE_SETTER$1 = false; }\n\t});\n\n\t_export$1({ target: 'Object', stat: true, forced: !nativeSymbol$1, sham: !descriptors$1 }, {\n\t // `Object.create` method\n\t // https://tc39.github.io/ecma262/#sec-object.create\n\t create: $create$1,\n\t // `Object.defineProperty` method\n\t // https://tc39.github.io/ecma262/#sec-object.defineproperty\n\t defineProperty: $defineProperty$1,\n\t // `Object.defineProperties` method\n\t // https://tc39.github.io/ecma262/#sec-object.defineproperties\n\t defineProperties: $defineProperties$1,\n\t // `Object.getOwnPropertyDescriptor` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\t getOwnPropertyDescriptor: $getOwnPropertyDescriptor$1\n\t});\n\n\t_export$1({ target: 'Object', stat: true, forced: !nativeSymbol$1 }, {\n\t // `Object.getOwnPropertyNames` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n\t getOwnPropertyNames: $getOwnPropertyNames$1,\n\t // `Object.getOwnPropertySymbols` method\n\t // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n\t getOwnPropertySymbols: $getOwnPropertySymbols$1\n\t});\n\n\t// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n\t// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n\t_export$1({ target: 'Object', stat: true, forced: fails$1(function () { objectGetOwnPropertySymbols$1.f(1); }) }, {\n\t getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n\t return objectGetOwnPropertySymbols$1.f(toObject$1(it));\n\t }\n\t});\n\n\t// `JSON.stringify` method behavior with symbols\n\t// https://tc39.github.io/ecma262/#sec-json.stringify\n\tif ($stringify$1) {\n\t var FORCED_JSON_STRINGIFY$1 = !nativeSymbol$1 || fails$1(function () {\n\t var symbol = $Symbol$1();\n\t // MS Edge converts symbol values to JSON as {}\n\t return $stringify$1([symbol]) != '[null]'\n\t // WebKit converts symbol values to JSON as null\n\t || $stringify$1({ a: symbol }) != '{}'\n\t // V8 throws on boxed symbols\n\t || $stringify$1(Object(symbol)) != '{}';\n\t });\n\n\t _export$1({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY$1 }, {\n\t // eslint-disable-next-line no-unused-vars\n\t stringify: function stringify(it, replacer, space) {\n\t var args = [it];\n\t var index = 1;\n\t var $replacer;\n\t while (arguments.length > index) args.push(arguments[index++]);\n\t $replacer = replacer;\n\t if (!isObject$2(replacer) && it === undefined || isSymbol$1(it)) return; // IE8 returns string on undefined\n\t if (!isArray$2(replacer)) replacer = function (key, value) {\n\t if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n\t if (!isSymbol$1(value)) return value;\n\t };\n\t args[1] = replacer;\n\t return $stringify$1.apply(null, args);\n\t }\n\t });\n\t}\n\n\t// `Symbol.prototype[@@toPrimitive]` method\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\n\tif (!$Symbol$1[PROTOTYPE$4][TO_PRIMITIVE$1]) {\n\t createNonEnumerableProperty$1($Symbol$1[PROTOTYPE$4], TO_PRIMITIVE$1, $Symbol$1[PROTOTYPE$4].valueOf);\n\t}\n\t// `Symbol.prototype[@@toStringTag]` property\n\t// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\n\tsetToStringTag$1($Symbol$1, SYMBOL$1);\n\n\thiddenKeys$2[HIDDEN$1] = true;\n\n\t// `Number.isNaN` method\n\t// https://tc39.github.io/ecma262/#sec-number.isnan\n\t_export$1({ target: 'Number', stat: true }, {\n\t isNaN: function isNaN(number) {\n\t // eslint-disable-next-line no-self-compare\n\t return number != number;\n\t }\n\t});\n\n\tvar nativeGetOwnPropertyDescriptor$5 = objectGetOwnPropertyDescriptor$1.f;\n\n\n\tvar FAILS_ON_PRIMITIVES$3 = fails$1(function () { nativeGetOwnPropertyDescriptor$5(1); });\n\tvar FORCED$a = !descriptors$1 || FAILS_ON_PRIMITIVES$3;\n\n\t// `Object.getOwnPropertyDescriptor` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n\t_export$1({ target: 'Object', stat: true, forced: FORCED$a, sham: !descriptors$1 }, {\n\t getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n\t return nativeGetOwnPropertyDescriptor$5(toIndexedObject$1(it), key);\n\t }\n\t});\n\n\t// `Object.getOwnPropertyDescriptors` method\n\t// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n\t_export$1({ target: 'Object', stat: true, sham: !descriptors$1 }, {\n\t getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n\t var O = toIndexedObject$1(object);\n\t var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor$1.f;\n\t var keys = ownKeys$2(O);\n\t var result = {};\n\t var index = 0;\n\t var key, descriptor;\n\t while (keys.length > index) {\n\t descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n\t if (descriptor !== undefined) createProperty$1(result, key, descriptor);\n\t }\n\t return result;\n\t }\n\t});\n\n\t// @@match logic\n\tfixRegexpWellKnownSymbolLogic$1('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n\t return [\n\t // `String.prototype.match` method\n\t // https://tc39.github.io/ecma262/#sec-string.prototype.match\n\t function match(regexp) {\n\t var O = requireObjectCoercible$1(this);\n\t var matcher = regexp == undefined ? undefined : regexp[MATCH];\n\t return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n\t },\n\t // `RegExp.prototype[@@match]` method\n\t // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n\t function (regexp) {\n\t var res = maybeCallNative(nativeMatch, regexp, this);\n\t if (res.done) return res.value;\n\n\t var rx = anObject$1(regexp);\n\t var S = String(this);\n\n\t if (!rx.global) return regexpExecAbstract$1(rx, S);\n\n\t var fullUnicode = rx.unicode;\n\t rx.lastIndex = 0;\n\t var A = [];\n\t var n = 0;\n\t var result;\n\t while ((result = regexpExecAbstract$1(rx, S)) !== null) {\n\t var matchStr = String(result[0]);\n\t A[n] = matchStr;\n\t if (matchStr === '') rx.lastIndex = advanceStringIndex$1(S, toLength$1(rx.lastIndex), fullUnicode);\n\t n++;\n\t }\n\t return n === 0 ? null : A;\n\t }\n\t ];\n\t});\n\n\tfunction _classCallCheck$2(e, t) {\n\t if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n\t}\n\n\tfunction _defineProperties$2(e, t) {\n\t for (var n = 0; n < t.length; n++) {\n\t var r = t[n];\n\t r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n\t }\n\t}\n\n\tfunction _createClass$2(e, t, n) {\n\t return t && _defineProperties$2(e.prototype, t), n && _defineProperties$2(e, n), e;\n\t}\n\n\tfunction _defineProperty$2(e, t, n) {\n\t return t in e ? Object.defineProperty(e, t, {\n\t value: n,\n\t enumerable: !0,\n\t configurable: !0,\n\t writable: !0\n\t }) : e[t] = n, e;\n\t}\n\n\tfunction ownKeys$3(e, t) {\n\t var n = Object.keys(e);\n\n\t if (Object.getOwnPropertySymbols) {\n\t var r = Object.getOwnPropertySymbols(e);\n\t t && (r = r.filter(function (t) {\n\t return Object.getOwnPropertyDescriptor(e, t).enumerable;\n\t })), n.push.apply(n, r);\n\t }\n\n\t return n;\n\t}\n\n\tfunction _objectSpread2$1(e) {\n\t for (var t = 1; t < arguments.length; t++) {\n\t var n = null != arguments[t] ? arguments[t] : {};\n\t t % 2 ? ownKeys$3(Object(n), !0).forEach(function (t) {\n\t _defineProperty$2(e, t, n[t]);\n\t }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$3(Object(n)).forEach(function (t) {\n\t Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n\t });\n\t }\n\n\t return e;\n\t}\n\n\tvar defaults$1 = {\n\t addCSS: !0,\n\t thumbWidth: 15,\n\t watch: !0\n\t};\n\n\tfunction matches$1(e, t) {\n\t return function () {\n\t return Array.from(document.querySelectorAll(t)).includes(this);\n\t }.call(e, t);\n\t}\n\n\tfunction trigger(e, t) {\n\t if (e && t) {\n\t var n = new Event(t, {\n\t bubbles: !0\n\t });\n\t e.dispatchEvent(n);\n\t }\n\t}\n\n\tvar getConstructor$1 = function getConstructor(e) {\n\t return null != e ? e.constructor : null;\n\t},\n\t instanceOf$1 = function instanceOf(e, t) {\n\t return !!(e && t && e instanceof t);\n\t},\n\t isNullOrUndefined$1 = function isNullOrUndefined(e) {\n\t return null == e;\n\t},\n\t isObject$3 = function isObject(e) {\n\t return getConstructor$1(e) === Object;\n\t},\n\t isNumber$1 = function isNumber(e) {\n\t return getConstructor$1(e) === Number && !Number.isNaN(e);\n\t},\n\t isString$2 = function isString(e) {\n\t return getConstructor$1(e) === String;\n\t},\n\t isBoolean$1 = function isBoolean(e) {\n\t return getConstructor$1(e) === Boolean;\n\t},\n\t isFunction$1 = function isFunction(e) {\n\t return getConstructor$1(e) === Function;\n\t},\n\t isArray$3 = function isArray(e) {\n\t return Array.isArray(e);\n\t},\n\t isNodeList$1 = function isNodeList(e) {\n\t return instanceOf$1(e, NodeList);\n\t},\n\t isElement$2 = function isElement(e) {\n\t return instanceOf$1(e, Element);\n\t},\n\t isEvent$2 = function isEvent(e) {\n\t return instanceOf$1(e, Event);\n\t},\n\t isEmpty$1 = function isEmpty(e) {\n\t return isNullOrUndefined$1(e) || (isString$2(e) || isArray$3(e) || isNodeList$1(e)) && !e.length || isObject$3(e) && !Object.keys(e).length;\n\t},\n\t is$1 = {\n\t nullOrUndefined: isNullOrUndefined$1,\n\t object: isObject$3,\n\t number: isNumber$1,\n\t string: isString$2,\n\t boolean: isBoolean$1,\n\t function: isFunction$1,\n\t array: isArray$3,\n\t nodeList: isNodeList$1,\n\t element: isElement$2,\n\t event: isEvent$2,\n\t empty: isEmpty$1\n\t};\n\n\tfunction getDecimalPlaces(e) {\n\t var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n\t return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n\t}\n\n\tfunction round(e, t) {\n\t if (1 > t) {\n\t var n = getDecimalPlaces(t);\n\t return parseFloat(e.toFixed(n));\n\t }\n\n\t return Math.round(e / t) * t;\n\t}\n\n\tvar RangeTouch = function () {\n\t function e(t, n) {\n\t _classCallCheck$2(this, e), is$1.element(t) ? this.element = t : is$1.string(t) && (this.element = document.querySelector(t)), is$1.element(this.element) && is$1.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults$1, {}, n), this.init());\n\t }\n\n\t return _createClass$2(e, [{\n\t key: \"init\",\n\t value: function value() {\n\t e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n\t }\n\t }, {\n\t key: \"destroy\",\n\t value: function value() {\n\t e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n\t }\n\t }, {\n\t key: \"listeners\",\n\t value: function value(e) {\n\t var t = this,\n\t n = e ? \"addEventListener\" : \"removeEventListener\";\n\t [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n\t t.element[n](e, function (e) {\n\t return t.set(e);\n\t }, !1);\n\t });\n\t }\n\t }, {\n\t key: \"get\",\n\t value: function value(t) {\n\t if (!e.enabled || !is$1.event(t)) return null;\n\t var n,\n\t r = t.target,\n\t i = t.changedTouches[0],\n\t o = parseFloat(r.getAttribute(\"min\")) || 0,\n\t s = parseFloat(r.getAttribute(\"max\")) || 100,\n\t u = parseFloat(r.getAttribute(\"step\")) || 1,\n\t c = r.getBoundingClientRect(),\n\t a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n\t return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n\t }\n\t }, {\n\t key: \"set\",\n\t value: function value(t) {\n\t e.enabled && is$1.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n\t }\n\t }], [{\n\t key: \"setup\",\n\t value: function value(t) {\n\t var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n\t r = null;\n\t if (is$1.empty(t) || is$1.string(t) ? r = Array.from(document.querySelectorAll(is$1.string(t) ? t : 'input[type=\"range\"]')) : is$1.element(t) ? r = [t] : is$1.nodeList(t) ? r = Array.from(t) : is$1.array(t) && (r = t.filter(is$1.element)), is$1.empty(r)) return null;\n\n\t var i = _objectSpread2$1({}, defaults$1, {}, n);\n\n\t if (is$1.string(t) && i.watch) {\n\t var o = new MutationObserver(function (n) {\n\t Array.from(n).forEach(function (n) {\n\t Array.from(n.addedNodes).forEach(function (n) {\n\t is$1.element(n) && matches$1(n, t) && new e(n, i);\n\t });\n\t });\n\t });\n\t o.observe(document.body, {\n\t childList: !0,\n\t subtree: !0\n\t });\n\t }\n\n\t return r.map(function (t) {\n\t return new e(t, n);\n\t });\n\t }\n\t }, {\n\t key: \"enabled\",\n\t get: function get() {\n\t return \"ontouchstart\" in document.documentElement;\n\t }\n\t }]), e;\n\t}();\n\n\tvar nativePromiseConstructor$1 = global_1$1.Promise;\n\n\tvar SPECIES$b = wellKnownSymbol$1('species');\n\n\tvar setSpecies$1 = function (CONSTRUCTOR_NAME) {\n\t var Constructor = getBuiltIn$1(CONSTRUCTOR_NAME);\n\t var defineProperty = objectDefineProperty$1.f;\n\n\t if (descriptors$1 && Constructor && !Constructor[SPECIES$b]) {\n\t defineProperty(Constructor, SPECIES$b, {\n\t configurable: true,\n\t get: function () { return this; }\n\t });\n\t }\n\t};\n\n\tvar engineIsIos$1 = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent$1);\n\n\tvar engineIsNode = classofRaw$1(global_1$1.process) == 'process';\n\n\tvar location$1 = global_1$1.location;\n\tvar set$4 = global_1$1.setImmediate;\n\tvar clear$1 = global_1$1.clearImmediate;\n\tvar process$6 = global_1$1.process;\n\tvar MessageChannel$1 = global_1$1.MessageChannel;\n\tvar Dispatch$1 = global_1$1.Dispatch;\n\tvar counter$1 = 0;\n\tvar queue$1 = {};\n\tvar ONREADYSTATECHANGE$1 = 'onreadystatechange';\n\tvar defer$1, channel$1, port$1;\n\n\tvar run$1 = function (id) {\n\t // eslint-disable-next-line no-prototype-builtins\n\t if (queue$1.hasOwnProperty(id)) {\n\t var fn = queue$1[id];\n\t delete queue$1[id];\n\t fn();\n\t }\n\t};\n\n\tvar runner$1 = function (id) {\n\t return function () {\n\t run$1(id);\n\t };\n\t};\n\n\tvar listener$1 = function (event) {\n\t run$1(event.data);\n\t};\n\n\tvar post$1 = function (id) {\n\t // old engines have not location.origin\n\t global_1$1.postMessage(id + '', location$1.protocol + '//' + location$1.host);\n\t};\n\n\t// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n\tif (!set$4 || !clear$1) {\n\t set$4 = function setImmediate(fn) {\n\t var args = [];\n\t var i = 1;\n\t while (arguments.length > i) args.push(arguments[i++]);\n\t queue$1[++counter$1] = function () {\n\t // eslint-disable-next-line no-new-func\n\t (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n\t };\n\t defer$1(counter$1);\n\t return counter$1;\n\t };\n\t clear$1 = function clearImmediate(id) {\n\t delete queue$1[id];\n\t };\n\t // Node.js 0.8-\n\t if (engineIsNode) {\n\t defer$1 = function (id) {\n\t process$6.nextTick(runner$1(id));\n\t };\n\t // Sphere (JS game engine) Dispatch API\n\t } else if (Dispatch$1 && Dispatch$1.now) {\n\t defer$1 = function (id) {\n\t Dispatch$1.now(runner$1(id));\n\t };\n\t // Browsers with MessageChannel, includes WebWorkers\n\t // except iOS - https://github.com/zloirock/core-js/issues/624\n\t } else if (MessageChannel$1 && !engineIsIos$1) {\n\t channel$1 = new MessageChannel$1();\n\t port$1 = channel$1.port2;\n\t channel$1.port1.onmessage = listener$1;\n\t defer$1 = functionBindContext$1(port$1.postMessage, port$1, 1);\n\t // Browsers with postMessage, skip WebWorkers\n\t // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n\t } else if (\n\t global_1$1.addEventListener &&\n\t typeof postMessage == 'function' &&\n\t !global_1$1.importScripts &&\n\t location$1 && location$1.protocol !== 'file:' &&\n\t !fails$1(post$1)\n\t ) {\n\t defer$1 = post$1;\n\t global_1$1.addEventListener('message', listener$1, false);\n\t // IE8-\n\t } else if (ONREADYSTATECHANGE$1 in documentCreateElement$1('script')) {\n\t defer$1 = function (id) {\n\t html$1.appendChild(documentCreateElement$1('script'))[ONREADYSTATECHANGE$1] = function () {\n\t html$1.removeChild(this);\n\t run$1(id);\n\t };\n\t };\n\t // Rest old browsers\n\t } else {\n\t defer$1 = function (id) {\n\t setTimeout(runner$1(id), 0);\n\t };\n\t }\n\t}\n\n\tvar task$2 = {\n\t set: set$4,\n\t clear: clear$1\n\t};\n\n\tvar getOwnPropertyDescriptor$7 = objectGetOwnPropertyDescriptor$1.f;\n\tvar macrotask$1 = task$2.set;\n\n\n\n\tvar MutationObserver$2 = global_1$1.MutationObserver || global_1$1.WebKitMutationObserver;\n\tvar document$4 = global_1$1.document;\n\tvar process$7 = global_1$1.process;\n\tvar Promise$2 = global_1$1.Promise;\n\t// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\n\tvar queueMicrotaskDescriptor$1 = getOwnPropertyDescriptor$7(global_1$1, 'queueMicrotask');\n\tvar queueMicrotask$1 = queueMicrotaskDescriptor$1 && queueMicrotaskDescriptor$1.value;\n\n\tvar flush$1, head$1, last$1, notify$2, toggle$1, node$1, promise$1, then$1;\n\n\t// modern engines have queueMicrotask method\n\tif (!queueMicrotask$1) {\n\t flush$1 = function () {\n\t var parent, fn;\n\t if (engineIsNode && (parent = process$7.domain)) parent.exit();\n\t while (head$1) {\n\t fn = head$1.fn;\n\t head$1 = head$1.next;\n\t try {\n\t fn();\n\t } catch (error) {\n\t if (head$1) notify$2();\n\t else last$1 = undefined;\n\t throw error;\n\t }\n\t } last$1 = undefined;\n\t if (parent) parent.enter();\n\t };\n\n\t // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n\t if (!engineIsIos$1 && !engineIsNode && MutationObserver$2 && document$4) {\n\t toggle$1 = true;\n\t node$1 = document$4.createTextNode('');\n\t new MutationObserver$2(flush$1).observe(node$1, { characterData: true });\n\t notify$2 = function () {\n\t node$1.data = toggle$1 = !toggle$1;\n\t };\n\t // environments with maybe non-completely correct, but existent Promise\n\t } else if (Promise$2 && Promise$2.resolve) {\n\t // Promise.resolve without an argument throws an error in LG WebOS 2\n\t promise$1 = Promise$2.resolve(undefined);\n\t then$1 = promise$1.then;\n\t notify$2 = function () {\n\t then$1.call(promise$1, flush$1);\n\t };\n\t // Node.js without promises\n\t } else if (engineIsNode) {\n\t notify$2 = function () {\n\t process$7.nextTick(flush$1);\n\t };\n\t // for other environments - macrotask based on:\n\t // - setImmediate\n\t // - MessageChannel\n\t // - window.postMessag\n\t // - onreadystatechange\n\t // - setTimeout\n\t } else {\n\t notify$2 = function () {\n\t // strange IE + webpack dev server bug - use .call(global)\n\t macrotask$1.call(global_1$1, flush$1);\n\t };\n\t }\n\t}\n\n\tvar microtask$1 = queueMicrotask$1 || function (fn) {\n\t var task = { fn: fn, next: undefined };\n\t if (last$1) last$1.next = task;\n\t if (!head$1) {\n\t head$1 = task;\n\t notify$2();\n\t } last$1 = task;\n\t};\n\n\tvar PromiseCapability$1 = function (C) {\n\t var resolve, reject;\n\t this.promise = new C(function ($$resolve, $$reject) {\n\t if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n\t resolve = $$resolve;\n\t reject = $$reject;\n\t });\n\t this.resolve = aFunction$3(resolve);\n\t this.reject = aFunction$3(reject);\n\t};\n\n\t// 25.4.1.5 NewPromiseCapability(C)\n\tvar f$f = function (C) {\n\t return new PromiseCapability$1(C);\n\t};\n\n\tvar newPromiseCapability$2 = {\n\t\tf: f$f\n\t};\n\n\tvar promiseResolve$1 = function (C, x) {\n\t anObject$1(C);\n\t if (isObject$2(x) && x.constructor === C) return x;\n\t var promiseCapability = newPromiseCapability$2.f(C);\n\t var resolve = promiseCapability.resolve;\n\t resolve(x);\n\t return promiseCapability.promise;\n\t};\n\n\tvar hostReportErrors$1 = function (a, b) {\n\t var console = global_1$1.console;\n\t if (console && console.error) {\n\t arguments.length === 1 ? console.error(a) : console.error(a, b);\n\t }\n\t};\n\n\tvar perform$1 = function (exec) {\n\t try {\n\t return { error: false, value: exec() };\n\t } catch (error) {\n\t return { error: true, value: error };\n\t }\n\t};\n\n\tvar task$3 = task$2.set;\n\n\n\n\n\n\n\n\n\n\n\n\tvar SPECIES$c = wellKnownSymbol$1('species');\n\tvar PROMISE$1 = 'Promise';\n\tvar getInternalState$8 = internalState$1.get;\n\tvar setInternalState$f = internalState$1.set;\n\tvar getInternalPromiseState$1 = internalState$1.getterFor(PROMISE$1);\n\tvar PromiseConstructor$1 = nativePromiseConstructor$1;\n\tvar TypeError$2 = global_1$1.TypeError;\n\tvar document$5 = global_1$1.document;\n\tvar process$8 = global_1$1.process;\n\tvar $fetch$3 = getBuiltIn$1('fetch');\n\tvar newPromiseCapability$3 = newPromiseCapability$2.f;\n\tvar newGenericPromiseCapability$1 = newPromiseCapability$3;\n\tvar DISPATCH_EVENT$1 = !!(document$5 && document$5.createEvent && global_1$1.dispatchEvent);\n\tvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\n\tvar UNHANDLED_REJECTION$1 = 'unhandledrejection';\n\tvar REJECTION_HANDLED$1 = 'rejectionhandled';\n\tvar PENDING$1 = 0;\n\tvar FULFILLED$1 = 1;\n\tvar REJECTED$1 = 2;\n\tvar HANDLED$1 = 1;\n\tvar UNHANDLED$1 = 2;\n\tvar Internal$1, OwnPromiseCapability$1, PromiseWrapper$1, nativeThen$1;\n\n\tvar FORCED$b = isForced_1$1(PROMISE$1, function () {\n\t var GLOBAL_CORE_JS_PROMISE = inspectSource$1(PromiseConstructor$1) !== String(PromiseConstructor$1);\n\t if (!GLOBAL_CORE_JS_PROMISE) {\n\t // V8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n\t // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n\t // We can't detect it synchronously, so just check versions\n\t if (engineV8Version$1 === 66) return true;\n\t // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n\t if (!engineIsNode && !NATIVE_REJECTION_EVENT) return true;\n\t }\n\t // We can't use @@species feature detection in V8 since it causes\n\t // deoptimization and performance degradation\n\t // https://github.com/zloirock/core-js/issues/679\n\t if (engineV8Version$1 >= 51 && /native code/.test(PromiseConstructor$1)) return false;\n\t // Detect correctness of subclassing with @@species support\n\t var promise = PromiseConstructor$1.resolve(1);\n\t var FakePromise = function (exec) {\n\t exec(function () { /* empty */ }, function () { /* empty */ });\n\t };\n\t var constructor = promise.constructor = {};\n\t constructor[SPECIES$c] = FakePromise;\n\t return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n\t});\n\n\tvar INCORRECT_ITERATION$3 = FORCED$b || !checkCorrectnessOfIteration$1(function (iterable) {\n\t PromiseConstructor$1.all(iterable)['catch'](function () { /* empty */ });\n\t});\n\n\t// helpers\n\tvar isThenable$2 = function (it) {\n\t var then;\n\t return isObject$2(it) && typeof (then = it.then) == 'function' ? then : false;\n\t};\n\n\tvar notify$3 = function (state, isReject) {\n\t if (state.notified) return;\n\t state.notified = true;\n\t var chain = state.reactions;\n\t microtask$1(function () {\n\t var value = state.value;\n\t var ok = state.state == FULFILLED$1;\n\t var index = 0;\n\t // variable length - can't use forEach\n\t while (chain.length > index) {\n\t var reaction = chain[index++];\n\t var handler = ok ? reaction.ok : reaction.fail;\n\t var resolve = reaction.resolve;\n\t var reject = reaction.reject;\n\t var domain = reaction.domain;\n\t var result, then, exited;\n\t try {\n\t if (handler) {\n\t if (!ok) {\n\t if (state.rejection === UNHANDLED$1) onHandleUnhandled$1(state);\n\t state.rejection = HANDLED$1;\n\t }\n\t if (handler === true) result = value;\n\t else {\n\t if (domain) domain.enter();\n\t result = handler(value); // can throw\n\t if (domain) {\n\t domain.exit();\n\t exited = true;\n\t }\n\t }\n\t if (result === reaction.promise) {\n\t reject(TypeError$2('Promise-chain cycle'));\n\t } else if (then = isThenable$2(result)) {\n\t then.call(result, resolve, reject);\n\t } else resolve(result);\n\t } else reject(value);\n\t } catch (error) {\n\t if (domain && !exited) domain.exit();\n\t reject(error);\n\t }\n\t }\n\t state.reactions = [];\n\t state.notified = false;\n\t if (isReject && !state.rejection) onUnhandled$1(state);\n\t });\n\t};\n\n\tvar dispatchEvent$1 = function (name, promise, reason) {\n\t var event, handler;\n\t if (DISPATCH_EVENT$1) {\n\t event = document$5.createEvent('Event');\n\t event.promise = promise;\n\t event.reason = reason;\n\t event.initEvent(name, false, true);\n\t global_1$1.dispatchEvent(event);\n\t } else event = { promise: promise, reason: reason };\n\t if (!NATIVE_REJECTION_EVENT && (handler = global_1$1['on' + name])) handler(event);\n\t else if (name === UNHANDLED_REJECTION$1) hostReportErrors$1('Unhandled promise rejection', reason);\n\t};\n\n\tvar onUnhandled$1 = function (state) {\n\t task$3.call(global_1$1, function () {\n\t var promise = state.facade;\n\t var value = state.value;\n\t var IS_UNHANDLED = isUnhandled$1(state);\n\t var result;\n\t if (IS_UNHANDLED) {\n\t result = perform$1(function () {\n\t if (engineIsNode) {\n\t process$8.emit('unhandledRejection', value, promise);\n\t } else dispatchEvent$1(UNHANDLED_REJECTION$1, promise, value);\n\t });\n\t // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n\t state.rejection = engineIsNode || isUnhandled$1(state) ? UNHANDLED$1 : HANDLED$1;\n\t if (result.error) throw result.value;\n\t }\n\t });\n\t};\n\n\tvar isUnhandled$1 = function (state) {\n\t return state.rejection !== HANDLED$1 && !state.parent;\n\t};\n\n\tvar onHandleUnhandled$1 = function (state) {\n\t task$3.call(global_1$1, function () {\n\t var promise = state.facade;\n\t if (engineIsNode) {\n\t process$8.emit('rejectionHandled', promise);\n\t } else dispatchEvent$1(REJECTION_HANDLED$1, promise, state.value);\n\t });\n\t};\n\n\tvar bind$1 = function (fn, state, unwrap) {\n\t return function (value) {\n\t fn(state, value, unwrap);\n\t };\n\t};\n\n\tvar internalReject$1 = function (state, value, unwrap) {\n\t if (state.done) return;\n\t state.done = true;\n\t if (unwrap) state = unwrap;\n\t state.value = value;\n\t state.state = REJECTED$1;\n\t notify$3(state, true);\n\t};\n\n\tvar internalResolve$1 = function (state, value, unwrap) {\n\t if (state.done) return;\n\t state.done = true;\n\t if (unwrap) state = unwrap;\n\t try {\n\t if (state.facade === value) throw TypeError$2(\"Promise can't be resolved itself\");\n\t var then = isThenable$2(value);\n\t if (then) {\n\t microtask$1(function () {\n\t var wrapper = { done: false };\n\t try {\n\t then.call(value,\n\t bind$1(internalResolve$1, wrapper, state),\n\t bind$1(internalReject$1, wrapper, state)\n\t );\n\t } catch (error) {\n\t internalReject$1(wrapper, error, state);\n\t }\n\t });\n\t } else {\n\t state.value = value;\n\t state.state = FULFILLED$1;\n\t notify$3(state, false);\n\t }\n\t } catch (error) {\n\t internalReject$1({ done: false }, error, state);\n\t }\n\t};\n\n\t// constructor polyfill\n\tif (FORCED$b) {\n\t // 25.4.3.1 Promise(executor)\n\t PromiseConstructor$1 = function Promise(executor) {\n\t anInstance$1(this, PromiseConstructor$1, PROMISE$1);\n\t aFunction$3(executor);\n\t Internal$1.call(this);\n\t var state = getInternalState$8(this);\n\t try {\n\t executor(bind$1(internalResolve$1, state), bind$1(internalReject$1, state));\n\t } catch (error) {\n\t internalReject$1(state, error);\n\t }\n\t };\n\t // eslint-disable-next-line no-unused-vars\n\t Internal$1 = function Promise(executor) {\n\t setInternalState$f(this, {\n\t type: PROMISE$1,\n\t done: false,\n\t notified: false,\n\t parent: false,\n\t reactions: [],\n\t rejection: false,\n\t state: PENDING$1,\n\t value: undefined\n\t });\n\t };\n\t Internal$1.prototype = redefineAll$1(PromiseConstructor$1.prototype, {\n\t // `Promise.prototype.then` method\n\t // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n\t then: function then(onFulfilled, onRejected) {\n\t var state = getInternalPromiseState$1(this);\n\t var reaction = newPromiseCapability$3(speciesConstructor$1(this, PromiseConstructor$1));\n\t reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n\t reaction.fail = typeof onRejected == 'function' && onRejected;\n\t reaction.domain = engineIsNode ? process$8.domain : undefined;\n\t state.parent = true;\n\t state.reactions.push(reaction);\n\t if (state.state != PENDING$1) notify$3(state, false);\n\t return reaction.promise;\n\t },\n\t // `Promise.prototype.catch` method\n\t // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n\t 'catch': function (onRejected) {\n\t return this.then(undefined, onRejected);\n\t }\n\t });\n\t OwnPromiseCapability$1 = function () {\n\t var promise = new Internal$1();\n\t var state = getInternalState$8(promise);\n\t this.promise = promise;\n\t this.resolve = bind$1(internalResolve$1, state);\n\t this.reject = bind$1(internalReject$1, state);\n\t };\n\t newPromiseCapability$2.f = newPromiseCapability$3 = function (C) {\n\t return C === PromiseConstructor$1 || C === PromiseWrapper$1\n\t ? new OwnPromiseCapability$1(C)\n\t : newGenericPromiseCapability$1(C);\n\t };\n\n\t if ( typeof nativePromiseConstructor$1 == 'function') {\n\t nativeThen$1 = nativePromiseConstructor$1.prototype.then;\n\n\t // wrap native Promise#then for native async functions\n\t redefine$1(nativePromiseConstructor$1.prototype, 'then', function then(onFulfilled, onRejected) {\n\t var that = this;\n\t return new PromiseConstructor$1(function (resolve, reject) {\n\t nativeThen$1.call(that, resolve, reject);\n\t }).then(onFulfilled, onRejected);\n\t // https://github.com/zloirock/core-js/issues/640\n\t }, { unsafe: true });\n\n\t // wrap fetch result\n\t if (typeof $fetch$3 == 'function') _export$1({ global: true, enumerable: true, forced: true }, {\n\t // eslint-disable-next-line no-unused-vars\n\t fetch: function fetch(input /* , init */) {\n\t return promiseResolve$1(PromiseConstructor$1, $fetch$3.apply(global_1$1, arguments));\n\t }\n\t });\n\t }\n\t}\n\n\t_export$1({ global: true, wrap: true, forced: FORCED$b }, {\n\t Promise: PromiseConstructor$1\n\t});\n\n\tsetToStringTag$1(PromiseConstructor$1, PROMISE$1, false);\n\tsetSpecies$1(PROMISE$1);\n\n\tPromiseWrapper$1 = getBuiltIn$1(PROMISE$1);\n\n\t// statics\n\t_export$1({ target: PROMISE$1, stat: true, forced: FORCED$b }, {\n\t // `Promise.reject` method\n\t // https://tc39.github.io/ecma262/#sec-promise.reject\n\t reject: function reject(r) {\n\t var capability = newPromiseCapability$3(this);\n\t capability.reject.call(undefined, r);\n\t return capability.promise;\n\t }\n\t});\n\n\t_export$1({ target: PROMISE$1, stat: true, forced: FORCED$b }, {\n\t // `Promise.resolve` method\n\t // https://tc39.github.io/ecma262/#sec-promise.resolve\n\t resolve: function resolve(x) {\n\t return promiseResolve$1( this, x);\n\t }\n\t});\n\n\t_export$1({ target: PROMISE$1, stat: true, forced: INCORRECT_ITERATION$3 }, {\n\t // `Promise.all` method\n\t // https://tc39.github.io/ecma262/#sec-promise.all\n\t all: function all(iterable) {\n\t var C = this;\n\t var capability = newPromiseCapability$3(C);\n\t var resolve = capability.resolve;\n\t var reject = capability.reject;\n\t var result = perform$1(function () {\n\t var $promiseResolve = aFunction$3(C.resolve);\n\t var values = [];\n\t var counter = 0;\n\t var remaining = 1;\n\t iterate(iterable, function (promise) {\n\t var index = counter++;\n\t var alreadyCalled = false;\n\t values.push(undefined);\n\t remaining++;\n\t $promiseResolve.call(C, promise).then(function (value) {\n\t if (alreadyCalled) return;\n\t alreadyCalled = true;\n\t values[index] = value;\n\t --remaining || resolve(values);\n\t }, reject);\n\t });\n\t --remaining || resolve(values);\n\t });\n\t if (result.error) reject(result.value);\n\t return capability.promise;\n\t },\n\t // `Promise.race` method\n\t // https://tc39.github.io/ecma262/#sec-promise.race\n\t race: function race(iterable) {\n\t var C = this;\n\t var capability = newPromiseCapability$3(C);\n\t var reject = capability.reject;\n\t var result = perform$1(function () {\n\t var $promiseResolve = aFunction$3(C.resolve);\n\t iterate(iterable, function (promise) {\n\t $promiseResolve.call(C, promise).then(capability.resolve, reject);\n\t });\n\t });\n\t if (result.error) reject(result.value);\n\t return capability.promise;\n\t }\n\t});\n\n\tvar getOwnPropertyDescriptor$8 = objectGetOwnPropertyDescriptor$1.f;\n\n\n\n\n\n\n\tvar nativeStartsWith = ''.startsWith;\n\tvar min$b = Math.min;\n\n\tvar CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic$1('startsWith');\n\t// https://github.com/zloirock/core-js/pull/702\n\tvar MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () {\n\t var descriptor = getOwnPropertyDescriptor$8(String.prototype, 'startsWith');\n\t return descriptor && !descriptor.writable;\n\t}();\n\n\t// `String.prototype.startsWith` method\n\t// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n\t_export$1({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n\t startsWith: function startsWith(searchString /* , position = 0 */) {\n\t var that = String(requireObjectCoercible$1(this));\n\t notARegexp$1(searchString);\n\t var index = toLength$1(min$b(arguments.length > 1 ? arguments[1] : undefined, that.length));\n\t var search = String(searchString);\n\t return nativeStartsWith\n\t ? nativeStartsWith.call(that, search, index)\n\t : that.slice(index, index + search.length) === search;\n\t }\n\t});\n\n\t// ==========================================================================\n\t// Type checking utils\n\t// ==========================================================================\n\tvar getConstructor$2 = function getConstructor(input) {\n\t return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n\t};\n\n\tvar instanceOf$2 = function instanceOf(input, constructor) {\n\t return Boolean(input && constructor && input instanceof constructor);\n\t};\n\n\tvar isNullOrUndefined$2 = function isNullOrUndefined(input) {\n\t return input === null || typeof input === 'undefined';\n\t};\n\n\tvar isObject$4 = function isObject(input) {\n\t return getConstructor$2(input) === Object;\n\t};\n\n\tvar isNumber$2 = function isNumber(input) {\n\t return getConstructor$2(input) === Number && !Number.isNaN(input);\n\t};\n\n\tvar isString$3 = function isString(input) {\n\t return getConstructor$2(input) === String;\n\t};\n\n\tvar isBoolean$2 = function isBoolean(input) {\n\t return getConstructor$2(input) === Boolean;\n\t};\n\n\tvar isFunction$2 = function isFunction(input) {\n\t return getConstructor$2(input) === Function;\n\t};\n\n\tvar isArray$4 = function isArray(input) {\n\t return Array.isArray(input);\n\t};\n\n\tvar isWeakMap = function isWeakMap(input) {\n\t return instanceOf$2(input, WeakMap);\n\t};\n\n\tvar isNodeList$2 = function isNodeList(input) {\n\t return instanceOf$2(input, NodeList);\n\t};\n\n\tvar isTextNode = function isTextNode(input) {\n\t return getConstructor$2(input) === Text;\n\t};\n\n\tvar isEvent$3 = function isEvent(input) {\n\t return instanceOf$2(input, Event);\n\t};\n\n\tvar isKeyboardEvent = function isKeyboardEvent(input) {\n\t return instanceOf$2(input, KeyboardEvent);\n\t};\n\n\tvar isCue = function isCue(input) {\n\t return instanceOf$2(input, window.TextTrackCue) || instanceOf$2(input, window.VTTCue);\n\t};\n\n\tvar isTrack = function isTrack(input) {\n\t return instanceOf$2(input, TextTrack) || !isNullOrUndefined$2(input) && isString$3(input.kind);\n\t};\n\n\tvar isPromise = function isPromise(input) {\n\t return instanceOf$2(input, Promise) && isFunction$2(input.then);\n\t};\n\n\tvar isElement$3 = function isElement(input) {\n\t return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';\n\t};\n\n\tvar isEmpty$2 = function isEmpty(input) {\n\t return isNullOrUndefined$2(input) || (isString$3(input) || isArray$4(input) || isNodeList$2(input)) && !input.length || isObject$4(input) && !Object.keys(input).length;\n\t};\n\n\tvar isUrl = function isUrl(input) {\n\t // Accept a URL object\n\t if (instanceOf$2(input, window.URL)) {\n\t return true;\n\t } // Must be string from here\n\n\n\t if (!isString$3(input)) {\n\t return false;\n\t } // Add the protocol if required\n\n\n\t var string = input;\n\n\t if (!input.startsWith('http://') || !input.startsWith('https://')) {\n\t string = \"http://\".concat(input);\n\t }\n\n\t try {\n\t return !isEmpty$2(new URL(string).hostname);\n\t } catch (e) {\n\t return false;\n\t }\n\t};\n\n\tvar is$2 = {\n\t nullOrUndefined: isNullOrUndefined$2,\n\t object: isObject$4,\n\t number: isNumber$2,\n\t string: isString$3,\n\t boolean: isBoolean$2,\n\t function: isFunction$2,\n\t array: isArray$4,\n\t weakMap: isWeakMap,\n\t nodeList: isNodeList$2,\n\t element: isElement$3,\n\t textNode: isTextNode,\n\t event: isEvent$3,\n\t keyboardEvent: isKeyboardEvent,\n\t cue: isCue,\n\t track: isTrack,\n\t promise: isPromise,\n\t url: isUrl,\n\t empty: isEmpty$2\n\t};\n\n\tvar transitionEndEvent = function () {\n\t var element = document.createElement('span');\n\t var events = {\n\t WebkitTransition: 'webkitTransitionEnd',\n\t MozTransition: 'transitionend',\n\t OTransition: 'oTransitionEnd otransitionend',\n\t transition: 'transitionend'\n\t };\n\t var type = Object.keys(events).find(function (event) {\n\t return element.style[event] !== undefined;\n\t });\n\t return is$2.string(type) ? events[type] : false;\n\t}(); // Force repaint of element\n\n\tfunction repaint(element, delay) {\n\t setTimeout(function () {\n\t try {\n\t // eslint-disable-next-line no-param-reassign\n\t element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n\t element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n\t element.hidden = false;\n\t } catch (e) {// Do nothing\n\t }\n\t }, delay);\n\t}\n\n\t// ==========================================================================\n\t// Browser sniffing\n\t// Unfortunately, due to mixed support, UA sniffing is required\n\t// ==========================================================================\n\tvar browser = {\n\t isIE:\n\t /* @cc_on!@ */\n\t !!document.documentMode,\n\t isEdge: window.navigator.userAgent.includes('Edge'),\n\t isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),\n\t isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),\n\t isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)\n\t};\n\n\t// `Array.prototype.{ reduce, reduceRight }` methods implementation\n\tvar createMethod$b = function (IS_RIGHT) {\n\t return function (that, callbackfn, argumentsLength, memo) {\n\t aFunction$3(callbackfn);\n\t var O = toObject$1(that);\n\t var self = indexedObject$1(O);\n\t var length = toLength$1(O.length);\n\t var index = IS_RIGHT ? length - 1 : 0;\n\t var i = IS_RIGHT ? -1 : 1;\n\t if (argumentsLength < 2) while (true) {\n\t if (index in self) {\n\t memo = self[index];\n\t index += i;\n\t break;\n\t }\n\t index += i;\n\t if (IS_RIGHT ? index < 0 : length <= index) {\n\t throw TypeError('Reduce of empty array with no initial value');\n\t }\n\t }\n\t for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n\t memo = callbackfn(memo, self[index], index, O);\n\t }\n\t return memo;\n\t };\n\t};\n\n\tvar arrayReduce$1 = {\n\t // `Array.prototype.reduce` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n\t left: createMethod$b(false),\n\t // `Array.prototype.reduceRight` method\n\t // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n\t right: createMethod$b(true)\n\t};\n\n\tvar $reduce$1 = arrayReduce$1.left;\n\n\n\n\n\n\tvar STRICT_METHOD$a = arrayMethodIsStrict$1('reduce');\n\tvar USES_TO_LENGTH$i = arrayMethodUsesToLength$1('reduce', { 1: 0 });\n\t// Chrome 80-82 has a critical bug\n\t// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\n\tvar CHROME_BUG = !engineIsNode && engineV8Version$1 > 79 && engineV8Version$1 < 83;\n\n\t// `Array.prototype.reduce` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n\t_export$1({ target: 'Array', proto: true, forced: !STRICT_METHOD$a || !USES_TO_LENGTH$i || CHROME_BUG }, {\n\t reduce: function reduce(callbackfn /* , initialValue */) {\n\t return $reduce$1(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\tfunction cloneDeep(object) {\n\t return JSON.parse(JSON.stringify(object));\n\t} // Get a nested value in an object\n\n\tfunction getDeep(object, path) {\n\t return path.split('.').reduce(function (obj, key) {\n\t return obj && obj[key];\n\t }, object);\n\t} // Deep extend destination object with N more objects\n\n\tfunction extend$1() {\n\t var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n\t for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t sources[_key - 1] = arguments[_key];\n\t }\n\n\t if (!sources.length) {\n\t return target;\n\t }\n\n\t var source = sources.shift();\n\n\t if (!is$2.object(source)) {\n\t return target;\n\t }\n\n\t Object.keys(source).forEach(function (key) {\n\t if (is$2.object(source[key])) {\n\t if (!Object.keys(target).includes(key)) {\n\t Object.assign(target, _defineProperty({}, key, {}));\n\t }\n\n\t extend$1(target[key], source[key]);\n\t } else {\n\t Object.assign(target, _defineProperty({}, key, source[key]));\n\t }\n\t });\n\t return extend$1.apply(void 0, [target].concat(sources));\n\t}\n\n\tfunction wrap$4(elements, wrapper) {\n\t // Convert `elements` to an array, if necessary.\n\t var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n\t // first element (see `child` below).\n\n\t Array.from(targets).reverse().forEach(function (element, index) {\n\t var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n\t var parent = element.parentNode;\n\t var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n\t // parent).\n\n\t child.appendChild(element); // If the element had a sibling, insert the wrapper before\n\t // the sibling to maintain the HTML structure; otherwise, just\n\t // append it to the parent.\n\n\t if (sibling) {\n\t parent.insertBefore(child, sibling);\n\t } else {\n\t parent.appendChild(child);\n\t }\n\t });\n\t} // Set attributes\n\n\tfunction setAttributes$1(element, attributes) {\n\t if (!is$2.element(element) || is$2.empty(attributes)) {\n\t return;\n\t } // Assume null and undefined attributes should be left out,\n\t // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n\t Object.entries(attributes).filter(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t value = _ref2[1];\n\n\t return !is$2.nullOrUndefined(value);\n\t }).forEach(function (_ref3) {\n\t var _ref4 = _slicedToArray(_ref3, 2),\n\t key = _ref4[0],\n\t value = _ref4[1];\n\n\t return element.setAttribute(key, value);\n\t });\n\t} // Create a DocumentFragment\n\n\tfunction createElement$1(type, attributes, text) {\n\t // Create a new <element>\n\t var element = document.createElement(type); // Set all passed attributes\n\n\t if (is$2.object(attributes)) {\n\t setAttributes$1(element, attributes);\n\t } // Add text node\n\n\n\t if (is$2.string(text)) {\n\t element.innerText = text;\n\t } // Return built element\n\n\n\t return element;\n\t} // Inaert an element after another\n\n\tfunction insertAfter(element, target) {\n\t if (!is$2.element(element) || !is$2.element(target)) {\n\t return;\n\t }\n\n\t target.parentNode.insertBefore(element, target.nextSibling);\n\t} // Insert a DocumentFragment\n\n\tfunction insertElement(type, parent, attributes, text) {\n\t if (!is$2.element(parent)) {\n\t return;\n\t }\n\n\t parent.appendChild(createElement$1(type, attributes, text));\n\t} // Remove element(s)\n\n\tfunction removeElement(element) {\n\t if (is$2.nodeList(element) || is$2.array(element)) {\n\t Array.from(element).forEach(removeElement);\n\t return;\n\t }\n\n\t if (!is$2.element(element) || !is$2.element(element.parentNode)) {\n\t return;\n\t }\n\n\t element.parentNode.removeChild(element);\n\t} // Remove all child elements\n\n\tfunction emptyElement(element) {\n\t if (!is$2.element(element)) {\n\t return;\n\t }\n\n\t var length = element.childNodes.length;\n\n\t while (length > 0) {\n\t element.removeChild(element.lastChild);\n\t length -= 1;\n\t }\n\t} // Replace element\n\n\tfunction replaceElement(newChild, oldChild) {\n\t if (!is$2.element(oldChild) || !is$2.element(oldChild.parentNode) || !is$2.element(newChild)) {\n\t return null;\n\t }\n\n\t oldChild.parentNode.replaceChild(newChild, oldChild);\n\t return newChild;\n\t} // Get an attribute object from a string selector\n\n\tfunction getAttributesFromSelector(sel, existingAttributes) {\n\t // For example:\n\t // '.test' to { class: 'test' }\n\t // '#test' to { id: 'test' }\n\t // '[data-test=\"test\"]' to { 'data-test': 'test' }\n\t if (!is$2.string(sel) || is$2.empty(sel)) {\n\t return {};\n\t }\n\n\t var attributes = {};\n\t var existing = extend$1({}, existingAttributes);\n\t sel.split(',').forEach(function (s) {\n\t // Remove whitespace\n\t var selector = s.trim();\n\t var className = selector.replace('.', '');\n\t var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n\t var parts = stripped.split('=');\n\n\t var _parts = _slicedToArray(parts, 1),\n\t key = _parts[0];\n\n\t var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n\t var start = selector.charAt(0);\n\n\t switch (start) {\n\t case '.':\n\t // Add to existing classname\n\t if (is$2.string(existing.class)) {\n\t attributes.class = \"\".concat(existing.class, \" \").concat(className);\n\t } else {\n\t attributes.class = className;\n\t }\n\n\t break;\n\n\t case '#':\n\t // ID selector\n\t attributes.id = selector.replace('#', '');\n\t break;\n\n\t case '[':\n\t // Attribute selector\n\t attributes[key] = value;\n\t break;\n\t }\n\t });\n\t return extend$1(existing, attributes);\n\t} // Toggle hidden\n\n\tfunction toggleHidden(element, hidden) {\n\t if (!is$2.element(element)) {\n\t return;\n\t }\n\n\t var hide = hidden;\n\n\t if (!is$2.boolean(hide)) {\n\t hide = !element.hidden;\n\t } // eslint-disable-next-line no-param-reassign\n\n\n\t element.hidden = hide;\n\t} // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\n\tfunction toggleClass(element, className, force) {\n\t if (is$2.nodeList(element)) {\n\t return Array.from(element).map(function (e) {\n\t return toggleClass(e, className, force);\n\t });\n\t }\n\n\t if (is$2.element(element)) {\n\t var method = 'toggle';\n\n\t if (typeof force !== 'undefined') {\n\t method = force ? 'add' : 'remove';\n\t }\n\n\t element.classList[method](className);\n\t return element.classList.contains(className);\n\t }\n\n\t return false;\n\t} // Has class name\n\n\tfunction hasClass(element, className) {\n\t return is$2.element(element) && element.classList.contains(className);\n\t} // Element matches selector\n\n\tfunction matches$2(element, selector) {\n\t var _Element = Element,\n\t prototype = _Element.prototype;\n\n\t function match() {\n\t return Array.from(document.querySelectorAll(selector)).includes(this);\n\t }\n\n\t var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n\t return method.call(element, selector);\n\t} // Closest ancestor element matching selector (also tests element itself)\n\n\tfunction closest(element, selector) {\n\t var _Element2 = Element,\n\t prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n\t function closestElement() {\n\t var el = this;\n\n\t do {\n\t if (matches$2.matches(el, selector)) return el;\n\t el = el.parentElement || el.parentNode;\n\t } while (el !== null && el.nodeType === 1);\n\n\t return null;\n\t }\n\n\t var method = prototype.closest || closestElement;\n\t return method.call(element, selector);\n\t} // Find all elements\n\n\tfunction getElements(selector) {\n\t return this.elements.container.querySelectorAll(selector);\n\t} // Find a single element\n\n\tfunction getElement(selector) {\n\t return this.elements.container.querySelector(selector);\n\t} // Set focus and tab focus class\n\n\tfunction setFocus() {\n\t var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t if (!is$2.element(element)) {\n\t return;\n\t } // Set regular focus\n\n\n\t element.focus({\n\t preventScroll: true\n\t }); // If we want to mimic keyboard focus via tab\n\n\t if (tabFocus) {\n\t toggleClass(element, this.config.classNames.tabFocus);\n\t }\n\t}\n\n\tvar defaultCodecs = {\n\t 'audio/ogg': 'vorbis',\n\t 'audio/wav': '1',\n\t 'video/webm': 'vp8, vorbis',\n\t 'video/mp4': 'avc1.42E01E, mp4a.40.2',\n\t 'video/ogg': 'theora'\n\t}; // Check for feature support\n\n\tvar support = {\n\t // Basic support\n\t audio: 'canPlayType' in document.createElement('audio'),\n\t video: 'canPlayType' in document.createElement('video'),\n\t // Check for support\n\t // Basic functionality vs full UI\n\t check: function check(type, provider, playsinline) {\n\t var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n\t var api = support[type] || provider !== 'html5';\n\t var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n\t return {\n\t api: api,\n\t ui: ui\n\t };\n\t },\n\t // Picture-in-picture support\n\t // Safari & Chrome only currently\n\t pip: function () {\n\t if (browser.isIPhone) {\n\t return false;\n\t } // Safari\n\t // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n\t if (is$2.function(createElement$1('video').webkitSetPresentationMode)) {\n\t return true;\n\t } // Chrome\n\t // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n\t if (document.pictureInPictureEnabled && !createElement$1('video').disablePictureInPicture) {\n\t return true;\n\t }\n\n\t return false;\n\t }(),\n\t // Airplay support\n\t // Safari only currently\n\t airplay: is$2.function(window.WebKitPlaybackTargetAvailabilityEvent),\n\t // Inline playback support\n\t // https://webkit.org/blog/6784/new-video-policies-for-ios/\n\t playsinline: 'playsInline' in document.createElement('video'),\n\t // Check for mime type support against a player instance\n\t // Credits: http://diveintohtml5.info/everything.html\n\t // Related: http://www.leanbackplayer.com/test/h5mt.html\n\t mime: function mime(input) {\n\t if (is$2.empty(input)) {\n\t return false;\n\t }\n\n\t var _input$split = input.split('/'),\n\t _input$split2 = _slicedToArray(_input$split, 1),\n\t mediaType = _input$split2[0];\n\n\t var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n\t if (!this.isHTML5 || mediaType !== this.type) {\n\t return false;\n\t } // Add codec if required\n\n\n\t if (Object.keys(defaultCodecs).includes(type)) {\n\t type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n\t }\n\n\t try {\n\t return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n\t } catch (e) {\n\t return false;\n\t }\n\t },\n\t // Check for textTracks support\n\t textTracks: 'textTracks' in document.createElement('video'),\n\t // <input type=\"range\"> Sliders\n\t rangeInput: function () {\n\t var range = document.createElement('input');\n\t range.type = 'range';\n\t return range.type === 'range';\n\t }(),\n\t // Touch\n\t // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event\n\t touch: 'ontouchstart' in document.documentElement,\n\t // Detect transitions support\n\t transitions: transitionEndEvent !== false,\n\t // Reduced motion iOS & MacOS setting\n\t // https://webkit.org/blog/7551/responsive-design-for-motion/\n\t reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches\n\t};\n\n\t// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n\t// https://www.youtube.com/watch?v=NPM6172J22g\n\n\tvar supportsPassiveListeners = function () {\n\t // Test via a getter in the options object to see if the passive property is accessed\n\t var supported = false;\n\n\t try {\n\t var options = Object.defineProperty({}, 'passive', {\n\t get: function get() {\n\t supported = true;\n\t return null;\n\t }\n\t });\n\t window.addEventListener('test', null, options);\n\t window.removeEventListener('test', null, options);\n\t } catch (e) {// Do nothing\n\t }\n\n\t return supported;\n\t}(); // Toggle event listener\n\n\n\tfunction toggleListener(element, event, callback) {\n\t var _this = this;\n\n\t var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n\t var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n\t var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n\t // Bail if no element, event, or callback\n\t if (!element || !('addEventListener' in element) || is$2.empty(event) || !is$2.function(callback)) {\n\t return;\n\t } // Allow multiple events\n\n\n\t var events = event.split(' '); // Build options\n\t // Default to just the capture boolean for browsers with no passive listener support\n\n\t var options = capture; // If passive events listeners are supported\n\n\t if (supportsPassiveListeners) {\n\t options = {\n\t // Whether the listener can be passive (i.e. default never prevented)\n\t passive: passive,\n\t // Whether the listener is a capturing listener or not\n\t capture: capture\n\t };\n\t } // If a single node is passed, bind the event listener\n\n\n\t events.forEach(function (type) {\n\t if (_this && _this.eventListeners && toggle) {\n\t // Cache event listener\n\t _this.eventListeners.push({\n\t element: element,\n\t type: type,\n\t callback: callback,\n\t options: options\n\t });\n\t }\n\n\t element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n\t });\n\t} // Bind event handler\n\n\tfunction on(element) {\n\t var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var callback = arguments.length > 2 ? arguments[2] : undefined;\n\t var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\t var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\t toggleListener.call(this, element, events, callback, true, passive, capture);\n\t} // Unbind event handler\n\n\tfunction off(element) {\n\t var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var callback = arguments.length > 2 ? arguments[2] : undefined;\n\t var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\t var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\t toggleListener.call(this, element, events, callback, false, passive, capture);\n\t} // Bind once-only event handler\n\n\tfunction once(element) {\n\t var _this2 = this;\n\n\t var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var callback = arguments.length > 2 ? arguments[2] : undefined;\n\t var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n\t var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n\t var onceCallback = function onceCallback() {\n\t off(element, events, onceCallback, passive, capture);\n\n\t for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n\t args[_key] = arguments[_key];\n\t }\n\n\t callback.apply(_this2, args);\n\t };\n\n\t toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n\t} // Trigger event\n\n\tfunction triggerEvent(element) {\n\t var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\t var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n\t // Bail if no element\n\t if (!is$2.element(element) || is$2.empty(type)) {\n\t return;\n\t } // Create and dispatch the event\n\n\n\t var event = new CustomEvent(type, {\n\t bubbles: bubbles,\n\t detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n\t plyr: this\n\t })\n\t }); // Dispatch the event\n\n\t element.dispatchEvent(event);\n\t} // Unbind all cached event listeners\n\n\tfunction unbindListeners() {\n\t if (this && this.eventListeners) {\n\t this.eventListeners.forEach(function (item) {\n\t var element = item.element,\n\t type = item.type,\n\t callback = item.callback,\n\t options = item.options;\n\t element.removeEventListener(type, callback, options);\n\t });\n\t this.eventListeners = [];\n\t }\n\t} // Run method when / if player is ready\n\n\tfunction ready() {\n\t var _this3 = this;\n\n\t return new Promise(function (resolve) {\n\t return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n\t }).then(function () {});\n\t}\n\n\t/**\n\t * Silence a Promise-like object.\n\t * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n\t * play promise\" rejection error messages.\n\t * @param {Object} value An object that may or may not be `Promise`-like.\n\t */\n\n\tfunction silencePromise(value) {\n\t if (is$2.promise(value)) {\n\t value.then(null, function () {});\n\t }\n\t}\n\n\tfunction validateRatio(input) {\n\t if (!is$2.array(input) && (!is$2.string(input) || !input.includes(':'))) {\n\t return false;\n\t }\n\n\t var ratio = is$2.array(input) ? input : input.split(':');\n\t return ratio.map(Number).every(is$2.number);\n\t}\n\tfunction reduceAspectRatio(ratio) {\n\t if (!is$2.array(ratio) || !ratio.every(is$2.number)) {\n\t return null;\n\t }\n\n\t var _ratio = _slicedToArray(ratio, 2),\n\t width = _ratio[0],\n\t height = _ratio[1];\n\n\t var getDivider = function getDivider(w, h) {\n\t return h === 0 ? w : getDivider(h, w % h);\n\t };\n\n\t var divider = getDivider(width, height);\n\t return [width / divider, height / divider];\n\t}\n\tfunction getAspectRatio(input) {\n\t var parse = function parse(ratio) {\n\t return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n\t }; // Try provided ratio\n\n\n\t var ratio = parse(input); // Get from config\n\n\t if (ratio === null) {\n\t ratio = parse(this.config.ratio);\n\t } // Get from embed\n\n\n\t if (ratio === null && !is$2.empty(this.embed) && is$2.array(this.embed.ratio)) {\n\t ratio = this.embed.ratio;\n\t } // Get from HTML5 video\n\n\n\t if (ratio === null && this.isHTML5) {\n\t var _this$media = this.media,\n\t videoWidth = _this$media.videoWidth,\n\t videoHeight = _this$media.videoHeight;\n\t ratio = reduceAspectRatio([videoWidth, videoHeight]);\n\t }\n\n\t return ratio;\n\t} // Set aspect ratio for responsive container\n\n\tfunction setAspectRatio(input) {\n\t if (!this.isVideo) {\n\t return {};\n\t }\n\n\t var wrapper = this.elements.wrapper;\n\t var ratio = getAspectRatio.call(this, input);\n\n\t var _ref = is$2.array(ratio) ? ratio : [0, 0],\n\t _ref2 = _slicedToArray(_ref, 2),\n\t w = _ref2[0],\n\t h = _ref2[1];\n\n\t var padding = 100 / w * h;\n\t wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n\t if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n\t var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n\t var offset = (height - padding) / (height / 50);\n\n\t if (this.fullscreen.active) {\n\t wrapper.style.paddingBottom = null;\n\t } else {\n\t this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n\t }\n\t } else if (this.isHTML5) {\n\t wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n\t }\n\n\t return {\n\t padding: padding,\n\t ratio: ratio\n\t };\n\t}\n\n\tvar html5 = {\n\t getSources: function getSources() {\n\t var _this = this;\n\n\t if (!this.isHTML5) {\n\t return [];\n\t }\n\n\t var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n\t return sources.filter(function (source) {\n\t var type = source.getAttribute('type');\n\n\t if (is$2.empty(type)) {\n\t return true;\n\t }\n\n\t return support.mime.call(_this, type);\n\t });\n\t },\n\t // Get quality levels\n\t getQualityOptions: function getQualityOptions() {\n\t // Whether we're forcing all options (e.g. for streaming)\n\t if (this.config.quality.forced) {\n\t return this.config.quality.options;\n\t } // Get sizes from <source> elements\n\n\n\t return html5.getSources.call(this).map(function (source) {\n\t return Number(source.getAttribute('size'));\n\t }).filter(Boolean);\n\t },\n\t setup: function setup() {\n\t if (!this.isHTML5) {\n\t return;\n\t }\n\n\t var player = this; // Set speed options from config\n\n\t player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n\t if (!is$2.empty(this.config.ratio)) {\n\t setAspectRatio.call(player);\n\t } // Quality\n\n\n\t Object.defineProperty(player.media, 'quality', {\n\t get: function get() {\n\t // Get sources\n\t var sources = html5.getSources.call(player);\n\t var source = sources.find(function (s) {\n\t return s.getAttribute('src') === player.source;\n\t }); // Return size, if match is found\n\n\t return source && Number(source.getAttribute('size'));\n\t },\n\t set: function set(input) {\n\t if (player.quality === input) {\n\t return;\n\t } // If we're using an an external handler...\n\n\n\t if (player.config.quality.forced && is$2.function(player.config.quality.onChange)) {\n\t player.config.quality.onChange(input);\n\t } else {\n\t // Get sources\n\t var sources = html5.getSources.call(player); // Get first match for requested size\n\n\t var source = sources.find(function (s) {\n\t return Number(s.getAttribute('size')) === input;\n\t }); // No matching source found\n\n\t if (!source) {\n\t return;\n\t } // Get current state\n\n\n\t var _player$media = player.media,\n\t currentTime = _player$media.currentTime,\n\t paused = _player$media.paused,\n\t preload = _player$media.preload,\n\t readyState = _player$media.readyState,\n\t playbackRate = _player$media.playbackRate; // Set new source\n\n\t player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n\t if (preload !== 'none' || readyState) {\n\t // Restore time\n\t player.once('loadedmetadata', function () {\n\t player.speed = playbackRate;\n\t player.currentTime = currentTime; // Resume playing\n\n\t if (!paused) {\n\t silencePromise(player.play());\n\t }\n\t }); // Load new source\n\n\t player.media.load();\n\t }\n\t } // Trigger change event\n\n\n\t triggerEvent.call(player, player.media, 'qualitychange', false, {\n\t quality: input\n\t });\n\t }\n\t });\n\t },\n\t // Cancel current network requests\n\t // See https://github.com/sampotts/plyr/issues/174\n\t cancelRequests: function cancelRequests() {\n\t if (!this.isHTML5) {\n\t return;\n\t } // Remove child sources\n\n\n\t removeElement(html5.getSources.call(this)); // Set blank video src attribute\n\t // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error\n\t // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection\n\n\t this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n\t // This will cancel existing requests\n\t // See https://github.com/sampotts/plyr/issues/174\n\n\t this.media.load(); // Debugging\n\n\t this.debug.log('Cancelled network requests');\n\t }\n\t};\n\n\tfunction dedupe(array) {\n\t if (!is$2.array(array)) {\n\t return array;\n\t }\n\n\t return array.filter(function (item, index) {\n\t return array.indexOf(item) === index;\n\t });\n\t} // Get the closest value in an array\n\n\tfunction closest$1(array, value) {\n\t if (!is$2.array(array) || !array.length) {\n\t return null;\n\t }\n\n\t return array.reduce(function (prev, curr) {\n\t return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n\t });\n\t}\n\n\tvar HAS_SPECIES_SUPPORT$6 = arrayMethodHasSpeciesSupport$1('slice');\n\tvar USES_TO_LENGTH$j = arrayMethodUsesToLength$1('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n\tvar SPECIES$d = wellKnownSymbol$1('species');\n\tvar nativeSlice$1 = [].slice;\n\tvar max$6 = Math.max;\n\n\t// `Array.prototype.slice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n\t// fallback for not array-like ES3 strings and DOM objects\n\t_export$1({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$6 || !USES_TO_LENGTH$j }, {\n\t slice: function slice(start, end) {\n\t var O = toIndexedObject$1(this);\n\t var length = toLength$1(O.length);\n\t var k = toAbsoluteIndex$1(start, length);\n\t var fin = toAbsoluteIndex$1(end === undefined ? length : end, length);\n\t // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n\t var Constructor, result, n;\n\t if (isArray$2(O)) {\n\t Constructor = O.constructor;\n\t // cross-realm fallback\n\t if (typeof Constructor == 'function' && (Constructor === Array || isArray$2(Constructor.prototype))) {\n\t Constructor = undefined;\n\t } else if (isObject$2(Constructor)) {\n\t Constructor = Constructor[SPECIES$d];\n\t if (Constructor === null) Constructor = undefined;\n\t }\n\t if (Constructor === Array || Constructor === undefined) {\n\t return nativeSlice$1.call(O, k, fin);\n\t }\n\t }\n\t result = new (Constructor === undefined ? Array : Constructor)(max$6(fin - k, 0));\n\t for (n = 0; k < fin; k++, n++) if (k in O) createProperty$1(result, n, O[k]);\n\t result.length = n;\n\t return result;\n\t }\n\t});\n\n\tvar defineProperty$f = objectDefineProperty$1.f;\n\tvar getOwnPropertyNames$4 = objectGetOwnPropertyNames$1.f;\n\n\n\n\n\n\tvar setInternalState$g = internalState$1.set;\n\n\n\n\tvar MATCH$5 = wellKnownSymbol$1('match');\n\tvar NativeRegExp$1 = global_1$1.RegExp;\n\tvar RegExpPrototype$3 = NativeRegExp$1.prototype;\n\tvar re1$1 = /a/g;\n\tvar re2$1 = /a/g;\n\n\t// \"new\" should create a new object, old webkit bug\n\tvar CORRECT_NEW$1 = new NativeRegExp$1(re1$1) !== re1$1;\n\n\tvar UNSUPPORTED_Y$5 = regexpStickyHelpers$1.UNSUPPORTED_Y;\n\n\tvar FORCED$c = descriptors$1 && isForced_1$1('RegExp', (!CORRECT_NEW$1 || UNSUPPORTED_Y$5 || fails$1(function () {\n\t re2$1[MATCH$5] = false;\n\t // RegExp constructor can alter flags and IsRegExp works correct with @@match\n\t return NativeRegExp$1(re1$1) != re1$1 || NativeRegExp$1(re2$1) == re2$1 || NativeRegExp$1(re1$1, 'i') != '/a/i';\n\t})));\n\n\t// `RegExp` constructor\n\t// https://tc39.github.io/ecma262/#sec-regexp-constructor\n\tif (FORCED$c) {\n\t var RegExpWrapper$1 = function RegExp(pattern, flags) {\n\t var thisIsRegExp = this instanceof RegExpWrapper$1;\n\t var patternIsRegExp = isRegexp$1(pattern);\n\t var flagsAreUndefined = flags === undefined;\n\t var sticky;\n\n\t if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper$1 && flagsAreUndefined) {\n\t return pattern;\n\t }\n\n\t if (CORRECT_NEW$1) {\n\t if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n\t } else if (pattern instanceof RegExpWrapper$1) {\n\t if (flagsAreUndefined) flags = regexpFlags$1.call(pattern);\n\t pattern = pattern.source;\n\t }\n\n\t if (UNSUPPORTED_Y$5) {\n\t sticky = !!flags && flags.indexOf('y') > -1;\n\t if (sticky) flags = flags.replace(/y/g, '');\n\t }\n\n\t var result = inheritIfRequired$1(\n\t CORRECT_NEW$1 ? new NativeRegExp$1(pattern, flags) : NativeRegExp$1(pattern, flags),\n\t thisIsRegExp ? this : RegExpPrototype$3,\n\t RegExpWrapper$1\n\t );\n\n\t if (UNSUPPORTED_Y$5 && sticky) setInternalState$g(result, { sticky: sticky });\n\n\t return result;\n\t };\n\t var proxy$1 = function (key) {\n\t key in RegExpWrapper$1 || defineProperty$f(RegExpWrapper$1, key, {\n\t configurable: true,\n\t get: function () { return NativeRegExp$1[key]; },\n\t set: function (it) { NativeRegExp$1[key] = it; }\n\t });\n\t };\n\t var keys$6 = getOwnPropertyNames$4(NativeRegExp$1);\n\t var index$1 = 0;\n\t while (keys$6.length > index$1) proxy$1(keys$6[index$1++]);\n\t RegExpPrototype$3.constructor = RegExpWrapper$1;\n\t RegExpWrapper$1.prototype = RegExpPrototype$3;\n\t redefine$1(global_1$1, 'RegExp', RegExpWrapper$1);\n\t}\n\n\t// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\n\tsetSpecies$1('RegExp');\n\n\tfunction generateId(prefix) {\n\t return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n\t} // Format string\n\n\tfunction format(input) {\n\t for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t args[_key - 1] = arguments[_key];\n\t }\n\n\t if (is$2.empty(input)) {\n\t return input;\n\t }\n\n\t return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n\t return args[i].toString();\n\t });\n\t} // Get percentage\n\n\tfunction getPercentage(current, max) {\n\t if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {\n\t return 0;\n\t }\n\n\t return (current / max * 100).toFixed(2);\n\t} // Replace all occurances of a string in a string\n\n\tvar replaceAll = function replaceAll() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n\t return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\t}; // Convert to title case\n\n\tvar toTitleCase = function toTitleCase() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t return input.toString().replace(/\\w\\S*/g, function (text) {\n\t return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n\t });\n\t}; // Convert string to pascalCase\n\n\tfunction toPascalCase() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var string = input.toString(); // Convert kebab case\n\n\t string = replaceAll(string, '-', ' '); // Convert snake case\n\n\t string = replaceAll(string, '_', ' '); // Convert to title case\n\n\t string = toTitleCase(string); // Convert to pascal case\n\n\t return replaceAll(string, ' ', '');\n\t} // Convert string to pascalCase\n\n\tfunction toCamelCase() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var string = input.toString(); // Convert to pascal case\n\n\t string = toPascalCase(string); // Convert first character to lowercase\n\n\t return string.charAt(0).toLowerCase() + string.slice(1);\n\t} // Remove HTML from a string\n\n\tfunction stripHTML(source) {\n\t var fragment = document.createDocumentFragment();\n\t var element = document.createElement('div');\n\t fragment.appendChild(element);\n\t element.innerHTML = source;\n\t return fragment.firstChild.innerText;\n\t} // Like outerHTML, but also works for DocumentFragment\n\n\tfunction getHTML(element) {\n\t var wrapper = document.createElement('div');\n\t wrapper.appendChild(element);\n\t return wrapper.innerHTML;\n\t}\n\n\tvar resources = {\n\t pip: 'PIP',\n\t airplay: 'AirPlay',\n\t html5: 'HTML5',\n\t vimeo: 'Vimeo',\n\t youtube: 'YouTube'\n\t};\n\tvar i18n = {\n\t get: function get() {\n\t var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n\t if (is$2.empty(key) || is$2.empty(config)) {\n\t return '';\n\t }\n\n\t var string = getDeep(config.i18n, key);\n\n\t if (is$2.empty(string)) {\n\t if (Object.keys(resources).includes(key)) {\n\t return resources[key];\n\t }\n\n\t return '';\n\t }\n\n\t var replace = {\n\t '{seektime}': config.seekTime,\n\t '{title}': config.title\n\t };\n\t Object.entries(replace).forEach(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t k = _ref2[0],\n\t v = _ref2[1];\n\n\t string = replaceAll(string, k, v);\n\t });\n\t return string;\n\t }\n\t};\n\n\tvar Storage$1 = /*#__PURE__*/function () {\n\t function Storage(player) {\n\t var _this = this;\n\n\t _classCallCheck(this, Storage);\n\n\t _defineProperty(this, \"get\", function (key) {\n\t if (!Storage.supported || !_this.enabled) {\n\t return null;\n\t }\n\n\t var store = window.localStorage.getItem(_this.key);\n\n\t if (is$2.empty(store)) {\n\t return null;\n\t }\n\n\t var json = JSON.parse(store);\n\t return is$2.string(key) && key.length ? json[key] : json;\n\t });\n\n\t _defineProperty(this, \"set\", function (object) {\n\t // Bail if we don't have localStorage support or it's disabled\n\t if (!Storage.supported || !_this.enabled) {\n\t return;\n\t } // Can only store objectst\n\n\n\t if (!is$2.object(object)) {\n\t return;\n\t } // Get current storage\n\n\n\t var storage = _this.get(); // Default to empty object\n\n\n\t if (is$2.empty(storage)) {\n\t storage = {};\n\t } // Update the working copy of the values\n\n\n\t extend$1(storage, object); // Update storage\n\n\t window.localStorage.setItem(_this.key, JSON.stringify(storage));\n\t });\n\n\t this.enabled = player.config.storage.enabled;\n\t this.key = player.config.storage.key;\n\t } // Check for actual support (see if we can use it)\n\n\n\t _createClass(Storage, null, [{\n\t key: \"supported\",\n\t get: function get() {\n\t try {\n\t if (!('localStorage' in window)) {\n\t return false;\n\t }\n\n\t var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)\n\t // see: https://github.com/sampotts/plyr/issues/131\n\n\t window.localStorage.setItem(test, test);\n\t window.localStorage.removeItem(test);\n\t return true;\n\t } catch (e) {\n\t return false;\n\t }\n\t }\n\t }]);\n\n\t return Storage;\n\t}();\n\n\t// ==========================================================================\n\t// Fetch wrapper\n\t// Using XHR to avoid issues with older browsers\n\t// ==========================================================================\n\tfunction fetch(url) {\n\t var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n\t return new Promise(function (resolve, reject) {\n\t try {\n\t var request = new XMLHttpRequest(); // Check for CORS support\n\n\t if (!('withCredentials' in request)) {\n\t return;\n\t }\n\n\t request.addEventListener('load', function () {\n\t if (responseType === 'text') {\n\t try {\n\t resolve(JSON.parse(request.responseText));\n\t } catch (e) {\n\t resolve(request.responseText);\n\t }\n\t } else {\n\t resolve(request.response);\n\t }\n\t });\n\t request.addEventListener('error', function () {\n\t throw new Error(request.status);\n\t });\n\t request.open('GET', url, true); // Set the required response type\n\n\t request.responseType = responseType;\n\t request.send();\n\t } catch (e) {\n\t reject(e);\n\t }\n\t });\n\t}\n\n\t// ==========================================================================\n\n\tfunction loadSprite(url, id) {\n\t if (!is$2.string(url)) {\n\t return;\n\t }\n\n\t var prefix = 'cache';\n\t var hasId = is$2.string(id);\n\t var isCached = false;\n\n\t var exists = function exists() {\n\t return document.getElementById(id) !== null;\n\t };\n\n\t var update = function update(container, data) {\n\t // eslint-disable-next-line no-param-reassign\n\t container.innerHTML = data; // Check again incase of race condition\n\n\t if (hasId && exists()) {\n\t return;\n\t } // Inject the SVG to the body\n\n\n\t document.body.insertAdjacentElement('afterbegin', container);\n\t }; // Only load once if ID set\n\n\n\t if (!hasId || !exists()) {\n\t var useStorage = Storage$1.supported; // Create container\n\n\t var container = document.createElement('div');\n\t container.setAttribute('hidden', '');\n\n\t if (hasId) {\n\t container.setAttribute('id', id);\n\t } // Check in cache\n\n\n\t if (useStorage) {\n\t var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n\t isCached = cached !== null;\n\n\t if (isCached) {\n\t var data = JSON.parse(cached);\n\t update(container, data.content);\n\t }\n\t } // Get the sprite\n\n\n\t fetch(url).then(function (result) {\n\t if (is$2.empty(result)) {\n\t return;\n\t }\n\n\t if (useStorage) {\n\t window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n\t content: result\n\t }));\n\t }\n\n\t update(container, result);\n\t }).catch(function () {});\n\t }\n\t}\n\n\tvar ceil$2 = Math.ceil;\n\tvar floor$b = Math.floor;\n\n\t// `Math.trunc` method\n\t// https://tc39.github.io/ecma262/#sec-math.trunc\n\t_export$1({ target: 'Math', stat: true }, {\n\t trunc: function trunc(it) {\n\t return (it > 0 ? floor$b : ceil$2)(it);\n\t }\n\t});\n\n\tvar getHours = function getHours(value) {\n\t return Math.trunc(value / 60 / 60 % 60, 10);\n\t};\n\tvar getMinutes = function getMinutes(value) {\n\t return Math.trunc(value / 60 % 60, 10);\n\t};\n\tvar getSeconds = function getSeconds(value) {\n\t return Math.trunc(value % 60, 10);\n\t}; // Format time to UI friendly string\n\n\tfunction formatTime() {\n\t var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t // Bail if the value isn't a number\n\t if (!is$2.number(time)) {\n\t return formatTime(undefined, displayHours, inverted);\n\t } // Format time component to add leading zero\n\n\n\t var format = function format(value) {\n\t return \"0\".concat(value).slice(-2);\n\t }; // Breakdown to hours, mins, secs\n\n\n\t var hours = getHours(time);\n\t var mins = getMinutes(time);\n\t var secs = getSeconds(time); // Do we need to display hours?\n\n\t if (displayHours || hours > 0) {\n\t hours = \"\".concat(hours, \":\");\n\t } else {\n\t hours = '';\n\t } // Render\n\n\n\t return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n\t}\n\n\tvar controls = {\n\t // Get icon URL\n\t getIconUrl: function getIconUrl() {\n\t var url = new URL(this.config.iconUrl, window.location);\n\t var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n\t return {\n\t url: this.config.iconUrl,\n\t cors: cors\n\t };\n\t },\n\t // Find the UI controls\n\t findElements: function findElements() {\n\t try {\n\t this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\n\t this.elements.buttons = {\n\t play: getElements.call(this, this.config.selectors.buttons.play),\n\t pause: getElement.call(this, this.config.selectors.buttons.pause),\n\t restart: getElement.call(this, this.config.selectors.buttons.restart),\n\t rewind: getElement.call(this, this.config.selectors.buttons.rewind),\n\t fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),\n\t mute: getElement.call(this, this.config.selectors.buttons.mute),\n\t pip: getElement.call(this, this.config.selectors.buttons.pip),\n\t airplay: getElement.call(this, this.config.selectors.buttons.airplay),\n\t settings: getElement.call(this, this.config.selectors.buttons.settings),\n\t captions: getElement.call(this, this.config.selectors.buttons.captions),\n\t fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)\n\t }; // Progress\n\n\t this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\n\t this.elements.inputs = {\n\t seek: getElement.call(this, this.config.selectors.inputs.seek),\n\t volume: getElement.call(this, this.config.selectors.inputs.volume)\n\t }; // Display\n\n\t this.elements.display = {\n\t buffer: getElement.call(this, this.config.selectors.display.buffer),\n\t currentTime: getElement.call(this, this.config.selectors.display.currentTime),\n\t duration: getElement.call(this, this.config.selectors.display.duration)\n\t }; // Seek tooltip\n\n\t if (is$2.element(this.elements.progress)) {\n\t this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\n\t }\n\n\t return true;\n\t } catch (error) {\n\t // Log it\n\t this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls\n\n\t this.toggleNativeControls(true);\n\t return false;\n\t }\n\t },\n\t // Create <svg> icon\n\t createIcon: function createIcon(type, attributes) {\n\t var namespace = 'http://www.w3.org/2000/svg';\n\t var iconUrl = controls.getIconUrl.call(this);\n\t var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n\t var icon = document.createElementNS(namespace, 'svg');\n\t setAttributes$1(icon, extend$1(attributes, {\n\t 'aria-hidden': 'true',\n\t focusable: 'false'\n\t })); // Create the <use> to reference sprite\n\n\t var use = document.createElementNS(namespace, 'use');\n\t var path = \"\".concat(iconPath, \"-\").concat(type); // Set `href` attributes\n\t // https://github.com/sampotts/plyr/issues/460\n\t // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href\n\n\t if ('href' in use) {\n\t use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n\t } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n\t use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n\t icon.appendChild(use);\n\t return icon;\n\t },\n\t // Create hidden text label\n\t createLabel: function createLabel(key) {\n\t var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t var text = i18n.get(key, this.config);\n\n\t var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n\t class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n\t });\n\n\t return createElement$1('span', attributes, text);\n\t },\n\t // Create a badge\n\t createBadge: function createBadge(text) {\n\t if (is$2.empty(text)) {\n\t return null;\n\t }\n\n\t var badge = createElement$1('span', {\n\t class: this.config.classNames.menu.value\n\t });\n\t badge.appendChild(createElement$1('span', {\n\t class: this.config.classNames.menu.badge\n\t }, text));\n\t return badge;\n\t },\n\t // Create a <button>\n\t createButton: function createButton(buttonType, attr) {\n\t var _this = this;\n\n\t var attributes = extend$1({}, attr);\n\t var type = toCamelCase(buttonType);\n\t var props = {\n\t element: 'button',\n\t toggle: false,\n\t label: null,\n\t icon: null,\n\t labelPressed: null,\n\t iconPressed: null\n\t };\n\t ['element', 'icon', 'label'].forEach(function (key) {\n\t if (Object.keys(attributes).includes(key)) {\n\t props[key] = attributes[key];\n\t delete attributes[key];\n\t }\n\t }); // Default to 'button' type to prevent form submission\n\n\t if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n\t attributes.type = 'button';\n\t } // Set class name\n\n\n\t if (Object.keys(attributes).includes('class')) {\n\t if (!attributes.class.split(' ').some(function (c) {\n\t return c === _this.config.classNames.control;\n\t })) {\n\t extend$1(attributes, {\n\t class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n\t });\n\t }\n\t } else {\n\t attributes.class = this.config.classNames.control;\n\t } // Large play button\n\n\n\t switch (buttonType) {\n\t case 'play':\n\t props.toggle = true;\n\t props.label = 'play';\n\t props.labelPressed = 'pause';\n\t props.icon = 'play';\n\t props.iconPressed = 'pause';\n\t break;\n\n\t case 'mute':\n\t props.toggle = true;\n\t props.label = 'mute';\n\t props.labelPressed = 'unmute';\n\t props.icon = 'volume';\n\t props.iconPressed = 'muted';\n\t break;\n\n\t case 'captions':\n\t props.toggle = true;\n\t props.label = 'enableCaptions';\n\t props.labelPressed = 'disableCaptions';\n\t props.icon = 'captions-off';\n\t props.iconPressed = 'captions-on';\n\t break;\n\n\t case 'fullscreen':\n\t props.toggle = true;\n\t props.label = 'enterFullscreen';\n\t props.labelPressed = 'exitFullscreen';\n\t props.icon = 'enter-fullscreen';\n\t props.iconPressed = 'exit-fullscreen';\n\t break;\n\n\t case 'play-large':\n\t attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n\t type = 'play';\n\t props.label = 'play';\n\t props.icon = 'play';\n\t break;\n\n\t default:\n\t if (is$2.empty(props.label)) {\n\t props.label = type;\n\t }\n\n\t if (is$2.empty(props.icon)) {\n\t props.icon = buttonType;\n\t }\n\n\t }\n\n\t var button = createElement$1(props.element); // Setup toggle icon and labels\n\n\t if (props.toggle) {\n\t // Icon\n\t button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n\t class: 'icon--pressed'\n\t }));\n\t button.appendChild(controls.createIcon.call(this, props.icon, {\n\t class: 'icon--not-pressed'\n\t })); // Label/Tooltip\n\n\t button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n\t class: 'label--pressed'\n\t }));\n\t button.appendChild(controls.createLabel.call(this, props.label, {\n\t class: 'label--not-pressed'\n\t }));\n\t } else {\n\t button.appendChild(controls.createIcon.call(this, props.icon));\n\t button.appendChild(controls.createLabel.call(this, props.label));\n\t } // Merge and set attributes\n\n\n\t extend$1(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n\t setAttributes$1(button, attributes); // We have multiple play buttons\n\n\t if (type === 'play') {\n\t if (!is$2.array(this.elements.buttons[type])) {\n\t this.elements.buttons[type] = [];\n\t }\n\n\t this.elements.buttons[type].push(button);\n\t } else {\n\t this.elements.buttons[type] = button;\n\t }\n\n\t return button;\n\t },\n\t // Create an <input type='range'>\n\t createRange: function createRange(type, attributes) {\n\t // Seek input\n\t var input = createElement$1('input', extend$1(getAttributesFromSelector(this.config.selectors.inputs[type]), {\n\t type: 'range',\n\t min: 0,\n\t max: 100,\n\t step: 0.01,\n\t value: 0,\n\t autocomplete: 'off',\n\t // A11y fixes for https://github.com/sampotts/plyr/issues/905\n\t role: 'slider',\n\t 'aria-label': i18n.get(type, this.config),\n\t 'aria-valuemin': 0,\n\t 'aria-valuemax': 100,\n\t 'aria-valuenow': 0\n\t }, attributes));\n\t this.elements.inputs[type] = input; // Set the fill for webkit now\n\n\t controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n\t RangeTouch.setup(input);\n\t return input;\n\t },\n\t // Create a <progress>\n\t createProgress: function createProgress(type, attributes) {\n\t var progress = createElement$1('progress', extend$1(getAttributesFromSelector(this.config.selectors.display[type]), {\n\t min: 0,\n\t max: 100,\n\t value: 0,\n\t role: 'progressbar',\n\t 'aria-hidden': true\n\t }, attributes)); // Create the label inside\n\n\t if (type !== 'volume') {\n\t progress.appendChild(createElement$1('span', null, '0'));\n\t var suffixKey = {\n\t played: 'played',\n\t buffer: 'buffered'\n\t }[type];\n\t var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n\t progress.innerText = \"% \".concat(suffix.toLowerCase());\n\t }\n\n\t this.elements.display[type] = progress;\n\t return progress;\n\t },\n\t // Create time display\n\t createTime: function createTime(type, attrs) {\n\t var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\t var container = createElement$1('div', extend$1(attributes, {\n\t class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n\t 'aria-label': i18n.get(type, this.config)\n\t }), '00:00'); // Reference for updates\n\n\t this.elements.display[type] = container;\n\t return container;\n\t },\n\t // Bind keyboard shortcuts for a menu item\n\t // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n\t bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {\n\t var _this2 = this;\n\n\t // Navigate through menus via arrow keys and space\n\t on.call(this, menuItem, 'keydown keyup', function (event) {\n\t // We only care about space and ⬆️ ⬇️️ ➡️\n\t if (![32, 38, 39, 40].includes(event.which)) {\n\t return;\n\t } // Prevent play / seek\n\n\n\t event.preventDefault();\n\t event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n\t if (event.type === 'keydown') {\n\t return;\n\t }\n\n\t var isRadioButton = matches$2(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n\t if (!isRadioButton && [32, 39].includes(event.which)) {\n\t controls.showMenuPanel.call(_this2, type, true);\n\t } else {\n\t var target;\n\n\t if (event.which !== 32) {\n\t if (event.which === 40 || isRadioButton && event.which === 39) {\n\t target = menuItem.nextElementSibling;\n\n\t if (!is$2.element(target)) {\n\t target = menuItem.parentNode.firstElementChild;\n\t }\n\t } else {\n\t target = menuItem.previousElementSibling;\n\n\t if (!is$2.element(target)) {\n\t target = menuItem.parentNode.lastElementChild;\n\t }\n\t }\n\n\t setFocus.call(_this2, target, true);\n\t }\n\t }\n\t }, false); // Enter will fire a `click` event but we still need to manage focus\n\t // So we bind to keyup which fires after and set focus here\n\n\t on.call(this, menuItem, 'keyup', function (event) {\n\t if (event.which !== 13) {\n\t return;\n\t }\n\n\t controls.focusFirstMenuItem.call(_this2, null, true);\n\t });\n\t },\n\t // Create a settings menu item\n\t createMenuItem: function createMenuItem(_ref) {\n\t var _this3 = this;\n\n\t var value = _ref.value,\n\t list = _ref.list,\n\t type = _ref.type,\n\t title = _ref.title,\n\t _ref$badge = _ref.badge,\n\t badge = _ref$badge === void 0 ? null : _ref$badge,\n\t _ref$checked = _ref.checked,\n\t checked = _ref$checked === void 0 ? false : _ref$checked;\n\t var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n\t var menuItem = createElement$1('button', extend$1(attributes, {\n\t type: 'button',\n\t role: 'menuitemradio',\n\t class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n\t 'aria-checked': checked,\n\t value: value\n\t }));\n\t var flex = createElement$1('span'); // We have to set as HTML incase of special characters\n\n\t flex.innerHTML = title;\n\n\t if (is$2.element(badge)) {\n\t flex.appendChild(badge);\n\t }\n\n\t menuItem.appendChild(flex); // Replicate radio button behaviour\n\n\t Object.defineProperty(menuItem, 'checked', {\n\t enumerable: true,\n\t get: function get() {\n\t return menuItem.getAttribute('aria-checked') === 'true';\n\t },\n\t set: function set(check) {\n\t // Ensure exclusivity\n\t if (check) {\n\t Array.from(menuItem.parentNode.children).filter(function (node) {\n\t return matches$2(node, '[role=\"menuitemradio\"]');\n\t }).forEach(function (node) {\n\t return node.setAttribute('aria-checked', 'false');\n\t });\n\t }\n\n\t menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n\t }\n\t });\n\t this.listeners.bind(menuItem, 'click keyup', function (event) {\n\t if (is$2.keyboardEvent(event) && event.which !== 32) {\n\t return;\n\t }\n\n\t event.preventDefault();\n\t event.stopPropagation();\n\t menuItem.checked = true;\n\n\t switch (type) {\n\t case 'language':\n\t _this3.currentTrack = Number(value);\n\t break;\n\n\t case 'quality':\n\t _this3.quality = value;\n\t break;\n\n\t case 'speed':\n\t _this3.speed = parseFloat(value);\n\t break;\n\t }\n\n\t controls.showMenuPanel.call(_this3, 'home', is$2.keyboardEvent(event));\n\t }, type, false);\n\t controls.bindMenuItemShortcuts.call(this, menuItem, type);\n\t list.appendChild(menuItem);\n\t },\n\t // Format a time for display\n\t formatTime: function formatTime$1() {\n\t var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t // Bail if the value isn't a number\n\t if (!is$2.number(time)) {\n\t return time;\n\t } // Always display hours if duration is over an hour\n\n\n\t var forceHours = getHours(this.duration) > 0;\n\t return formatTime(time, forceHours, inverted);\n\t },\n\t // Update the displayed time\n\t updateTimeDisplay: function updateTimeDisplay() {\n\t var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n\t var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\t var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n\t // Bail if there's no element to display or the value isn't a number\n\t if (!is$2.element(target) || !is$2.number(time)) {\n\t return;\n\t } // eslint-disable-next-line no-param-reassign\n\n\n\t target.innerText = controls.formatTime(time, inverted);\n\t },\n\t // Update volume UI and storage\n\t updateVolume: function updateVolume() {\n\t if (!this.supported.ui) {\n\t return;\n\t } // Update range\n\n\n\t if (is$2.element(this.elements.inputs.volume)) {\n\t controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n\t } // Update mute state\n\n\n\t if (is$2.element(this.elements.buttons.mute)) {\n\t this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n\t }\n\t },\n\t // Update seek value and lower fill\n\t setRange: function setRange(target) {\n\t var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n\t if (!is$2.element(target)) {\n\t return;\n\t } // eslint-disable-next-line\n\n\n\t target.value = value; // Webkit range fill\n\n\t controls.updateRangeFill.call(this, target);\n\t },\n\t // Update <progress> elements\n\t updateProgress: function updateProgress(event) {\n\t var _this4 = this;\n\n\t if (!this.supported.ui || !is$2.event(event)) {\n\t return;\n\t }\n\n\t var value = 0;\n\n\t var setProgress = function setProgress(target, input) {\n\t var val = is$2.number(input) ? input : 0;\n\t var progress = is$2.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n\t if (is$2.element(progress)) {\n\t progress.value = val; // Update text label inside\n\n\t var label = progress.getElementsByTagName('span')[0];\n\n\t if (is$2.element(label)) {\n\t label.childNodes[0].nodeValue = val;\n\t }\n\t }\n\t };\n\n\t if (event) {\n\t switch (event.type) {\n\t // Video playing\n\t case 'timeupdate':\n\t case 'seeking':\n\t case 'seeked':\n\t value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event\n\n\t if (event.type === 'timeupdate') {\n\t controls.setRange.call(this, this.elements.inputs.seek, value);\n\t }\n\n\t break;\n\t // Check buffer status\n\n\t case 'playing':\n\t case 'progress':\n\t setProgress(this.elements.display.buffer, this.buffered * 100);\n\t break;\n\t }\n\t }\n\t },\n\t // Webkit polyfill for lower fill range\n\t updateRangeFill: function updateRangeFill(target) {\n\t // Get range from event if event passed\n\t var range = is$2.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n\t if (!is$2.element(range) || range.getAttribute('type') !== 'range') {\n\t return;\n\t } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n\t if (matches$2(range, this.config.selectors.inputs.seek)) {\n\t range.setAttribute('aria-valuenow', this.currentTime);\n\t var currentTime = controls.formatTime(this.currentTime);\n\t var duration = controls.formatTime(this.duration);\n\t var format = i18n.get('seekLabel', this.config);\n\t range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n\t } else if (matches$2(range, this.config.selectors.inputs.volume)) {\n\t var percent = range.value * 100;\n\t range.setAttribute('aria-valuenow', percent);\n\t range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n\t } else {\n\t range.setAttribute('aria-valuenow', range.value);\n\t } // WebKit only\n\n\n\t if (!browser.isWebkit) {\n\t return;\n\t } // Set CSS custom property\n\n\n\t range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n\t },\n\t // Update hover tooltip for seeking\n\t updateSeekTooltip: function updateSeekTooltip(event) {\n\t var _this5 = this;\n\n\t // Bail if setting not true\n\t if (!this.config.tooltips.seek || !is$2.element(this.elements.inputs.seek) || !is$2.element(this.elements.display.seekTooltip) || this.duration === 0) {\n\t return;\n\t }\n\n\t var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n\t var toggle = function toggle(show) {\n\t return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n\t }; // Hide on touch\n\n\n\t if (this.touch) {\n\t toggle(false);\n\t return;\n\t } // Determine percentage, if already visible\n\n\n\t var percent = 0;\n\t var clientRect = this.elements.progress.getBoundingClientRect();\n\n\t if (is$2.event(event)) {\n\t percent = 100 / clientRect.width * (event.pageX - clientRect.left);\n\t } else if (hasClass(this.elements.display.seekTooltip, visible)) {\n\t percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);\n\t } else {\n\t return;\n\t } // Set bounds\n\n\n\t if (percent < 0) {\n\t percent = 0;\n\t } else if (percent > 100) {\n\t percent = 100;\n\t } // Display the time a click would seek to\n\n\n\t controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n\t this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n\t // If the event is a moues in/out and percentage is inside bounds\n\n\t if (is$2.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n\t toggle(event.type === 'mouseenter');\n\t }\n\t },\n\t // Handle time change event\n\t timeUpdate: function timeUpdate(event) {\n\t // Only invert if only one time element is displayed and used for both duration and currentTime\n\t var invert = !is$2.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n\t controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n\t if (event && event.type === 'timeupdate' && this.media.seeking) {\n\t return;\n\t } // Playing progress\n\n\n\t controls.updateProgress.call(this, event);\n\t },\n\t // Show the duration on metadataloaded or durationchange events\n\t durationUpdate: function durationUpdate() {\n\t // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false\n\t if (!this.supported.ui || !this.config.invertTime && this.currentTime) {\n\t return;\n\t } // 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\t // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415\n\t // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062\n\t // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338\n\n\n\t if (this.duration >= Math.pow(2, 32)) {\n\t toggleHidden(this.elements.display.currentTime, true);\n\t toggleHidden(this.elements.progress, true);\n\t return;\n\t } // Update ARIA values\n\n\n\t if (is$2.element(this.elements.inputs.seek)) {\n\t this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n\t } // If there's a spot to display duration\n\n\n\t var hasDuration = is$2.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n\t if (!hasDuration && this.config.displayDuration && this.paused) {\n\t controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n\t } // If there's a duration element, update content\n\n\n\t if (hasDuration) {\n\t controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n\t } // Update the tooltip (if visible)\n\n\n\t controls.updateSeekTooltip.call(this);\n\t },\n\t // Hide/show a tab\n\t toggleMenuButton: function toggleMenuButton(setting, toggle) {\n\t toggleHidden(this.elements.settings.buttons[setting], !toggle);\n\t },\n\t // Update the selected setting\n\t updateSetting: function updateSetting(setting, container, input) {\n\t var pane = this.elements.settings.panels[setting];\n\t var value = null;\n\t var list = container;\n\n\t if (setting === 'captions') {\n\t value = this.currentTrack;\n\t } else {\n\t value = !is$2.empty(input) ? input : this[setting]; // Get default\n\n\t if (is$2.empty(value)) {\n\t value = this.config[setting].default;\n\t } // Unsupported value\n\n\n\t if (!is$2.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n\t this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n\t return;\n\t } // Disabled value\n\n\n\t if (!this.config[setting].options.includes(value)) {\n\t this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n\t return;\n\t }\n\t } // Get the list if we need to\n\n\n\t if (!is$2.element(list)) {\n\t list = pane && pane.querySelector('[role=\"menu\"]');\n\t } // If there's no list it means it's not been rendered...\n\n\n\t if (!is$2.element(list)) {\n\t return;\n\t } // Update the label\n\n\n\t var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n\t label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n\t var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n\t if (is$2.element(target)) {\n\t target.checked = true;\n\t }\n\t },\n\t // Translate a value into a nice label\n\t getLabel: function getLabel(setting, value) {\n\t switch (setting) {\n\t case 'speed':\n\t return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n\t case 'quality':\n\t if (is$2.number(value)) {\n\t var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n\t if (!label.length) {\n\t return \"\".concat(value, \"p\");\n\t }\n\n\t return label;\n\t }\n\n\t return toTitleCase(value);\n\n\t case 'captions':\n\t return captions.getLabel.call(this);\n\n\t default:\n\t return null;\n\t }\n\t },\n\t // Set the quality menu\n\t setQualityMenu: function setQualityMenu(options) {\n\t var _this6 = this;\n\n\t // Menu required\n\t if (!is$2.element(this.elements.settings.panels.quality)) {\n\t return;\n\t }\n\n\t var type = 'quality';\n\t var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n\t if (is$2.array(options)) {\n\t this.options.quality = dedupe(options).filter(function (quality) {\n\t return _this6.config.quality.options.includes(quality);\n\t });\n\t } // Toggle the pane and tab\n\n\n\t var toggle = !is$2.empty(this.options.quality) && this.options.quality.length > 1;\n\t controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n\t emptyElement(list); // Check if we need to toggle the parent\n\n\t controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n\t if (!toggle) {\n\t return;\n\t } // Get the badge HTML for HD, 4K etc\n\n\n\t var getBadge = function getBadge(quality) {\n\t var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n\t if (!label.length) {\n\t return null;\n\t }\n\n\t return controls.createBadge.call(_this6, label);\n\t }; // Sort options by the config and then render options\n\n\n\t this.options.quality.sort(function (a, b) {\n\t var sorting = _this6.config.quality.options;\n\t return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n\t }).forEach(function (quality) {\n\t controls.createMenuItem.call(_this6, {\n\t value: quality,\n\t list: list,\n\t type: type,\n\t title: controls.getLabel.call(_this6, 'quality', quality),\n\t badge: getBadge(quality)\n\t });\n\t });\n\t controls.updateSetting.call(this, type, list);\n\t },\n\t // Set the looping options\n\n\t /* setLoopMenu() {\n\t // Menu required\n\t if (!is.element(this.elements.settings.panels.loop)) {\n\t return;\n\t }\n\t const options = ['start', 'end', 'all', 'reset'];\n\t const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n\t // Show the pane and tab\n\t toggleHidden(this.elements.settings.buttons.loop, false);\n\t toggleHidden(this.elements.settings.panels.loop, false);\n\t // Toggle the pane and tab\n\t const toggle = !is.empty(this.loop.options);\n\t controls.toggleMenuButton.call(this, 'loop', toggle);\n\t // Empty the menu\n\t emptyElement(list);\n\t options.forEach(option => {\n\t const item = createElement('li');\n\t const button = createElement(\n\t 'button',\n\t extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {\n\t type: 'button',\n\t class: this.config.classNames.control,\n\t 'data-plyr-loop-action': option,\n\t }),\n\t i18n.get(option, this.config)\n\t );\n\t if (['start', 'end'].includes(option)) {\n\t const badge = controls.createBadge.call(this, '00:00');\n\t button.appendChild(badge);\n\t }\n\t item.appendChild(button);\n\t list.appendChild(item);\n\t });\n\t }, */\n\t // Get current selected caption language\n\t // TODO: rework this to user the getter in the API?\n\t // Set a list of available captions languages\n\t setCaptionsMenu: function setCaptionsMenu() {\n\t var _this7 = this;\n\n\t // Menu required\n\t if (!is$2.element(this.elements.settings.panels.captions)) {\n\t return;\n\t } // TODO: Captions or language? Currently it's mixed\n\n\n\t var type = 'captions';\n\t var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n\t var tracks = captions.getTracks.call(this);\n\t var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n\t controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n\t emptyElement(list); // Check if we need to toggle the parent\n\n\t controls.checkMenu.call(this); // If there's no captions, bail\n\n\t if (!toggle) {\n\t return;\n\t } // Generate options data\n\n\n\t var options = tracks.map(function (track, value) {\n\t return {\n\t value: value,\n\t checked: _this7.captions.toggled && _this7.currentTrack === value,\n\t title: captions.getLabel.call(_this7, track),\n\t badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n\t list: list,\n\t type: 'language'\n\t };\n\t }); // Add the \"Disabled\" option to turn off captions\n\n\t options.unshift({\n\t value: -1,\n\t checked: !this.captions.toggled,\n\t title: i18n.get('disabled', this.config),\n\t list: list,\n\t type: 'language'\n\t }); // Generate options\n\n\t options.forEach(controls.createMenuItem.bind(this));\n\t controls.updateSetting.call(this, type, list);\n\t },\n\t // Set a list of available captions languages\n\t setSpeedMenu: function setSpeedMenu() {\n\t var _this8 = this;\n\n\t // Menu required\n\t if (!is$2.element(this.elements.settings.panels.speed)) {\n\t return;\n\t }\n\n\t var type = 'speed';\n\t var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n\t this.options.speed = this.options.speed.filter(function (o) {\n\t return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n\t }); // Toggle the pane and tab\n\n\t var toggle = !is$2.empty(this.options.speed) && this.options.speed.length > 1;\n\t controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n\t emptyElement(list); // Check if we need to toggle the parent\n\n\t controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n\t if (!toggle) {\n\t return;\n\t } // Create items\n\n\n\t this.options.speed.forEach(function (speed) {\n\t controls.createMenuItem.call(_this8, {\n\t value: speed,\n\t list: list,\n\t type: type,\n\t title: controls.getLabel.call(_this8, 'speed', speed)\n\t });\n\t });\n\t controls.updateSetting.call(this, type, list);\n\t },\n\t // Check if we need to hide/show the settings menu\n\t checkMenu: function checkMenu() {\n\t var buttons = this.elements.settings.buttons;\n\t var visible = !is$2.empty(buttons) && Object.values(buttons).some(function (button) {\n\t return !button.hidden;\n\t });\n\t toggleHidden(this.elements.settings.menu, !visible);\n\t },\n\t // Focus the first menu item in a given (or visible) menu\n\t focusFirstMenuItem: function focusFirstMenuItem(pane) {\n\t var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t if (this.elements.settings.popup.hidden) {\n\t return;\n\t }\n\n\t var target = pane;\n\n\t if (!is$2.element(target)) {\n\t target = Object.values(this.elements.settings.panels).find(function (p) {\n\t return !p.hidden;\n\t });\n\t }\n\n\t var firstItem = target.querySelector('[role^=\"menuitem\"]');\n\t setFocus.call(this, firstItem, tabFocus);\n\t },\n\t // Show/hide menu\n\t toggleMenu: function toggleMenu(input) {\n\t var popup = this.elements.settings.popup;\n\t var button = this.elements.buttons.settings; // Menu and button are required\n\n\t if (!is$2.element(popup) || !is$2.element(button)) {\n\t return;\n\t } // True toggle by default\n\n\n\t var hidden = popup.hidden;\n\t var show = hidden;\n\n\t if (is$2.boolean(input)) {\n\t show = input;\n\t } else if (is$2.keyboardEvent(input) && input.which === 27) {\n\t show = false;\n\t } else if (is$2.event(input)) {\n\t // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n\t // Element in the shadowDOM. The path, if available, is complete.\n\t var target = is$2.function(input.composedPath) ? input.composedPath()[0] : input.target;\n\t var isMenuItem = popup.contains(target); // If the click was inside the menu or if the click\n\t // wasn't the button or menu item and we're trying to\n\t // show the menu (a doc click shouldn't show the menu)\n\n\t if (isMenuItem || !isMenuItem && input.target !== button && show) {\n\t return;\n\t }\n\t } // Set button attributes\n\n\n\t button.setAttribute('aria-expanded', show); // Show the actual popup\n\n\t toggleHidden(popup, !show); // Add class hook\n\n\t toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n\t if (show && is$2.keyboardEvent(input)) {\n\t controls.focusFirstMenuItem.call(this, null, true);\n\t } else if (!show && !hidden) {\n\t // If closing, re-focus the button\n\t setFocus.call(this, button, is$2.keyboardEvent(input));\n\t }\n\t },\n\t // Get the natural size of a menu panel\n\t getMenuSize: function getMenuSize(tab) {\n\t var clone = tab.cloneNode(true);\n\t clone.style.position = 'absolute';\n\t clone.style.opacity = 0;\n\t clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n\t tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n\t var width = clone.scrollWidth;\n\t var height = clone.scrollHeight; // Remove from the DOM\n\n\t removeElement(clone);\n\t return {\n\t width: width,\n\t height: height\n\t };\n\t },\n\t // Show a panel in the menu\n\t showMenuPanel: function showMenuPanel() {\n\t var _this9 = this;\n\n\t var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n\t var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n\t if (!is$2.element(target)) {\n\t return;\n\t } // Hide all other panels\n\n\n\t var container = target.parentNode;\n\t var current = Array.from(container.children).find(function (node) {\n\t return !node.hidden;\n\t }); // If we can do fancy animations, we'll animate the height/width\n\n\t if (support.transitions && !support.reducedMotion) {\n\t // Set the current width as a base\n\t container.style.width = \"\".concat(current.scrollWidth, \"px\");\n\t container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n\t var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n\t var restore = function restore(event) {\n\t // We're only bothered about height and width on the container\n\t if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {\n\t return;\n\t } // Revert back to auto\n\n\n\t container.style.width = '';\n\t container.style.height = ''; // Only listen once\n\n\t off.call(_this9, container, transitionEndEvent, restore);\n\t }; // Listen for the transition finishing and restore auto height/width\n\n\n\t on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n\t container.style.width = \"\".concat(size.width, \"px\");\n\t container.style.height = \"\".concat(size.height, \"px\");\n\t } // Set attributes on current tab\n\n\n\t toggleHidden(current, true); // Set attributes on target\n\n\t toggleHidden(target, false); // Focus the first item\n\n\t controls.focusFirstMenuItem.call(this, target, tabFocus);\n\t },\n\t // Set the download URL\n\t setDownloadUrl: function setDownloadUrl() {\n\t var button = this.elements.buttons.download; // Bail if no button\n\n\t if (!is$2.element(button)) {\n\t return;\n\t } // Set attribute\n\n\n\t button.setAttribute('href', this.download);\n\t },\n\t // Build the default HTML\n\t create: function create(data) {\n\t var _this10 = this;\n\n\t var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n\t createButton = controls.createButton,\n\t createProgress = controls.createProgress,\n\t createRange = controls.createRange,\n\t createTime = controls.createTime,\n\t setQualityMenu = controls.setQualityMenu,\n\t setSpeedMenu = controls.setSpeedMenu,\n\t showMenuPanel = controls.showMenuPanel;\n\t this.elements.controls = null; // Larger overlaid play button\n\n\t if (is$2.array(this.config.controls) && this.config.controls.includes('play-large')) {\n\t this.elements.container.appendChild(createButton.call(this, 'play-large'));\n\t } // Create the container\n\n\n\t var container = createElement$1('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n\t this.elements.controls = container; // Default item attributes\n\n\t var defaultAttributes = {\n\t class: 'plyr__controls__item'\n\t }; // Loop through controls in order\n\n\t dedupe(is$2.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n\t // Restart button\n\t if (control === 'restart') {\n\t container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n\t } // Rewind button\n\n\n\t if (control === 'rewind') {\n\t container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n\t } // Play/Pause button\n\n\n\t if (control === 'play') {\n\t container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n\t } // Fast forward button\n\n\n\t if (control === 'fast-forward') {\n\t container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n\t } // Progress\n\n\n\t if (control === 'progress') {\n\t var progressContainer = createElement$1('div', {\n\t class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n\t });\n\t var progress = createElement$1('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n\t progress.appendChild(createRange.call(_this10, 'seek', {\n\t id: \"plyr-seek-\".concat(data.id)\n\t })); // Buffer progress\n\n\t progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n\t // Seek tooltip\n\n\t if (_this10.config.tooltips.seek) {\n\t var tooltip = createElement$1('span', {\n\t class: _this10.config.classNames.tooltip\n\t }, '00:00');\n\t progress.appendChild(tooltip);\n\t _this10.elements.display.seekTooltip = tooltip;\n\t }\n\n\t _this10.elements.progress = progress;\n\t progressContainer.appendChild(_this10.elements.progress);\n\t container.appendChild(progressContainer);\n\t } // Media current time display\n\n\n\t if (control === 'current-time') {\n\t container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n\t } // Media duration display\n\n\n\t if (control === 'duration') {\n\t container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n\t } // Volume controls\n\n\n\t if (control === 'mute' || control === 'volume') {\n\t var volume = _this10.elements.volume; // Create the volume container if needed\n\n\t if (!is$2.element(volume) || !container.contains(volume)) {\n\t volume = createElement$1('div', extend$1({}, defaultAttributes, {\n\t class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n\t }));\n\t _this10.elements.volume = volume;\n\t container.appendChild(volume);\n\t } // Toggle mute button\n\n\n\t if (control === 'mute') {\n\t volume.appendChild(createButton.call(_this10, 'mute'));\n\t } // Volume range control\n\t // Ignored on iOS as it's handled globally\n\t // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n\t if (control === 'volume' && !browser.isIos) {\n\t // Set the attributes\n\t var attributes = {\n\t max: 1,\n\t step: 0.05,\n\t value: _this10.config.volume\n\t }; // Create the volume range slider\n\n\t volume.appendChild(createRange.call(_this10, 'volume', extend$1(attributes, {\n\t id: \"plyr-volume-\".concat(data.id)\n\t })));\n\t }\n\t } // Toggle captions button\n\n\n\t if (control === 'captions') {\n\t container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n\t } // Settings button / menu\n\n\n\t if (control === 'settings' && !is$2.empty(_this10.config.settings)) {\n\t var wrapper = createElement$1('div', extend$1({}, defaultAttributes, {\n\t class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n\t hidden: ''\n\t }));\n\t wrapper.appendChild(createButton.call(_this10, 'settings', {\n\t 'aria-haspopup': true,\n\t 'aria-controls': \"plyr-settings-\".concat(data.id),\n\t 'aria-expanded': false\n\t }));\n\t var popup = createElement$1('div', {\n\t class: 'plyr__menu__container',\n\t id: \"plyr-settings-\".concat(data.id),\n\t hidden: ''\n\t });\n\t var inner = createElement$1('div');\n\t var home = createElement$1('div', {\n\t id: \"plyr-settings-\".concat(data.id, \"-home\")\n\t }); // Create the menu\n\n\t var menu = createElement$1('div', {\n\t role: 'menu'\n\t });\n\t home.appendChild(menu);\n\t inner.appendChild(home);\n\t _this10.elements.settings.panels.home = home; // Build the menu items\n\n\t _this10.config.settings.forEach(function (type) {\n\t // TODO: bundle this with the createMenuItem helper and bindings\n\t var menuItem = createElement$1('button', extend$1(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n\t type: 'button',\n\t class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n\t role: 'menuitem',\n\t 'aria-haspopup': true,\n\t hidden: ''\n\t })); // Bind menu shortcuts for keyboard users\n\n\t bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n\t on.call(_this10, menuItem, 'click', function () {\n\t showMenuPanel.call(_this10, type, false);\n\t });\n\t var flex = createElement$1('span', null, i18n.get(type, _this10.config));\n\t var value = createElement$1('span', {\n\t class: _this10.config.classNames.menu.value\n\t }); // Speed contains HTML entities\n\n\t value.innerHTML = data[type];\n\t flex.appendChild(value);\n\t menuItem.appendChild(flex);\n\t menu.appendChild(menuItem); // Build the panes\n\n\t var pane = createElement$1('div', {\n\t id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n\t hidden: ''\n\t }); // Back button\n\n\t var backButton = createElement$1('button', {\n\t type: 'button',\n\t class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n\t }); // Visible label\n\n\t backButton.appendChild(createElement$1('span', {\n\t 'aria-hidden': true\n\t }, i18n.get(type, _this10.config))); // Screen reader label\n\n\t backButton.appendChild(createElement$1('span', {\n\t class: _this10.config.classNames.hidden\n\t }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n\t on.call(_this10, pane, 'keydown', function (event) {\n\t // We only care about <-\n\t if (event.which !== 37) {\n\t return;\n\t } // Prevent seek\n\n\n\t event.preventDefault();\n\t event.stopPropagation(); // Show the respective menu\n\n\t showMenuPanel.call(_this10, 'home', true);\n\t }, false); // Go back via button click\n\n\t on.call(_this10, backButton, 'click', function () {\n\t showMenuPanel.call(_this10, 'home', false);\n\t }); // Add to pane\n\n\t pane.appendChild(backButton); // Menu\n\n\t pane.appendChild(createElement$1('div', {\n\t role: 'menu'\n\t }));\n\t inner.appendChild(pane);\n\t _this10.elements.settings.buttons[type] = menuItem;\n\t _this10.elements.settings.panels[type] = pane;\n\t });\n\n\t popup.appendChild(inner);\n\t wrapper.appendChild(popup);\n\t container.appendChild(wrapper);\n\t _this10.elements.settings.popup = popup;\n\t _this10.elements.settings.menu = wrapper;\n\t } // Picture in picture button\n\n\n\t if (control === 'pip' && support.pip) {\n\t container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n\t } // Airplay button\n\n\n\t if (control === 'airplay' && support.airplay) {\n\t container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n\t } // Download button\n\n\n\t if (control === 'download') {\n\t var _attributes = extend$1({}, defaultAttributes, {\n\t element: 'a',\n\t href: _this10.download,\n\t target: '_blank'\n\t }); // Set download attribute for HTML5 only\n\n\n\t if (_this10.isHTML5) {\n\t _attributes.download = '';\n\t }\n\n\t var download = _this10.config.urls.download;\n\n\t if (!is$2.url(download) && _this10.isEmbed) {\n\t extend$1(_attributes, {\n\t icon: \"logo-\".concat(_this10.provider),\n\t label: _this10.provider\n\t });\n\t }\n\n\t container.appendChild(createButton.call(_this10, 'download', _attributes));\n\t } // Toggle fullscreen button\n\n\n\t if (control === 'fullscreen') {\n\t container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n\t }\n\t }); // Set available quality levels\n\n\t if (this.isHTML5) {\n\t setQualityMenu.call(this, html5.getQualityOptions.call(this));\n\t }\n\n\t setSpeedMenu.call(this);\n\t return container;\n\t },\n\t // Insert controls\n\t inject: function inject() {\n\t var _this11 = this;\n\n\t // Sprite\n\t if (this.config.loadSprite) {\n\t var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n\t if (icon.cors) {\n\t loadSprite(icon.url, 'sprite-plyr');\n\t }\n\t } // Create a unique ID\n\n\n\t this.id = Math.floor(Math.random() * 10000); // Null by default\n\n\t var container = null;\n\t this.elements.controls = null; // Set template properties\n\n\t var props = {\n\t id: this.id,\n\t seektime: this.config.seekTime,\n\t title: this.config.title\n\t };\n\t var update = true; // If function, run it and use output\n\n\t if (is$2.function(this.config.controls)) {\n\t this.config.controls = this.config.controls.call(this, props);\n\t } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n\t if (!this.config.controls) {\n\t this.config.controls = [];\n\t }\n\n\t if (is$2.element(this.config.controls) || is$2.string(this.config.controls)) {\n\t // HTMLElement or Non-empty string passed as the option\n\t container = this.config.controls;\n\t } else {\n\t // Create controls\n\t container = controls.create.call(this, {\n\t id: this.id,\n\t seektime: this.config.seekTime,\n\t speed: this.speed,\n\t quality: this.quality,\n\t captions: captions.getLabel.call(this) // TODO: Looping\n\t // loop: 'None',\n\n\t });\n\t update = false;\n\t } // Replace props with their value\n\n\n\t var replace = function replace(input) {\n\t var result = input;\n\t Object.entries(props).forEach(function (_ref2) {\n\t var _ref3 = _slicedToArray(_ref2, 2),\n\t key = _ref3[0],\n\t value = _ref3[1];\n\n\t result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n\t });\n\t return result;\n\t }; // Update markup\n\n\n\t if (update) {\n\t if (is$2.string(this.config.controls)) {\n\t container = replace(container);\n\t }\n\t } // Controls container\n\n\n\t var target; // Inject to custom location\n\n\t if (is$2.string(this.config.selectors.controls.container)) {\n\t target = document.querySelector(this.config.selectors.controls.container);\n\t } // Inject into the container by default\n\n\n\t if (!is$2.element(target)) {\n\t target = this.elements.container;\n\t } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n\t var insertMethod = is$2.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n\t target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n\t if (!is$2.element(this.elements.controls)) {\n\t controls.findElements.call(this);\n\t } // Add pressed property to buttons\n\n\n\t if (!is$2.empty(this.elements.buttons)) {\n\t var addProperty = function addProperty(button) {\n\t var className = _this11.config.classNames.controlPressed;\n\t Object.defineProperty(button, 'pressed', {\n\t enumerable: true,\n\t get: function get() {\n\t return hasClass(button, className);\n\t },\n\t set: function set() {\n\t var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t toggleClass(button, className, pressed);\n\t }\n\t });\n\t }; // Toggle classname when pressed property is set\n\n\n\t Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n\t if (is$2.array(button) || is$2.nodeList(button)) {\n\t Array.from(button).filter(Boolean).forEach(addProperty);\n\t } else {\n\t addProperty(button);\n\t }\n\t });\n\t } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n\t if (browser.isEdge) {\n\t repaint(target);\n\t } // Setup tooltips\n\n\n\t if (this.config.tooltips.controls) {\n\t var _this$config = this.config,\n\t classNames = _this$config.classNames,\n\t selectors = _this$config.selectors;\n\t var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n\t var labels = getElements.call(this, selector);\n\t Array.from(labels).forEach(function (label) {\n\t toggleClass(label, _this11.config.classNames.hidden, false);\n\t toggleClass(label, _this11.config.classNames.tooltip, true);\n\t });\n\t }\n\t }\n\t};\n\n\t/**\n\t * Parse a string to a URL object\n\t * @param {String} input - the URL to be parsed\n\t * @param {Boolean} safe - failsafe parsing\n\t */\n\n\tfunction parseUrl$1(input) {\n\t var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t var url = input;\n\n\t if (safe) {\n\t var parser = document.createElement('a');\n\t parser.href = url;\n\t url = parser.href;\n\t }\n\n\t try {\n\t return new URL(url);\n\t } catch (e) {\n\t return null;\n\t }\n\t} // Convert object to URLSearchParams\n\n\tfunction buildUrlParams(input) {\n\t var params = new URLSearchParams();\n\n\t if (is$2.object(input)) {\n\t Object.entries(input).forEach(function (_ref) {\n\t var _ref2 = _slicedToArray(_ref, 2),\n\t key = _ref2[0],\n\t value = _ref2[1];\n\n\t params.set(key, value);\n\t });\n\t }\n\n\t return params;\n\t}\n\n\tvar captions = {\n\t // Setup captions\n\t setup: function setup() {\n\t // Requires UI support\n\t if (!this.supported.ui) {\n\t return;\n\t } // Only Vimeo and HTML5 video supported at this point\n\n\n\t if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n\t // Clear menu and hide\n\t if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n\t controls.setCaptionsMenu.call(this);\n\t }\n\n\t return;\n\t } // Inject the container\n\n\n\t if (!is$2.element(this.elements.captions)) {\n\t this.elements.captions = createElement$1('div', getAttributesFromSelector(this.config.selectors.captions));\n\t insertAfter(this.elements.captions, this.elements.wrapper);\n\t } // Fix IE captions if CORS is used\n\t // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n\t if (browser.isIE && window.URL) {\n\t var elements = this.media.querySelectorAll('track');\n\t Array.from(elements).forEach(function (track) {\n\t var src = track.getAttribute('src');\n\t var url = parseUrl$1(src);\n\n\t if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n\t fetch(src, 'blob').then(function (blob) {\n\t track.setAttribute('src', window.URL.createObjectURL(blob));\n\t }).catch(function () {\n\t removeElement(track);\n\t });\n\t }\n\t });\n\t } // Get and set initial data\n\t // The \"preferred\" options are not realized unless / until the wanted language has a match\n\t // * languages: Array of user's browser languages.\n\t // * language: The language preferred by user settings or config\n\t // * active: The state preferred by user settings or config\n\t // * toggled: The real captions state\n\n\n\t var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n\t var languages = dedupe(browserLanguages.map(function (language) {\n\t return language.split('-')[0];\n\t }));\n\t var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n\t if (language === 'auto') {\n\t var _languages = _slicedToArray(languages, 1);\n\n\t language = _languages[0];\n\t }\n\n\t var active = this.storage.get('captions');\n\n\t if (!is$2.boolean(active)) {\n\t active = this.config.captions.active;\n\t }\n\n\t Object.assign(this.captions, {\n\t toggled: false,\n\t active: active,\n\t language: language,\n\t languages: languages\n\t }); // Watch changes to textTracks and update captions menu\n\n\t if (this.isHTML5) {\n\t var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n\t on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n\t } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n\t setTimeout(captions.update.bind(this), 0);\n\t },\n\t // Update available language options in settings based on tracks\n\t update: function update() {\n\t var _this = this;\n\n\t var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n\t var _this$captions = this.captions,\n\t active = _this$captions.active,\n\t language = _this$captions.language,\n\t meta = _this$captions.meta,\n\t currentTrackNode = _this$captions.currentTrackNode;\n\t var languageExists = Boolean(tracks.find(function (track) {\n\t return track.language === language;\n\t })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n\t if (this.isHTML5 && this.isVideo) {\n\t tracks.filter(function (track) {\n\t return !meta.get(track);\n\t }).forEach(function (track) {\n\t _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n\t meta.set(track, {\n\t default: track.mode === 'showing'\n\t }); // Turn off native caption rendering to avoid double captions\n\t // Note: mode='hidden' forces a track to download. To ensure every track\n\t // isn't downloaded at once, only 'showing' tracks should be reassigned\n\t // eslint-disable-next-line no-param-reassign\n\n\t if (track.mode === 'showing') {\n\t // eslint-disable-next-line no-param-reassign\n\t track.mode = 'hidden';\n\t } // Add event listener for cue changes\n\n\n\t on.call(_this, track, 'cuechange', function () {\n\t return captions.updateCues.call(_this);\n\t });\n\t });\n\t } // Update language first time it matches, or if the previous matching track was removed\n\n\n\t if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n\t captions.setLanguage.call(this, language);\n\t captions.toggle.call(this, active && languageExists);\n\t } // Enable or disable captions based on track length\n\n\n\t toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$2.empty(tracks)); // Update available languages in list\n\n\t if (is$2.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n\t controls.setCaptionsMenu.call(this);\n\t }\n\t },\n\t // Toggle captions display\n\t // Used internally for the toggleCaptions method, with the passive option forced to false\n\t toggle: function toggle(input) {\n\t var _this2 = this;\n\n\t var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t // If there's no full support\n\t if (!this.supported.ui) {\n\t return;\n\t }\n\n\t var toggled = this.captions.toggled; // Current state\n\n\t var activeClass = this.config.classNames.captions.active; // Get the next state\n\t // If the method is called without parameter, toggle based on current value\n\n\t var active = is$2.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n\t if (active !== toggled) {\n\t // When passive, don't override user preferences\n\t if (!passive) {\n\t this.captions.active = active;\n\t this.storage.set({\n\t captions: active\n\t });\n\t } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n\t if (!this.language && active && !passive) {\n\t var tracks = captions.getTracks.call(this);\n\t 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\n\n\t this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n\t captions.set.call(this, tracks.indexOf(track));\n\t return;\n\t } // Toggle button if it's enabled\n\n\n\t if (this.elements.buttons.captions) {\n\t this.elements.buttons.captions.pressed = active;\n\t } // Add class hook\n\n\n\t toggleClass(this.elements.container, activeClass, active);\n\t this.captions.toggled = active; // Update settings menu\n\n\t controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n\t triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n\t } // Wait for the call stack to clear before setting mode='hidden'\n\t // on the active track - forcing the browser to download it\n\n\n\t setTimeout(function () {\n\t if (active && _this2.captions.toggled) {\n\t _this2.captions.currentTrackNode.mode = 'hidden';\n\t }\n\t });\n\t },\n\t // Set captions by track index\n\t // Used internally for the currentTrack setter with the passive option forced to false\n\t set: function set(index) {\n\t var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n\t if (index === -1) {\n\t captions.toggle.call(this, false, passive);\n\t return;\n\t }\n\n\t if (!is$2.number(index)) {\n\t this.debug.warn('Invalid caption argument', index);\n\t return;\n\t }\n\n\t if (!(index in tracks)) {\n\t this.debug.warn('Track not found', index);\n\t return;\n\t }\n\n\t if (this.captions.currentTrack !== index) {\n\t this.captions.currentTrack = index;\n\t var track = tracks[index];\n\n\t var _ref = track || {},\n\t language = _ref.language; // Store reference to node for invalidation on remove\n\n\n\t this.captions.currentTrackNode = track; // Update settings menu\n\n\t controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n\t if (!passive) {\n\t this.captions.language = language;\n\t this.storage.set({\n\t language: language\n\t });\n\t } // Handle Vimeo captions\n\n\n\t if (this.isVimeo) {\n\t this.embed.enableTextTrack(language);\n\t } // Trigger event\n\n\n\t triggerEvent.call(this, this.media, 'languagechange');\n\t } // Show captions\n\n\n\t captions.toggle.call(this, true, passive);\n\n\t if (this.isHTML5 && this.isVideo) {\n\t // If we change the active track while a cue is already displayed we need to update it\n\t captions.updateCues.call(this);\n\t }\n\t },\n\t // Set captions by language\n\t // Used internally for the language setter with the passive option forced to false\n\t setLanguage: function setLanguage(input) {\n\t var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t if (!is$2.string(input)) {\n\t this.debug.warn('Invalid language argument', input);\n\t return;\n\t } // Normalize\n\n\n\t var language = input.toLowerCase();\n\t this.captions.language = language; // Set currentTrack\n\n\t var tracks = captions.getTracks.call(this);\n\t var track = captions.findTrack.call(this, [language]);\n\t captions.set.call(this, tracks.indexOf(track), passive);\n\t },\n\t // Get current valid caption tracks\n\t // If update is false it will also ignore tracks without metadata\n\t // This is used to \"freeze\" the language options when captions.update is false\n\t getTracks: function getTracks() {\n\t var _this3 = this;\n\n\t var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t // Handle media or textTracks missing or null\n\t var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)\n\t // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)\n\n\t return tracks.filter(function (track) {\n\t return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n\t }).filter(function (track) {\n\t return ['captions', 'subtitles'].includes(track.kind);\n\t });\n\t },\n\t // Match tracks based on languages and get the first\n\t findTrack: function findTrack(languages) {\n\t var _this4 = this;\n\n\t var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var tracks = captions.getTracks.call(this);\n\n\t var sortIsDefault = function sortIsDefault(track) {\n\t return Number((_this4.captions.meta.get(track) || {}).default);\n\t };\n\n\t var sorted = Array.from(tracks).sort(function (a, b) {\n\t return sortIsDefault(b) - sortIsDefault(a);\n\t });\n\t var track;\n\t languages.every(function (language) {\n\t track = sorted.find(function (t) {\n\t return t.language === language;\n\t });\n\t return !track; // Break iteration if there is a match\n\t }); // If no match is found but is required, get first\n\n\t return track || (force ? sorted[0] : undefined);\n\t },\n\t // Get the current track\n\t getCurrentTrack: function getCurrentTrack() {\n\t return captions.getTracks.call(this)[this.currentTrack];\n\t },\n\t // Get UI label for track\n\t getLabel: function getLabel(track) {\n\t var currentTrack = track;\n\n\t if (!is$2.track(currentTrack) && support.textTracks && this.captions.toggled) {\n\t currentTrack = captions.getCurrentTrack.call(this);\n\t }\n\n\t if (is$2.track(currentTrack)) {\n\t if (!is$2.empty(currentTrack.label)) {\n\t return currentTrack.label;\n\t }\n\n\t if (!is$2.empty(currentTrack.language)) {\n\t return track.language.toUpperCase();\n\t }\n\n\t return i18n.get('enabled', this.config);\n\t }\n\n\t return i18n.get('disabled', this.config);\n\t },\n\t // Update captions using current track's active cues\n\t // Also optional array argument in case there isn't any track (ex: vimeo)\n\t updateCues: function updateCues(input) {\n\t // Requires UI\n\t if (!this.supported.ui) {\n\t return;\n\t }\n\n\t if (!is$2.element(this.elements.captions)) {\n\t this.debug.warn('No captions element to render to');\n\t return;\n\t } // Only accept array or empty input\n\n\n\t if (!is$2.nullOrUndefined(input) && !Array.isArray(input)) {\n\t this.debug.warn('updateCues: Invalid input', input);\n\t return;\n\t }\n\n\t var cues = input; // Get cues from track\n\n\t if (!cues) {\n\t var track = captions.getCurrentTrack.call(this);\n\t cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n\t return cue.getCueAsHTML();\n\t }).map(getHTML);\n\t } // Set new caption text\n\n\n\t var content = cues.map(function (cueText) {\n\t return cueText.trim();\n\t }).join('\\n');\n\t var changed = content !== this.elements.captions.innerHTML;\n\n\t if (changed) {\n\t // Empty the container and create a new child element\n\t emptyElement(this.elements.captions);\n\t var caption = createElement$1('span', getAttributesFromSelector(this.config.selectors.caption));\n\t caption.innerHTML = content;\n\t this.elements.captions.appendChild(caption); // Trigger event\n\n\t triggerEvent.call(this, this.media, 'cuechange');\n\t }\n\t }\n\t};\n\n\t// ==========================================================================\n\t// Plyr default config\n\t// ==========================================================================\n\tvar defaults$2 = {\n\t // Disable\n\t enabled: true,\n\t // Custom media title\n\t title: '',\n\t // Logging to console\n\t debug: false,\n\t // Auto play (if supported)\n\t autoplay: false,\n\t // Only allow one media playing at once (vimeo only)\n\t autopause: true,\n\t // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)\n\t // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)\n\t playsinline: true,\n\t // Default time to skip when rewind/fast forward\n\t seekTime: 10,\n\t // Default volume\n\t volume: 1,\n\t muted: false,\n\t // Pass a custom duration\n\t duration: null,\n\t // Display the media duration on load in the current time position\n\t // If you have opted to display both duration and currentTime, this is ignored\n\t displayDuration: true,\n\t // Invert the current time to be a countdown\n\t invertTime: true,\n\t // Clicking the currentTime inverts it's value to show time left rather than elapsed\n\t toggleInvert: true,\n\t // Force an aspect ratio\n\t // The format must be `'w:h'` (e.g. `'16:9'`)\n\t ratio: null,\n\t // Click video container to play/pause\n\t clickToPlay: true,\n\t // Auto hide the controls\n\t hideControls: true,\n\t // Reset to start when playback ended\n\t resetOnEnd: false,\n\t // Disable the standard context menu\n\t disableContextMenu: true,\n\t // Sprite (for icons)\n\t loadSprite: true,\n\t iconPrefix: 'plyr',\n\t iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',\n\t // Blank video (used to prevent errors on source change)\n\t blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n\t // Quality default\n\t quality: {\n\t default: 576,\n\t // The options to display in the UI, if available for the source media\n\t options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n\t forced: false,\n\t onChange: null\n\t },\n\t // Set loops\n\t loop: {\n\t active: false // start: null,\n\t // end: null,\n\n\t },\n\t // Speed default and options to display\n\t speed: {\n\t selected: 1,\n\t // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n\t options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n\t },\n\t // Keyboard shortcut settings\n\t keyboard: {\n\t focused: true,\n\t global: false\n\t },\n\t // Display tooltips\n\t tooltips: {\n\t controls: false,\n\t seek: true\n\t },\n\t // Captions settings\n\t captions: {\n\t active: false,\n\t language: 'auto',\n\t // Listen to new tracks added after Plyr is initialized.\n\t // This is needed for streaming captions, but may result in unselectable options\n\t update: false\n\t },\n\t // Fullscreen settings\n\t fullscreen: {\n\t enabled: true,\n\t // Allow fullscreen?\n\t fallback: true,\n\t // Fallback using full viewport/window\n\t iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n\t // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n\t // Non-ancestors of the player element will be ignored\n\t // container: null, // defaults to the player element\n\n\t },\n\t // Local storage\n\t storage: {\n\t enabled: true,\n\t key: 'plyr'\n\t },\n\t // Default controls\n\t controls: ['play-large', // 'restart',\n\t // 'rewind',\n\t 'play', // 'fast-forward',\n\t 'progress', 'current-time', // 'duration',\n\t 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n\t 'fullscreen'],\n\t settings: ['captions', 'quality', 'speed'],\n\t // Localisation\n\t i18n: {\n\t restart: 'Restart',\n\t rewind: 'Rewind {seektime}s',\n\t play: 'Play',\n\t pause: 'Pause',\n\t fastForward: 'Forward {seektime}s',\n\t seek: 'Seek',\n\t seekLabel: '{currentTime} of {duration}',\n\t played: 'Played',\n\t buffered: 'Buffered',\n\t currentTime: 'Current time',\n\t duration: 'Duration',\n\t volume: 'Volume',\n\t mute: 'Mute',\n\t unmute: 'Unmute',\n\t enableCaptions: 'Enable captions',\n\t disableCaptions: 'Disable captions',\n\t download: 'Download',\n\t enterFullscreen: 'Enter fullscreen',\n\t exitFullscreen: 'Exit fullscreen',\n\t frameTitle: 'Player for {title}',\n\t captions: 'Captions',\n\t settings: 'Settings',\n\t pip: 'PIP',\n\t menuBack: 'Go back to previous menu',\n\t speed: 'Speed',\n\t normal: 'Normal',\n\t quality: 'Quality',\n\t loop: 'Loop',\n\t start: 'Start',\n\t end: 'End',\n\t all: 'All',\n\t reset: 'Reset',\n\t disabled: 'Disabled',\n\t enabled: 'Enabled',\n\t advertisement: 'Ad',\n\t qualityBadge: {\n\t 2160: '4K',\n\t 1440: 'HD',\n\t 1080: 'HD',\n\t 720: 'HD',\n\t 576: 'SD',\n\t 480: 'SD'\n\t }\n\t },\n\t // URLs\n\t urls: {\n\t download: null,\n\t vimeo: {\n\t sdk: 'https://player.vimeo.com/api/player.js',\n\t iframe: 'https://player.vimeo.com/video/{0}?{1}',\n\t api: 'https://vimeo.com/api/oembed.json?url={0}'\n\t },\n\t youtube: {\n\t sdk: 'https://www.youtube.com/iframe_api',\n\t api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n\t },\n\t googleIMA: {\n\t sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\n\t }\n\t },\n\t // Custom control listeners\n\t listeners: {\n\t seek: null,\n\t play: null,\n\t pause: null,\n\t restart: null,\n\t rewind: null,\n\t fastForward: null,\n\t mute: null,\n\t volume: null,\n\t captions: null,\n\t download: null,\n\t fullscreen: null,\n\t pip: null,\n\t airplay: null,\n\t speed: null,\n\t quality: null,\n\t loop: null,\n\t language: null\n\t },\n\t // Events to watch and bubble\n\t events: [// Events to watch on HTML5 media elements and bubble\n\t // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n\t 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n\t 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n\t 'statechange', // Quality\n\t 'qualitychange', // Ads\n\t 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\n\t // Selectors\n\t // Change these to match your template if using custom HTML\n\t selectors: {\n\t editable: 'input, textarea, select, [contenteditable]',\n\t container: '.plyr',\n\t controls: {\n\t container: null,\n\t wrapper: '.plyr__controls'\n\t },\n\t labels: '[data-plyr]',\n\t buttons: {\n\t play: '[data-plyr=\"play\"]',\n\t pause: '[data-plyr=\"pause\"]',\n\t restart: '[data-plyr=\"restart\"]',\n\t rewind: '[data-plyr=\"rewind\"]',\n\t fastForward: '[data-plyr=\"fast-forward\"]',\n\t mute: '[data-plyr=\"mute\"]',\n\t captions: '[data-plyr=\"captions\"]',\n\t download: '[data-plyr=\"download\"]',\n\t fullscreen: '[data-plyr=\"fullscreen\"]',\n\t pip: '[data-plyr=\"pip\"]',\n\t airplay: '[data-plyr=\"airplay\"]',\n\t settings: '[data-plyr=\"settings\"]',\n\t loop: '[data-plyr=\"loop\"]'\n\t },\n\t inputs: {\n\t seek: '[data-plyr=\"seek\"]',\n\t volume: '[data-plyr=\"volume\"]',\n\t speed: '[data-plyr=\"speed\"]',\n\t language: '[data-plyr=\"language\"]',\n\t quality: '[data-plyr=\"quality\"]'\n\t },\n\t display: {\n\t currentTime: '.plyr__time--current',\n\t duration: '.plyr__time--duration',\n\t buffer: '.plyr__progress__buffer',\n\t loop: '.plyr__progress__loop',\n\t // Used later\n\t volume: '.plyr__volume--display'\n\t },\n\t progress: '.plyr__progress',\n\t captions: '.plyr__captions',\n\t caption: '.plyr__caption'\n\t },\n\t // Class hooks added to the player in different states\n\t classNames: {\n\t type: 'plyr--{0}',\n\t provider: 'plyr--{0}',\n\t video: 'plyr__video-wrapper',\n\t embed: 'plyr__video-embed',\n\t videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\n\t embedContainer: 'plyr__video-embed__container',\n\t poster: 'plyr__poster',\n\t posterEnabled: 'plyr__poster-enabled',\n\t ads: 'plyr__ads',\n\t control: 'plyr__control',\n\t controlPressed: 'plyr__control--pressed',\n\t playing: 'plyr--playing',\n\t paused: 'plyr--paused',\n\t stopped: 'plyr--stopped',\n\t loading: 'plyr--loading',\n\t hover: 'plyr--hover',\n\t tooltip: 'plyr__tooltip',\n\t cues: 'plyr__cues',\n\t hidden: 'plyr__sr-only',\n\t hideControls: 'plyr--hide-controls',\n\t isIos: 'plyr--is-ios',\n\t isTouch: 'plyr--is-touch',\n\t uiSupported: 'plyr--full-ui',\n\t noTransition: 'plyr--no-transition',\n\t display: {\n\t time: 'plyr__time'\n\t },\n\t menu: {\n\t value: 'plyr__menu__value',\n\t badge: 'plyr__badge',\n\t open: 'plyr--menu-open'\n\t },\n\t captions: {\n\t enabled: 'plyr--captions-enabled',\n\t active: 'plyr--captions-active'\n\t },\n\t fullscreen: {\n\t enabled: 'plyr--fullscreen-enabled',\n\t fallback: 'plyr--fullscreen-fallback'\n\t },\n\t pip: {\n\t supported: 'plyr--pip-supported',\n\t active: 'plyr--pip-active'\n\t },\n\t airplay: {\n\t supported: 'plyr--airplay-supported',\n\t active: 'plyr--airplay-active'\n\t },\n\t tabFocus: 'plyr__tab-focus',\n\t previewThumbnails: {\n\t // Tooltip thumbs\n\t thumbContainer: 'plyr__preview-thumb',\n\t thumbContainerShown: 'plyr__preview-thumb--is-shown',\n\t imageContainer: 'plyr__preview-thumb__image-container',\n\t timeContainer: 'plyr__preview-thumb__time-container',\n\t // Scrubbing\n\t scrubbingContainer: 'plyr__preview-scrubbing',\n\t scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n\t }\n\t },\n\t // Embed attributes\n\t attributes: {\n\t embed: {\n\t provider: 'data-plyr-provider',\n\t id: 'data-plyr-embed-id'\n\t }\n\t },\n\t // Advertisements plugin\n\t // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio\n\t ads: {\n\t enabled: false,\n\t publisherId: '',\n\t tagUrl: ''\n\t },\n\t // Preview Thumbnails plugin\n\t previewThumbnails: {\n\t enabled: false,\n\t src: ''\n\t },\n\t // Vimeo plugin\n\t vimeo: {\n\t byline: false,\n\t portrait: false,\n\t title: false,\n\t speed: true,\n\t transparent: false,\n\t // Custom settings from Plyr\n\t customControls: true,\n\t referrerPolicy: null,\n\t // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n\t // Whether the owner of the video has a Pro or Business account\n\t // (which allows us to properly hide controls without CSS hacks, etc)\n\t premium: false\n\t },\n\t // YouTube plugin\n\t youtube: {\n\t rel: 0,\n\t // No related vids\n\t showinfo: 0,\n\t // Hide info\n\t iv_load_policy: 3,\n\t // Hide annotations\n\t modestbranding: 1,\n\t // Hide logos as much as possible (they still show one in the corner when paused)\n\t // Custom settings from Plyr\n\t customControls: true,\n\t noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n\t }\n\t};\n\n\t// ==========================================================================\n\t// Plyr states\n\t// ==========================================================================\n\tvar pip = {\n\t active: 'picture-in-picture',\n\t inactive: 'inline'\n\t};\n\n\t// ==========================================================================\n\t// Plyr supported types and providers\n\t// ==========================================================================\n\tvar providers = {\n\t html5: 'html5',\n\t youtube: 'youtube',\n\t vimeo: 'vimeo'\n\t};\n\tvar types = {\n\t audio: 'audio',\n\t video: 'video'\n\t};\n\t/**\n\t * Get provider by URL\n\t * @param {String} url\n\t */\n\n\tfunction getProviderByUrl(url) {\n\t // YouTube\n\t if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n\t return providers.youtube;\n\t } // Vimeo\n\n\n\t if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n\t return providers.vimeo;\n\t }\n\n\t return null;\n\t}\n\n\t// ==========================================================================\n\t// Console wrapper\n\t// ==========================================================================\n\tvar noop$1 = function noop() {};\n\n\tvar Console$1 = /*#__PURE__*/function () {\n\t function Console() {\n\t var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t _classCallCheck(this, Console);\n\n\t this.enabled = window.console && enabled;\n\n\t if (this.enabled) {\n\t this.log('Debugging enabled');\n\t }\n\t }\n\n\t _createClass(Console, [{\n\t key: \"log\",\n\t get: function get() {\n\t // eslint-disable-next-line no-console\n\t return this.enabled ? Function.prototype.bind.call(console.log, console) : noop$1;\n\t }\n\t }, {\n\t key: \"warn\",\n\t get: function get() {\n\t // eslint-disable-next-line no-console\n\t return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop$1;\n\t }\n\t }, {\n\t key: \"error\",\n\t get: function get() {\n\t // eslint-disable-next-line no-console\n\t return this.enabled ? Function.prototype.bind.call(console.error, console) : noop$1;\n\t }\n\t }]);\n\n\t return Console;\n\t}();\n\n\tvar Fullscreen = /*#__PURE__*/function () {\n\t function Fullscreen(player) {\n\t var _this = this;\n\n\t _classCallCheck(this, Fullscreen);\n\n\t _defineProperty(this, \"onChange\", function () {\n\t if (!_this.enabled) {\n\t return;\n\t } // Update toggle button\n\n\n\t var button = _this.player.elements.buttons.fullscreen;\n\n\t if (is$2.element(button)) {\n\t button.pressed = _this.active;\n\t } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n\t var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event\n\n\t triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n\t });\n\n\t _defineProperty(this, \"toggleFallback\", function () {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t // Store or restore scroll position\n\t if (toggle) {\n\t _this.scrollPosition = {\n\t x: window.scrollX || 0,\n\t y: window.scrollY || 0\n\t };\n\t } else {\n\t window.scrollTo(_this.scrollPosition.x, _this.scrollPosition.y);\n\t } // Toggle scroll\n\n\n\t document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n\t toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n\t if (browser.isIos) {\n\t var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n\t var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n\t if (!viewport) {\n\t viewport = document.createElement('meta');\n\t viewport.setAttribute('name', 'viewport');\n\t } // Check if the property already exists\n\n\n\t var hasProperty = is$2.string(viewport.content) && viewport.content.includes(property);\n\n\t if (toggle) {\n\t _this.cleanupViewport = !hasProperty;\n\n\t if (!hasProperty) {\n\t viewport.content += \",\".concat(property);\n\t }\n\t } else if (_this.cleanupViewport) {\n\t viewport.content = viewport.content.split(',').filter(function (part) {\n\t return part.trim() !== property;\n\t }).join(',');\n\t }\n\t } // Toggle button and fire events\n\n\n\t _this.onChange();\n\t });\n\n\t _defineProperty(this, \"trapFocus\", function (event) {\n\t // Bail if iOS, not active, not the tab key\n\t if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n\t return;\n\t } // Get the current focused element\n\n\n\t var focused = document.activeElement;\n\t var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n\t var _focusable = _slicedToArray(focusable, 1),\n\t first = _focusable[0];\n\n\t var last = focusable[focusable.length - 1];\n\n\t if (focused === last && !event.shiftKey) {\n\t // Move focus to first element that can be tabbed if Shift isn't used\n\t first.focus();\n\t event.preventDefault();\n\t } else if (focused === first && event.shiftKey) {\n\t // Move focus to last element that can be tabbed if Shift is used\n\t last.focus();\n\t event.preventDefault();\n\t }\n\t });\n\n\t _defineProperty(this, \"update\", function () {\n\t if (_this.enabled) {\n\t var mode;\n\n\t if (_this.forceFallback) {\n\t mode = 'Fallback (forced)';\n\t } else if (Fullscreen.native) {\n\t mode = 'Native';\n\t } else {\n\t mode = 'Fallback';\n\t }\n\n\t _this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n\t } else {\n\t _this.player.debug.log('Fullscreen not supported and fallback disabled');\n\t } // Add styling hook to show button\n\n\n\t toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);\n\t });\n\n\t _defineProperty(this, \"enter\", function () {\n\t if (!_this.enabled) {\n\t return;\n\t } // iOS native fullscreen doesn't need the request step\n\n\n\t if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n\t if (_this.player.isVimeo) {\n\t _this.player.embed.requestFullscreen();\n\t } else {\n\t _this.target.webkitEnterFullscreen();\n\t }\n\t } else if (!Fullscreen.native || _this.forceFallback) {\n\t _this.toggleFallback(true);\n\t } else if (!_this.prefix) {\n\t _this.target.requestFullscreen({\n\t navigationUI: 'hide'\n\t });\n\t } else if (!is$2.empty(_this.prefix)) {\n\t _this.target[\"\".concat(_this.prefix, \"Request\").concat(_this.property)]();\n\t }\n\t });\n\n\t _defineProperty(this, \"exit\", function () {\n\t if (!_this.enabled) {\n\t return;\n\t } // iOS native fullscreen\n\n\n\t if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n\t _this.target.webkitExitFullscreen();\n\n\t silencePromise(_this.player.play());\n\t } else if (!Fullscreen.native || _this.forceFallback) {\n\t _this.toggleFallback(false);\n\t } else if (!_this.prefix) {\n\t (document.cancelFullScreen || document.exitFullscreen).call(document);\n\t } else if (!is$2.empty(_this.prefix)) {\n\t var action = _this.prefix === 'moz' ? 'Cancel' : 'Exit';\n\t document[\"\".concat(_this.prefix).concat(action).concat(_this.property)]();\n\t }\n\t });\n\n\t _defineProperty(this, \"toggle\", function () {\n\t if (!_this.active) {\n\t _this.enter();\n\t } else {\n\t _this.exit();\n\t }\n\t });\n\n\t // Keep reference to parent\n\t this.player = player; // Get prefix\n\n\t this.prefix = Fullscreen.prefix;\n\t this.property = Fullscreen.property; // Scroll position\n\n\t this.scrollPosition = {\n\t x: 0,\n\t y: 0\n\t }; // Force the use of 'full window/browser' rather than fullscreen\n\n\t this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n\t // Checks container is an ancestor, defaults to null\n\n\t this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n\t // Handle event (incase user presses escape etc)\n\n\t on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n\t // TODO: Filter for target??\n\t _this.onChange();\n\t }); // Fullscreen toggle on double click\n\n\t on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n\t // Ignore double click in controls\n\t if (is$2.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n\t return;\n\t }\n\n\t _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n\t }); // Tap focus when in fullscreen\n\n\t on.call(this, this.player.elements.container, 'keydown', function (event) {\n\t return _this.trapFocus(event);\n\t }); // Update the UI\n\n\t this.update(); // this.toggle = this.toggle.bind(this);\n\t } // Determine if native supported\n\n\n\t _createClass(Fullscreen, [{\n\t key: \"usingNative\",\n\t // If we're actually using native\n\t get: function get() {\n\t return Fullscreen.native && !this.forceFallback;\n\t } // Get the prefix for handlers\n\n\t }, {\n\t key: \"enabled\",\n\t // Determine if fullscreen is enabled\n\t get: function get() {\n\t return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n\t } // Get active state\n\n\t }, {\n\t key: \"active\",\n\t get: function get() {\n\t if (!this.enabled) {\n\t return false;\n\t } // Fallback using classname\n\n\n\t if (!Fullscreen.native || this.forceFallback) {\n\t return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n\t }\n\n\t var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n\t return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n\t } // Get target element\n\n\t }, {\n\t key: \"target\",\n\t get: function get() {\n\t return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n\t }\n\t }], [{\n\t key: \"native\",\n\t get: function get() {\n\t return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n\t }\n\t }, {\n\t key: \"prefix\",\n\t get: function get() {\n\t // No prefix\n\t if (is$2.function(document.exitFullscreen)) {\n\t return '';\n\t } // Check for fullscreen support by vendor prefix\n\n\n\t var value = '';\n\t var prefixes = ['webkit', 'moz', 'ms'];\n\t prefixes.some(function (pre) {\n\t if (is$2.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$2.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n\t value = pre;\n\t return true;\n\t }\n\n\t return false;\n\t });\n\t return value;\n\t }\n\t }, {\n\t key: \"property\",\n\t get: function get() {\n\t return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n\t }\n\t }]);\n\n\t return Fullscreen;\n\t}();\n\n\t// `Math.sign` method implementation\n\t// https://tc39.github.io/ecma262/#sec-math.sign\n\tvar mathSign = Math.sign || function sign(x) {\n\t // eslint-disable-next-line no-self-compare\n\t return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n\t};\n\n\t// `Math.sign` method\n\t// https://tc39.github.io/ecma262/#sec-math.sign\n\t_export$1({ target: 'Math', stat: true }, {\n\t sign: mathSign\n\t});\n\n\t// ==========================================================================\n\t// Load image avoiding xhr/fetch CORS issues\n\t// Server status can't be obtained this way unfortunately, so this uses \"naturalWidth\" to determine if the image has loaded\n\t// By default it checks if it is at least 1px, but you can add a second argument to change this\n\t// ==========================================================================\n\tfunction loadImage(src) {\n\t var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n\t return new Promise(function (resolve, reject) {\n\t var image = new Image();\n\n\t var handler = function handler() {\n\t delete image.onload;\n\t delete image.onerror;\n\t (image.naturalWidth >= minWidth ? resolve : reject)(image);\n\t };\n\n\t Object.assign(image, {\n\t onload: handler,\n\t onerror: handler,\n\t src: src\n\t });\n\t });\n\t}\n\n\tvar ui = {\n\t addStyleHook: function addStyleHook() {\n\t toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);\n\t toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);\n\t },\n\t // Toggle native HTML5 media controls\n\t toggleNativeControls: function toggleNativeControls() {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t if (toggle && this.isHTML5) {\n\t this.media.setAttribute('controls', '');\n\t } else {\n\t this.media.removeAttribute('controls');\n\t }\n\t },\n\t // Setup the UI\n\t build: function build() {\n\t var _this = this;\n\n\t // Re-attach media element listeners\n\t // TODO: Use event bubbling?\n\t this.listeners.media(); // Don't setup interface if no support\n\n\t if (!this.supported.ui) {\n\t this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n\t ui.toggleNativeControls.call(this, true); // Bail\n\n\t return;\n\t } // Inject custom controls if not present\n\n\n\t if (!is$2.element(this.elements.controls)) {\n\t // Inject custom controls\n\t controls.inject.call(this); // Re-attach control listeners\n\n\t this.listeners.controls();\n\t } // Remove native controls\n\n\n\t ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n\t if (this.isHTML5) {\n\t captions.setup.call(this);\n\t } // Reset volume\n\n\n\t this.volume = null; // Reset mute state\n\n\t this.muted = null; // Reset loop state\n\n\t this.loop = null; // Reset quality setting\n\n\t this.quality = null; // Reset speed\n\n\t this.speed = null; // Reset volume display\n\n\t controls.updateVolume.call(this); // Reset time display\n\n\t controls.timeUpdate.call(this); // Update the UI\n\n\t ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n\t toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n\t toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n\t toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n\t toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n\t this.ready = true; // Ready event at end of execution stack\n\n\t setTimeout(function () {\n\t triggerEvent.call(_this, _this.media, 'ready');\n\t }, 0); // Set the title\n\n\t ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n\t if (this.poster) {\n\t ui.setPoster.call(this, this.poster, false).catch(function () {});\n\t } // Manually set the duration if user has overridden it.\n\t // The event listeners for it doesn't get called if preload is disabled (#701)\n\n\n\t if (this.config.duration) {\n\t controls.durationUpdate.call(this);\n\t }\n\t },\n\t // Setup aria attribute for play and iframe title\n\t setTitle: function setTitle() {\n\t // Find the current text\n\t var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n\t if (is$2.string(this.config.title) && !is$2.empty(this.config.title)) {\n\t label += \", \".concat(this.config.title);\n\t } // If there's a play button, set label\n\n\n\t Array.from(this.elements.buttons.play || []).forEach(function (button) {\n\t button.setAttribute('aria-label', label);\n\t }); // Set iframe title\n\t // https://github.com/sampotts/plyr/issues/124\n\n\t if (this.isEmbed) {\n\t var iframe = getElement.call(this, 'iframe');\n\n\t if (!is$2.element(iframe)) {\n\t return;\n\t } // Default to media type\n\n\n\t var title = !is$2.empty(this.config.title) ? this.config.title : 'video';\n\t var format = i18n.get('frameTitle', this.config);\n\t iframe.setAttribute('title', format.replace('{title}', title));\n\t }\n\t },\n\t // Toggle poster\n\t togglePoster: function togglePoster(enable) {\n\t toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n\t },\n\t // Set the poster image (async)\n\t // Used internally for the poster setter, with the passive option forced to false\n\t setPoster: function setPoster(poster) {\n\t var _this2 = this;\n\n\t var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n\t // Don't override if call is passive\n\t if (passive && this.poster) {\n\t return Promise.reject(new Error('Poster already set'));\n\t } // Set property synchronously to respect the call order\n\n\n\t this.media.setAttribute('data-poster', poster); // Show the poster\n\n\t this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n\t return ready.call(this) // Load image\n\t .then(function () {\n\t return loadImage(poster);\n\t }).catch(function (err) {\n\t // Hide poster on error unless it's been set by another call\n\t if (poster === _this2.poster) {\n\t ui.togglePoster.call(_this2, false);\n\t } // Rethrow\n\n\n\t throw err;\n\t }).then(function () {\n\t // Prevent race conditions\n\t if (poster !== _this2.poster) {\n\t throw new Error('setPoster cancelled by later call to setPoster');\n\t }\n\t }).then(function () {\n\t Object.assign(_this2.elements.poster.style, {\n\t backgroundImage: \"url('\".concat(poster, \"')\"),\n\t // Reset backgroundSize as well (since it can be set to \"cover\" for padded thumbnails for youtube)\n\t backgroundSize: ''\n\t });\n\t ui.togglePoster.call(_this2, true);\n\t return poster;\n\t });\n\t },\n\t // Check playing state\n\t checkPlaying: function checkPlaying(event) {\n\t var _this3 = this;\n\n\t // Class hooks\n\t toggleClass(this.elements.container, this.config.classNames.playing, this.playing);\n\t toggleClass(this.elements.container, this.config.classNames.paused, this.paused);\n\t toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state\n\n\t Array.from(this.elements.buttons.play || []).forEach(function (target) {\n\t Object.assign(target, {\n\t pressed: _this3.playing\n\t });\n\t target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n\t }); // Only update controls on non timeupdate events\n\n\t if (is$2.event(event) && event.type === 'timeupdate') {\n\t return;\n\t } // Toggle controls\n\n\n\t ui.toggleControls.call(this);\n\t },\n\t // Check if media is loading\n\t checkLoading: function checkLoading(event) {\n\t var _this4 = this;\n\n\t this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n\t clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n\t this.timers.loading = setTimeout(function () {\n\t // Update progress bar loading class state\n\t toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n\t ui.toggleControls.call(_this4);\n\t }, this.loading ? 250 : 0);\n\t },\n\t // Toggle controls based on state and `force` argument\n\t toggleControls: function toggleControls(force) {\n\t var controlsElement = this.elements.controls;\n\n\t if (controlsElement && this.config.hideControls) {\n\t // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n\t var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n\t this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n\t }\n\t },\n\t // Migrate any custom properties from the media to the parent\n\t migrateStyles: function migrateStyles() {\n\t var _this5 = this;\n\n\t // Loop through values (as they are the keys when the object is spread 🤔)\n\t Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n\t .filter(function (key) {\n\t return !is$2.empty(key) && is$2.string(key) && key.startsWith('--plyr');\n\t }).forEach(function (key) {\n\t // Set on the container\n\t _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n\t _this5.media.style.removeProperty(key);\n\t }); // Remove attribute if empty\n\n\t if (is$2.empty(this.media.style)) {\n\t this.media.removeAttribute('style');\n\t }\n\t }\n\t};\n\n\tvar Listeners = /*#__PURE__*/function () {\n\t function Listeners(_player) {\n\t var _this = this;\n\n\t _classCallCheck(this, Listeners);\n\n\t _defineProperty(this, \"firstTouch\", function () {\n\t var player = _this.player;\n\t var elements = player.elements;\n\t player.touch = true; // Add touch class\n\n\t toggleClass(elements.container, player.config.classNames.isTouch, true);\n\t });\n\n\t _defineProperty(this, \"setTabFocus\", function (event) {\n\t var player = _this.player;\n\t var elements = player.elements;\n\t clearTimeout(_this.focusTimer); // Ignore any key other than tab\n\n\t if (event.type === 'keydown' && event.which !== 9) {\n\t return;\n\t } // Store reference to event timeStamp\n\n\n\t if (event.type === 'keydown') {\n\t _this.lastKeyDown = event.timeStamp;\n\t } // Remove current classes\n\n\n\t var removeCurrent = function removeCurrent() {\n\t var className = player.config.classNames.tabFocus;\n\t var current = getElements.call(player, \".\".concat(className));\n\t toggleClass(current, className, false);\n\t }; // Determine if a key was pressed to trigger this event\n\n\n\t var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n\t if (event.type === 'focus' && !wasKeyDown) {\n\t return;\n\t } // Remove all current\n\n\n\t removeCurrent(); // Delay the adding of classname until the focus has changed\n\t // This event fires before the focusin event\n\n\t if (event.type !== 'focusout') {\n\t _this.focusTimer = setTimeout(function () {\n\t var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n\t if (!elements.container.contains(focused)) {\n\t return;\n\t }\n\n\t toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n\t }, 10);\n\t }\n\t });\n\n\t _defineProperty(this, \"global\", function () {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\t var player = _this.player; // Keyboard shortcuts\n\n\t if (player.config.keyboard.global) {\n\t toggleListener.call(player, window, 'keydown keyup', _this.handleKey, toggle, false);\n\t } // Click anywhere closes menu\n\n\n\t toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events\n\n\t once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection\n\n\t toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);\n\t });\n\n\t _defineProperty(this, \"container\", function () {\n\t var player = _this.player;\n\t var config = player.config,\n\t elements = player.elements,\n\t timers = player.timers; // Keyboard shortcuts\n\n\t if (!config.keyboard.global && config.keyboard.focused) {\n\t on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);\n\t } // Toggle controls on mouse events and entering fullscreen\n\n\n\t on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n\t var controlsElement = elements.controls; // Remove button states for fullscreen\n\n\t if (controlsElement && event.type === 'enterfullscreen') {\n\t controlsElement.pressed = false;\n\t controlsElement.hover = false;\n\t } // Show, then hide after a timeout unless another control event occurs\n\n\n\t var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n\t var delay = 0;\n\n\t if (show) {\n\t ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n\t delay = player.touch ? 3000 : 2000;\n\t } // Clear timer\n\n\n\t clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n\t timers.controls = setTimeout(function () {\n\t return ui.toggleControls.call(player, false);\n\t }, delay);\n\t }); // Set a gutter for Vimeo\n\n\t var setGutter = function setGutter(ratio, padding, toggle) {\n\t if (!player.isVimeo || player.config.vimeo.premium) {\n\t return;\n\t }\n\n\t var target = player.elements.wrapper.firstChild;\n\n\t var _ratio = _slicedToArray(ratio, 2),\n\t y = _ratio[1];\n\n\t var _getAspectRatio$call = getAspectRatio.call(player),\n\t _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n\t videoX = _getAspectRatio$call2[0],\n\t videoY = _getAspectRatio$call2[1];\n\n\t target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n\t target.style.margin = toggle ? '0 auto' : null;\n\t }; // Resize on fullscreen change\n\n\n\t var setPlayerSize = function setPlayerSize(measure) {\n\t // If we don't need to measure the viewport\n\t if (!measure) {\n\t return setAspectRatio.call(player);\n\t }\n\n\t var rect = elements.container.getBoundingClientRect();\n\t var width = rect.width,\n\t height = rect.height;\n\t return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n\t };\n\n\t var resized = function resized() {\n\t clearTimeout(timers.resized);\n\t timers.resized = setTimeout(setPlayerSize, 50);\n\t };\n\n\t on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n\t var _player$fullscreen = player.fullscreen,\n\t target = _player$fullscreen.target,\n\t usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n\t if (target !== elements.container) {\n\t return;\n\t } // If it's not an embed and no ratio specified\n\n\n\t if (!player.isEmbed && is$2.empty(player.config.ratio)) {\n\t return;\n\t }\n\n\t var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n\t var _setPlayerSize = setPlayerSize(isEnter),\n\t padding = _setPlayerSize.padding,\n\t ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n\t setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n\t if (isEnter) {\n\t setTimeout(function () {\n\t return repaint(elements.container);\n\t }, 100);\n\t } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n\t if (!usingNative) {\n\t if (isEnter) {\n\t on.call(player, window, 'resize', resized);\n\t } else {\n\t off.call(player, window, 'resize', resized);\n\t }\n\t }\n\t });\n\t });\n\n\t _defineProperty(this, \"media\", function () {\n\t var player = _this.player;\n\t var elements = player.elements; // Time change on media\n\n\t on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n\t return controls.timeUpdate.call(player, event);\n\t }); // Display duration\n\n\t on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n\t return controls.durationUpdate.call(player, event);\n\t }); // Handle the media finishing\n\n\t on.call(player, player.media, 'ended', function () {\n\t // Show poster on end\n\t if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n\t // Restart\n\t player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n\t player.pause();\n\t }\n\t }); // Check for buffer progress\n\n\t on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n\t return controls.updateProgress.call(player, event);\n\t }); // Handle volume changes\n\n\t on.call(player, player.media, 'volumechange', function (event) {\n\t return controls.updateVolume.call(player, event);\n\t }); // Handle play/pause\n\n\t on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n\t return ui.checkPlaying.call(player, event);\n\t }); // Loading state\n\n\t on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n\t return ui.checkLoading.call(player, event);\n\t }); // Click video\n\n\t if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n\t // Re-fetch the wrapper\n\t var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n\t if (!is$2.element(wrapper)) {\n\t return;\n\t } // On click play, pause or restart\n\n\n\t on.call(player, elements.container, 'click', function (event) {\n\t var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n\t if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n\t return;\n\t } // Touch devices will just show controls (if hidden)\n\n\n\t if (player.touch && player.config.hideControls) {\n\t return;\n\t }\n\n\t if (player.ended) {\n\t _this.proxy(event, player.restart, 'restart');\n\n\t _this.proxy(event, function () {\n\t silencePromise(player.play());\n\t }, 'play');\n\t } else {\n\t _this.proxy(event, function () {\n\t silencePromise(player.togglePlay());\n\t }, 'play');\n\t }\n\t });\n\t } // Disable right click\n\n\n\t if (player.supported.ui && player.config.disableContextMenu) {\n\t on.call(player, elements.wrapper, 'contextmenu', function (event) {\n\t event.preventDefault();\n\t }, false);\n\t } // Volume change\n\n\n\t on.call(player, player.media, 'volumechange', function () {\n\t // Save to storage\n\t player.storage.set({\n\t volume: player.volume,\n\t muted: player.muted\n\t });\n\t }); // Speed change\n\n\t on.call(player, player.media, 'ratechange', function () {\n\t // Update UI\n\t controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\t player.storage.set({\n\t speed: player.speed\n\t });\n\t }); // Quality change\n\n\t on.call(player, player.media, 'qualitychange', function (event) {\n\t // Update UI\n\t controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n\t }); // Update download link when ready and if quality changes\n\n\t on.call(player, player.media, 'ready qualitychange', function () {\n\t controls.setDownloadUrl.call(player);\n\t }); // Proxy events to container\n\t // Bubble up key events for Edge\n\n\t var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n\t on.call(player, player.media, proxyEvents, function (event) {\n\t var _event$detail = event.detail,\n\t detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n\t if (event.type === 'error') {\n\t detail = player.media.error;\n\t }\n\n\t triggerEvent.call(player, elements.container, event.type, true, detail);\n\t });\n\t });\n\n\t _defineProperty(this, \"proxy\", function (event, defaultHandler, customHandlerKey) {\n\t var player = _this.player;\n\t var customHandler = player.config.listeners[customHandlerKey];\n\t var hasCustomHandler = is$2.function(customHandler);\n\t var returned = true; // Execute custom handler\n\n\t if (hasCustomHandler) {\n\t returned = customHandler.call(player, event);\n\t } // Only call default handler if not prevented in custom handler\n\n\n\t if (returned !== false && is$2.function(defaultHandler)) {\n\t defaultHandler.call(player, event);\n\t }\n\t });\n\n\t _defineProperty(this, \"bind\", function (element, type, defaultHandler, customHandlerKey) {\n\t var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n\t var player = _this.player;\n\t var customHandler = player.config.listeners[customHandlerKey];\n\t var hasCustomHandler = is$2.function(customHandler);\n\t on.call(player, element, type, function (event) {\n\t return _this.proxy(event, defaultHandler, customHandlerKey);\n\t }, passive && !hasCustomHandler);\n\t });\n\n\t _defineProperty(this, \"controls\", function () {\n\t var player = _this.player;\n\t var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n\t var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n\t if (elements.buttons.play) {\n\t Array.from(elements.buttons.play).forEach(function (button) {\n\t _this.bind(button, 'click', function () {\n\t silencePromise(player.togglePlay());\n\t }, 'play');\n\t });\n\t } // Pause\n\n\n\t _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n\n\t _this.bind(elements.buttons.rewind, 'click', function () {\n\t // Record seek time so we can prevent hiding controls for a few seconds after rewind\n\t player.lastSeekTime = Date.now();\n\t player.rewind();\n\t }, 'rewind'); // Rewind\n\n\n\t _this.bind(elements.buttons.fastForward, 'click', function () {\n\t // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n\t player.lastSeekTime = Date.now();\n\t player.forward();\n\t }, 'fastForward'); // Mute toggle\n\n\n\t _this.bind(elements.buttons.mute, 'click', function () {\n\t player.muted = !player.muted;\n\t }, 'mute'); // Captions toggle\n\n\n\t _this.bind(elements.buttons.captions, 'click', function () {\n\t return player.toggleCaptions();\n\t }); // Download\n\n\n\t _this.bind(elements.buttons.download, 'click', function () {\n\t triggerEvent.call(player, player.media, 'download');\n\t }, 'download'); // Fullscreen toggle\n\n\n\t _this.bind(elements.buttons.fullscreen, 'click', function () {\n\t player.fullscreen.toggle();\n\t }, 'fullscreen'); // Picture-in-Picture\n\n\n\t _this.bind(elements.buttons.pip, 'click', function () {\n\t player.pip = 'toggle';\n\t }, 'pip'); // Airplay\n\n\n\t _this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n\n\t _this.bind(elements.buttons.settings, 'click', function (event) {\n\t // Prevent the document click listener closing the menu\n\t event.stopPropagation();\n\t event.preventDefault();\n\t controls.toggleMenu.call(player, event);\n\t }, null, false); // Can't be passive as we're preventing default\n\t // Settings menu - keyboard toggle\n\t // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus\n\t // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143\n\n\n\t _this.bind(elements.buttons.settings, 'keyup', function (event) {\n\t var code = event.which; // We only care about space and return\n\n\t if (![13, 32].includes(code)) {\n\t return;\n\t } // Because return triggers a click anyway, all we need to do is set focus\n\n\n\t if (code === 13) {\n\t controls.focusFirstMenuItem.call(player, null, true);\n\t return;\n\t } // Prevent scroll\n\n\n\t event.preventDefault(); // Prevent playing video (Firefox)\n\n\t event.stopPropagation(); // Toggle menu\n\n\t controls.toggleMenu.call(player, event);\n\t }, null, false // Can't be passive as we're preventing default\n\t ); // Escape closes menu\n\n\n\t _this.bind(elements.settings.menu, 'keydown', function (event) {\n\t if (event.which === 27) {\n\t controls.toggleMenu.call(player, event);\n\t }\n\t }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n\n\t _this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n\t var rect = elements.progress.getBoundingClientRect();\n\t var percent = 100 / rect.width * (event.pageX - rect.left);\n\t event.currentTarget.setAttribute('seek-value', percent);\n\t }); // Pause while seeking\n\n\n\t _this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n\t var seek = event.currentTarget;\n\t var code = event.keyCode ? event.keyCode : event.which;\n\t var attribute = 'play-on-seeked';\n\n\t if (is$2.keyboardEvent(event) && code !== 39 && code !== 37) {\n\t return;\n\t } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n\t player.lastSeekTime = Date.now(); // Was playing before?\n\n\t var play = seek.hasAttribute(attribute); // Done seeking\n\n\t var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n\t if (play && done) {\n\t seek.removeAttribute(attribute);\n\t silencePromise(player.play());\n\t } else if (!done && player.playing) {\n\t seek.setAttribute(attribute, '');\n\t player.pause();\n\t }\n\t }); // Fix range inputs on iOS\n\t // Super weird iOS bug where after you interact with an <input type=\"range\">,\n\t // it takes over further interactions on the page. This is a hack\n\n\n\t if (browser.isIos) {\n\t var inputs = getElements.call(player, 'input[type=\"range\"]');\n\t Array.from(inputs).forEach(function (input) {\n\t return _this.bind(input, inputEvent, function (event) {\n\t return repaint(event.target);\n\t });\n\t });\n\t } // Seek\n\n\n\t _this.bind(elements.inputs.seek, inputEvent, function (event) {\n\t var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n\t var seekTo = seek.getAttribute('seek-value');\n\n\t if (is$2.empty(seekTo)) {\n\t seekTo = seek.value;\n\t }\n\n\t seek.removeAttribute('seek-value');\n\t player.currentTime = seekTo / seek.max * player.duration;\n\t }, 'seek'); // Seek tooltip\n\n\n\t _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n\t return controls.updateSeekTooltip.call(player, event);\n\t }); // Preview thumbnails plugin\n\t // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n\n\t _this.bind(elements.progress, 'mousemove touchmove', function (event) {\n\t var previewThumbnails = player.previewThumbnails;\n\n\t if (previewThumbnails && previewThumbnails.loaded) {\n\t previewThumbnails.startMove(event);\n\t }\n\t }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n\n\t _this.bind(elements.progress, 'mouseleave touchend click', function () {\n\t var previewThumbnails = player.previewThumbnails;\n\n\t if (previewThumbnails && previewThumbnails.loaded) {\n\t previewThumbnails.endMove(false, true);\n\t }\n\t }); // Show scrubbing preview\n\n\n\t _this.bind(elements.progress, 'mousedown touchstart', function (event) {\n\t var previewThumbnails = player.previewThumbnails;\n\n\t if (previewThumbnails && previewThumbnails.loaded) {\n\t previewThumbnails.startScrubbing(event);\n\t }\n\t });\n\n\t _this.bind(elements.progress, 'mouseup touchend', function (event) {\n\t var previewThumbnails = player.previewThumbnails;\n\n\t if (previewThumbnails && previewThumbnails.loaded) {\n\t previewThumbnails.endScrubbing(event);\n\t }\n\t }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n\n\t if (browser.isWebkit) {\n\t Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n\t _this.bind(element, 'input', function (event) {\n\t return controls.updateRangeFill.call(player, event.target);\n\t });\n\t });\n\t } // Current time invert\n\t // Only if one time element is used for both currentTime and duration\n\n\n\t if (player.config.toggleInvert && !is$2.element(elements.display.duration)) {\n\t _this.bind(elements.display.currentTime, 'click', function () {\n\t // Do nothing if we're at the start\n\t if (player.currentTime === 0) {\n\t return;\n\t }\n\n\t player.config.invertTime = !player.config.invertTime;\n\t controls.timeUpdate.call(player);\n\t });\n\t } // Volume\n\n\n\t _this.bind(elements.inputs.volume, inputEvent, function (event) {\n\t player.volume = event.target.value;\n\t }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n\n\t _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n\t elements.controls.hover = !player.touch && event.type === 'mouseenter';\n\t }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n\n\t if (elements.fullscreen) {\n\t Array.from(elements.fullscreen.children).filter(function (c) {\n\t return !c.contains(elements.container);\n\t }).forEach(function (child) {\n\t _this.bind(child, 'mouseenter mouseleave', function (event) {\n\t elements.controls.hover = !player.touch && event.type === 'mouseenter';\n\t });\n\t });\n\t } // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)\n\n\n\t _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n\t elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n\t }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n\n\t _this.bind(elements.controls, 'focusin', function () {\n\t var config = player.config,\n\t timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n\t toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n\t ui.toggleControls.call(player, true); // Restore transition\n\n\t setTimeout(function () {\n\t toggleClass(elements.controls, config.classNames.noTransition, false);\n\t }, 0); // Delay a little more for mouse users\n\n\t var delay = _this.touch ? 3000 : 4000; // Clear timer\n\n\t clearTimeout(timers.controls); // Hide again after delay\n\n\t timers.controls = setTimeout(function () {\n\t return ui.toggleControls.call(player, false);\n\t }, delay);\n\t }); // Mouse wheel for volume\n\n\n\t _this.bind(elements.inputs.volume, 'wheel', function (event) {\n\t // Detect \"natural\" scroll - suppored on OS X Safari only\n\t // Other browsers on OS X will be inverted until support improves\n\t var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n\t var _map = [event.deltaX, -event.deltaY].map(function (value) {\n\t return inverted ? -value : value;\n\t }),\n\t _map2 = _slicedToArray(_map, 2),\n\t x = _map2[0],\n\t y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n\t var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n\t player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n\t var volume = player.media.volume;\n\n\t if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n\t event.preventDefault();\n\t }\n\t }, 'volume', false);\n\t });\n\n\t this.player = _player;\n\t this.lastKey = null;\n\t this.focusTimer = null;\n\t this.lastKeyDown = null;\n\t this.handleKey = this.handleKey.bind(this);\n\t this.toggleMenu = this.toggleMenu.bind(this);\n\t this.setTabFocus = this.setTabFocus.bind(this);\n\t this.firstTouch = this.firstTouch.bind(this);\n\t } // Handle key presses\n\n\n\t _createClass(Listeners, [{\n\t key: \"handleKey\",\n\t value: function handleKey(event) {\n\t var player = this.player;\n\t var elements = player.elements;\n\t var code = event.keyCode ? event.keyCode : event.which;\n\t var pressed = event.type === 'keydown';\n\t var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n\t if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n\t return;\n\t } // If the event is bubbled from the media element\n\t // Firefox doesn't get the keycode for whatever reason\n\n\n\t if (!is$2.number(code)) {\n\t return;\n\t } // Seek by the number keys\n\n\n\t var seekByKey = function seekByKey() {\n\t // Divide the max duration into 10th's and times by the number value\n\t player.currentTime = player.duration / 10 * (code - 48);\n\t }; // Handle the key on keydown\n\t // Reset on keyup\n\n\n\t if (pressed) {\n\t // Check focused element\n\t // and if the focused element is not editable (e.g. text input)\n\t // and any that accept key input http://webaim.org/techniques/keyboard/\n\t var focused = document.activeElement;\n\n\t if (is$2.element(focused)) {\n\t var editable = player.config.selectors.editable;\n\t var seek = elements.inputs.seek;\n\n\t if (focused !== seek && matches$2(focused, editable)) {\n\t return;\n\t }\n\n\t if (event.which === 32 && matches$2(focused, 'button, [role^=\"menuitem\"]')) {\n\t return;\n\t }\n\t } // Which keycodes should we prevent default\n\n\n\t 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)\n\n\t if (preventDefault.includes(code)) {\n\t event.preventDefault();\n\t event.stopPropagation();\n\t }\n\n\t switch (code) {\n\t case 48:\n\t case 49:\n\t case 50:\n\t case 51:\n\t case 52:\n\t case 53:\n\t case 54:\n\t case 55:\n\t case 56:\n\t case 57:\n\t // 0-9\n\t if (!repeat) {\n\t seekByKey();\n\t }\n\n\t break;\n\n\t case 32:\n\t case 75:\n\t // Space and K key\n\t if (!repeat) {\n\t silencePromise(player.togglePlay());\n\t }\n\n\t break;\n\n\t case 38:\n\t // Arrow up\n\t player.increaseVolume(0.1);\n\t break;\n\n\t case 40:\n\t // Arrow down\n\t player.decreaseVolume(0.1);\n\t break;\n\n\t case 77:\n\t // M key\n\t if (!repeat) {\n\t player.muted = !player.muted;\n\t }\n\n\t break;\n\n\t case 39:\n\t // Arrow forward\n\t player.forward();\n\t break;\n\n\t case 37:\n\t // Arrow back\n\t player.rewind();\n\t break;\n\n\t case 70:\n\t // F key\n\t player.fullscreen.toggle();\n\t break;\n\n\t case 67:\n\t // C key\n\t if (!repeat) {\n\t player.toggleCaptions();\n\t }\n\n\t break;\n\n\t case 76:\n\t // L key\n\t player.loop = !player.loop;\n\t break;\n\t } // Escape is handle natively when in full screen\n\t // So we only need to worry about non native\n\n\n\t if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n\t player.fullscreen.toggle();\n\t } // Store last code for next cycle\n\n\n\t this.lastKey = code;\n\t } else {\n\t this.lastKey = null;\n\t }\n\t } // Toggle menu\n\n\t }, {\n\t key: \"toggleMenu\",\n\t value: function toggleMenu(event) {\n\t controls.toggleMenu.call(this.player, event);\n\t } // Device is touch enabled\n\n\t }]);\n\n\t return Listeners;\n\t}();\n\n\tvar HAS_SPECIES_SUPPORT$7 = arrayMethodHasSpeciesSupport$1('splice');\n\tvar USES_TO_LENGTH$k = arrayMethodUsesToLength$1('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n\tvar max$7 = Math.max;\n\tvar min$c = Math.min;\n\tvar MAX_SAFE_INTEGER$3 = 0x1FFFFFFFFFFFFF;\n\tvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED$1 = 'Maximum allowed length exceeded';\n\n\t// `Array.prototype.splice` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n\t// with adding support of @@species\n\t_export$1({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$7 || !USES_TO_LENGTH$k }, {\n\t splice: function splice(start, deleteCount /* , ...items */) {\n\t var O = toObject$1(this);\n\t var len = toLength$1(O.length);\n\t var actualStart = toAbsoluteIndex$1(start, len);\n\t var argumentsLength = arguments.length;\n\t var insertCount, actualDeleteCount, A, k, from, to;\n\t if (argumentsLength === 0) {\n\t insertCount = actualDeleteCount = 0;\n\t } else if (argumentsLength === 1) {\n\t insertCount = 0;\n\t actualDeleteCount = len - actualStart;\n\t } else {\n\t insertCount = argumentsLength - 2;\n\t actualDeleteCount = min$c(max$7(toInteger$1(deleteCount), 0), len - actualStart);\n\t }\n\t if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$3) {\n\t throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED$1);\n\t }\n\t A = arraySpeciesCreate$1(O, actualDeleteCount);\n\t for (k = 0; k < actualDeleteCount; k++) {\n\t from = actualStart + k;\n\t if (from in O) createProperty$1(A, k, O[from]);\n\t }\n\t A.length = actualDeleteCount;\n\t if (insertCount < actualDeleteCount) {\n\t for (k = actualStart; k < len - actualDeleteCount; k++) {\n\t from = k + actualDeleteCount;\n\t to = k + insertCount;\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t }\n\t for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n\t } else if (insertCount > actualDeleteCount) {\n\t for (k = len - actualDeleteCount; k > actualStart; k--) {\n\t from = k + actualDeleteCount - 1;\n\t to = k + insertCount - 1;\n\t if (from in O) O[to] = O[from];\n\t else delete O[to];\n\t }\n\t }\n\t for (k = 0; k < insertCount; k++) {\n\t O[k + actualStart] = arguments[k + 2];\n\t }\n\t O.length = len - actualDeleteCount + insertCount;\n\t return A;\n\t }\n\t});\n\n\tvar loadjs_umd = createCommonjsModule(function (module, exports) {\n\t (function (root, factory) {\n\t {\n\t module.exports = factory();\n\t }\n\t })(commonjsGlobal, function () {\n\t /**\n\t * Global dependencies.\n\t * @global {Object} document - DOM\n\t */\n\t var devnull = function devnull() {},\n\t bundleIdCache = {},\n\t bundleResultCache = {},\n\t bundleCallbackQueue = {};\n\t /**\n\t * Subscribe to bundle load event.\n\t * @param {string[]} bundleIds - Bundle ids\n\t * @param {Function} callbackFn - The callback function\n\t */\n\n\n\t function subscribe(bundleIds, callbackFn) {\n\t // listify\n\t bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n\t var depsNotFound = [],\n\t i = bundleIds.length,\n\t numWaiting = i,\n\t fn,\n\t bundleId,\n\t r,\n\t q; // define callback function\n\n\t fn = function fn(bundleId, pathsNotFound) {\n\t if (pathsNotFound.length) depsNotFound.push(bundleId);\n\t numWaiting--;\n\t if (!numWaiting) callbackFn(depsNotFound);\n\t }; // register callback\n\n\n\t while (i--) {\n\t bundleId = bundleIds[i]; // execute callback if in result cache\n\n\t r = bundleResultCache[bundleId];\n\n\t if (r) {\n\t fn(bundleId, r);\n\t continue;\n\t } // add to callback queue\n\n\n\t q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n\t q.push(fn);\n\t }\n\t }\n\t /**\n\t * Publish bundle load event.\n\t * @param {string} bundleId - Bundle id\n\t * @param {string[]} pathsNotFound - List of files not found\n\t */\n\n\n\t function publish(bundleId, pathsNotFound) {\n\t // exit if id isn't defined\n\t if (!bundleId) return;\n\t var q = bundleCallbackQueue[bundleId]; // cache result\n\n\t bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n\t if (!q) return; // empty callback queue\n\n\t while (q.length) {\n\t q[0](bundleId, pathsNotFound);\n\t q.splice(0, 1);\n\t }\n\t }\n\t /**\n\t * Execute callbacks.\n\t * @param {Object or Function} args - The callback args\n\t * @param {string[]} depsNotFound - List of dependencies not found\n\t */\n\n\n\t function executeCallbacks(args, depsNotFound) {\n\t // accept function as argument\n\t if (args.call) args = {\n\t success: args\n\t }; // success and error callbacks\n\n\t if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n\t }\n\t /**\n\t * Load individual file.\n\t * @param {string} path - The file path\n\t * @param {Function} callbackFn - The callback function\n\t */\n\n\n\t function loadFile(path, callbackFn, args, numTries) {\n\t var doc = document,\n\t async = args.async,\n\t maxTries = (args.numRetries || 0) + 1,\n\t beforeCallbackFn = args.before || devnull,\n\t pathname = path.replace(/[\\?|#].*$/, ''),\n\t pathStripped = path.replace(/^(css|img)!/, ''),\n\t isLegacyIECss,\n\t e;\n\t numTries = numTries || 0;\n\n\t if (/(^css!|\\.css$)/.test(pathname)) {\n\t // css\n\t e = doc.createElement('link');\n\t e.rel = 'stylesheet';\n\t e.href = pathStripped; // tag IE9+\n\n\t isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n\t if (isLegacyIECss && e.relList) {\n\t isLegacyIECss = 0;\n\t e.rel = 'preload';\n\t e.as = 'style';\n\t }\n\t } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\n\t // image\n\t e = doc.createElement('img');\n\t e.src = pathStripped;\n\t } else {\n\t // javascript\n\t e = doc.createElement('script');\n\t e.src = path;\n\t e.async = async === undefined ? true : async;\n\t }\n\n\t e.onload = e.onerror = e.onbeforeload = function (ev) {\n\t var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror\n\t // support in IE9-11\n\n\t if (isLegacyIECss) {\n\t try {\n\t if (!e.sheet.cssText.length) result = 'e';\n\t } catch (x) {\n\t // sheets objects created from load errors don't allow access to\n\t // `cssText` (unless error is Code:18 SecurityError)\n\t if (x.code != 18) result = 'e';\n\t }\n\t } // handle retries in case of load failure\n\n\n\t if (result == 'e') {\n\t // increment counter\n\t numTries += 1; // exit function and try again\n\n\t if (numTries < maxTries) {\n\t return loadFile(path, callbackFn, args, numTries);\n\t }\n\t } else if (e.rel == 'preload' && e.as == 'style') {\n\t // activate preloaded stylesheets\n\t return e.rel = 'stylesheet'; // jshint ignore:line\n\t } // execute callback\n\n\n\t callbackFn(path, result, ev.defaultPrevented);\n\t }; // add to document (unless callback returns `false`)\n\n\n\t if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n\t }\n\t /**\n\t * Load multiple files.\n\t * @param {string[]} paths - The file paths\n\t * @param {Function} callbackFn - The callback function\n\t */\n\n\n\t function loadFiles(paths, callbackFn, args) {\n\t // listify paths\n\t paths = paths.push ? paths : [paths];\n\t var numWaiting = paths.length,\n\t x = numWaiting,\n\t pathsNotFound = [],\n\t fn,\n\t i; // define callback function\n\n\t fn = function fn(path, result, defaultPrevented) {\n\t // handle error\n\t if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n\t // will be blocked (ex. Ghostery/ABP on Safari)\n\n\t if (result == 'b') {\n\t if (defaultPrevented) pathsNotFound.push(path);else return;\n\t }\n\n\t numWaiting--;\n\t if (!numWaiting) callbackFn(pathsNotFound);\n\t }; // load scripts\n\n\n\t for (i = 0; i < x; i++) {\n\t loadFile(paths[i], fn, args);\n\t }\n\t }\n\t /**\n\t * Initiate script load and register bundle.\n\t * @param {(string|string[])} paths - The file paths\n\t * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n\t * callback or (3) object literal with success/error arguments, numRetries,\n\t * etc.\n\t * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n\t * literal with success/error arguments, numRetries, etc.\n\t */\n\n\n\t function loadjs(paths, arg1, arg2) {\n\t var bundleId, args; // bundleId (if string)\n\n\t if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n\t args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n\t if (bundleId) {\n\t if (bundleId in bundleIdCache) {\n\t throw \"LoadJS\";\n\t } else {\n\t bundleIdCache[bundleId] = true;\n\t }\n\t }\n\n\t function loadFn(resolve, reject) {\n\t loadFiles(paths, function (pathsNotFound) {\n\t // execute callbacks\n\t executeCallbacks(args, pathsNotFound); // resolve Promise\n\n\t if (resolve) {\n\t executeCallbacks({\n\t success: resolve,\n\t error: reject\n\t }, pathsNotFound);\n\t } // publish bundle load event\n\n\n\t publish(bundleId, pathsNotFound);\n\t }, args);\n\t }\n\n\t if (args.returnPromise) return new Promise(loadFn);else loadFn();\n\t }\n\t /**\n\t * Execute callbacks when dependencies have been satisfied.\n\t * @param {(string|string[])} deps - List of bundle ids\n\t * @param {Object} args - success/error arguments\n\t */\n\n\n\t loadjs.ready = function ready(deps, args) {\n\t // subscribe to bundle load event\n\t subscribe(deps, function (depsNotFound) {\n\t // execute callbacks\n\t executeCallbacks(args, depsNotFound);\n\t });\n\t return loadjs;\n\t };\n\t /**\n\t * Manually satisfy bundle dependencies.\n\t * @param {string} bundleId - The bundle id\n\t */\n\n\n\t loadjs.done = function done(bundleId) {\n\t publish(bundleId, []);\n\t };\n\t /**\n\t * Reset loadjs dependencies statuses\n\t */\n\n\n\t loadjs.reset = function reset() {\n\t bundleIdCache = {};\n\t bundleResultCache = {};\n\t bundleCallbackQueue = {};\n\t };\n\t /**\n\t * Determine if bundle has already been defined\n\t * @param String} bundleId - The bundle id\n\t */\n\n\n\t loadjs.isDefined = function isDefined(bundleId) {\n\t return bundleId in bundleIdCache;\n\t }; // export\n\n\n\t return loadjs;\n\t });\n\t});\n\n\tfunction loadScript(url) {\n\t return new Promise(function (resolve, reject) {\n\t loadjs_umd(url, {\n\t success: resolve,\n\t error: reject\n\t });\n\t });\n\t}\n\n\tfunction parseId(url) {\n\t if (is$2.empty(url)) {\n\t return null;\n\t }\n\n\t if (is$2.number(Number(url))) {\n\t return url;\n\t }\n\n\t var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n\t return url.match(regex) ? RegExp.$2 : url;\n\t} // Set playback state and trigger change (only on actual change)\n\n\n\tfunction assurePlaybackState(play) {\n\t if (play && !this.embed.hasPlayed) {\n\t this.embed.hasPlayed = true;\n\t }\n\n\t if (this.media.paused === play) {\n\t this.media.paused = !play;\n\t triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n\t }\n\t}\n\n\tvar vimeo = {\n\t setup: function setup() {\n\t var player = this; // Add embed class for responsive\n\n\t toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n\t player.options.speed = player.config.speed.options; // Set intial ratio\n\n\t setAspectRatio.call(player); // Load the SDK if not already\n\n\t if (!is$2.object(window.Vimeo)) {\n\t loadScript(player.config.urls.vimeo.sdk).then(function () {\n\t vimeo.ready.call(player);\n\t }).catch(function (error) {\n\t player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n\t });\n\t } else {\n\t vimeo.ready.call(player);\n\t }\n\t },\n\t // API Ready\n\t ready: function ready() {\n\t var _this = this;\n\n\t var player = this;\n\t var config = player.config.vimeo;\n\n\t var premium = config.premium,\n\t referrerPolicy = config.referrerPolicy,\n\t frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n\t if (premium) {\n\t Object.assign(frameParams, {\n\t controls: false,\n\t sidedock: false\n\t });\n\t } // Get Vimeo params for the iframe\n\n\n\t var params = buildUrlParams(_objectSpread2({\n\t loop: player.config.loop.active,\n\t autoplay: player.autoplay,\n\t muted: player.muted,\n\t gesture: 'media',\n\t playsinline: !this.config.fullscreen.iosNative\n\t }, frameParams)); // Get the source URL or ID\n\n\t var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n\t if (is$2.empty(source)) {\n\t source = player.media.getAttribute(player.config.attributes.embed.id);\n\t }\n\n\t var id = parseId(source); // Build an iframe\n\n\t var iframe = createElement$1('iframe');\n\t var src = format(player.config.urls.vimeo.iframe, id, params);\n\t iframe.setAttribute('src', src);\n\t iframe.setAttribute('allowfullscreen', '');\n\t iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required\n\n\t if (!is$2.empty(referrerPolicy)) {\n\t iframe.setAttribute('referrerPolicy', referrerPolicy);\n\t } // Inject the package\n\n\n\t if (premium || !config.customControls) {\n\t iframe.setAttribute('data-poster', player.poster);\n\t player.media = replaceElement(iframe, player.media);\n\t } else {\n\t var wrapper = createElement$1('div', {\n\t class: player.config.classNames.embedContainer,\n\t 'data-poster': player.poster\n\t });\n\t wrapper.appendChild(iframe);\n\t player.media = replaceElement(wrapper, player.media);\n\t } // Get poster image\n\n\n\t if (!config.customControls) {\n\t fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n\t if (is$2.empty(response) || !response.thumbnail_url) {\n\t return;\n\t } // Set and show poster\n\n\n\t ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n\t });\n\t } // Setup instance\n\t // https://github.com/vimeo/player.js\n\n\n\t player.embed = new window.Vimeo.Player(iframe, {\n\t autopause: player.config.autopause,\n\t muted: player.muted\n\t });\n\t player.media.paused = true;\n\t player.media.currentTime = 0; // Disable native text track rendering\n\n\t if (player.supported.ui) {\n\t player.embed.disableTextTrack();\n\t } // Create a faux HTML5 API using the Vimeo API\n\n\n\t player.media.play = function () {\n\t assurePlaybackState.call(player, true);\n\t return player.embed.play();\n\t };\n\n\t player.media.pause = function () {\n\t assurePlaybackState.call(player, false);\n\t return player.embed.pause();\n\t };\n\n\t player.media.stop = function () {\n\t player.pause();\n\t player.currentTime = 0;\n\t }; // Seeking\n\n\n\t var currentTime = player.media.currentTime;\n\t Object.defineProperty(player.media, 'currentTime', {\n\t get: function get() {\n\t return currentTime;\n\t },\n\t set: function set(time) {\n\t // Vimeo will automatically play on seek if the video hasn't been played before\n\t // Get current paused state and volume etc\n\t var embed = player.embed,\n\t media = player.media,\n\t paused = player.paused,\n\t volume = player.volume;\n\t var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n\t media.seeking = true;\n\t triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n\t Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n\t .then(function () {\n\t return embed.setCurrentTime(time);\n\t }) // Restore paused\n\t .then(function () {\n\t return restorePause && embed.pause();\n\t }) // Restore volume\n\t .then(function () {\n\t return restorePause && embed.setVolume(volume);\n\t }).catch(function () {// Do nothing\n\t });\n\t }\n\t }); // Playback speed\n\n\t var speed = player.config.speed.selected;\n\t Object.defineProperty(player.media, 'playbackRate', {\n\t get: function get() {\n\t return speed;\n\t },\n\t set: function set(input) {\n\t player.embed.setPlaybackRate(input).then(function () {\n\t speed = input;\n\t triggerEvent.call(player, player.media, 'ratechange');\n\t }).catch(function () {\n\t // Cannot set Playback Rate, Video is probably not on Pro account\n\t player.options.speed = [1];\n\t });\n\t }\n\t }); // Volume\n\n\t var volume = player.config.volume;\n\t Object.defineProperty(player.media, 'volume', {\n\t get: function get() {\n\t return volume;\n\t },\n\t set: function set(input) {\n\t player.embed.setVolume(input).then(function () {\n\t volume = input;\n\t triggerEvent.call(player, player.media, 'volumechange');\n\t });\n\t }\n\t }); // Muted\n\n\t var muted = player.config.muted;\n\t Object.defineProperty(player.media, 'muted', {\n\t get: function get() {\n\t return muted;\n\t },\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : false;\n\t player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n\t muted = toggle;\n\t triggerEvent.call(player, player.media, 'volumechange');\n\t });\n\t }\n\t }); // Loop\n\n\t var loop = player.config.loop;\n\t Object.defineProperty(player.media, 'loop', {\n\t get: function get() {\n\t return loop;\n\t },\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : player.config.loop.active;\n\t player.embed.setLoop(toggle).then(function () {\n\t loop = toggle;\n\t });\n\t }\n\t }); // Source\n\n\t var currentSrc;\n\t player.embed.getVideoUrl().then(function (value) {\n\t currentSrc = value;\n\t controls.setDownloadUrl.call(player);\n\t }).catch(function (error) {\n\t _this.debug.warn(error);\n\t });\n\t Object.defineProperty(player.media, 'currentSrc', {\n\t get: function get() {\n\t return currentSrc;\n\t }\n\t }); // Ended\n\n\t Object.defineProperty(player.media, 'ended', {\n\t get: function get() {\n\t return player.currentTime === player.duration;\n\t }\n\t }); // Set aspect ratio based on video size\n\n\t Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n\t var _dimensions = _slicedToArray(dimensions, 2),\n\t width = _dimensions[0],\n\t height = _dimensions[1];\n\n\t player.embed.ratio = [width, height];\n\t setAspectRatio.call(_this);\n\t }); // Set autopause\n\n\t player.embed.setAutopause(player.config.autopause).then(function (state) {\n\t player.config.autopause = state;\n\t }); // Get title\n\n\t player.embed.getVideoTitle().then(function (title) {\n\t player.config.title = title;\n\t ui.setTitle.call(_this);\n\t }); // Get current time\n\n\t player.embed.getCurrentTime().then(function (value) {\n\t currentTime = value;\n\t triggerEvent.call(player, player.media, 'timeupdate');\n\t }); // Get duration\n\n\t player.embed.getDuration().then(function (value) {\n\t player.media.duration = value;\n\t triggerEvent.call(player, player.media, 'durationchange');\n\t }); // Get captions\n\n\t player.embed.getTextTracks().then(function (tracks) {\n\t player.media.textTracks = tracks;\n\t captions.setup.call(player);\n\t });\n\t player.embed.on('cuechange', function (_ref) {\n\t var _ref$cues = _ref.cues,\n\t cues = _ref$cues === void 0 ? [] : _ref$cues;\n\t var strippedCues = cues.map(function (cue) {\n\t return stripHTML(cue.text);\n\t });\n\t captions.updateCues.call(player, strippedCues);\n\t });\n\t player.embed.on('loaded', function () {\n\t // Assure state and events are updated on autoplay\n\t player.embed.getPaused().then(function (paused) {\n\t assurePlaybackState.call(player, !paused);\n\n\t if (!paused) {\n\t triggerEvent.call(player, player.media, 'playing');\n\t }\n\t });\n\n\t if (is$2.element(player.embed.element) && player.supported.ui) {\n\t var frame = player.embed.element; // Fix keyboard focus issues\n\t // https://github.com/sampotts/plyr/issues/317\n\n\t frame.setAttribute('tabindex', -1);\n\t }\n\t });\n\t player.embed.on('bufferstart', function () {\n\t triggerEvent.call(player, player.media, 'waiting');\n\t });\n\t player.embed.on('bufferend', function () {\n\t triggerEvent.call(player, player.media, 'playing');\n\t });\n\t player.embed.on('play', function () {\n\t assurePlaybackState.call(player, true);\n\t triggerEvent.call(player, player.media, 'playing');\n\t });\n\t player.embed.on('pause', function () {\n\t assurePlaybackState.call(player, false);\n\t });\n\t player.embed.on('timeupdate', function (data) {\n\t player.media.seeking = false;\n\t currentTime = data.seconds;\n\t triggerEvent.call(player, player.media, 'timeupdate');\n\t });\n\t player.embed.on('progress', function (data) {\n\t player.media.buffered = data.percent;\n\t triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n\t if (parseInt(data.percent, 10) === 1) {\n\t triggerEvent.call(player, player.media, 'canplaythrough');\n\t } // Get duration as if we do it before load, it gives an incorrect value\n\t // https://github.com/sampotts/plyr/issues/891\n\n\n\t player.embed.getDuration().then(function (value) {\n\t if (value !== player.media.duration) {\n\t player.media.duration = value;\n\t triggerEvent.call(player, player.media, 'durationchange');\n\t }\n\t });\n\t });\n\t player.embed.on('seeked', function () {\n\t player.media.seeking = false;\n\t triggerEvent.call(player, player.media, 'seeked');\n\t });\n\t player.embed.on('ended', function () {\n\t player.media.paused = true;\n\t triggerEvent.call(player, player.media, 'ended');\n\t });\n\t player.embed.on('error', function (detail) {\n\t player.media.error = detail;\n\t triggerEvent.call(player, player.media, 'error');\n\t }); // Rebuild UI\n\n\t if (config.customControls) {\n\t setTimeout(function () {\n\t return ui.build.call(player);\n\t }, 0);\n\t }\n\t }\n\t};\n\n\tfunction parseId$1(url) {\n\t if (is$2.empty(url)) {\n\t return null;\n\t }\n\n\t var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n\t return url.match(regex) ? RegExp.$2 : url;\n\t} // Set playback state and trigger change (only on actual change)\n\n\n\tfunction assurePlaybackState$1(play) {\n\t if (play && !this.embed.hasPlayed) {\n\t this.embed.hasPlayed = true;\n\t }\n\n\t if (this.media.paused === play) {\n\t this.media.paused = !play;\n\t triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n\t }\n\t}\n\n\tfunction getHost$2(config) {\n\t if (config.noCookie) {\n\t return 'https://www.youtube-nocookie.com';\n\t }\n\n\t if (window.location.protocol === 'http:') {\n\t return 'http://www.youtube.com';\n\t } // Use YouTube's default\n\n\n\t return undefined;\n\t}\n\n\tvar youtube = {\n\t setup: function setup() {\n\t var _this = this;\n\n\t // Add embed class for responsive\n\t toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n\t if (is$2.object(window.YT) && is$2.function(window.YT.Player)) {\n\t youtube.ready.call(this);\n\t } else {\n\t // Reference current global callback\n\t var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n\t window.onYouTubeIframeAPIReady = function () {\n\t // Call global callback if set\n\t if (is$2.function(callback)) {\n\t callback();\n\t }\n\n\t youtube.ready.call(_this);\n\t }; // Load the SDK\n\n\n\t loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n\t _this.debug.warn('YouTube API failed to load', error);\n\t });\n\t }\n\t },\n\t // Get the media title\n\t getTitle: function getTitle(videoId) {\n\t var _this2 = this;\n\n\t var url = format(this.config.urls.youtube.api, videoId);\n\t fetch(url).then(function (data) {\n\t if (is$2.object(data)) {\n\t var title = data.title,\n\t height = data.height,\n\t width = data.width; // Set title\n\n\t _this2.config.title = title;\n\t ui.setTitle.call(_this2); // Set aspect ratio\n\n\t _this2.embed.ratio = [width, height];\n\t }\n\n\t setAspectRatio.call(_this2);\n\t }).catch(function () {\n\t // Set aspect ratio\n\t setAspectRatio.call(_this2);\n\t });\n\t },\n\t // API ready\n\t ready: function ready() {\n\t var player = this;\n\t var config = player.config.youtube; // Ignore already setup (race condition)\n\n\t var currentId = player.media && player.media.getAttribute('id');\n\n\t if (!is$2.empty(currentId) && currentId.startsWith('youtube-')) {\n\t return;\n\t } // Get the source URL or ID\n\n\n\t var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n\t if (is$2.empty(source)) {\n\t source = player.media.getAttribute(this.config.attributes.embed.id);\n\t } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n\t var videoId = parseId$1(source);\n\t var id = generateId(player.provider); // Replace media element\n\n\t var container = createElement$1('div', {\n\t id: id,\n\t 'data-poster': config.customControls ? player.poster : undefined\n\t });\n\t player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n\t if (config.customControls) {\n\t var posterSrc = function posterSrc(s) {\n\t return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n\t }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n\t loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n\t .catch(function () {\n\t return loadImage(posterSrc('sd'), 121);\n\t }) // 480p padded 4:3\n\t .catch(function () {\n\t return loadImage(posterSrc('hq'));\n\t }) // 360p padded 4:3. Always exists\n\t .then(function (image) {\n\t return ui.setPoster.call(player, image.src);\n\t }).then(function (src) {\n\t // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n\t if (!src.includes('maxres')) {\n\t player.elements.poster.style.backgroundSize = 'cover';\n\t }\n\t }).catch(function () {});\n\t } // Setup instance\n\t // https://developers.google.com/youtube/iframe_api_reference\n\n\n\t player.embed = new window.YT.Player(player.media, {\n\t videoId: videoId,\n\t host: getHost$2(config),\n\t playerVars: extend$1({}, {\n\t // Autoplay\n\t autoplay: player.config.autoplay ? 1 : 0,\n\t // iframe interface language\n\t hl: player.config.hl,\n\t // Only show controls if not fully supported or opted out\n\t controls: player.supported.ui && config.customControls ? 0 : 1,\n\t // Disable keyboard as we handle it\n\t disablekb: 1,\n\t // Allow iOS inline playback\n\t playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n\t // Captions are flaky on YouTube\n\t cc_load_policy: player.captions.active ? 1 : 0,\n\t cc_lang_pref: player.config.captions.language,\n\t // Tracking for stats\n\t widget_referrer: window ? window.location.href : null\n\t }, config),\n\t events: {\n\t onError: function onError(event) {\n\t // YouTube may fire onError twice, so only handle it once\n\t if (!player.media.error) {\n\t var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n\t var message = {\n\t 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\t 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',\n\t 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\t 101: 'The owner of the requested video does not allow it to be played in embedded players.',\n\t 150: 'The owner of the requested video does not allow it to be played in embedded players.'\n\t }[code] || 'An unknown error occured';\n\t player.media.error = {\n\t code: code,\n\t message: message\n\t };\n\t triggerEvent.call(player, player.media, 'error');\n\t }\n\t },\n\t onPlaybackRateChange: function onPlaybackRateChange(event) {\n\t // Get the instance\n\t var instance = event.target; // Get current speed\n\n\t player.media.playbackRate = instance.getPlaybackRate();\n\t triggerEvent.call(player, player.media, 'ratechange');\n\t },\n\t onReady: function onReady(event) {\n\t // Bail if onReady has already been called. See issue #1108\n\t if (is$2.function(player.media.play)) {\n\t return;\n\t } // Get the instance\n\n\n\t var instance = event.target; // Get the title\n\n\t youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n\t player.media.play = function () {\n\t assurePlaybackState$1.call(player, true);\n\t instance.playVideo();\n\t };\n\n\t player.media.pause = function () {\n\t assurePlaybackState$1.call(player, false);\n\t instance.pauseVideo();\n\t };\n\n\t player.media.stop = function () {\n\t instance.stopVideo();\n\t };\n\n\t player.media.duration = instance.getDuration();\n\t player.media.paused = true; // Seeking\n\n\t player.media.currentTime = 0;\n\t Object.defineProperty(player.media, 'currentTime', {\n\t get: function get() {\n\t return Number(instance.getCurrentTime());\n\t },\n\t set: function set(time) {\n\t // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).\n\t if (player.paused && !player.embed.hasPlayed) {\n\t player.embed.mute();\n\t } // Set seeking state and trigger event\n\n\n\t player.media.seeking = true;\n\t triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n\t instance.seekTo(time);\n\t }\n\t }); // Playback speed\n\n\t Object.defineProperty(player.media, 'playbackRate', {\n\t get: function get() {\n\t return instance.getPlaybackRate();\n\t },\n\t set: function set(input) {\n\t instance.setPlaybackRate(input);\n\t }\n\t }); // Volume\n\n\t var volume = player.config.volume;\n\t Object.defineProperty(player.media, 'volume', {\n\t get: function get() {\n\t return volume;\n\t },\n\t set: function set(input) {\n\t volume = input;\n\t instance.setVolume(volume * 100);\n\t triggerEvent.call(player, player.media, 'volumechange');\n\t }\n\t }); // Muted\n\n\t var muted = player.config.muted;\n\t Object.defineProperty(player.media, 'muted', {\n\t get: function get() {\n\t return muted;\n\t },\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : muted;\n\t muted = toggle;\n\t instance[toggle ? 'mute' : 'unMute']();\n\t instance.setVolume(volume * 100);\n\t triggerEvent.call(player, player.media, 'volumechange');\n\t }\n\t }); // Source\n\n\t Object.defineProperty(player.media, 'currentSrc', {\n\t get: function get() {\n\t return instance.getVideoUrl();\n\t }\n\t }); // Ended\n\n\t Object.defineProperty(player.media, 'ended', {\n\t get: function get() {\n\t return player.currentTime === player.duration;\n\t }\n\t }); // Get available speeds\n\n\t var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n\t player.options.speed = speeds.filter(function (s) {\n\t return player.config.speed.options.includes(s);\n\t }); // Set the tabindex to avoid focus entering iframe\n\n\t if (player.supported.ui && config.customControls) {\n\t player.media.setAttribute('tabindex', -1);\n\t }\n\n\t triggerEvent.call(player, player.media, 'timeupdate');\n\t triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n\t clearInterval(player.timers.buffering); // Setup buffering\n\n\t player.timers.buffering = setInterval(function () {\n\t // Get loaded % from YouTube\n\t player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n\t if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n\t triggerEvent.call(player, player.media, 'progress');\n\t } // Set last buffer point\n\n\n\t player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n\t if (player.media.buffered === 1) {\n\t clearInterval(player.timers.buffering); // Trigger event\n\n\t triggerEvent.call(player, player.media, 'canplaythrough');\n\t }\n\t }, 200); // Rebuild UI\n\n\t if (config.customControls) {\n\t setTimeout(function () {\n\t return ui.build.call(player);\n\t }, 50);\n\t }\n\t },\n\t onStateChange: function onStateChange(event) {\n\t // Get the instance\n\t var instance = event.target; // Reset timer\n\n\t clearInterval(player.timers.playing);\n\t var seeked = player.media.seeking && [1, 2].includes(event.data);\n\n\t if (seeked) {\n\t // Unset seeking and fire seeked event\n\t player.media.seeking = false;\n\t triggerEvent.call(player, player.media, 'seeked');\n\t } // Handle events\n\t // -1 Unstarted\n\t // 0 Ended\n\t // 1 Playing\n\t // 2 Paused\n\t // 3 Buffering\n\t // 5 Video cued\n\n\n\t switch (event.data) {\n\t case -1:\n\t // Update scrubber\n\t triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n\t player.media.buffered = instance.getVideoLoadedFraction();\n\t triggerEvent.call(player, player.media, 'progress');\n\t break;\n\n\t case 0:\n\t assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\n\t if (player.media.loop) {\n\t // YouTube needs a call to `stopVideo` before playing again\n\t instance.stopVideo();\n\t instance.playVideo();\n\t } else {\n\t triggerEvent.call(player, player.media, 'ended');\n\t }\n\n\t break;\n\n\t case 1:\n\t // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)\n\t if (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n\t player.media.pause();\n\t } else {\n\t assurePlaybackState$1.call(player, true);\n\t triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n\t player.timers.playing = setInterval(function () {\n\t triggerEvent.call(player, player.media, 'timeupdate');\n\t }, 50); // Check duration again due to YouTube bug\n\t // https://github.com/sampotts/plyr/issues/374\n\t // https://code.google.com/p/gdata-issues/issues/detail?id=8690\n\n\t if (player.media.duration !== instance.getDuration()) {\n\t player.media.duration = instance.getDuration();\n\t triggerEvent.call(player, player.media, 'durationchange');\n\t }\n\t }\n\n\t break;\n\n\t case 2:\n\t // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)\n\t if (!player.muted) {\n\t player.embed.unMute();\n\t }\n\n\t assurePlaybackState$1.call(player, false);\n\t break;\n\n\t case 3:\n\t // Trigger waiting event to add loading classes to container as the video buffers.\n\t triggerEvent.call(player, player.media, 'waiting');\n\t break;\n\t }\n\n\t triggerEvent.call(player, player.elements.container, 'statechange', false, {\n\t code: event.data\n\t });\n\t }\n\t }\n\t });\n\t }\n\t};\n\n\tvar media = {\n\t // Setup media\n\t setup: function setup() {\n\t // If there's no media, bail\n\t if (!this.media) {\n\t this.debug.warn('No media element found!');\n\t return;\n\t } // Add type class\n\n\n\t toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n\t toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n\t // This will require changes if audio embeds are added\n\n\t if (this.isEmbed) {\n\t toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n\t } // Inject the player wrapper\n\n\n\t if (this.isVideo) {\n\t // Create the wrapper div\n\t this.elements.wrapper = createElement$1('div', {\n\t class: this.config.classNames.video\n\t }); // Wrap the video in a container\n\n\t wrap$4(this.media, this.elements.wrapper); // Poster image container\n\n\t this.elements.poster = createElement$1('div', {\n\t class: this.config.classNames.poster,\n\t hidden: ''\n\t });\n\t this.elements.wrapper.appendChild(this.elements.poster);\n\t }\n\n\t if (this.isHTML5) {\n\t html5.setup.call(this);\n\t } else if (this.isYouTube) {\n\t youtube.setup.call(this);\n\t } else if (this.isVimeo) {\n\t vimeo.setup.call(this);\n\t }\n\t }\n\t};\n\n\tvar destroy = function destroy(instance) {\n\t // Destroy our adsManager\n\t if (instance.manager) {\n\t instance.manager.destroy();\n\t } // Destroy our adsManager\n\n\n\t if (instance.elements.displayContainer) {\n\t instance.elements.displayContainer.destroy();\n\t }\n\n\t instance.elements.container.remove();\n\t};\n\n\tvar Ads = /*#__PURE__*/function () {\n\t /**\n\t * Ads constructor.\n\t * @param {Object} player\n\t * @return {Ads}\n\t */\n\t function Ads(player) {\n\t var _this = this;\n\n\t _classCallCheck(this, Ads);\n\n\t _defineProperty(this, \"load\", function () {\n\t if (!_this.enabled) {\n\t return;\n\t } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n\t if (!is$2.object(window.google) || !is$2.object(window.google.ima)) {\n\t loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {\n\t _this.ready();\n\t }).catch(function () {\n\t // Script failed to load or is blocked\n\t _this.trigger('error', new Error('Google IMA SDK failed to load'));\n\t });\n\t } else {\n\t _this.ready();\n\t }\n\t });\n\n\t _defineProperty(this, \"ready\", function () {\n\t // Double check we're enabled\n\t if (!_this.enabled) {\n\t destroy(_this);\n\t } // Start ticking our safety timer. If the whole advertisement\n\t // thing doesn't resolve within our set time; we bail\n\n\n\t _this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n\n\t _this.managerPromise.then(function () {\n\t _this.clearSafetyTimer('onAdsManagerLoaded()');\n\t }); // Set listeners on the Plyr instance\n\n\n\t _this.listeners(); // Setup the IMA SDK\n\n\n\t _this.setupIMA();\n\t });\n\n\t _defineProperty(this, \"setupIMA\", function () {\n\t // Create the container for our advertisements\n\t _this.elements.container = createElement$1('div', {\n\t class: _this.player.config.classNames.ads\n\t });\n\n\t _this.player.elements.container.appendChild(_this.elements.container); // So we can run VPAID2\n\n\n\t google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n\t google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+\n\n\t google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n\t _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader\n\n\t _this.loader = new google.ima.AdsLoader(_this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n\t _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n\t return _this.onAdsManagerLoaded(event);\n\t }, false);\n\n\t _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n\t return _this.onAdError(error);\n\t }, false); // Request video ads to be pre-loaded\n\n\n\t _this.requestAds();\n\t });\n\n\t _defineProperty(this, \"requestAds\", function () {\n\t var container = _this.player.elements.container;\n\n\t try {\n\t // Request video ads\n\t var request = new google.ima.AdsRequest();\n\t request.adTagUrl = _this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n\t // to select the correct creative if multiple are returned\n\n\t request.linearAdSlotWidth = container.offsetWidth;\n\t request.linearAdSlotHeight = container.offsetHeight;\n\t request.nonLinearAdSlotWidth = container.offsetWidth;\n\t request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n\t request.forceNonLinearFullSlot = false; // Mute based on current state\n\n\t request.setAdWillPlayMuted(!_this.player.muted);\n\n\t _this.loader.requestAds(request);\n\t } catch (e) {\n\t _this.onAdError(e);\n\t }\n\t });\n\n\t _defineProperty(this, \"pollCountdown\", function () {\n\t var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n\t if (!start) {\n\t clearInterval(_this.countdownTimer);\n\n\t _this.elements.container.removeAttribute('data-badge-text');\n\n\t return;\n\t }\n\n\t var update = function update() {\n\t var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));\n\t var label = \"\".concat(i18n.get('advertisement', _this.player.config), \" - \").concat(time);\n\n\t _this.elements.container.setAttribute('data-badge-text', label);\n\t };\n\n\t _this.countdownTimer = setInterval(update, 100);\n\t });\n\n\t _defineProperty(this, \"onAdsManagerLoaded\", function (event) {\n\t // Load could occur after a source change (race condition)\n\t if (!_this.enabled) {\n\t return;\n\t } // Get the ads manager\n\n\n\t var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n\t settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n\t settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration\n\t // so it can determine when to start the mid- and post-roll\n\n\t _this.manager = event.getAdsManager(_this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n\t _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events\n\t // Advertisement error events\n\n\t _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n\t return _this.onAdError(error);\n\t }); // Advertisement regular events\n\n\n\t Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n\t _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n\t return _this.onAdEvent(e);\n\t });\n\t }); // Resolve our adsManager\n\n\t _this.trigger('loaded');\n\t });\n\n\t _defineProperty(this, \"addCuePoints\", function () {\n\t // Add advertisement cue's within the time line if available\n\t if (!is$2.empty(_this.cuePoints)) {\n\t _this.cuePoints.forEach(function (cuePoint) {\n\t if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {\n\t var seekElement = _this.player.elements.progress;\n\n\t if (is$2.element(seekElement)) {\n\t var cuePercentage = 100 / _this.player.duration * cuePoint;\n\t var cue = createElement$1('span', {\n\t class: _this.player.config.classNames.cues\n\t });\n\t cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n\t seekElement.appendChild(cue);\n\t }\n\t }\n\t });\n\t }\n\t });\n\n\t _defineProperty(this, \"onAdEvent\", function (event) {\n\t var container = _this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n\t // don't have ad object associated\n\n\t var ad = event.getAd();\n\t var adData = event.getAdData(); // Proxy event\n\n\t var dispatchEvent = function dispatchEvent(type) {\n\t triggerEvent.call(_this.player, _this.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n\t }; // Bubble the event\n\n\n\t dispatchEvent(event.type);\n\n\t switch (event.type) {\n\t case google.ima.AdEvent.Type.LOADED:\n\t // This is the first event sent for an ad - it is possible to determine whether the\n\t // ad is a video ad or an overlay\n\t _this.trigger('loaded'); // Start countdown\n\n\n\t _this.pollCountdown(true);\n\n\t if (!ad.isLinear()) {\n\t // Position AdDisplayContainer correctly for overlay\n\t ad.width = container.offsetWidth;\n\t ad.height = container.offsetHeight;\n\t } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n\t // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n\t break;\n\n\t case google.ima.AdEvent.Type.STARTED:\n\t // Set volume to match player\n\t _this.manager.setVolume(_this.player.volume);\n\n\t break;\n\n\t case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:\n\t // All ads for the current videos are done. We can now request new advertisements\n\t // in case the video is re-played\n\t // TODO: Example for what happens when a next video in a playlist would be loaded.\n\t // So here we load a new video when all ads are done.\n\t // Then we load new ads within a new adsManager. When the video\n\t // Is started - after - the ads are loaded, then we get ads.\n\t // You can also easily test cancelling and reloading by running\n\t // player.ads.cancel() and player.ads.play from the console I guess.\n\t // this.player.source = {\n\t // type: 'video',\n\t // title: 'View From A Blue Moon',\n\t // sources: [{\n\t // src:\n\t // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:\n\t // 'video/mp4', }], poster:\n\t // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:\n\t // [ { kind: 'captions', label: 'English', srclang: 'en', src:\n\t // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n\t // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:\n\t // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],\n\t // };\n\t // TODO: So there is still this thing where a video should only be allowed to start\n\t // playing when the IMA SDK is ready or has failed\n\t if (_this.player.ended) {\n\t _this.loadAds();\n\t } else {\n\t // The SDK won't allow new ads to be called without receiving a contentComplete()\n\t _this.loader.contentComplete();\n\t }\n\n\t break;\n\n\t case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:\n\t // This event indicates the ad has started - the video player can adjust the UI,\n\t // for example display a pause button and remaining time. Fired when content should\n\t // be paused. This usually happens right before an ad is about to cover the content\n\t _this.pauseContent();\n\n\t break;\n\n\t case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:\n\t // This event indicates the ad has finished - the video player can perform\n\t // appropriate UI actions, such as removing the timer for remaining time detection.\n\t // Fired when content should be resumed. This usually happens when an ad finishes\n\t // or collapses\n\t _this.pollCountdown();\n\n\t _this.resumeContent();\n\n\t break;\n\n\t case google.ima.AdEvent.Type.LOG:\n\t if (adData.adError) {\n\t _this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n\t }\n\n\t break;\n\t }\n\t });\n\n\t _defineProperty(this, \"onAdError\", function (event) {\n\t _this.cancel();\n\n\t _this.player.debug.warn('Ads error', event);\n\t });\n\n\t _defineProperty(this, \"listeners\", function () {\n\t var container = _this.player.elements.container;\n\t var time;\n\n\t _this.player.on('canplay', function () {\n\t _this.addCuePoints();\n\t });\n\n\t _this.player.on('ended', function () {\n\t _this.loader.contentComplete();\n\t });\n\n\t _this.player.on('timeupdate', function () {\n\t time = _this.player.currentTime;\n\t });\n\n\t _this.player.on('seeked', function () {\n\t var seekedTime = _this.player.currentTime;\n\n\t if (is$2.empty(_this.cuePoints)) {\n\t return;\n\t }\n\n\t _this.cuePoints.forEach(function (cuePoint, index) {\n\t if (time < cuePoint && cuePoint < seekedTime) {\n\t _this.manager.discardAdBreak();\n\n\t _this.cuePoints.splice(index, 1);\n\t }\n\t });\n\t }); // Listen to the resizing of the window. And resize ad accordingly\n\t // TODO: eventually implement ResizeObserver\n\n\n\t window.addEventListener('resize', function () {\n\t if (_this.manager) {\n\t _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n\t }\n\t });\n\t });\n\n\t _defineProperty(this, \"play\", function () {\n\t var container = _this.player.elements.container;\n\n\t if (!_this.managerPromise) {\n\t _this.resumeContent();\n\t } // Play the requested advertisement whenever the adsManager is ready\n\n\n\t _this.managerPromise.then(function () {\n\t // Set volume to match player\n\t _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\n\t _this.elements.displayContainer.initialize();\n\n\t try {\n\t if (!_this.initialized) {\n\t // Initialize the ads manager. Ad rules playlist will start at this time\n\t _this.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will\n\t // start at this time; the call will be ignored for ad rules\n\n\n\t _this.manager.start();\n\t }\n\n\t _this.initialized = true;\n\t } catch (adError) {\n\t // An error may be thrown if there was a problem with the\n\t // VAST response\n\t _this.onAdError(adError);\n\t }\n\t }).catch(function () {});\n\t });\n\n\t _defineProperty(this, \"resumeContent\", function () {\n\t // Hide the advertisement container\n\t _this.elements.container.style.zIndex = ''; // Ad is stopped\n\n\t _this.playing = false; // Play video\n\n\t silencePromise(_this.player.media.play());\n\t });\n\n\t _defineProperty(this, \"pauseContent\", function () {\n\t // Show the advertisement container\n\t _this.elements.container.style.zIndex = 3; // Ad is playing\n\n\t _this.playing = true; // Pause our video.\n\n\t _this.player.media.pause();\n\t });\n\n\t _defineProperty(this, \"cancel\", function () {\n\t // Pause our video\n\t if (_this.initialized) {\n\t _this.resumeContent();\n\t } // Tell our instance that we're done for now\n\n\n\t _this.trigger('error'); // Re-create our adsManager\n\n\n\t _this.loadAds();\n\t });\n\n\t _defineProperty(this, \"loadAds\", function () {\n\t // Tell our adsManager to go bye bye\n\t _this.managerPromise.then(function () {\n\t // Destroy our adsManager\n\t if (_this.manager) {\n\t _this.manager.destroy();\n\t } // Re-set our adsManager promises\n\n\n\t _this.managerPromise = new Promise(function (resolve) {\n\t _this.on('loaded', resolve);\n\n\t _this.player.debug.log(_this.manager);\n\t }); // Now that the manager has been destroyed set it to also be un-initialized\n\n\t _this.initialized = false; // Now request some new advertisements\n\n\t _this.requestAds();\n\t }).catch(function () {});\n\t });\n\n\t _defineProperty(this, \"trigger\", function (event) {\n\t for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n\t args[_key - 1] = arguments[_key];\n\t }\n\n\t var handlers = _this.events[event];\n\n\t if (is$2.array(handlers)) {\n\t handlers.forEach(function (handler) {\n\t if (is$2.function(handler)) {\n\t handler.apply(_this, args);\n\t }\n\t });\n\t }\n\t });\n\n\t _defineProperty(this, \"on\", function (event, callback) {\n\t if (!is$2.array(_this.events[event])) {\n\t _this.events[event] = [];\n\t }\n\n\t _this.events[event].push(callback);\n\n\t return _this;\n\t });\n\n\t _defineProperty(this, \"startSafetyTimer\", function (time, from) {\n\t _this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n\n\t _this.safetyTimer = setTimeout(function () {\n\t _this.cancel();\n\n\t _this.clearSafetyTimer('startSafetyTimer()');\n\t }, time);\n\t });\n\n\t _defineProperty(this, \"clearSafetyTimer\", function (from) {\n\t if (!is$2.nullOrUndefined(_this.safetyTimer)) {\n\t _this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n\n\t clearTimeout(_this.safetyTimer);\n\t _this.safetyTimer = null;\n\t }\n\t });\n\n\t this.player = player;\n\t this.config = player.config.ads;\n\t this.playing = false;\n\t this.initialized = false;\n\t this.elements = {\n\t container: null,\n\t displayContainer: null\n\t };\n\t this.manager = null;\n\t this.loader = null;\n\t this.cuePoints = null;\n\t this.events = {};\n\t this.safetyTimer = null;\n\t this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready\n\n\t this.managerPromise = new Promise(function (resolve, reject) {\n\t // The ad is loaded and ready\n\t _this.on('loaded', resolve); // Ads failed\n\n\n\t _this.on('error', reject);\n\t });\n\t this.load();\n\t }\n\n\t _createClass(Ads, [{\n\t key: \"enabled\",\n\t get: function get() {\n\t var config = this.config;\n\t return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$2.empty(config.publisherId) || is$2.url(config.tagUrl));\n\t }\n\t /**\n\t * Load the IMA SDK\n\t */\n\n\t }, {\n\t key: \"tagUrl\",\n\t // Build the tag URL\n\t get: function get() {\n\t var config = this.config;\n\n\t if (is$2.url(config.tagUrl)) {\n\t return config.tagUrl;\n\t }\n\n\t var params = {\n\t AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',\n\t AV_CHANNELID: '5a0458dc28a06145e4519d21',\n\t AV_URL: window.location.hostname,\n\t cb: Date.now(),\n\t AV_WIDTH: 640,\n\t AV_HEIGHT: 480,\n\t AV_CDIM2: config.publisherId\n\t };\n\t var base = 'https://go.aniview.com/api/adserver6/vast/';\n\t return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n\t }\n\t /**\n\t * In order for the SDK to display ads for our video, we need to tell it where to put them,\n\t * so here we define our ad container. This div is set up to render on top of the video player.\n\t * Using the code below, we tell the SDK to render ads within that div. We also provide a\n\t * handle to the content video player - the SDK will poll the current time of our player to\n\t * properly place mid-rolls. After we create the ad display container, we initialize it. On\n\t * mobile devices, this initialization is done as the result of a user action.\n\t */\n\n\t }]);\n\n\t return Ads;\n\t}();\n\n\tvar $findIndex$1 = arrayIteration$1.findIndex;\n\n\n\n\tvar FIND_INDEX = 'findIndex';\n\tvar SKIPS_HOLES$2 = true;\n\n\tvar USES_TO_LENGTH$l = arrayMethodUsesToLength$1(FIND_INDEX);\n\n\t// Shouldn't skip holes\n\tif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES$2 = false; });\n\n\t// `Array.prototype.findIndex` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n\t_export$1({ target: 'Array', proto: true, forced: SKIPS_HOLES$2 || !USES_TO_LENGTH$l }, {\n\t findIndex: function findIndex(callbackfn /* , that = undefined */) {\n\t return $findIndex$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n\t }\n\t});\n\n\t// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n\taddToUnscopables$1(FIND_INDEX);\n\n\tvar min$d = Math.min;\n\tvar nativeLastIndexOf$1 = [].lastIndexOf;\n\tvar NEGATIVE_ZERO$3 = !!nativeLastIndexOf$1 && 1 / [1].lastIndexOf(1, -0) < 0;\n\tvar STRICT_METHOD$b = arrayMethodIsStrict$1('lastIndexOf');\n\t// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\n\tvar USES_TO_LENGTH$m = arrayMethodUsesToLength$1('indexOf', { ACCESSORS: true, 1: 0 });\n\tvar FORCED$d = NEGATIVE_ZERO$3 || !STRICT_METHOD$b || !USES_TO_LENGTH$m;\n\n\t// `Array.prototype.lastIndexOf` method implementation\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n\tvar arrayLastIndexOf$1 = FORCED$d ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n\t // convert -0 to +0\n\t if (NEGATIVE_ZERO$3) return nativeLastIndexOf$1.apply(this, arguments) || 0;\n\t var O = toIndexedObject$1(this);\n\t var length = toLength$1(O.length);\n\t var index = length - 1;\n\t if (arguments.length > 1) index = min$d(index, toInteger$1(arguments[1]));\n\t if (index < 0) index = length + index;\n\t for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n\t return -1;\n\t} : nativeLastIndexOf$1;\n\n\t// `Array.prototype.lastIndexOf` method\n\t// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n\t_export$1({ target: 'Array', proto: true, forced: arrayLastIndexOf$1 !== [].lastIndexOf }, {\n\t lastIndexOf: arrayLastIndexOf$1\n\t});\n\n\tvar parseVtt = function parseVtt(vttDataString) {\n\t var processedList = [];\n\t var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\t frames.forEach(function (frame) {\n\t var result = {};\n\t var lines = frame.split(/\\r\\n|\\n|\\r/);\n\t lines.forEach(function (line) {\n\t if (!is$2.number(result.startTime)) {\n\t // The line with start and end times on it is the first line of interest\n\t var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n\t if (matchTimes) {\n\t result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n\t result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n\t }\n\t } else if (!is$2.empty(line.trim()) && is$2.empty(result.text)) {\n\t // If we already have the startTime, then we're definitely up to the text line(s)\n\t var lineSplit = line.trim().split('#xywh=');\n\n\t var _lineSplit = _slicedToArray(lineSplit, 1);\n\n\t result.text = _lineSplit[0];\n\n\t // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n\t if (lineSplit[1]) {\n\t var _lineSplit$1$split = lineSplit[1].split(',');\n\n\t var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n\t result.x = _lineSplit$1$split2[0];\n\t result.y = _lineSplit$1$split2[1];\n\t result.w = _lineSplit$1$split2[2];\n\t result.h = _lineSplit$1$split2[3];\n\t }\n\t }\n\t });\n\n\t if (result.text) {\n\t processedList.push(result);\n\t }\n\t });\n\t return processedList;\n\t};\n\t/**\n\t * Preview thumbnails for seek hover and scrubbing\n\t * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n\t * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n\t *\n\t * Notes:\n\t * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n\t * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n\t * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n\t */\n\n\n\tvar fitRatio = function fitRatio(ratio, outer) {\n\t var targetRatio = outer.width / outer.height;\n\t var result = {};\n\n\t if (ratio > targetRatio) {\n\t result.width = outer.width;\n\t result.height = 1 / ratio * outer.width;\n\t } else {\n\t result.height = outer.height;\n\t result.width = ratio * outer.height;\n\t }\n\n\t return result;\n\t};\n\n\tvar PreviewThumbnails = /*#__PURE__*/function () {\n\t /**\n\t * PreviewThumbnails constructor.\n\t * @param {Plyr} player\n\t * @return {PreviewThumbnails}\n\t */\n\t function PreviewThumbnails(player) {\n\t var _this = this;\n\n\t _classCallCheck(this, PreviewThumbnails);\n\n\t _defineProperty(this, \"load\", function () {\n\t // Toggle the regular seek tooltip\n\t if (_this.player.elements.display.seekTooltip) {\n\t _this.player.elements.display.seekTooltip.hidden = _this.enabled;\n\t }\n\n\t if (!_this.enabled) {\n\t return;\n\t }\n\n\t _this.getThumbnails().then(function () {\n\t if (!_this.enabled) {\n\t return;\n\t } // Render DOM elements\n\n\n\t _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n\t _this.determineContainerAutoSizing();\n\n\t _this.loaded = true;\n\t });\n\t });\n\n\t _defineProperty(this, \"getThumbnails\", function () {\n\t return new Promise(function (resolve) {\n\t var src = _this.player.config.previewThumbnails.src;\n\n\t if (is$2.empty(src)) {\n\t throw new Error('Missing previewThumbnails.src config attribute');\n\t } // Resolve promise\n\n\n\t var sortAndResolve = function sortAndResolve() {\n\t // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n\t _this.thumbnails.sort(function (x, y) {\n\t return x.height - y.height;\n\t });\n\n\t _this.player.debug.log('Preview thumbnails', _this.thumbnails);\n\n\t resolve();\n\t }; // Via callback()\n\n\n\t if (is$2.function(src)) {\n\t src(function (thumbnails) {\n\t _this.thumbnails = thumbnails;\n\t sortAndResolve();\n\t });\n\t } // VTT urls\n\t else {\n\t // If string, convert into single-element list\n\t var urls = is$2.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n\t var promises = urls.map(function (u) {\n\t return _this.getThumbnail(u);\n\t }); // Resolve\n\n\t Promise.all(promises).then(sortAndResolve);\n\t }\n\t });\n\t });\n\n\t _defineProperty(this, \"getThumbnail\", function (url) {\n\t return new Promise(function (resolve) {\n\t fetch(url).then(function (response) {\n\t var thumbnail = {\n\t frames: parseVtt(response),\n\t height: null,\n\t urlPrefix: ''\n\t }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n\t // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n\t // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n\t if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n\t thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n\t } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n\t var tempImage = new Image();\n\n\t tempImage.onload = function () {\n\t thumbnail.height = tempImage.naturalHeight;\n\t thumbnail.width = tempImage.naturalWidth;\n\n\t _this.thumbnails.push(thumbnail);\n\n\t resolve();\n\t };\n\n\t tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n\t });\n\t });\n\t });\n\n\t _defineProperty(this, \"startMove\", function (event) {\n\t if (!_this.loaded) {\n\t return;\n\t }\n\n\t if (!is$2.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n\t return;\n\t } // Wait until media has a duration\n\n\n\t if (!_this.player.media.duration) {\n\t return;\n\t }\n\n\t if (event.type === 'touchmove') {\n\t // Calculate seek hover position as approx video seconds\n\t _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);\n\t } else {\n\t // Calculate seek hover position as approx video seconds\n\t var clientRect = _this.player.elements.progress.getBoundingClientRect();\n\n\t var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n\t _this.seekTime = _this.player.media.duration * (percentage / 100);\n\n\t if (_this.seekTime < 0) {\n\t // The mousemove fires for 10+px out to the left\n\t _this.seekTime = 0;\n\t }\n\n\t if (_this.seekTime > _this.player.media.duration - 1) {\n\t // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n\t _this.seekTime = _this.player.media.duration - 1;\n\t }\n\n\t _this.mousePosX = event.pageX; // Set time text inside image container\n\n\t _this.elements.thumb.time.innerText = formatTime(_this.seekTime);\n\t } // Download and show image\n\n\n\t _this.showImageAtCurrentTime();\n\t });\n\n\t _defineProperty(this, \"endMove\", function () {\n\t _this.toggleThumbContainer(false, true);\n\t });\n\n\t _defineProperty(this, \"startScrubbing\", function (event) {\n\t // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n\t if (is$2.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n\t _this.mouseDown = true; // Wait until media has a duration\n\n\t if (_this.player.media.duration) {\n\t _this.toggleScrubbingContainer(true);\n\n\t _this.toggleThumbContainer(false, true); // Download and show image\n\n\n\t _this.showImageAtCurrentTime();\n\t }\n\t }\n\t });\n\n\t _defineProperty(this, \"endScrubbing\", function () {\n\t _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n\t if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {\n\t // The video was already seeked/loaded at the chosen time - hide immediately\n\t _this.toggleScrubbingContainer(false);\n\t } else {\n\t // The video hasn't seeked yet. Wait for that\n\t once.call(_this.player, _this.player.media, 'timeupdate', function () {\n\t // Re-check mousedown - we might have already started scrubbing again\n\t if (!_this.mouseDown) {\n\t _this.toggleScrubbingContainer(false);\n\t }\n\t });\n\t }\n\t });\n\n\t _defineProperty(this, \"listeners\", function () {\n\t // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n\t _this.player.on('play', function () {\n\t _this.toggleThumbContainer(false, true);\n\t });\n\n\t _this.player.on('seeked', function () {\n\t _this.toggleThumbContainer(false);\n\t });\n\n\t _this.player.on('timeupdate', function () {\n\t _this.lastTime = _this.player.media.currentTime;\n\t });\n\t });\n\n\t _defineProperty(this, \"render\", function () {\n\t // Create HTML element: plyr__preview-thumbnail-container\n\t _this.elements.thumb.container = createElement$1('div', {\n\t class: _this.player.config.classNames.previewThumbnails.thumbContainer\n\t }); // Wrapper for the image for styling\n\n\t _this.elements.thumb.imageContainer = createElement$1('div', {\n\t class: _this.player.config.classNames.previewThumbnails.imageContainer\n\t });\n\n\t _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n\n\t var timeContainer = createElement$1('div', {\n\t class: _this.player.config.classNames.previewThumbnails.timeContainer\n\t });\n\t _this.elements.thumb.time = createElement$1('span', {}, '00:00');\n\t timeContainer.appendChild(_this.elements.thumb.time);\n\n\t _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n\n\t if (is$2.element(_this.player.elements.progress)) {\n\t _this.player.elements.progress.appendChild(_this.elements.thumb.container);\n\t } // Create HTML element: plyr__preview-scrubbing-container\n\n\n\t _this.elements.scrubbing.container = createElement$1('div', {\n\t class: _this.player.config.classNames.previewThumbnails.scrubbingContainer\n\t });\n\n\t _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);\n\t });\n\n\t _defineProperty(this, \"destroy\", function () {\n\t if (_this.elements.thumb.container) {\n\t _this.elements.thumb.container.remove();\n\t }\n\n\t if (_this.elements.scrubbing.container) {\n\t _this.elements.scrubbing.container.remove();\n\t }\n\t });\n\n\t _defineProperty(this, \"showImageAtCurrentTime\", function () {\n\t if (_this.mouseDown) {\n\t _this.setScrubbingContainerSize();\n\t } else {\n\t _this.setThumbContainerSizeAndPos();\n\t } // Find the desired thumbnail index\n\t // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n\t var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {\n\t return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;\n\t });\n\n\t var hasThumb = thumbNum >= 0;\n\t var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n\t if (!_this.mouseDown) {\n\t _this.toggleThumbContainer(hasThumb);\n\t } // No matching thumb found\n\n\n\t if (!hasThumb) {\n\t return;\n\t } // Check to see if we've already downloaded higher quality versions of this image\n\n\n\t _this.thumbnails.forEach(function (thumbnail, index) {\n\t if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n\t qualityIndex = index;\n\t }\n\t }); // Only proceed if either thumbnum or thumbfilename has changed\n\n\n\t if (thumbNum !== _this.showingThumb) {\n\t _this.showingThumb = thumbNum;\n\n\t _this.loadImage(qualityIndex);\n\t }\n\t });\n\n\t _defineProperty(this, \"loadImage\", function () {\n\t var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var thumbNum = _this.showingThumb;\n\t var thumbnail = _this.thumbnails[qualityIndex];\n\t var urlPrefix = thumbnail.urlPrefix;\n\t var frame = thumbnail.frames[thumbNum];\n\t var thumbFilename = thumbnail.frames[thumbNum].text;\n\t var thumbUrl = urlPrefix + thumbFilename;\n\n\t if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {\n\t // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n\t // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n\t if (_this.loadingImage && _this.usingSprites) {\n\t _this.loadingImage.onload = null;\n\t } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n\t // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n\t // images causes a flicker. Putting a new image over the top does not\n\n\n\t var previewImage = new Image();\n\t previewImage.src = thumbUrl;\n\t previewImage.dataset.index = thumbNum;\n\t previewImage.dataset.filename = thumbFilename;\n\t _this.showingThumbFilename = thumbFilename;\n\n\t _this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n\n\t previewImage.onload = function () {\n\t return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n\t };\n\n\t _this.loadingImage = previewImage;\n\n\t _this.removeOldImages(previewImage);\n\t } else {\n\t // Update the existing image\n\t _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n\n\t _this.currentImageElement.dataset.index = thumbNum;\n\n\t _this.removeOldImages(_this.currentImageElement);\n\t }\n\t });\n\n\t _defineProperty(this, \"showImage\", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n\t var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n\t _this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n\n\t _this.setImageSizeAndOffset(previewImage, frame);\n\n\t if (newImage) {\n\t _this.currentImageContainer.appendChild(previewImage);\n\n\t _this.currentImageElement = previewImage;\n\n\t if (!_this.loadedImages.includes(thumbFilename)) {\n\t _this.loadedImages.push(thumbFilename);\n\t }\n\t } // Preload images before and after the current one\n\t // Show higher quality of the same frame\n\t // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n\t _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n\t });\n\n\t _defineProperty(this, \"removeOldImages\", function (currentImage) {\n\t // Get a list of all images, convert it from a DOM list to an array\n\t Array.from(_this.currentImageContainer.children).forEach(function (image) {\n\t if (image.tagName.toLowerCase() !== 'img') {\n\t return;\n\t }\n\n\t var removeDelay = _this.usingSprites ? 500 : 1000;\n\n\t if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n\t // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n\t // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n\t // eslint-disable-next-line no-param-reassign\n\t image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n\t var currentImageContainer = _this.currentImageContainer;\n\t setTimeout(function () {\n\t currentImageContainer.removeChild(image);\n\n\t _this.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n\t }, removeDelay);\n\t }\n\t });\n\t });\n\n\t _defineProperty(this, \"preloadNearby\", function (thumbNum) {\n\t var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\t return new Promise(function (resolve) {\n\t setTimeout(function () {\n\t var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;\n\n\t if (_this.showingThumbFilename === oldThumbFilename) {\n\t // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n\t var thumbnailsClone;\n\n\t if (forward) {\n\t thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);\n\t } else {\n\t thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n\t }\n\n\t var foundOne = false;\n\t thumbnailsClone.forEach(function (frame) {\n\t var newThumbFilename = frame.text;\n\n\t if (newThumbFilename !== oldThumbFilename) {\n\t // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n\t if (!_this.loadedImages.includes(newThumbFilename)) {\n\t foundOne = true;\n\n\t _this.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n\t var urlPrefix = _this.thumbnails[0].urlPrefix;\n\t var thumbURL = urlPrefix + newThumbFilename;\n\t var previewImage = new Image();\n\t previewImage.src = thumbURL;\n\n\t previewImage.onload = function () {\n\t _this.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n\t if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n\t resolve();\n\t };\n\t }\n\t }\n\t }); // If there are none to preload then we want to resolve immediately\n\n\t if (!foundOne) {\n\t resolve();\n\t }\n\t }\n\t }, 300);\n\t });\n\t });\n\n\t _defineProperty(this, \"getHigherQuality\", function (currentQualityIndex, previewImage, frame, thumbFilename) {\n\t if (currentQualityIndex < _this.thumbnails.length - 1) {\n\t // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n\t var previewImageHeight = previewImage.naturalHeight;\n\n\t if (_this.usingSprites) {\n\t previewImageHeight = frame.h;\n\t }\n\n\t if (previewImageHeight < _this.thumbContainerHeight) {\n\t // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n\t setTimeout(function () {\n\t // Make sure the mouse hasn't already moved on and started hovering at another image\n\t if (_this.showingThumbFilename === thumbFilename) {\n\t _this.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n\t _this.loadImage(currentQualityIndex + 1);\n\t }\n\t }, 300);\n\t }\n\t }\n\t });\n\n\t _defineProperty(this, \"toggleThumbContainer\", function () {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\t var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;\n\n\t _this.elements.thumb.container.classList.toggle(className, toggle);\n\n\t if (!toggle && clearShowing) {\n\t _this.showingThumb = null;\n\t _this.showingThumbFilename = null;\n\t }\n\t });\n\n\t _defineProperty(this, \"toggleScrubbingContainer\", function () {\n\t var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\t var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n\n\t _this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n\t if (!toggle) {\n\t _this.showingThumb = null;\n\t _this.showingThumbFilename = null;\n\t }\n\t });\n\n\t _defineProperty(this, \"determineContainerAutoSizing\", function () {\n\t if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {\n\t // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n\t _this.sizeSpecifiedInCSS = true;\n\t }\n\t });\n\n\t _defineProperty(this, \"setThumbContainerSizeAndPos\", function () {\n\t if (!_this.sizeSpecifiedInCSS) {\n\t var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);\n\t _this.elements.thumb.imageContainer.style.height = \"\".concat(_this.thumbContainerHeight, \"px\");\n\t _this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n\t } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {\n\t var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);\n\n\t _this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n\t } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {\n\t var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);\n\t _this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n\t }\n\n\t _this.setThumbContainerPos();\n\t });\n\n\t _defineProperty(this, \"setThumbContainerPos\", function () {\n\t var seekbarRect = _this.player.elements.progress.getBoundingClientRect();\n\n\t var plyrRect = _this.player.elements.container.getBoundingClientRect();\n\n\t var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n\t var minVal = plyrRect.left - seekbarRect.left + 10;\n\t var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n\t var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n\t if (previewPos < minVal) {\n\t previewPos = minVal;\n\t }\n\n\t if (previewPos > maxVal) {\n\t previewPos = maxVal;\n\t }\n\n\t container.style.left = \"\".concat(previewPos, \"px\");\n\t });\n\n\t _defineProperty(this, \"setScrubbingContainerSize\", function () {\n\t var _fitRatio = fitRatio(_this.thumbAspectRatio, {\n\t width: _this.player.media.clientWidth,\n\t height: _this.player.media.clientHeight\n\t }),\n\t width = _fitRatio.width,\n\t height = _fitRatio.height;\n\n\t _this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n\t _this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n\t });\n\n\t _defineProperty(this, \"setImageSizeAndOffset\", function (previewImage, frame) {\n\t if (!_this.usingSprites) {\n\t return;\n\t } // Find difference between height and preview container height\n\n\n\t var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n\t previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n\t previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n\t previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n\t previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n\t });\n\n\t this.player = player;\n\t this.thumbnails = [];\n\t this.loaded = false;\n\t this.lastMouseMoveTime = Date.now();\n\t this.mouseDown = false;\n\t this.loadedImages = [];\n\t this.elements = {\n\t thumb: {},\n\t scrubbing: {}\n\t };\n\t this.load();\n\t }\n\n\t _createClass(PreviewThumbnails, [{\n\t key: \"enabled\",\n\t get: function get() {\n\t return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n\t }\n\t }, {\n\t key: \"currentImageContainer\",\n\t get: function get() {\n\t if (this.mouseDown) {\n\t return this.elements.scrubbing.container;\n\t }\n\n\t return this.elements.thumb.imageContainer;\n\t }\n\t }, {\n\t key: \"usingSprites\",\n\t get: function get() {\n\t return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n\t }\n\t }, {\n\t key: \"thumbAspectRatio\",\n\t get: function get() {\n\t if (this.usingSprites) {\n\t return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n\t }\n\n\t return this.thumbnails[0].width / this.thumbnails[0].height;\n\t }\n\t }, {\n\t key: \"thumbContainerHeight\",\n\t get: function get() {\n\t if (this.mouseDown) {\n\t var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n\t width: this.player.media.clientWidth,\n\t height: this.player.media.clientHeight\n\t }),\n\t height = _fitRatio2.height;\n\n\t return height;\n\t } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n\t if (this.sizeSpecifiedInCSS) {\n\t return this.elements.thumb.imageContainer.clientHeight;\n\t }\n\n\t return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n\t }\n\t }, {\n\t key: \"currentImageElement\",\n\t get: function get() {\n\t if (this.mouseDown) {\n\t return this.currentScrubbingImageElement;\n\t }\n\n\t return this.currentThumbnailImageElement;\n\t },\n\t set: function set(element) {\n\t if (this.mouseDown) {\n\t this.currentScrubbingImageElement = element;\n\t } else {\n\t this.currentThumbnailImageElement = element;\n\t }\n\t }\n\t }]);\n\n\t return PreviewThumbnails;\n\t}();\n\n\tvar source = {\n\t // Add elements to HTML5 media (source, tracks, etc)\n\t insertElements: function insertElements(type, attributes) {\n\t var _this = this;\n\n\t if (is$2.string(attributes)) {\n\t insertElement(type, this.media, {\n\t src: attributes\n\t });\n\t } else if (is$2.array(attributes)) {\n\t attributes.forEach(function (attribute) {\n\t insertElement(type, _this.media, attribute);\n\t });\n\t }\n\t },\n\t // Update source\n\t // Sources are not checked for support so be careful\n\t change: function change(input) {\n\t var _this2 = this;\n\n\t if (!getDeep(input, 'sources.length')) {\n\t this.debug.warn('Invalid source format');\n\t return;\n\t } // Cancel current network requests\n\n\n\t html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n\t this.destroy.call(this, function () {\n\t // Reset quality options\n\t _this2.options.quality = []; // Remove elements\n\n\t removeElement(_this2.media);\n\t _this2.media = null; // Reset class name\n\n\t if (is$2.element(_this2.elements.container)) {\n\t _this2.elements.container.removeAttribute('class');\n\t } // Set the type and provider\n\n\n\t var sources = input.sources,\n\t type = input.type;\n\n\t var _sources = _slicedToArray(sources, 1),\n\t _sources$ = _sources[0],\n\t _sources$$provider = _sources$.provider,\n\t provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n\t src = _sources$.src;\n\n\t var tagName = provider === 'html5' ? type : 'div';\n\t var attributes = provider === 'html5' ? {} : {\n\t src: src\n\t };\n\t Object.assign(_this2, {\n\t provider: provider,\n\t type: type,\n\t // Check for support\n\t supported: support.check(type, provider, _this2.config.playsinline),\n\t // Create new element\n\t media: createElement$1(tagName, attributes)\n\t }); // Inject the new element\n\n\t _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n\t if (is$2.boolean(input.autoplay)) {\n\t _this2.config.autoplay = input.autoplay;\n\t } // Set attributes for audio and video\n\n\n\t if (_this2.isHTML5) {\n\t if (_this2.config.crossorigin) {\n\t _this2.media.setAttribute('crossorigin', '');\n\t }\n\n\t if (_this2.config.autoplay) {\n\t _this2.media.setAttribute('autoplay', '');\n\t }\n\n\t if (!is$2.empty(input.poster)) {\n\t _this2.poster = input.poster;\n\t }\n\n\t if (_this2.config.loop.active) {\n\t _this2.media.setAttribute('loop', '');\n\t }\n\n\t if (_this2.config.muted) {\n\t _this2.media.setAttribute('muted', '');\n\t }\n\n\t if (_this2.config.playsinline) {\n\t _this2.media.setAttribute('playsinline', '');\n\t }\n\t } // Restore class hook\n\n\n\t ui.addStyleHook.call(_this2); // Set new sources for html5\n\n\t if (_this2.isHTML5) {\n\t source.insertElements.call(_this2, 'source', sources);\n\t } // Set video title\n\n\n\t _this2.config.title = input.title; // Set up from scratch\n\n\t media.setup.call(_this2); // HTML5 stuff\n\n\t if (_this2.isHTML5) {\n\t // Setup captions\n\t if (Object.keys(input).includes('tracks')) {\n\t source.insertElements.call(_this2, 'track', input.tracks);\n\t }\n\t } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n\t if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n\t // Setup interface\n\t ui.build.call(_this2);\n\t } // Load HTML5 sources\n\n\n\t if (_this2.isHTML5) {\n\t _this2.media.load();\n\t } // Update previewThumbnails config & reload plugin\n\n\n\t if (!is$2.empty(input.previewThumbnails)) {\n\t Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n\t if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n\t _this2.previewThumbnails.destroy();\n\n\t _this2.previewThumbnails = null;\n\t } // Create new instance if it is still enabled\n\n\n\t if (_this2.config.previewThumbnails.enabled) {\n\t _this2.previewThumbnails = new PreviewThumbnails(_this2);\n\t }\n\t } // Update the fullscreen support\n\n\n\t _this2.fullscreen.update();\n\t }, true);\n\t }\n\t};\n\n\t/**\n\t * Returns a number whose value is limited to the given range.\n\t *\n\t * Example: limit the output of this computation to between 0 and 255\n\t * (x * 255).clamp(0, 255)\n\t *\n\t * @param {Number} input\n\t * @param {Number} min The lower boundary of the output range\n\t * @param {Number} max The upper boundary of the output range\n\t * @returns A number in the range [min, max]\n\t * @type Number\n\t */\n\tfunction clamp() {\n\t var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n\t var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\t var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n\t return Math.min(Math.max(input, min), max);\n\t}\n\n\t// TODO: Use a WeakMap for private globals\n\t// const globals = new WeakMap();\n\t// Plyr instance\n\n\tvar Plyr = /*#__PURE__*/function () {\n\t function Plyr(target, options) {\n\t var _this = this;\n\n\t _classCallCheck(this, Plyr);\n\n\t _defineProperty(this, \"play\", function () {\n\t if (!is$2.function(_this.media.play)) {\n\t return null;\n\t } // Intecept play with ads\n\n\n\t if (_this.ads && _this.ads.enabled) {\n\t _this.ads.managerPromise.then(function () {\n\t return _this.ads.play();\n\t }).catch(function () {\n\t return silencePromise(_this.media.play());\n\t });\n\t } // Return the promise (for HTML5)\n\n\n\t return _this.media.play();\n\t });\n\n\t _defineProperty(this, \"pause\", function () {\n\t if (!_this.playing || !is$2.function(_this.media.pause)) {\n\t return null;\n\t }\n\n\t return _this.media.pause();\n\t });\n\n\t _defineProperty(this, \"togglePlay\", function (input) {\n\t // Toggle based on current state if nothing passed\n\t var toggle = is$2.boolean(input) ? input : !_this.playing;\n\n\t if (toggle) {\n\t return _this.play();\n\t }\n\n\t return _this.pause();\n\t });\n\n\t _defineProperty(this, \"stop\", function () {\n\t if (_this.isHTML5) {\n\t _this.pause();\n\n\t _this.restart();\n\t } else if (is$2.function(_this.media.stop)) {\n\t _this.media.stop();\n\t }\n\t });\n\n\t _defineProperty(this, \"restart\", function () {\n\t _this.currentTime = 0;\n\t });\n\n\t _defineProperty(this, \"rewind\", function (seekTime) {\n\t _this.currentTime -= is$2.number(seekTime) ? seekTime : _this.config.seekTime;\n\t });\n\n\t _defineProperty(this, \"forward\", function (seekTime) {\n\t _this.currentTime += is$2.number(seekTime) ? seekTime : _this.config.seekTime;\n\t });\n\n\t _defineProperty(this, \"increaseVolume\", function (step) {\n\t var volume = _this.media.muted ? 0 : _this.volume;\n\t _this.volume = volume + (is$2.number(step) ? step : 0);\n\t });\n\n\t _defineProperty(this, \"decreaseVolume\", function (step) {\n\t _this.increaseVolume(-step);\n\t });\n\n\t _defineProperty(this, \"airplay\", function () {\n\t // Show dialog if supported\n\t if (support.airplay) {\n\t _this.media.webkitShowPlaybackTargetPicker();\n\t }\n\t });\n\n\t _defineProperty(this, \"toggleControls\", function (toggle) {\n\t // Don't toggle if missing UI support or if it's audio\n\t if (_this.supported.ui && !_this.isAudio) {\n\t // Get state before change\n\t var isHidden = hasClass(_this.elements.container, _this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n\t var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n\t var hiding = toggleClass(_this.elements.container, _this.config.classNames.hideControls, force); // Close menu\n\n\t if (hiding && is$2.array(_this.config.controls) && _this.config.controls.includes('settings') && !is$2.empty(_this.config.settings)) {\n\t controls.toggleMenu.call(_this, false);\n\t } // Trigger event on change\n\n\n\t if (hiding !== isHidden) {\n\t var eventName = hiding ? 'controlshidden' : 'controlsshown';\n\t triggerEvent.call(_this, _this.media, eventName);\n\t }\n\n\t return !hiding;\n\t }\n\n\t return false;\n\t });\n\n\t _defineProperty(this, \"on\", function (event, callback) {\n\t on.call(_this, _this.elements.container, event, callback);\n\t });\n\n\t _defineProperty(this, \"once\", function (event, callback) {\n\t once.call(_this, _this.elements.container, event, callback);\n\t });\n\n\t _defineProperty(this, \"off\", function (event, callback) {\n\t off(_this.elements.container, event, callback);\n\t });\n\n\t _defineProperty(this, \"destroy\", function (callback) {\n\t var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n\t if (!_this.ready) {\n\t return;\n\t }\n\n\t var done = function done() {\n\t // Reset overflow (incase destroyed while in fullscreen)\n\t document.body.style.overflow = ''; // GC for embed\n\n\t _this.embed = null; // If it's a soft destroy, make minimal changes\n\n\t if (soft) {\n\t if (Object.keys(_this.elements).length) {\n\t // Remove elements\n\t removeElement(_this.elements.buttons.play);\n\t removeElement(_this.elements.captions);\n\t removeElement(_this.elements.controls);\n\t removeElement(_this.elements.wrapper); // Clear for GC\n\n\t _this.elements.buttons.play = null;\n\t _this.elements.captions = null;\n\t _this.elements.controls = null;\n\t _this.elements.wrapper = null;\n\t } // Callback\n\n\n\t if (is$2.function(callback)) {\n\t callback();\n\t }\n\t } else {\n\t // Unbind listeners\n\t unbindListeners.call(_this); // Cancel current network requests\n\n\t html5.cancelRequests.call(_this); // Replace the container with the original element provided\n\n\t replaceElement(_this.elements.original, _this.elements.container); // Event\n\n\t triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback\n\n\t if (is$2.function(callback)) {\n\t callback.call(_this.elements.original);\n\t } // Reset state\n\n\n\t _this.ready = false; // Clear for garbage collection\n\n\t setTimeout(function () {\n\t _this.elements = null;\n\t _this.media = null;\n\t }, 200);\n\t }\n\t }; // Stop playback\n\n\n\t _this.stop(); // Clear timeouts\n\n\n\t clearTimeout(_this.timers.loading);\n\t clearTimeout(_this.timers.controls);\n\t clearTimeout(_this.timers.resized); // Provider specific stuff\n\n\t if (_this.isHTML5) {\n\t // Restore native video controls\n\t ui.toggleNativeControls.call(_this, true); // Clean up\n\n\t done();\n\t } else if (_this.isYouTube) {\n\t // Clear timers\n\t clearInterval(_this.timers.buffering);\n\t clearInterval(_this.timers.playing); // Destroy YouTube API\n\n\t if (_this.embed !== null && is$2.function(_this.embed.destroy)) {\n\t _this.embed.destroy();\n\t } // Clean up\n\n\n\t done();\n\t } else if (_this.isVimeo) {\n\t // Destroy Vimeo API\n\t // then clean up (wait, to prevent postmessage errors)\n\t if (_this.embed !== null) {\n\t _this.embed.unload().then(done);\n\t } // Vimeo does not always return\n\n\n\t setTimeout(done, 200);\n\t }\n\t });\n\n\t _defineProperty(this, \"supports\", function (type) {\n\t return support.mime.call(_this, type);\n\t });\n\n\t this.timers = {}; // State\n\n\t this.ready = false;\n\t this.loading = false;\n\t this.failed = false; // Touch device\n\n\t this.touch = support.touch; // Set the media element\n\n\t this.media = target; // String selector passed\n\n\t if (is$2.string(this.media)) {\n\t this.media = document.querySelectorAll(this.media);\n\t } // jQuery, NodeList or Array passed, use first element\n\n\n\t if (window.jQuery && this.media instanceof jQuery || is$2.nodeList(this.media) || is$2.array(this.media)) {\n\t // eslint-disable-next-line\n\t this.media = this.media[0];\n\t } // Set config\n\n\n\t this.config = extend$1({}, defaults$2, Plyr.defaults, options || {}, function () {\n\t try {\n\t return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n\t } catch (e) {\n\t return {};\n\t }\n\t }()); // Elements cache\n\n\t this.elements = {\n\t container: null,\n\t fullscreen: null,\n\t captions: null,\n\t buttons: {},\n\t display: {},\n\t progress: {},\n\t inputs: {},\n\t settings: {\n\t popup: null,\n\t menu: null,\n\t panels: {},\n\t buttons: {}\n\t }\n\t }; // Captions\n\n\t this.captions = {\n\t active: null,\n\t currentTrack: -1,\n\t meta: new WeakMap()\n\t }; // Fullscreen\n\n\t this.fullscreen = {\n\t active: false\n\t }; // Options\n\n\t this.options = {\n\t speed: [],\n\t quality: []\n\t }; // Debugging\n\t // TODO: move to globals\n\n\t this.debug = new Console$1(this.config.debug); // Log config options and support\n\n\t this.debug.log('Config', this.config);\n\t this.debug.log('Support', support); // We need an element to setup\n\n\t if (is$2.nullOrUndefined(this.media) || !is$2.element(this.media)) {\n\t this.debug.error('Setup failed: no suitable element passed');\n\t return;\n\t } // Bail if the element is initialized\n\n\n\t if (this.media.plyr) {\n\t this.debug.warn('Target already setup');\n\t return;\n\t } // Bail if not enabled\n\n\n\t if (!this.config.enabled) {\n\t this.debug.error('Setup failed: disabled by config');\n\t return;\n\t } // Bail if disabled or no basic support\n\t // You may want to disable certain UAs etc\n\n\n\t if (!support.check().api) {\n\t this.debug.error('Setup failed: no support');\n\t return;\n\t } // Cache original element state for .destroy()\n\n\n\t var clone = this.media.cloneNode(true);\n\t clone.autoplay = false;\n\t this.elements.original = clone; // Set media type based on tag or data attribute\n\t // Supported: video, audio, vimeo, youtube\n\n\t var _type = this.media.tagName.toLowerCase(); // Embed properties\n\n\n\t var iframe = null;\n\t var url = null; // Different setup based on type\n\n\t switch (_type) {\n\t case 'div':\n\t // Find the frame\n\t iframe = this.media.querySelector('iframe'); // <iframe> type\n\n\t if (is$2.element(iframe)) {\n\t // Detect provider\n\t url = parseUrl$1(iframe.getAttribute('src'));\n\t this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n\t this.elements.container = this.media;\n\t this.media = iframe; // Reset classname\n\n\t this.elements.container.className = ''; // Get attributes from URL and set config\n\n\t if (url.search.length) {\n\t var truthy = ['1', 'true'];\n\n\t if (truthy.includes(url.searchParams.get('autoplay'))) {\n\t this.config.autoplay = true;\n\t }\n\n\t if (truthy.includes(url.searchParams.get('loop'))) {\n\t this.config.loop.active = true;\n\t } // TODO: replace fullscreen.iosNative with this playsinline config option\n\t // YouTube requires the playsinline in the URL\n\n\n\t if (this.isYouTube) {\n\t this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n\t this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?\n\t } else {\n\t this.config.playsinline = true;\n\t }\n\t }\n\t } else {\n\t // <div> with attributes\n\t this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute\n\n\t this.media.removeAttribute(this.config.attributes.embed.provider);\n\t } // Unsupported or missing provider\n\n\n\t if (is$2.empty(this.provider) || !Object.values(providers).includes(this.provider)) {\n\t this.debug.error('Setup failed: Invalid provider');\n\t return;\n\t } // Audio will come later for external providers\n\n\n\t this.type = types.video;\n\t break;\n\n\t case 'video':\n\t case 'audio':\n\t this.type = _type;\n\t this.provider = providers.html5; // Get config from attributes\n\n\t if (this.media.hasAttribute('crossorigin')) {\n\t this.config.crossorigin = true;\n\t }\n\n\t if (this.media.hasAttribute('autoplay')) {\n\t this.config.autoplay = true;\n\t }\n\n\t if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n\t this.config.playsinline = true;\n\t }\n\n\t if (this.media.hasAttribute('muted')) {\n\t this.config.muted = true;\n\t }\n\n\t if (this.media.hasAttribute('loop')) {\n\t this.config.loop.active = true;\n\t }\n\n\t break;\n\n\t default:\n\t this.debug.error('Setup failed: unsupported type');\n\t return;\n\t } // Check for support again but with type\n\n\n\t this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n\t if (!this.supported.api) {\n\t this.debug.error('Setup failed: no support');\n\t return;\n\t }\n\n\t this.eventListeners = []; // Create listeners\n\n\t this.listeners = new Listeners(this); // Setup local storage for user settings\n\n\t this.storage = new Storage$1(this); // Store reference\n\n\t this.media.plyr = this; // Wrap media\n\n\t if (!is$2.element(this.elements.container)) {\n\t this.elements.container = createElement$1('div', {\n\t tabindex: 0\n\t });\n\t wrap$4(this.media, this.elements.container);\n\t } // Migrate custom properties from media to container (so they work 😉)\n\n\n\t ui.migrateStyles.call(this); // Add style hook\n\n\t ui.addStyleHook.call(this); // Setup media\n\n\t media.setup.call(this); // Listen for events if debugging\n\n\t if (this.config.debug) {\n\t on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n\t _this.debug.log(\"event: \".concat(event.type));\n\t });\n\t } // Setup fullscreen\n\n\n\t this.fullscreen = new Fullscreen(this); // Setup interface\n\t // If embed but not fully supported, build interface now to avoid flash of controls\n\n\t if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n\t ui.build.call(this);\n\t } // Container listeners\n\n\n\t this.listeners.container(); // Global listeners\n\n\t this.listeners.global(); // Setup ads if provided\n\n\t if (this.config.ads.enabled) {\n\t this.ads = new Ads(this);\n\t } // Autoplay if required\n\n\n\t if (this.isHTML5 && this.config.autoplay) {\n\t this.once('canplay', function () {\n\t return silencePromise(_this.play());\n\t });\n\t } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n\t this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n\t if (this.config.previewThumbnails.enabled) {\n\t this.previewThumbnails = new PreviewThumbnails(this);\n\t }\n\t } // ---------------------------------------\n\t // API\n\t // ---------------------------------------\n\n\t /**\n\t * Types and provider helpers\n\t */\n\n\n\t _createClass(Plyr, [{\n\t key: \"toggleCaptions\",\n\n\t /**\n\t * Toggle captions\n\t * @param {Boolean} input - Whether to enable captions\n\t */\n\t value: function toggleCaptions(input) {\n\t captions.toggle.call(this, input, false);\n\t }\n\t /**\n\t * Set the caption track by index\n\t * @param {Number} - Caption index\n\t */\n\n\t }, {\n\t key: \"isHTML5\",\n\t get: function get() {\n\t return this.provider === providers.html5;\n\t }\n\t }, {\n\t key: \"isEmbed\",\n\t get: function get() {\n\t return this.isYouTube || this.isVimeo;\n\t }\n\t }, {\n\t key: \"isYouTube\",\n\t get: function get() {\n\t return this.provider === providers.youtube;\n\t }\n\t }, {\n\t key: \"isVimeo\",\n\t get: function get() {\n\t return this.provider === providers.vimeo;\n\t }\n\t }, {\n\t key: \"isVideo\",\n\t get: function get() {\n\t return this.type === types.video;\n\t }\n\t }, {\n\t key: \"isAudio\",\n\t get: function get() {\n\t return this.type === types.audio;\n\t }\n\t /**\n\t * Play the media, or play the advertisement (if they are not blocked)\n\t */\n\n\t }, {\n\t key: \"playing\",\n\n\t /**\n\t * Get playing state\n\t */\n\t get: function get() {\n\t return Boolean(this.ready && !this.paused && !this.ended);\n\t }\n\t /**\n\t * Get paused state\n\t */\n\n\t }, {\n\t key: \"paused\",\n\t get: function get() {\n\t return Boolean(this.media.paused);\n\t }\n\t /**\n\t * Get stopped state\n\t */\n\n\t }, {\n\t key: \"stopped\",\n\t get: function get() {\n\t return Boolean(this.paused && this.currentTime === 0);\n\t }\n\t /**\n\t * Get ended state\n\t */\n\n\t }, {\n\t key: \"ended\",\n\t get: function get() {\n\t return Boolean(this.media.ended);\n\t }\n\t /**\n\t * Toggle playback based on current status\n\t * @param {Boolean} input\n\t */\n\n\t }, {\n\t key: \"currentTime\",\n\n\t /**\n\t * Seek to a time\n\t * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n\t */\n\t set: function set(input) {\n\t // Bail if media duration isn't available yet\n\t if (!this.duration) {\n\t return;\n\t } // Validate input\n\n\n\t var inputIsValid = is$2.number(input) && input > 0; // Set\n\n\t this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n\t this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n\t }\n\t /**\n\t * Get current time\n\t */\n\t ,\n\t get: function get() {\n\t return Number(this.media.currentTime);\n\t }\n\t /**\n\t * Get buffered\n\t */\n\n\t }, {\n\t key: \"buffered\",\n\t get: function get() {\n\t var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n\t if (is$2.number(buffered)) {\n\t return buffered;\n\t } // HTML5\n\t // TODO: Handle buffered chunks of the media\n\t // (i.e. seek to another section buffers only that section)\n\n\n\t if (buffered && buffered.length && this.duration > 0) {\n\t return buffered.end(0) / this.duration;\n\t }\n\n\t return 0;\n\t }\n\t /**\n\t * Get seeking status\n\t */\n\n\t }, {\n\t key: \"seeking\",\n\t get: function get() {\n\t return Boolean(this.media.seeking);\n\t }\n\t /**\n\t * Get the duration of the current media\n\t */\n\n\t }, {\n\t key: \"duration\",\n\t get: function get() {\n\t // Faux duration set via config\n\t var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n\t var realDuration = (this.media || {}).duration;\n\t var duration = !is$2.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n\t return fauxDuration || duration;\n\t }\n\t /**\n\t * Set the player volume\n\t * @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\t */\n\n\t }, {\n\t key: \"volume\",\n\t set: function set(value) {\n\t var volume = value;\n\t var max = 1;\n\t var min = 0;\n\n\t if (is$2.string(volume)) {\n\t volume = Number(volume);\n\t } // Load volume from storage if no value specified\n\n\n\t if (!is$2.number(volume)) {\n\t volume = this.storage.get('volume');\n\t } // Use config if all else fails\n\n\n\t if (!is$2.number(volume)) {\n\t volume = this.config.volume;\n\t } // Maximum is volumeMax\n\n\n\t if (volume > max) {\n\t volume = max;\n\t } // Minimum is volumeMin\n\n\n\t if (volume < min) {\n\t volume = min;\n\t } // Update config\n\n\n\t this.config.volume = volume; // Set the player volume\n\n\t this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n\t if (!is$2.empty(value) && this.muted && volume > 0) {\n\t this.muted = false;\n\t }\n\t }\n\t /**\n\t * Get the current player volume\n\t */\n\t ,\n\t get: function get() {\n\t return Number(this.media.volume);\n\t }\n\t /**\n\t * Increase volume\n\t * @param {Boolean} step - How much to decrease by (between 0 and 1)\n\t */\n\n\t }, {\n\t key: \"muted\",\n\n\t /**\n\t * Set muted state\n\t * @param {Boolean} mute\n\t */\n\t set: function set(mute) {\n\t var toggle = mute; // Load muted state from storage\n\n\t if (!is$2.boolean(toggle)) {\n\t toggle = this.storage.get('muted');\n\t } // Use config if all else fails\n\n\n\t if (!is$2.boolean(toggle)) {\n\t toggle = this.config.muted;\n\t } // Update config\n\n\n\t this.config.muted = toggle; // Set mute on the player\n\n\t this.media.muted = toggle;\n\t }\n\t /**\n\t * Get current muted state\n\t */\n\t ,\n\t get: function get() {\n\t return Boolean(this.media.muted);\n\t }\n\t /**\n\t * Check if the media has audio\n\t */\n\n\t }, {\n\t key: \"hasAudio\",\n\t get: function get() {\n\t // Assume yes for all non HTML5 (as we can't tell...)\n\t if (!this.isHTML5) {\n\t return true;\n\t }\n\n\t if (this.isAudio) {\n\t return true;\n\t } // Get audio tracks\n\n\n\t return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n\t }\n\t /**\n\t * Set playback speed\n\t * @param {Number} speed - the speed of playback (0.5-2.0)\n\t */\n\n\t }, {\n\t key: \"speed\",\n\t set: function set(input) {\n\t var _this2 = this;\n\n\t var speed = null;\n\n\t if (is$2.number(input)) {\n\t speed = input;\n\t }\n\n\t if (!is$2.number(speed)) {\n\t speed = this.storage.get('speed');\n\t }\n\n\t if (!is$2.number(speed)) {\n\t speed = this.config.speed.selected;\n\t } // Clamp to min/max\n\n\n\t var min = this.minimumSpeed,\n\t max = this.maximumSpeed;\n\t speed = clamp(speed, min, max); // Update config\n\n\t this.config.speed.selected = speed; // Set media speed\n\n\t setTimeout(function () {\n\t _this2.media.playbackRate = speed;\n\t }, 0);\n\t }\n\t /**\n\t * Get current playback speed\n\t */\n\t ,\n\t get: function get() {\n\t return Number(this.media.playbackRate);\n\t }\n\t /**\n\t * Get the minimum allowed speed\n\t */\n\n\t }, {\n\t key: \"minimumSpeed\",\n\t get: function get() {\n\t if (this.isYouTube) {\n\t // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n\t return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n\t }\n\n\t if (this.isVimeo) {\n\t // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n\t return 0.5;\n\t } // https://stackoverflow.com/a/32320020/1191319\n\n\n\t return 0.0625;\n\t }\n\t /**\n\t * Get the maximum allowed speed\n\t */\n\n\t }, {\n\t key: \"maximumSpeed\",\n\t get: function get() {\n\t if (this.isYouTube) {\n\t // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n\t return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n\t }\n\n\t if (this.isVimeo) {\n\t // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n\t return 2;\n\t } // https://stackoverflow.com/a/32320020/1191319\n\n\n\t return 16;\n\t }\n\t /**\n\t * Set playback quality\n\t * Currently HTML5 & YouTube only\n\t * @param {Number} input - Quality level\n\t */\n\n\t }, {\n\t key: \"quality\",\n\t set: function set(input) {\n\t var config = this.config.quality;\n\t var options = this.options.quality;\n\n\t if (!options.length) {\n\t return;\n\t }\n\n\t var quality = [!is$2.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$2.number);\n\t var updateStorage = true;\n\n\t if (!options.includes(quality)) {\n\t var value = closest$1(options, quality);\n\t this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n\t quality = value; // Don't update storage if quality is not supported\n\n\t updateStorage = false;\n\t } // Update config\n\n\n\t config.selected = quality; // Set quality\n\n\t this.media.quality = quality; // Save to storage\n\n\t if (updateStorage) {\n\t this.storage.set({\n\t quality: quality\n\t });\n\t }\n\t }\n\t /**\n\t * Get current quality level\n\t */\n\t ,\n\t get: function get() {\n\t return this.media.quality;\n\t }\n\t /**\n\t * Toggle loop\n\t * TODO: Finish fancy new logic. Set the indicator on load as user may pass loop as config\n\t * @param {Boolean} input - Whether to loop or not\n\t */\n\n\t }, {\n\t key: \"loop\",\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : this.config.loop.active;\n\t this.config.loop.active = toggle;\n\t this.media.loop = toggle; // Set default to be a true toggle\n\n\t /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\n\t switch (type) {\n\t case 'start':\n\t if (this.config.loop.end && this.config.loop.end <= this.currentTime) {\n\t this.config.loop.end = null;\n\t }\n\t this.config.loop.start = this.currentTime;\n\t // this.config.loop.indicator.start = this.elements.display.played.value;\n\t break;\n\t case 'end':\n\t if (this.config.loop.start >= this.currentTime) {\n\t return this;\n\t }\n\t this.config.loop.end = this.currentTime;\n\t // this.config.loop.indicator.end = this.elements.display.played.value;\n\t break;\n\t case 'all':\n\t this.config.loop.start = 0;\n\t this.config.loop.end = this.duration - 2;\n\t this.config.loop.indicator.start = 0;\n\t this.config.loop.indicator.end = 100;\n\t break;\n\t case 'toggle':\n\t if (this.config.loop.active) {\n\t this.config.loop.start = 0;\n\t this.config.loop.end = null;\n\t } else {\n\t this.config.loop.start = 0;\n\t this.config.loop.end = this.duration - 2;\n\t }\n\t break;\n\t default:\n\t this.config.loop.start = 0;\n\t this.config.loop.end = null;\n\t break;\n\t } */\n\t }\n\t /**\n\t * Get current loop state\n\t */\n\t ,\n\t get: function get() {\n\t return Boolean(this.media.loop);\n\t }\n\t /**\n\t * Set new media source\n\t * @param {Object} input - The new source object (see docs)\n\t */\n\n\t }, {\n\t key: \"source\",\n\t set: function set(input) {\n\t source.change.call(this, input);\n\t }\n\t /**\n\t * Get current source\n\t */\n\t ,\n\t get: function get() {\n\t return this.media.currentSrc;\n\t }\n\t /**\n\t * Get a download URL (either source or custom)\n\t */\n\n\t }, {\n\t key: \"download\",\n\t get: function get() {\n\t var download = this.config.urls.download;\n\t return is$2.url(download) ? download : this.source;\n\t }\n\t /**\n\t * Set the download URL\n\t */\n\t ,\n\t set: function set(input) {\n\t if (!is$2.url(input)) {\n\t return;\n\t }\n\n\t this.config.urls.download = input;\n\t controls.setDownloadUrl.call(this);\n\t }\n\t /**\n\t * Set the poster image for a video\n\t * @param {String} input - the URL for the new poster image\n\t */\n\n\t }, {\n\t key: \"poster\",\n\t set: function set(input) {\n\t if (!this.isVideo) {\n\t this.debug.warn('Poster can only be set for video');\n\t return;\n\t }\n\n\t ui.setPoster.call(this, input, false).catch(function () {});\n\t }\n\t /**\n\t * Get the current poster image\n\t */\n\t ,\n\t get: function get() {\n\t if (!this.isVideo) {\n\t return null;\n\t }\n\n\t return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n\t }\n\t /**\n\t * Get the current aspect ratio in use\n\t */\n\n\t }, {\n\t key: \"ratio\",\n\t get: function get() {\n\t if (!this.isVideo) {\n\t return null;\n\t }\n\n\t var ratio = reduceAspectRatio(getAspectRatio.call(this));\n\t return is$2.array(ratio) ? ratio.join(':') : ratio;\n\t }\n\t /**\n\t * Set video aspect ratio\n\t */\n\t ,\n\t set: function set(input) {\n\t if (!this.isVideo) {\n\t this.debug.warn('Aspect ratio can only be set for video');\n\t return;\n\t }\n\n\t if (!is$2.string(input) || !validateRatio(input)) {\n\t this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n\t return;\n\t }\n\n\t this.config.ratio = input;\n\t setAspectRatio.call(this);\n\t }\n\t /**\n\t * Set the autoplay state\n\t * @param {Boolean} input - Whether to autoplay or not\n\t */\n\n\t }, {\n\t key: \"autoplay\",\n\t set: function set(input) {\n\t var toggle = is$2.boolean(input) ? input : this.config.autoplay;\n\t this.config.autoplay = toggle;\n\t }\n\t /**\n\t * Get the current autoplay state\n\t */\n\t ,\n\t get: function get() {\n\t return Boolean(this.config.autoplay);\n\t }\n\t }, {\n\t key: \"currentTrack\",\n\t set: function set(input) {\n\t captions.set.call(this, input, false);\n\t }\n\t /**\n\t * Get the current caption track index (-1 if disabled)\n\t */\n\t ,\n\t get: function get() {\n\t var _this$captions = this.captions,\n\t toggled = _this$captions.toggled,\n\t currentTrack = _this$captions.currentTrack;\n\t return toggled ? currentTrack : -1;\n\t }\n\t /**\n\t * Set the wanted language for captions\n\t * Since tracks can be added later it won't update the actual caption track until there is a matching track\n\t * @param {String} - Two character ISO language code (e.g. EN, FR, PT, etc)\n\t */\n\n\t }, {\n\t key: \"language\",\n\t set: function set(input) {\n\t captions.setLanguage.call(this, input, false);\n\t }\n\t /**\n\t * Get the current track's language\n\t */\n\t ,\n\t get: function get() {\n\t return (captions.getCurrentTrack.call(this) || {}).language;\n\t }\n\t /**\n\t * Toggle picture-in-picture playback on WebKit/MacOS\n\t * TODO: update player with state, support, enabled\n\t * TODO: detect outside changes\n\t */\n\n\t }, {\n\t key: \"pip\",\n\t set: function set(input) {\n\t // Bail if no support\n\t if (!support.pip) {\n\t return;\n\t } // Toggle based on current state if not passed\n\n\n\t var toggle = is$2.boolean(input) ? input : !this.pip; // Toggle based on current state\n\t // Safari\n\n\t if (is$2.function(this.media.webkitSetPresentationMode)) {\n\t this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n\t } // Chrome\n\n\n\t if (is$2.function(this.media.requestPictureInPicture)) {\n\t if (!this.pip && toggle) {\n\t this.media.requestPictureInPicture();\n\t } else if (this.pip && !toggle) {\n\t document.exitPictureInPicture();\n\t }\n\t }\n\t }\n\t /**\n\t * Get the current picture-in-picture state\n\t */\n\t ,\n\t get: function get() {\n\t if (!support.pip) {\n\t return null;\n\t } // Safari\n\n\n\t if (!is$2.empty(this.media.webkitPresentationMode)) {\n\t return this.media.webkitPresentationMode === pip.active;\n\t } // Chrome\n\n\n\t return this.media === document.pictureInPictureElement;\n\t }\n\t /**\n\t * Trigger the airplay dialog\n\t * TODO: update player with state, support, enabled\n\t */\n\n\t }], [{\n\t key: \"supported\",\n\n\t /**\n\t * Check for support\n\t * @param {String} type - Player type (audio/video)\n\t * @param {String} provider - Provider (html5/youtube/vimeo)\n\t * @param {Boolean} inline - Where player has `playsinline` sttribute\n\t */\n\t value: function supported(type, provider, inline) {\n\t return support.check(type, provider, inline);\n\t }\n\t /**\n\t * Load an SVG sprite into the page\n\t * @param {String} url - URL for the SVG sprite\n\t * @param {String} [id] - Unique ID\n\t */\n\n\t }, {\n\t key: \"loadSprite\",\n\t value: function loadSprite$1(url, id) {\n\t return loadSprite(url, id);\n\t }\n\t /**\n\t * Setup multiple instances\n\t * @param {*} selector\n\t * @param {Object} options\n\t */\n\n\t }, {\n\t key: \"setup\",\n\t value: function setup(selector) {\n\t var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\t var targets = null;\n\n\t if (is$2.string(selector)) {\n\t targets = Array.from(document.querySelectorAll(selector));\n\t } else if (is$2.nodeList(selector)) {\n\t targets = Array.from(selector);\n\t } else if (is$2.array(selector)) {\n\t targets = selector.filter(is$2.element);\n\t }\n\n\t if (is$2.empty(targets)) {\n\t return null;\n\t }\n\n\t return targets.map(function (t) {\n\t return new Plyr(t, options);\n\t });\n\t }\n\t }]);\n\n\t return Plyr;\n\t}();\n\n\tPlyr.defaults = cloneDeep(defaults$2);\n\n\tvar sources = {\n\t video: {\n\t type: 'video',\n\t title: 'View From A Blue Moon',\n\t sources: [{\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-576p.mp4',\n\t type: 'video/mp4',\n\t size: 576\n\t }, {\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-720p.mp4',\n\t type: 'video/mp4',\n\t size: 720\n\t }, {\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1080p.mp4',\n\t type: 'video/mp4',\n\t size: 1080\n\t }, {\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-1440p.mp4',\n\t type: 'video/mp4',\n\t size: 1440\n\t }],\n\t poster: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg',\n\t tracks: [{\n\t kind: 'captions',\n\t label: 'English',\n\t srclang: 'en',\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',\n\t default: true\n\t }, {\n\t kind: 'captions',\n\t label: 'French',\n\t srclang: 'fr',\n\t src: 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt'\n\t }],\n\t previewThumbnails: {\n\t src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt']\n\t }\n\t },\n\t audio: {\n\t type: 'audio',\n\t title: 'Kishi Bashi &ndash; &ldquo;It All Began With A Burst&rdquo;',\n\t sources: [{\n\t src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.mp3',\n\t type: 'audio/mp3'\n\t }, {\n\t src: 'https://cdn.plyr.io/static/demo/Kishi_Bashi_-_It_All_Began_With_a_Burst.ogg',\n\t type: 'audio/ogg'\n\t }]\n\t },\n\t youtube: {\n\t type: 'video',\n\t sources: [{\n\t src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n\t provider: 'youtube'\n\t }]\n\t },\n\t vimeo: {\n\t type: 'video',\n\t sources: [{\n\t src: 'https://vimeo.com/40648169',\n\t provider: 'vimeo'\n\t }]\n\t }\n\t};\n\n\t// Toggle class on an element\n\tvar toggleClass$1 = function toggleClass(element) {\n\t var className = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n\t var toggle = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\t return element && element.classList[toggle ? 'add' : 'remove'](className);\n\t};\n\n\t(function () {\n\t var production = 'plyr.io'; // Sentry for demo site (https://plyr.io) only\n\n\t if (window.location.host === production) {\n\t init({\n\t dsn: 'https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555',\n\t whitelistUrls: [production].map(function (d) {\n\t return new RegExp(\"https://(([a-z0-9])+(.))*\".concat(d));\n\t })\n\t });\n\t }\n\n\t document.addEventListener('DOMContentLoaded', function () {\n\t var selector = '#player'; // Setup share buttons\n\n\t Shr.setup('.js-shr', {\n\t count: {\n\t className: 'button__count'\n\t },\n\t wrapper: {\n\t className: 'button--with-count'\n\t }\n\t }); // Setup the player\n\n\t var player = new Plyr(selector, {\n\t debug: true,\n\t title: 'View From A Blue Moon',\n\t iconUrl: 'dist/demo.svg',\n\t keyboard: {\n\t global: true\n\t },\n\t tooltips: {\n\t controls: true\n\t },\n\t captions: {\n\t active: true\n\t },\n\t ads: {\n\t enabled: window.location.host.includes(production),\n\t publisherId: '918848828995742'\n\t },\n\t previewThumbnails: {\n\t enabled: true,\n\t src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt']\n\t },\n\t vimeo: {\n\t // Prevent Vimeo blocking plyr.io demo site\n\t referrerPolicy: 'no-referrer'\n\t }\n\t }); // Expose for tinkering in the console\n\n\t window.player = player; // Setup type toggle\n\n\t var buttons = document.querySelectorAll('[data-source]');\n\t var types = Object.keys(sources);\n\t var historySupport = Boolean(window.history && window.history.pushState);\n\t var currentType = window.location.hash.substring(1);\n\t var hasInitialType = currentType.length;\n\n\t function render(type) {\n\t // Remove active classes\n\t Array.from(buttons).forEach(function (button) {\n\t return toggleClass$1(button.parentElement, 'active', false);\n\t }); // Set active on parent\n\n\t toggleClass$1(document.querySelector(\"[data-source=\\\"\".concat(type, \"\\\"]\")), 'active', true); // Show cite\n\n\t Array.from(document.querySelectorAll('.plyr__cite')).forEach(function (cite) {\n\t // eslint-disable-next-line no-param-reassign\n\t cite.hidden = true;\n\t });\n\t document.querySelector(\".plyr__cite--\".concat(type)).hidden = false;\n\t } // Set a new source\n\n\n\t function setSource(type, init) {\n\t // 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\t if (!types.includes(type) || !init && type === currentType || !currentType.length && type === 'video') {\n\t return;\n\t } // Set the new source\n\n\n\t player.source = sources[type]; // Set the current type for next time\n\n\t currentType = type;\n\t render(type);\n\t } // Bind to each button\n\n\n\t Array.from(buttons).forEach(function (button) {\n\t button.addEventListener('click', function () {\n\t var type = button.getAttribute('data-source');\n\t setSource(type);\n\n\t if (historySupport) {\n\t window.history.pushState({\n\t type: type\n\t }, '', \"#\".concat(type));\n\t }\n\t });\n\t }); // List for backwards/forwards\n\n\t window.addEventListener('popstate', function (event) {\n\t if (event.state && Object.keys(event.state).includes('type')) {\n\t setSource(event.state.type);\n\t }\n\t }); // If there's no current type set, assume video\n\n\t if (!hasInitialType) {\n\t currentType = 'video';\n\t } // Replace current history state\n\n\n\t if (historySupport && types.includes(currentType)) {\n\t window.history.replaceState({\n\t type: currentType\n\t }, '', hasInitialType ? \"#\".concat(currentType) : '');\n\t } // If it's not video, load the source\n\n\n\t if (currentType !== 'video') {\n\t setSource(currentType, true);\n\t }\n\n\t render(currentType);\n\t });\n\t})();\n\n}());\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\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 toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\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 (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.6.5',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) createNonEnumerableProperty(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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 requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","var anObject = require('../internals/an-object');\n\n// call something on iterator step with safe closing on error\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 (error) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n throw error;\n }\n};\n","module.exports = {};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (e) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (f) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? 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 ? ObjectPrototype : null;\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","// Setup tab focus\nconst container = document.getElementById('container');\nconst tabClassName = 'tab-focus';\n\n// Remove class on blur\ndocument.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\ndocument.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","// 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 params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\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","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\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 nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","// `Symbol.prototype.description` getter\n// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar isObject = require('../internals/is-object');\nvar defineProperty = require('../internals/object-define-property').f;\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = global.Symbol;\n\nif (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\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","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.appent` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\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(String(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 var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === '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 } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\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(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\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] = [String(value)];\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\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (\r\n (new URLSearchParams('?a=1').toString() === 'a=1') &&\r\n (typeof URLSearchParams.prototype.set === 'function') &&\r\n (typeof URLSearchParams.prototype.entries === 'function')\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.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 if (typeof proto._fromString !== 'function') {\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 if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\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\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 global.URL('b', 'http://a');\r\n u.pathname = 'c d';\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 var inputElement = doc.createElement('input');\r\n inputElement.type = 'url';\r\n inputElement.value = url;\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || (!inputElement.checkValidity() && !base)) {\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 global.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","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.asyncIterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.asynciterator\ndefineWellKnownSymbol('asyncIterator');\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n }\n});\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (classof(process) == 'process') {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(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 (\n global.addEventListener &&\n typeof postMessage == 'function' &&\n !global.importScripts &&\n !fails(post) &&\n location.protocol !== 'file:'\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar iterate = module.exports = function (iterable, fn, that, AS_ENTRIES, IS_ITERATOR) {\n var boundFunction = bind(fn, that, AS_ENTRIES ? 2 : 1);\n var iterator, iterFn, index, length, result, next, step;\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = AS_ENTRIES\n ? boundFunction(anObject(step = iterable[index])[0], step[1])\n : boundFunction(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n result = callWithSafeIterationClosing(iterator, boundFunction, step.value, AS_ENTRIES);\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n\niterate.stop = function (result) {\n return new Result(true, result);\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar classof = require('../internals/classof-raw');\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar IS_NODE = classof(process) == 'process';\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n } else if (MutationObserver && !IS_IOS) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\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 promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, 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\nmodule.exports = queueMicrotask || 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","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar classof = require('../internals/classof-raw');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar IS_NODE = classof(process) == 'process';\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && typeof PromiseRejectionEvent != 'function') return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (promise, state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can 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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(promise, state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (handler = global['on' + name]) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (promise, state) {\n task.call(global, function () {\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (promise, state) {\n task.call(global, function () {\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, promise, state, unwrap) {\n return function (value) {\n fn(promise, state, value, unwrap);\n };\n};\n\nvar internalReject = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(promise, state, true);\n};\n\nvar internalResolve = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, promise, wrapper, state),\n bind(internalReject, promise, wrapper, state)\n );\n } catch (error) {\n internalReject(promise, wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(promise, state, false);\n }\n } catch (error) {\n internalReject(promise, { done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n } catch (error) {\n internalReject(this, state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(this, state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, promise, state);\n this.reject = bind(internalReject, promise, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\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 $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\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 var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (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\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/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","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/** JSDoc */\n// eslint-disable-next-line import/export\nexport var Severity;\n(function (Severity) {\n /** JSDoc */\n Severity[\"Fatal\"] = \"fatal\";\n /** JSDoc */\n Severity[\"Error\"] = \"error\";\n /** JSDoc */\n Severity[\"Warning\"] = \"warning\";\n /** JSDoc */\n Severity[\"Log\"] = \"log\";\n /** JSDoc */\n Severity[\"Info\"] = \"info\";\n /** JSDoc */\n Severity[\"Debug\"] = \"debug\";\n /** JSDoc */\n Severity[\"Critical\"] = \"critical\";\n})(Severity || (Severity = {}));\n// eslint-disable-next-line @typescript-eslint/no-namespace, import/export\n(function (Severity) {\n /**\n * Converts a string-based level into a {@link Severity}.\n *\n * @param level string representation of Severity\n * @returns Severity\n */\n function fromString(level) {\n switch (level) {\n case 'debug':\n return Severity.Debug;\n case 'info':\n return Severity.Info;\n case 'warn':\n case 'warning':\n return Severity.Warning;\n case 'error':\n return Severity.Error;\n case 'fatal':\n return Severity.Fatal;\n case 'critical':\n return Severity.Critical;\n case 'log':\n default:\n return Severity.Log;\n }\n }\n Severity.fromString = fromString;\n})(Severity || (Severity = {}));\n//# sourceMappingURL=severity.js.map","/** The status of an event. */\n// eslint-disable-next-line import/export\nexport var Status;\n(function (Status) {\n /** The status could not be determined. */\n Status[\"Unknown\"] = \"unknown\";\n /** The event was skipped due to configuration or callbacks. */\n Status[\"Skipped\"] = \"skipped\";\n /** The event was sent to Sentry successfully. */\n Status[\"Success\"] = \"success\";\n /** The client is currently rate limited and will try again later. */\n Status[\"RateLimit\"] = \"rate_limit\";\n /** The event could not be processed. */\n Status[\"Invalid\"] = \"invalid\";\n /** A server-side error ocurred during submission. */\n Status[\"Failed\"] = \"failed\";\n})(Status || (Status = {}));\n// eslint-disable-next-line @typescript-eslint/no-namespace, import/export\n(function (Status) {\n /**\n * Converts a HTTP status code into a {@link Status}.\n *\n * @param code The HTTP response status code.\n * @returns The send status or {@link Status.Unknown}.\n */\n function fromHttpCode(code) {\n if (code >= 200 && code < 300) {\n return Status.Success;\n }\n if (code === 429) {\n return Status.RateLimit;\n }\n if (code >= 400 && code < 500) {\n return Status.Invalid;\n }\n if (code >= 500) {\n return Status.Failed;\n }\n return Status.Unknown;\n }\n Status.fromHttpCode = fromHttpCode;\n})(Status || (Status = {}));\n//# sourceMappingURL=status.js.map","var DESCRIPTORS = require('../internals/descriptors');\nvar defineProperty = require('../internals/object-define-property').f;\n\nvar FunctionPrototype = Function.prototype;\nvar FunctionPrototypeToString = FunctionPrototype.toString;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// Function instances `.name` property\n// https://tc39.github.io/ecma262/#sec-function-instances-name\nif (DESCRIPTORS && !(NAME in FunctionPrototype)) {\n defineProperty(FunctionPrototype, NAME, {\n configurable: true,\n get: function () {\n try {\n return FunctionPrototypeToString.call(this).match(nameRE)[1];\n } catch (error) {\n return '';\n }\n }\n });\n}\n","export var setPrototypeOf = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array ? setProtoOf : mixinProperties);\n/**\n * setPrototypeOf polyfill using __proto__\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction setProtoOf(obj, proto) {\n // @ts-ignore __proto__ does not exist on obj\n obj.__proto__ = proto;\n return obj;\n}\n/**\n * setPrototypeOf polyfill using mixin\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction mixinProperties(obj, proto) {\n for (var prop in proto) {\n // eslint-disable-next-line no-prototype-builtins\n if (!obj.hasOwnProperty(prop)) {\n // @ts-ignore typescript complains about indexing so we remove\n obj[prop] = proto[prop];\n }\n }\n return obj;\n}\n//# sourceMappingURL=polyfill.js.map","import { __extends } from \"tslib\";\nimport { setPrototypeOf } from './polyfill';\n/** An error emitted by Sentry SDKs and related utilities. */\nvar SentryError = /** @class */ (function (_super) {\n __extends(SentryError, _super);\n function SentryError(message) {\n var _newTarget = this.constructor;\n var _this = _super.call(this, message) || this;\n _this.message = message;\n _this.name = _newTarget.prototype.constructor.name;\n setPrototypeOf(_this, _newTarget.prototype);\n return _this;\n }\n return SentryError;\n}(Error));\nexport { SentryError };\n//# sourceMappingURL=error.js.map","/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/**\n * Checks whether given value's type is one of a few Error or Error-like\n * {@link isError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isError(wat) {\n switch (Object.prototype.toString.call(wat)) {\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 isInstanceOf(wat, Error);\n }\n}\n/**\n * Checks whether given value's type is ErrorEvent\n * {@link isErrorEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isErrorEvent(wat) {\n return Object.prototype.toString.call(wat) === '[object ErrorEvent]';\n}\n/**\n * Checks whether given value's type is DOMError\n * {@link isDOMError}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMError(wat) {\n return Object.prototype.toString.call(wat) === '[object DOMError]';\n}\n/**\n * Checks whether given value's type is DOMException\n * {@link isDOMException}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isDOMException(wat) {\n return Object.prototype.toString.call(wat) === '[object DOMException]';\n}\n/**\n * Checks whether given value's type is a string\n * {@link isString}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isString(wat) {\n return Object.prototype.toString.call(wat) === '[object String]';\n}\n/**\n * Checks whether given value's is a primitive (undefined, null, number, boolean, string)\n * {@link isPrimitive}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPrimitive(wat) {\n return wat === null || (typeof wat !== 'object' && typeof wat !== 'function');\n}\n/**\n * Checks whether given value's type is an object literal\n * {@link isPlainObject}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isPlainObject(wat) {\n return Object.prototype.toString.call(wat) === '[object Object]';\n}\n/**\n * Checks whether given value's type is an Event instance\n * {@link isEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isEvent(wat) {\n return typeof Event !== 'undefined' && isInstanceOf(wat, Event);\n}\n/**\n * Checks whether given value's type is an Element instance\n * {@link isElement}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isElement(wat) {\n return typeof Element !== 'undefined' && isInstanceOf(wat, Element);\n}\n/**\n * Checks whether given value's type is an regexp\n * {@link isRegExp}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isRegExp(wat) {\n return Object.prototype.toString.call(wat) === '[object RegExp]';\n}\n/**\n * Checks whether given value has a then function.\n * @param wat A value to be checked.\n */\nexport function isThenable(wat) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return Boolean(wat && wat.then && typeof wat.then === 'function');\n}\n/**\n * Checks whether given value's type is a SyntheticEvent\n * {@link isSyntheticEvent}.\n *\n * @param wat A value to be checked.\n * @returns A boolean representing the result.\n */\nexport function isSyntheticEvent(wat) {\n return isPlainObject(wat) && 'nativeEvent' in wat && 'preventDefault' in wat && 'stopPropagation' in wat;\n}\n/**\n * Checks whether given value's type is an instance of provided constructor.\n * {@link isInstanceOf}.\n *\n * @param wat A value to be checked.\n * @param base A constructor to be used in a check.\n * @returns A boolean representing the result.\n */\nexport function isInstanceOf(wat, base) {\n try {\n return wat instanceof base;\n }\n catch (_e) {\n return false;\n }\n}\n//# sourceMappingURL=is.js.map","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","module.exports = typeof ArrayBuffer !== 'undefined' && typeof DataView !== 'undefined';\n","'use strict';\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar uid = require('../internals/uid');\n\nvar Int8Array = global.Int8Array;\nvar Int8ArrayPrototype = Int8Array && Int8Array.prototype;\nvar Uint8ClampedArray = global.Uint8ClampedArray;\nvar Uint8ClampedArrayPrototype = Uint8ClampedArray && Uint8ClampedArray.prototype;\nvar TypedArray = Int8Array && getPrototypeOf(Int8Array);\nvar TypedArrayPrototype = Int8ArrayPrototype && getPrototypeOf(Int8ArrayPrototype);\nvar ObjectPrototype = Object.prototype;\nvar isPrototypeOf = ObjectPrototype.isPrototypeOf;\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar TYPED_ARRAY_TAG = uid('TYPED_ARRAY_TAG');\n// Fixing native typed arrays in Opera Presto crashes the browser, see #595\nvar NATIVE_ARRAY_BUFFER_VIEWS = NATIVE_ARRAY_BUFFER && !!setPrototypeOf && classof(global.opera) !== 'Opera';\nvar TYPED_ARRAY_TAG_REQIRED = false;\nvar NAME;\n\nvar TypedArrayConstructorsList = {\n Int8Array: 1,\n Uint8Array: 1,\n Uint8ClampedArray: 1,\n Int16Array: 2,\n Uint16Array: 2,\n Int32Array: 4,\n Uint32Array: 4,\n Float32Array: 4,\n Float64Array: 8\n};\n\nvar isView = function isView(it) {\n var klass = classof(it);\n return klass === 'DataView' || has(TypedArrayConstructorsList, klass);\n};\n\nvar isTypedArray = function (it) {\n return isObject(it) && has(TypedArrayConstructorsList, classof(it));\n};\n\nvar aTypedArray = function (it) {\n if (isTypedArray(it)) return it;\n throw TypeError('Target is not a typed array');\n};\n\nvar aTypedArrayConstructor = function (C) {\n if (setPrototypeOf) {\n if (isPrototypeOf.call(TypedArray, C)) return C;\n } else for (var ARRAY in TypedArrayConstructorsList) if (has(TypedArrayConstructorsList, NAME)) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (C === TypedArrayConstructor || isPrototypeOf.call(TypedArrayConstructor, C))) {\n return C;\n }\n } throw TypeError('Target is not a typed array constructor');\n};\n\nvar exportTypedArrayMethod = function (KEY, property, forced) {\n if (!DESCRIPTORS) return;\n if (forced) for (var ARRAY in TypedArrayConstructorsList) {\n var TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor.prototype, KEY)) {\n delete TypedArrayConstructor.prototype[KEY];\n }\n }\n if (!TypedArrayPrototype[KEY] || forced) {\n redefine(TypedArrayPrototype, KEY, forced ? property\n : NATIVE_ARRAY_BUFFER_VIEWS && Int8ArrayPrototype[KEY] || property);\n }\n};\n\nvar exportTypedArrayStaticMethod = function (KEY, property, forced) {\n var ARRAY, TypedArrayConstructor;\n if (!DESCRIPTORS) return;\n if (setPrototypeOf) {\n if (forced) for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && has(TypedArrayConstructor, KEY)) {\n delete TypedArrayConstructor[KEY];\n }\n }\n if (!TypedArray[KEY] || forced) {\n // V8 ~ Chrome 49-50 `%TypedArray%` methods are non-writable non-configurable\n try {\n return redefine(TypedArray, KEY, forced ? property : NATIVE_ARRAY_BUFFER_VIEWS && Int8Array[KEY] || property);\n } catch (error) { /* empty */ }\n } else return;\n }\n for (ARRAY in TypedArrayConstructorsList) {\n TypedArrayConstructor = global[ARRAY];\n if (TypedArrayConstructor && (!TypedArrayConstructor[KEY] || forced)) {\n redefine(TypedArrayConstructor, KEY, property);\n }\n }\n};\n\nfor (NAME in TypedArrayConstructorsList) {\n if (!global[NAME]) NATIVE_ARRAY_BUFFER_VIEWS = false;\n}\n\n// WebKit bug - typed arrays constructors prototype is Object.prototype\nif (!NATIVE_ARRAY_BUFFER_VIEWS || typeof TypedArray != 'function' || TypedArray === Function.prototype) {\n // eslint-disable-next-line no-shadow\n TypedArray = function TypedArray() {\n throw TypeError('Incorrect invocation');\n };\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME], TypedArray);\n }\n}\n\nif (!NATIVE_ARRAY_BUFFER_VIEWS || !TypedArrayPrototype || TypedArrayPrototype === ObjectPrototype) {\n TypedArrayPrototype = TypedArray.prototype;\n if (NATIVE_ARRAY_BUFFER_VIEWS) for (NAME in TypedArrayConstructorsList) {\n if (global[NAME]) setPrototypeOf(global[NAME].prototype, TypedArrayPrototype);\n }\n}\n\n// WebKit bug - one more object in Uint8ClampedArray prototype chain\nif (NATIVE_ARRAY_BUFFER_VIEWS && getPrototypeOf(Uint8ClampedArrayPrototype) !== TypedArrayPrototype) {\n setPrototypeOf(Uint8ClampedArrayPrototype, TypedArrayPrototype);\n}\n\nif (DESCRIPTORS && !has(TypedArrayPrototype, TO_STRING_TAG)) {\n TYPED_ARRAY_TAG_REQIRED = true;\n defineProperty(TypedArrayPrototype, TO_STRING_TAG, { get: function () {\n return isObject(this) ? this[TYPED_ARRAY_TAG] : undefined;\n } });\n for (NAME in TypedArrayConstructorsList) if (global[NAME]) {\n createNonEnumerableProperty(global[NAME], TYPED_ARRAY_TAG, NAME);\n }\n}\n\nmodule.exports = {\n NATIVE_ARRAY_BUFFER_VIEWS: NATIVE_ARRAY_BUFFER_VIEWS,\n TYPED_ARRAY_TAG: TYPED_ARRAY_TAG_REQIRED && TYPED_ARRAY_TAG,\n aTypedArray: aTypedArray,\n aTypedArrayConstructor: aTypedArrayConstructor,\n exportTypedArrayMethod: exportTypedArrayMethod,\n exportTypedArrayStaticMethod: exportTypedArrayStaticMethod,\n isView: isView,\n isTypedArray: isTypedArray,\n TypedArray: TypedArray,\n TypedArrayPrototype: TypedArrayPrototype\n};\n","/* eslint-disable no-new */\nvar global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar NATIVE_ARRAY_BUFFER_VIEWS = require('../internals/array-buffer-view-core').NATIVE_ARRAY_BUFFER_VIEWS;\n\nvar ArrayBuffer = global.ArrayBuffer;\nvar Int8Array = global.Int8Array;\n\nmodule.exports = !NATIVE_ARRAY_BUFFER_VIEWS || !fails(function () {\n Int8Array(1);\n}) || !fails(function () {\n new Int8Array(-1);\n}) || !checkCorrectnessOfIteration(function (iterable) {\n new Int8Array();\n new Int8Array(null);\n new Int8Array(1.5);\n new Int8Array(iterable);\n}, true) || fails(function () {\n // Safari (11+) bug - a reason why even Safari 13 should load a typed array polyfill\n return new Int8Array(new ArrayBuffer(2), 1, undefined).length !== 1;\n});\n","var toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\n\n// `ToIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-toindex\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 or index');\n return length;\n};\n","// IEEE754 conversions based on https://github.com/feross/ieee754\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = 1 / 0;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\n\nvar pack = function (number, mantissaLength, bytes) {\n var buffer = new Array(bytes);\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var rt = mantissaLength === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var sign = number < 0 || number === 0 && 1 / number < 0 ? 1 : 0;\n var index = 0;\n var exponent, mantissa, c;\n number = abs(number);\n // eslint-disable-next-line no-self-compare\n if (number != number || number === Infinity) {\n // eslint-disable-next-line no-self-compare\n mantissa = number != number ? 1 : 0;\n exponent = eMax;\n } else {\n exponent = floor(log(number) / LN2);\n if (number * (c = pow(2, -exponent)) < 1) {\n exponent--;\n c *= 2;\n }\n if (exponent + eBias >= 1) {\n number += rt / c;\n } else {\n number += rt * pow(2, 1 - eBias);\n }\n if (number * c >= 2) {\n exponent++;\n c /= 2;\n }\n if (exponent + eBias >= eMax) {\n mantissa = 0;\n exponent = eMax;\n } else if (exponent + eBias >= 1) {\n mantissa = (number * c - 1) * pow(2, mantissaLength);\n exponent = exponent + eBias;\n } else {\n mantissa = number * pow(2, eBias - 1) * pow(2, mantissaLength);\n exponent = 0;\n }\n }\n for (; mantissaLength >= 8; buffer[index++] = mantissa & 255, mantissa /= 256, mantissaLength -= 8);\n exponent = exponent << mantissaLength | mantissa;\n exponentLength += mantissaLength;\n for (; exponentLength > 0; buffer[index++] = exponent & 255, exponent /= 256, exponentLength -= 8);\n buffer[--index] |= sign * 128;\n return buffer;\n};\n\nvar unpack = function (buffer, mantissaLength) {\n var bytes = buffer.length;\n var exponentLength = bytes * 8 - mantissaLength - 1;\n var eMax = (1 << exponentLength) - 1;\n var eBias = eMax >> 1;\n var nBits = exponentLength - 7;\n var index = bytes - 1;\n var sign = buffer[index--];\n var exponent = sign & 127;\n var mantissa;\n sign >>= 7;\n for (; nBits > 0; exponent = exponent * 256 + buffer[index], index--, nBits -= 8);\n mantissa = exponent & (1 << -nBits) - 1;\n exponent >>= -nBits;\n nBits += mantissaLength;\n for (; nBits > 0; mantissa = mantissa * 256 + buffer[index], index--, nBits -= 8);\n if (exponent === 0) {\n exponent = 1 - eBias;\n } else if (exponent === eMax) {\n return mantissa ? NaN : sign ? -Infinity : Infinity;\n } else {\n mantissa = mantissa + pow(2, mantissaLength);\n exponent = exponent - eBias;\n } return (sign ? -1 : 1) * mantissa * pow(2, exponent - mantissaLength);\n};\n\nmodule.exports = {\n pack: pack,\n unpack: unpack\n};\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.fill` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.fill\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var argumentsLength = arguments.length;\n var index = toAbsoluteIndex(argumentsLength > 1 ? arguments[1] : undefined, length);\n var end = argumentsLength > 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","'use strict';\nvar global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_ARRAY_BUFFER = require('../internals/array-buffer-native');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefineAll = require('../internals/redefine-all');\nvar fails = require('../internals/fails');\nvar anInstance = require('../internals/an-instance');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar IEEE754 = require('../internals/ieee754');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar arrayFill = require('../internals/array-fill');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length';\nvar WRONG_INDEX = 'Wrong index';\nvar NativeArrayBuffer = global[ARRAY_BUFFER];\nvar $ArrayBuffer = NativeArrayBuffer;\nvar $DataView = global[DATA_VIEW];\nvar $DataViewPrototype = $DataView && $DataView[PROTOTYPE];\nvar ObjectPrototype = Object.prototype;\nvar RangeError = global.RangeError;\n\nvar packIEEE754 = IEEE754.pack;\nvar unpackIEEE754 = IEEE754.unpack;\n\nvar packInt8 = function (number) {\n return [number & 0xFF];\n};\n\nvar packInt16 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF];\n};\n\nvar packInt32 = function (number) {\n return [number & 0xFF, number >> 8 & 0xFF, number >> 16 & 0xFF, number >> 24 & 0xFF];\n};\n\nvar unpackInt32 = function (buffer) {\n return buffer[3] << 24 | buffer[2] << 16 | buffer[1] << 8 | buffer[0];\n};\n\nvar packFloat32 = function (number) {\n return packIEEE754(number, 23, 4);\n};\n\nvar packFloat64 = function (number) {\n return packIEEE754(number, 52, 8);\n};\n\nvar addGetter = function (Constructor, key) {\n defineProperty(Constructor[PROTOTYPE], key, { get: function () { return getInternalState(this)[key]; } });\n};\n\nvar get = function (view, count, index, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = bytes.slice(start, start + count);\n return isLittleEndian ? pack : pack.reverse();\n};\n\nvar set = function (view, count, index, conversion, value, isLittleEndian) {\n var intIndex = toIndex(index);\n var store = getInternalState(view);\n if (intIndex + count > store.byteLength) throw RangeError(WRONG_INDEX);\n var bytes = getInternalState(store.buffer).bytes;\n var start = intIndex + store.byteOffset;\n var pack = conversion(+value);\n for (var i = 0; i < count; i++) bytes[start + i] = pack[isLittleEndian ? i : count - i - 1];\n};\n\nif (!NATIVE_ARRAY_BUFFER) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n setInternalState(this, {\n bytes: arrayFill.call(new Array(byteLength), 0),\n byteLength: byteLength\n });\n if (!DESCRIPTORS) this.byteLength = 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 = getInternalState(buffer).byteLength;\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 setInternalState(this, {\n buffer: buffer,\n byteLength: byteLength,\n byteOffset: offset\n });\n if (!DESCRIPTORS) {\n this.buffer = buffer;\n this.byteLength = byteLength;\n this.byteOffset = offset;\n }\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, 'byteLength');\n addGetter($DataView, 'buffer');\n addGetter($DataView, 'byteLength');\n addGetter($DataView, 'byteOffset');\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.length > 1 ? arguments[1] : undefined);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments.length > 1 ? arguments[1] : undefined);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackInt32(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined)) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 23);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments.length > 1 ? arguments[1] : undefined), 52);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packInt8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packInt16, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packInt32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packFloat32, value, arguments.length > 2 ? arguments[2] : undefined);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packFloat64, value, arguments.length > 2 ? arguments[2] : undefined);\n }\n });\n} else {\n if (!fails(function () {\n NativeArrayBuffer(1);\n }) || !fails(function () {\n new NativeArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new NativeArrayBuffer(); // eslint-disable-line no-new\n new NativeArrayBuffer(1.5); // eslint-disable-line no-new\n new NativeArrayBuffer(NaN); // eslint-disable-line no-new\n return NativeArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new NativeArrayBuffer(toIndex(length));\n };\n var ArrayBufferPrototype = $ArrayBuffer[PROTOTYPE] = NativeArrayBuffer[PROTOTYPE];\n for (var keys = getOwnPropertyNames(NativeArrayBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) {\n createNonEnumerableProperty($ArrayBuffer, key, NativeArrayBuffer[key]);\n }\n }\n ArrayBufferPrototype.constructor = $ArrayBuffer;\n }\n\n // WebKit bug - the same parent prototype for typed arrays and data view\n if (setPrototypeOf && getPrototypeOf($DataViewPrototype) !== ObjectPrototype) {\n setPrototypeOf($DataViewPrototype, ObjectPrototype);\n }\n\n // iOS Safari 7.x bug\n var testView = new $DataView(new $ArrayBuffer(2));\n var nativeSetInt8 = $DataViewPrototype.setInt8;\n testView.setInt8(0, 2147483648);\n testView.setInt8(1, 2147483649);\n if (testView.getInt8(0) || !testView.getInt8(1)) redefineAll($DataViewPrototype, {\n setInt8: function setInt8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n nativeSetInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, { unsafe: true });\n}\n\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\n\nmodule.exports = {\n ArrayBuffer: $ArrayBuffer,\n DataView: $DataView\n};\n","var toPositiveInteger = require('../internals/to-positive-integer');\n\nmodule.exports = function (it, BYTES) {\n var offset = toPositiveInteger(it);\n if (offset % BYTES) throw RangeError('Wrong offset');\n return offset;\n};\n","var toInteger = require('../internals/to-integer');\n\nmodule.exports = function (it) {\n var result = toInteger(it);\n if (result < 0) throw RangeError(\"The argument can't be less than 0\");\n return result;\n};\n","var toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar bind = require('../internals/function-bind-context');\nvar aTypedArrayConstructor = require('../internals/array-buffer-view-core').aTypedArrayConstructor;\n\nmodule.exports = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var i, length, result, step, iterator, next;\n if (iteratorMethod != undefined && !isArrayIteratorMethod(iteratorMethod)) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n O = [];\n while (!(step = next.call(iterator)).done) {\n O.push(step.value);\n }\n }\n if (mapping && argumentsLength > 2) {\n mapfn = bind(mapfn, arguments[2], 2);\n }\n length = toLength(O.length);\n result = new (aTypedArrayConstructor(this))(length);\n for (i = 0; length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS = require('../internals/typed-array-constructors-require-wrappers');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayBufferModule = require('../internals/array-buffer');\nvar anInstance = require('../internals/an-instance');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar toLength = require('../internals/to-length');\nvar toIndex = require('../internals/to-index');\nvar toOffset = require('../internals/to-offset');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar typedArrayFrom = require('../internals/typed-array-from');\nvar forEach = require('../internals/array-iteration').forEach;\nvar setSpecies = require('../internals/set-species');\nvar definePropertyModule = require('../internals/object-define-property');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar InternalStateModule = require('../internals/internal-state');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar round = Math.round;\nvar RangeError = global.RangeError;\nvar ArrayBuffer = ArrayBufferModule.ArrayBuffer;\nvar DataView = ArrayBufferModule.DataView;\nvar NATIVE_ARRAY_BUFFER_VIEWS = ArrayBufferViewCore.NATIVE_ARRAY_BUFFER_VIEWS;\nvar TYPED_ARRAY_TAG = ArrayBufferViewCore.TYPED_ARRAY_TAG;\nvar TypedArray = ArrayBufferViewCore.TypedArray;\nvar TypedArrayPrototype = ArrayBufferViewCore.TypedArrayPrototype;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar isTypedArray = ArrayBufferViewCore.isTypedArray;\nvar BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\nvar WRONG_LENGTH = 'Wrong length';\n\nvar fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n};\n\nvar addGetter = function (it, key) {\n nativeDefineProperty(it, key, { get: function () {\n return getInternalState(this)[key];\n } });\n};\n\nvar isArrayBuffer = function (it) {\n var klass;\n return it instanceof ArrayBuffer || (klass = classof(it)) == 'ArrayBuffer' || klass == 'SharedArrayBuffer';\n};\n\nvar isTypedArrayIndex = function (target, key) {\n return isTypedArray(target)\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n};\n\nvar wrappedGetOwnPropertyDescriptor = function getOwnPropertyDescriptor(target, key) {\n return isTypedArrayIndex(target, key = toPrimitive(key, true))\n ? createPropertyDescriptor(2, target[key])\n : nativeGetOwnPropertyDescriptor(target, key);\n};\n\nvar wrappedDefineProperty = function defineProperty(target, key, descriptor) {\n if (isTypedArrayIndex(target, key = toPrimitive(key, true))\n && isObject(descriptor)\n && has(descriptor, 'value')\n && !has(descriptor, 'get')\n && !has(descriptor, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !descriptor.configurable\n && (!has(descriptor, 'writable') || descriptor.writable)\n && (!has(descriptor, 'enumerable') || descriptor.enumerable)\n ) {\n target[key] = descriptor.value;\n return target;\n } return nativeDefineProperty(target, key, descriptor);\n};\n\nif (DESCRIPTORS) {\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n getOwnPropertyDescriptorModule.f = wrappedGetOwnPropertyDescriptor;\n definePropertyModule.f = wrappedDefineProperty;\n addGetter(TypedArrayPrototype, 'buffer');\n addGetter(TypedArrayPrototype, 'byteOffset');\n addGetter(TypedArrayPrototype, 'byteLength');\n addGetter(TypedArrayPrototype, 'length');\n }\n\n $({ target: 'Object', stat: true, forced: !NATIVE_ARRAY_BUFFER_VIEWS }, {\n getOwnPropertyDescriptor: wrappedGetOwnPropertyDescriptor,\n defineProperty: wrappedDefineProperty\n });\n\n module.exports = function (TYPE, wrapper, CLAMPED) {\n var BYTES = TYPE.match(/\\d+$/)[0] / 8;\n var CONSTRUCTOR_NAME = TYPE + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + TYPE;\n var SETTER = 'set' + TYPE;\n var NativeTypedArrayConstructor = global[CONSTRUCTOR_NAME];\n var TypedArrayConstructor = NativeTypedArrayConstructor;\n var TypedArrayConstructorPrototype = TypedArrayConstructor && TypedArrayConstructor.prototype;\n var exported = {};\n\n var getter = function (that, index) {\n var data = getInternalState(that);\n return data.view[GETTER](index * BYTES + data.byteOffset, true);\n };\n\n var setter = function (that, index, value) {\n var data = getInternalState(that);\n if (CLAMPED) value = (value = round(value)) < 0 ? 0 : value > 0xFF ? 0xFF : value & 0xFF;\n data.view[SETTER](index * BYTES + data.byteOffset, value, true);\n };\n\n var addElement = function (that, index) {\n nativeDefineProperty(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\n if (!NATIVE_ARRAY_BUFFER_VIEWS) {\n TypedArrayConstructor = wrapper(function (that, data, offset, $length) {\n anInstance(that, TypedArrayConstructor, CONSTRUCTOR_NAME);\n var index = 0;\n var byteOffset = 0;\n var buffer, byteLength, length;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new ArrayBuffer(byteLength);\n } else if (isArrayBuffer(data)) {\n buffer = data;\n byteOffset = toOffset(offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - byteOffset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + byteOffset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (isTypedArray(data)) {\n return fromList(TypedArrayConstructor, data);\n } else {\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }\n setInternalState(that, {\n buffer: buffer,\n byteOffset: byteOffset,\n byteLength: byteLength,\n length: length,\n view: new DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n TypedArrayConstructorPrototype = TypedArrayConstructor.prototype = create(TypedArrayPrototype);\n } else if (TYPED_ARRAYS_CONSTRUCTORS_REQUIRES_WRAPPERS) {\n TypedArrayConstructor = wrapper(function (dummy, data, typedArrayOffset, $length) {\n anInstance(dummy, TypedArrayConstructor, CONSTRUCTOR_NAME);\n return inheritIfRequired(function () {\n if (!isObject(data)) return new NativeTypedArrayConstructor(toIndex(data));\n if (isArrayBuffer(data)) return $length !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES), $length)\n : typedArrayOffset !== undefined\n ? new NativeTypedArrayConstructor(data, toOffset(typedArrayOffset, BYTES))\n : new NativeTypedArrayConstructor(data);\n if (isTypedArray(data)) return fromList(TypedArrayConstructor, data);\n return typedArrayFrom.call(TypedArrayConstructor, data);\n }(), dummy, TypedArrayConstructor);\n });\n\n if (setPrototypeOf) setPrototypeOf(TypedArrayConstructor, TypedArray);\n forEach(getOwnPropertyNames(NativeTypedArrayConstructor), function (key) {\n if (!(key in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, key, NativeTypedArrayConstructor[key]);\n }\n });\n TypedArrayConstructor.prototype = TypedArrayConstructorPrototype;\n }\n\n if (TypedArrayConstructorPrototype.constructor !== TypedArrayConstructor) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, 'constructor', TypedArrayConstructor);\n }\n\n if (TYPED_ARRAY_TAG) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, TYPED_ARRAY_TAG, CONSTRUCTOR_NAME);\n }\n\n exported[CONSTRUCTOR_NAME] = TypedArrayConstructor;\n\n $({\n global: true, forced: TypedArrayConstructor != NativeTypedArrayConstructor, sham: !NATIVE_ARRAY_BUFFER_VIEWS\n }, exported);\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructor)) {\n createNonEnumerableProperty(TypedArrayConstructor, BYTES_PER_ELEMENT, BYTES);\n }\n\n if (!(BYTES_PER_ELEMENT in TypedArrayConstructorPrototype)) {\n createNonEnumerableProperty(TypedArrayConstructorPrototype, BYTES_PER_ELEMENT, BYTES);\n }\n\n setSpecies(CONSTRUCTOR_NAME);\n };\n} else module.exports = function () { /* empty */ };\n","var createTypedArrayConstructor = require('../internals/typed-array-constructor');\n\n// `Uint16Array` constructor\n// https://tc39.github.io/ecma262/#sec-typedarray-objects\ncreateTypedArrayConstructor('Uint16', function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","'use strict';\nvar toObject = require('../internals/to-object');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\n\nvar min = Math.min;\n\n// `Array.prototype.copyWithin` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.copywithin\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 = 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","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $copyWithin = require('../internals/array-copy-within');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.copyWithin` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.copywithin\nexportTypedArrayMethod('copyWithin', function copyWithin(target, start /* , end */) {\n return $copyWithin.call(aTypedArray(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $every = require('../internals/array-iteration').every;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.every\nexportTypedArrayMethod('every', function every(callbackfn /* , thisArg */) {\n return $every(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $fill = require('../internals/array-fill');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.fill` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.fill\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('fill', function fill(value /* , start, end */) {\n return $fill.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $filter = require('../internals/array-iteration').filter;\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.filter\nexportTypedArrayMethod('filter', function filter(callbackfn /* , thisArg */) {\n var list = $filter(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $find = require('../internals/array-iteration').find;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.find\nexportTypedArrayMethod('find', function find(predicate /* , thisArg */) {\n return $find(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $findIndex = require('../internals/array-iteration').findIndex;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.findindex\nexportTypedArrayMethod('findIndex', function findIndex(predicate /* , thisArg */) {\n return $findIndex(aTypedArray(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.foreach\nexportTypedArrayMethod('forEach', function forEach(callbackfn /* , thisArg */) {\n $forEach(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $includes = require('../internals/array-includes').includes;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.includes\nexportTypedArrayMethod('includes', function includes(searchElement /* , fromIndex */) {\n return $includes(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $indexOf = require('../internals/array-includes').indexOf;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.indexof\nexportTypedArrayMethod('indexOf', function indexOf(searchElement /* , fromIndex */) {\n return $indexOf(aTypedArray(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar global = require('../internals/global');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar ArrayIterators = require('../modules/es.array.iterator');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar Uint8Array = global.Uint8Array;\nvar arrayValues = ArrayIterators.values;\nvar arrayKeys = ArrayIterators.keys;\nvar arrayEntries = ArrayIterators.entries;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar nativeTypedArrayIterator = Uint8Array && Uint8Array.prototype[ITERATOR];\n\nvar CORRECT_ITER_NAME = !!nativeTypedArrayIterator\n && (nativeTypedArrayIterator.name == 'values' || nativeTypedArrayIterator.name == undefined);\n\nvar typedArrayValues = function values() {\n return arrayValues.call(aTypedArray(this));\n};\n\n// `%TypedArray%.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.entries\nexportTypedArrayMethod('entries', function entries() {\n return arrayEntries.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.keys\nexportTypedArrayMethod('keys', function keys() {\n return arrayKeys.call(aTypedArray(this));\n});\n// `%TypedArray%.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.values\nexportTypedArrayMethod('values', typedArrayValues, !CORRECT_ITER_NAME);\n// `%TypedArray%.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype-@@iterator\nexportTypedArrayMethod(ITERATOR, typedArrayValues, !CORRECT_ITER_NAME);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $join = [].join;\n\n// `%TypedArray%.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.join\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('join', function join(separator) {\n return $join.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $lastIndexOf = require('../internals/array-last-index-of');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.lastindexof\n// eslint-disable-next-line no-unused-vars\nexportTypedArrayMethod('lastIndexOf', function lastIndexOf(searchElement /* , fromIndex */) {\n return $lastIndexOf.apply(aTypedArray(this), arguments);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $map = require('../internals/array-iteration').map;\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.map\nexportTypedArrayMethod('map', function map(mapfn /* , thisArg */) {\n return $map(aTypedArray(this), mapfn, arguments.length > 1 ? arguments[1] : undefined, function (O, length) {\n return new (aTypedArrayConstructor(speciesConstructor(O, O.constructor)))(length);\n });\n});\n","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $reduce = require('../internals/array-reduce').left;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduce\nexportTypedArrayMethod('reduce', function reduce(callbackfn /* , initialValue */) {\n return $reduce(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $reduceRight = require('../internals/array-reduce').right;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.reduceRicht` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reduceright\nexportTypedArrayMethod('reduceRight', function reduceRight(callbackfn /* , initialValue */) {\n return $reduceRight(aTypedArray(this), callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar floor = Math.floor;\n\n// `%TypedArray%.prototype.reverse` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.reverse\nexportTypedArrayMethod('reverse', function reverse() {\n var that = this;\n var length = aTypedArray(that).length;\n var middle = 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","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toOffset = require('../internals/to-offset');\nvar toObject = require('../internals/to-object');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line no-undef\n new Int8Array(1).set({});\n});\n\n// `%TypedArray%.prototype.set` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.set\nexportTypedArrayMethod('set', function set(arrayLike /* , offset */) {\n aTypedArray(this);\n var offset = toOffset(arguments.length > 1 ? arguments[1] : undefined, 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}, FORCED);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar speciesConstructor = require('../internals/species-constructor');\nvar fails = require('../internals/fails');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar aTypedArrayConstructor = ArrayBufferViewCore.aTypedArrayConstructor;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $slice = [].slice;\n\nvar FORCED = fails(function () {\n // eslint-disable-next-line no-undef\n new Int8Array(1).slice();\n});\n\n// `%TypedArray%.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.slice\nexportTypedArrayMethod('slice', function slice(start, end) {\n var list = $slice.call(aTypedArray(this), start, end);\n var C = speciesConstructor(this, this.constructor);\n var index = 0;\n var length = list.length;\n var result = new (aTypedArrayConstructor(C))(length);\n while (length > index) result[index] = list[index++];\n return result;\n}, FORCED);\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar $some = require('../internals/array-iteration').some;\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.some\nexportTypedArrayMethod('some', function some(callbackfn /* , thisArg */) {\n return $some(aTypedArray(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $sort = [].sort;\n\n// `%TypedArray%.prototype.sort` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.sort\nexportTypedArrayMethod('sort', function sort(comparefn) {\n return $sort.call(aTypedArray(this), comparefn);\n});\n","'use strict';\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar speciesConstructor = require('../internals/species-constructor');\n\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\n\n// `%TypedArray%.prototype.subarray` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.subarray\nexportTypedArrayMethod('subarray', function subarray(begin, end) {\n var O = aTypedArray(this);\n var length = O.length;\n var beginIndex = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O.constructor))(\n O.buffer,\n O.byteOffset + beginIndex * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - beginIndex)\n );\n});\n","'use strict';\nvar global = require('../internals/global');\nvar ArrayBufferViewCore = require('../internals/array-buffer-view-core');\nvar fails = require('../internals/fails');\n\nvar Int8Array = global.Int8Array;\nvar aTypedArray = ArrayBufferViewCore.aTypedArray;\nvar exportTypedArrayMethod = ArrayBufferViewCore.exportTypedArrayMethod;\nvar $toLocaleString = [].toLocaleString;\nvar $slice = [].slice;\n\n// iOS Safari 6.x fails here\nvar TO_LOCALE_STRING_BUG = !!Int8Array && fails(function () {\n $toLocaleString.call(new Int8Array(1));\n});\n\nvar FORCED = fails(function () {\n return [1, 2].toLocaleString() != new Int8Array([1, 2]).toLocaleString();\n}) || !fails(function () {\n Int8Array.prototype.toLocaleString.call([1, 2]);\n});\n\n// `%TypedArray%.prototype.toLocaleString` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tolocalestring\nexportTypedArrayMethod('toLocaleString', function toLocaleString() {\n return $toLocaleString.apply(TO_LOCALE_STRING_BUG ? $slice.call(aTypedArray(this)) : aTypedArray(this), arguments);\n}, FORCED);\n","'use strict';\nvar exportTypedArrayMethod = require('../internals/array-buffer-view-core').exportTypedArrayMethod;\nvar fails = require('../internals/fails');\nvar global = require('../internals/global');\n\nvar Uint8Array = global.Uint8Array;\nvar Uint8ArrayPrototype = Uint8Array && Uint8Array.prototype || {};\nvar arrayToString = [].toString;\nvar arrayJoin = [].join;\n\nif (fails(function () { arrayToString.call({}); })) {\n arrayToString = function toString() {\n return arrayJoin.call(this);\n };\n}\n\nvar IS_NOT_ARRAY_METHOD = Uint8ArrayPrototype.toString != arrayToString;\n\n// `%TypedArray%.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-%typedarray%.prototype.tostring\nexportTypedArrayMethod('toString', arrayToString, IS_NOT_ARRAY_METHOD);\n","import { isRegExp, isString } from './is';\n/**\n * Truncates given string to the maximum characters count\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function truncate(str, max) {\n if (max === void 0) { max = 0; }\n if (typeof str !== 'string' || max === 0) {\n return str;\n }\n return str.length <= max ? str : str.substr(0, max) + \"...\";\n}\n/**\n * This is basically just `trim_line` from\n * https://github.com/getsentry/sentry/blob/master/src/sentry/lang/javascript/processor.py#L67\n *\n * @param str An object that contains serializable values\n * @param max Maximum number of characters in truncated string\n * @returns string Encoded\n */\nexport function snipLine(line, colno) {\n var newLine = line;\n var ll = newLine.length;\n if (ll <= 150) {\n return newLine;\n }\n if (colno > ll) {\n // eslint-disable-next-line no-param-reassign\n colno = ll;\n }\n var start = Math.max(colno - 60, 0);\n if (start < 5) {\n start = 0;\n }\n var end = Math.min(start + 140, ll);\n if (end > ll - 5) {\n end = ll;\n }\n if (end === ll) {\n start = Math.max(end - 140, 0);\n }\n newLine = newLine.slice(start, end);\n if (start > 0) {\n newLine = \"'{snip} \" + newLine;\n }\n if (end < ll) {\n newLine += ' {snip}';\n }\n return newLine;\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 Joined values\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function safeJoin(input, delimiter) {\n if (!Array.isArray(input)) {\n return '';\n }\n var output = [];\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (var i = 0; i < input.length; i++) {\n var value = input[i];\n try {\n output.push(String(value));\n }\n catch (e) {\n output.push('[value cannot be serialized]');\n }\n }\n return output.join(delimiter);\n}\n/**\n * Checks if the value matches a regex or includes the string\n * @param value The string value to be checked against\n * @param pattern Either a regex or a string that must be contained in value\n */\nexport function isMatchingPattern(value, pattern) {\n if (!isString(value)) {\n return false;\n }\n if (isRegExp(pattern)) {\n return pattern.test(value);\n }\n if (typeof pattern === 'string') {\n return value.indexOf(pattern) !== -1;\n }\n return false;\n}\n//# sourceMappingURL=string.js.map","import { isString } from './is';\nimport { snipLine } from './string';\n/**\n * Requires a module which is protected against bundler minification.\n *\n * @param request The module path to resolve\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function dynamicRequire(mod, request) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return mod.require(request);\n}\n/**\n * Checks whether we're in the Node.js or Browser environment\n *\n * @returns Answer to given question\n */\nexport function isNodeEnv() {\n return Object.prototype.toString.call(typeof process !== 'undefined' ? process : 0) === '[object process]';\n}\nvar fallbackGlobalObject = {};\n/**\n * Safely get global scope object\n *\n * @returns Global scope object\n */\nexport function getGlobalObject() {\n return (isNodeEnv()\n ? global\n : typeof window !== 'undefined'\n ? window\n : typeof self !== 'undefined'\n ? self\n : fallbackGlobalObject);\n}\n/**\n * UUID4 generator\n *\n * @returns string Generated UUID4.\n */\nexport function uuid4() {\n var global = getGlobalObject();\n var crypto = global.crypto || global.msCrypto;\n if (!(crypto === void 0) && crypto.getRandomValues) {\n // Use window.crypto API if available\n var arr = new Uint16Array(8);\n crypto.getRandomValues(arr);\n // set 4 in byte 7\n // eslint-disable-next-line no-bitwise\n arr[3] = (arr[3] & 0xfff) | 0x4000;\n // set 2 most significant bits of byte 9 to '10'\n // eslint-disable-next-line no-bitwise\n arr[4] = (arr[4] & 0x3fff) | 0x8000;\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 return (pad(arr[0]) + pad(arr[1]) + pad(arr[2]) + pad(arr[3]) + pad(arr[4]) + pad(arr[5]) + pad(arr[6]) + pad(arr[7]));\n }\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 // eslint-disable-next-line no-bitwise\n var r = (Math.random() * 16) | 0;\n // eslint-disable-next-line no-bitwise\n var v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n/**\n * Parses string form of URL into an object\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\n * @returns parsed URL object\n */\nexport function parseUrl(url) {\n if (!url) {\n return {};\n }\n var match = url.match(/^(([^:/?#]+):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$/);\n if (!match) {\n return {};\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 host: match[4],\n path: match[5],\n protocol: match[2],\n relative: match[5] + query + fragment,\n };\n}\n/**\n * Extracts either message or type+value from an event that can be used for user-facing logs\n * @returns event's description\n */\nexport function getEventDescription(event) {\n if (event.message) {\n return event.message;\n }\n if (event.exception && event.exception.values && event.exception.values[0]) {\n var exception = event.exception.values[0];\n if (exception.type && exception.value) {\n return exception.type + \": \" + exception.value;\n }\n return exception.type || exception.value || event.event_id || '<unknown>';\n }\n return event.event_id || '<unknown>';\n}\n/** JSDoc */\nexport function consoleSandbox(callback) {\n var global = getGlobalObject();\n var levels = ['debug', 'info', 'warn', 'error', 'log', 'assert'];\n if (!('console' in global)) {\n return callback();\n }\n var originalConsole = global.console;\n var wrappedLevels = {};\n // Restore all wrapped console methods\n levels.forEach(function (level) {\n if (level in global.console && originalConsole[level].__sentry_original__) {\n wrappedLevels[level] = originalConsole[level];\n originalConsole[level] = originalConsole[level].__sentry_original__;\n }\n });\n // Perform callback manipulations\n var result = callback();\n // Revert restoration to wrapped state\n Object.keys(wrappedLevels).forEach(function (level) {\n originalConsole[level] = wrappedLevels[level];\n });\n return result;\n}\n/**\n * Adds exception values, type and value to an synthetic Exception.\n * @param event The event to modify.\n * @param value Value of the exception.\n * @param type Type of the exception.\n * @hidden\n */\nexport function addExceptionTypeValue(event, value, type) {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].value = event.exception.values[0].value || value || '';\n event.exception.values[0].type = event.exception.values[0].type || type || 'Error';\n}\n/**\n * Adds exception mechanism to a given event.\n * @param event The event to modify.\n * @param mechanism Mechanism of the mechanism.\n * @hidden\n */\nexport function addExceptionMechanism(event, mechanism) {\n if (mechanism === void 0) { mechanism = {}; }\n // TODO: Use real type with `keyof Mechanism` thingy and maybe make it better?\n try {\n // @ts-ignore Type 'Mechanism | {}' is not assignable to type 'Mechanism | undefined'\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n event.exception.values[0].mechanism = event.exception.values[0].mechanism || {};\n Object.keys(mechanism).forEach(function (key) {\n // @ts-ignore Mechanism has no index signature\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n event.exception.values[0].mechanism[key] = mechanism[key];\n });\n }\n catch (_oO) {\n // no-empty\n }\n}\n/**\n * A safe form of location.href\n */\nexport function getLocationHref() {\n try {\n return document.location.href;\n }\n catch (oO) {\n return '';\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 * @returns generated DOM path\n */\nexport function htmlTreeAsString(elem) {\n // try/catch both:\n // - accessing event.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 try {\n var currentElem = elem;\n var MAX_TRAVERSE_HEIGHT = 5;\n var MAX_OUTPUT_LEN = 80;\n var out = [];\n var height = 0;\n var len = 0;\n var separator = ' > ';\n var sepLength = separator.length;\n var nextStr = void 0;\n // eslint-disable-next-line no-plusplus\n while (currentElem && height++ < MAX_TRAVERSE_HEIGHT) {\n nextStr = _htmlElementAsString(currentElem);\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 (nextStr === 'html' || (height > 1 && len + out.length * sepLength + nextStr.length >= MAX_OUTPUT_LEN)) {\n break;\n }\n out.push(nextStr);\n len += nextStr.length;\n currentElem = currentElem.parentNode;\n }\n return out.reverse().join(separator);\n }\n catch (_oO) {\n return '<unknown>';\n }\n}\n/**\n * Returns a simple, query-selector representation of a DOM element\n * e.g. [HTMLElement] => input#foo.btn[name=baz]\n * @returns generated DOM path\n */\nfunction _htmlElementAsString(el) {\n var elem = el;\n var out = [];\n var className;\n var classes;\n var key;\n var attr;\n var i;\n if (!elem || !elem.tagName) {\n return '';\n }\n out.push(elem.tagName.toLowerCase());\n if (elem.id) {\n out.push(\"#\" + elem.id);\n }\n // eslint-disable-next-line prefer-const\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 allowedAttrs = ['type', 'name', 'title', 'alt'];\n for (i = 0; i < allowedAttrs.length; i++) {\n key = allowedAttrs[i];\n attr = elem.getAttribute(key);\n if (attr) {\n out.push(\"[\" + key + \"=\\\"\" + attr + \"\\\"]\");\n }\n }\n return out.join('');\n}\nvar INITIAL_TIME = Date.now();\nvar prevNow = 0;\nvar performanceFallback = {\n now: function () {\n var now = Date.now() - INITIAL_TIME;\n if (now < prevNow) {\n now = prevNow;\n }\n prevNow = now;\n return now;\n },\n timeOrigin: INITIAL_TIME,\n};\nexport var crossPlatformPerformance = (function () {\n if (isNodeEnv()) {\n try {\n var perfHooks = dynamicRequire(module, 'perf_hooks');\n return perfHooks.performance;\n }\n catch (_) {\n return performanceFallback;\n }\n }\n var performance = getGlobalObject().performance;\n if (!performance || !performance.now) {\n return performanceFallback;\n }\n // Polyfill for performance.timeOrigin.\n //\n // While performance.timing.navigationStart is deprecated in favor of performance.timeOrigin, performance.timeOrigin\n // is not as widely supported. Namely, performance.timeOrigin is undefined in Safari as of writing.\n if (performance.timeOrigin === undefined) {\n // As of writing, performance.timing is not available in Web Workers in mainstream browsers, so it is not always a\n // valid fallback. In the absence of a initial time provided by the browser, fallback to INITIAL_TIME.\n // @ts-ignore ignored because timeOrigin is a readonly property but we want to override\n // eslint-disable-next-line deprecation/deprecation\n performance.timeOrigin = (performance.timing && performance.timing.navigationStart) || INITIAL_TIME;\n }\n return performance;\n})();\n/**\n * Returns a timestamp in seconds with milliseconds precision since the UNIX epoch calculated with the monotonic clock.\n */\nexport function timestampWithMs() {\n return (crossPlatformPerformance.timeOrigin + crossPlatformPerformance.now()) / 1000;\n}\n// https://semver.org/#is-there-a-suggested-regular-expression-regex-to-check-a-semver-string\nvar SEMVER_REGEXP = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-((?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\\.(?:0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\\+([0-9a-zA-Z-]+(?:\\.[0-9a-zA-Z-]+)*))?$/;\n/**\n * Parses input into a SemVer interface\n * @param input string representation of a semver version\n */\nexport function parseSemver(input) {\n var match = input.match(SEMVER_REGEXP) || [];\n var major = parseInt(match[1], 10);\n var minor = parseInt(match[2], 10);\n var patch = parseInt(match[3], 10);\n return {\n buildmetadata: match[5],\n major: isNaN(major) ? undefined : major,\n minor: isNaN(minor) ? undefined : minor,\n patch: isNaN(patch) ? undefined : patch,\n prerelease: match[4],\n };\n}\nvar defaultRetryAfter = 60 * 1000; // 60 seconds\n/**\n * Extracts Retry-After value from the request header or returns default value\n * @param now current unix timestamp\n * @param header string representation of 'Retry-After' header\n */\nexport function parseRetryAfterHeader(now, header) {\n if (!header) {\n return defaultRetryAfter;\n }\n var headerDelay = parseInt(\"\" + header, 10);\n if (!isNaN(headerDelay)) {\n return headerDelay * 1000;\n }\n var headerDate = Date.parse(\"\" + header);\n if (!isNaN(headerDate)) {\n return headerDate - now;\n }\n return defaultRetryAfter;\n}\nvar defaultFunctionName = '<anonymous>';\n/**\n * Safely extract function name from itself\n */\nexport function getFunctionName(fn) {\n try {\n if (!fn || typeof fn !== 'function') {\n return defaultFunctionName;\n }\n return fn.name || defaultFunctionName;\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 return defaultFunctionName;\n }\n}\n/**\n * This function adds context (pre/post/line) lines to the provided frame\n *\n * @param lines string[] containing all lines\n * @param frame StackFrame that will be mutated\n * @param linesOfContext number of context lines we want to add pre/post\n */\nexport function addContextToFrame(lines, frame, linesOfContext) {\n if (linesOfContext === void 0) { linesOfContext = 5; }\n var lineno = frame.lineno || 0;\n var maxLines = lines.length;\n var sourceLine = Math.max(Math.min(maxLines, lineno - 1), 0);\n frame.pre_context = lines\n .slice(Math.max(0, sourceLine - linesOfContext), sourceLine)\n .map(function (line) { return snipLine(line, 0); });\n frame.context_line = snipLine(lines[Math.min(maxLines - 1, sourceLine)], frame.colno || 0);\n frame.post_context = lines\n .slice(Math.min(sourceLine + 1, maxLines), sourceLine + 1 + linesOfContext)\n .map(function (line) { return snipLine(line, 0); });\n}\n//# sourceMappingURL=misc.js.map","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { consoleSandbox, getGlobalObject } from './misc';\n// TODO: Implement different loggers for different environments\nvar global = getGlobalObject();\n/** Prefix for logging strings */\nvar PREFIX = 'Sentry Logger ';\n/** JSDoc */\nvar Logger = /** @class */ (function () {\n /** JSDoc */\n function Logger() {\n this._enabled = false;\n }\n /** JSDoc */\n Logger.prototype.disable = function () {\n this._enabled = false;\n };\n /** JSDoc */\n Logger.prototype.enable = function () {\n this._enabled = true;\n };\n /** JSDoc */\n Logger.prototype.log = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!this._enabled) {\n return;\n }\n consoleSandbox(function () {\n global.console.log(PREFIX + \"[Log]: \" + args.join(' '));\n });\n };\n /** JSDoc */\n Logger.prototype.warn = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!this._enabled) {\n return;\n }\n consoleSandbox(function () {\n global.console.warn(PREFIX + \"[Warn]: \" + args.join(' '));\n });\n };\n /** JSDoc */\n Logger.prototype.error = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n if (!this._enabled) {\n return;\n }\n consoleSandbox(function () {\n global.console.error(PREFIX + \"[Error]: \" + args.join(' '));\n });\n };\n return Logger;\n}());\n// Ensure we only have a single logger instance, even if multiple versions of @sentry/utils are being used\nglobal.__SENTRY__ = global.__SENTRY__ || {};\nvar logger = global.__SENTRY__.logger || (global.__SENTRY__.logger = new Logger());\nexport { logger };\n//# sourceMappingURL=logger.js.map","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n});\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","'use strict';\nvar redefineAll = require('../internals/redefine-all');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar $has = require('../internals/has');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && $has(data, state.id) && delete data[state.id];\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && $has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], that, IS_MAP);\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","'use strict';\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\n\n// `WeakSet` constructor\n// https://tc39.github.io/ecma262/#sec-weakset-constructor\ncollection('WeakSet', function (init) {\n return function WeakSet() { return init(this, arguments.length ? arguments[0] : undefined); };\n}, collectionWeak);\n","/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/**\n * Memo class used for decycle json objects. Uses WeakSet if available otherwise array.\n */\nvar Memo = /** @class */ (function () {\n function Memo() {\n this._hasWeakSet = typeof WeakSet === 'function';\n this._inner = this._hasWeakSet ? new WeakSet() : [];\n }\n /**\n * Sets obj to remember.\n * @param obj Object to remember\n */\n Memo.prototype.memoize = function (obj) {\n if (this._hasWeakSet) {\n if (this._inner.has(obj)) {\n return true;\n }\n this._inner.add(obj);\n return false;\n }\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (var i = 0; i < this._inner.length; i++) {\n var value = this._inner[i];\n if (value === obj) {\n return true;\n }\n }\n this._inner.push(obj);\n return false;\n };\n /**\n * Removes object from internal storage.\n * @param obj Object to forget\n */\n Memo.prototype.unmemoize = function (obj) {\n if (this._hasWeakSet) {\n this._inner.delete(obj);\n }\n else {\n for (var i = 0; i < this._inner.length; i++) {\n if (this._inner[i] === obj) {\n this._inner.splice(i, 1);\n break;\n }\n }\n }\n };\n return Memo;\n}());\nexport { Memo };\n//# sourceMappingURL=memo.js.map","import { __values } from \"tslib\";\nimport { isElement, isError, isEvent, isInstanceOf, isPlainObject, isPrimitive, isSyntheticEvent } from './is';\nimport { Memo } from './memo';\nimport { getFunctionName, htmlTreeAsString } from './misc';\nimport { truncate } from './string';\n/**\n * Wrap a given object method with a higher-order function\n *\n * @param source An object that contains a method to be wrapped.\n * @param name A name of method to be wrapped.\n * @param replacement A function that should be used to wrap a given method.\n * @returns void\n */\nexport function fill(source, name, replacement) {\n if (!(name in source)) {\n return;\n }\n var original = source[name];\n var wrapped = replacement(original);\n // Make sure it's a function first, as we need to attach an empty prototype for `defineProperties` to work\n // otherwise it'll throw \"TypeError: Object.defineProperties called on non-object\"\n if (typeof wrapped === 'function') {\n try {\n wrapped.prototype = wrapped.prototype || {};\n Object.defineProperties(wrapped, {\n __sentry_original__: {\n enumerable: false,\n value: original,\n },\n });\n }\n catch (_Oo) {\n // This can throw if multiple fill happens on a global object like XMLHttpRequest\n // Fixes https://github.com/getsentry/sentry-javascript/issues/2043\n }\n }\n source[name] = wrapped;\n}\n/**\n * Encodes given object into url-friendly format\n *\n * @param object An object that contains serializable values\n * @returns string Encoded\n */\nexport function urlEncode(object) {\n return Object.keys(object)\n .map(function (key) { return encodeURIComponent(key) + \"=\" + encodeURIComponent(object[key]); })\n .join('&');\n}\n/**\n * Transforms any object into an object literal with all it's attributes\n * attached to it.\n *\n * @param value Initial source that we have to transform in order to be usable by the serializer\n */\nfunction getWalkSource(value) {\n if (isError(value)) {\n var error = value;\n var err = {\n message: error.message,\n name: error.name,\n stack: error.stack,\n };\n for (var i in error) {\n if (Object.prototype.hasOwnProperty.call(error, i)) {\n err[i] = error[i];\n }\n }\n return err;\n }\n if (isEvent(value)) {\n var event_1 = value;\n var source = {};\n source.type = event_1.type;\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n source.target = isElement(event_1.target)\n ? htmlTreeAsString(event_1.target)\n : Object.prototype.toString.call(event_1.target);\n }\n catch (_oO) {\n source.target = '<unknown>';\n }\n try {\n source.currentTarget = isElement(event_1.currentTarget)\n ? htmlTreeAsString(event_1.currentTarget)\n : Object.prototype.toString.call(event_1.currentTarget);\n }\n catch (_oO) {\n source.currentTarget = '<unknown>';\n }\n if (typeof CustomEvent !== 'undefined' && isInstanceOf(value, CustomEvent)) {\n source.detail = event_1.detail;\n }\n for (var i in event_1) {\n if (Object.prototype.hasOwnProperty.call(event_1, i)) {\n source[i] = event_1;\n }\n }\n return source;\n }\n return value;\n}\n/** Calculates bytes size of input string */\nfunction utf8Length(value) {\n // eslint-disable-next-line no-bitwise\n return ~-encodeURI(value).split(/%..|./).length;\n}\n/** Calculates bytes size of input object */\nfunction jsonSize(value) {\n return utf8Length(JSON.stringify(value));\n}\n/** JSDoc */\nexport function normalizeToSize(object, \n// Default Node.js REPL depth\ndepth, \n// 100kB, as 200kB is max payload size, so half sounds reasonable\nmaxSize) {\n if (depth === void 0) { depth = 3; }\n if (maxSize === void 0) { maxSize = 100 * 1024; }\n var serialized = normalize(object, depth);\n if (jsonSize(serialized) > maxSize) {\n return normalizeToSize(object, depth - 1, maxSize);\n }\n return serialized;\n}\n/** Transforms any input value into a string form, either primitive value or a type of the input */\nfunction serializeValue(value) {\n var type = Object.prototype.toString.call(value);\n // Node.js REPL notation\n if (typeof value === 'string') {\n return value;\n }\n if (type === '[object Object]') {\n return '[Object]';\n }\n if (type === '[object Array]') {\n return '[Array]';\n }\n var normalized = normalizeValue(value);\n return isPrimitive(normalized) ? normalized : type;\n}\n/**\n * normalizeValue()\n *\n * Takes unserializable input and make it serializable friendly\n *\n * - translates undefined/NaN values to \"[undefined]\"/\"[NaN]\" respectively,\n * - serializes Error objects\n * - filter global objects\n */\nfunction normalizeValue(value, key) {\n if (key === 'domain' && value && typeof value === 'object' && value._events) {\n return '[Domain]';\n }\n if (key === 'domainEmitter') {\n return '[DomainEmitter]';\n }\n if (typeof global !== 'undefined' && value === global) {\n return '[Global]';\n }\n if (typeof window !== 'undefined' && value === window) {\n return '[Window]';\n }\n if (typeof document !== 'undefined' && value === document) {\n return '[Document]';\n }\n // React's SyntheticEvent thingy\n if (isSyntheticEvent(value)) {\n return '[SyntheticEvent]';\n }\n if (typeof value === 'number' && value !== value) {\n return '[NaN]';\n }\n if (value === void 0) {\n return '[undefined]';\n }\n if (typeof value === 'function') {\n return \"[Function: \" + getFunctionName(value) + \"]\";\n }\n return value;\n}\n/**\n * Walks an object to perform a normalization on it\n *\n * @param key of object that's walked in current iteration\n * @param value object to be walked\n * @param depth Optional number indicating how deep should walking be performed\n * @param memo Optional Memo class handling decycling\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function walk(key, value, depth, memo) {\n if (depth === void 0) { depth = +Infinity; }\n if (memo === void 0) { memo = new Memo(); }\n // If we reach the maximum depth, serialize whatever has left\n if (depth === 0) {\n return serializeValue(value);\n }\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // If value implements `toJSON` method, call it and return early\n if (value !== null && value !== undefined && typeof value.toJSON === 'function') {\n return value.toJSON();\n }\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n // If normalized value is a primitive, there are no branches left to walk, so we can just bail out, as theres no point in going down that branch any further\n var normalized = normalizeValue(value, key);\n if (isPrimitive(normalized)) {\n return normalized;\n }\n // Create source that we will use for next itterations, either objectified error object (Error type with extracted keys:value pairs) or the input itself\n var source = getWalkSource(value);\n // Create an accumulator that will act as a parent for all future itterations of that branch\n var acc = Array.isArray(value) ? [] : {};\n // If we already walked that branch, bail out, as it's circular reference\n if (memo.memoize(value)) {\n return '[Circular ~]';\n }\n // Walk all keys of the source\n for (var innerKey in source) {\n // Avoid iterating over fields in the prototype if they've somehow been exposed to enumeration.\n if (!Object.prototype.hasOwnProperty.call(source, innerKey)) {\n continue;\n }\n // Recursively walk through all the child nodes\n acc[innerKey] = walk(innerKey, source[innerKey], depth - 1, memo);\n }\n // Once walked through all the branches, remove the parent from memo storage\n memo.unmemoize(value);\n // Return accumulated values\n return acc;\n}\n/**\n * normalize()\n *\n * - Creates a copy to prevent original input mutation\n * - Skip non-enumerablers\n * - Calls `toJSON` if implemented\n * - Removes circular references\n * - Translates non-serializeable values (undefined/NaN/Functions) to serializable format\n * - Translates known global objects/Classes to a string representations\n * - Takes care of Error objects serialization\n * - Optionally limit depth of final output\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function normalize(input, depth) {\n try {\n return JSON.parse(JSON.stringify(input, function (key, value) { return walk(key, value, depth); }));\n }\n catch (_oO) {\n return '**non-serializable**';\n }\n}\n/**\n * Given any captured exception, extract its keys and create a sorted\n * and truncated list that will be used inside the event message.\n * eg. `Non-error exception captured with keys: foo, bar, baz`\n */\n// eslint-disable-next-line @typescript-eslint/explicit-module-boundary-types\nexport function extractExceptionKeysForMessage(exception, maxLength) {\n if (maxLength === void 0) { maxLength = 40; }\n var keys = Object.keys(getWalkSource(exception));\n keys.sort();\n if (!keys.length) {\n return '[object has no keys]';\n }\n if (keys[0].length >= maxLength) {\n return truncate(keys[0], maxLength);\n }\n for (var includedKeys = keys.length; includedKeys > 0; includedKeys--) {\n var serialized = keys.slice(0, includedKeys).join(', ');\n if (serialized.length > maxLength) {\n continue;\n }\n if (includedKeys === keys.length) {\n return serialized;\n }\n return truncate(serialized, maxLength);\n }\n return '';\n}\n/**\n * Given any object, return the new object with removed keys that value was `undefined`.\n * Works recursively on objects and arrays.\n */\nexport function dropUndefinedKeys(val) {\n var e_1, _a;\n if (isPlainObject(val)) {\n var obj = val;\n var rv = {};\n try {\n for (var _b = __values(Object.keys(obj)), _c = _b.next(); !_c.done; _c = _b.next()) {\n var key = _c.value;\n if (typeof obj[key] !== 'undefined') {\n rv[key] = dropUndefinedKeys(obj[key]);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n return rv;\n }\n if (Array.isArray(val)) {\n return val.map(dropUndefinedKeys);\n }\n return val;\n}\n//# sourceMappingURL=object.js.map","'use strict';\nvar $ = require('../internals/export');\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\n$({ target: 'URL', proto: true, enumerable: true }, {\n toJSON: function toJSON() {\n return URL.prototype.toString.call(this);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar fails = require('../internals/fails');\nvar getBuiltIn = require('../internals/get-built-in');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\nvar redefine = require('../internals/redefine');\n\n// Safari bug https://bugs.webkit.org/show_bug.cgi?id=200829\nvar NON_GENERIC = !!NativePromise && fails(function () {\n NativePromise.prototype['finally'].call({ then: function () { /* empty */ } }, function () { /* empty */ });\n});\n\n// `Promise.prototype.finally` method\n// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true, forced: NON_GENERIC }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n\n// patch native Promise.prototype for native async functions\nif (!IS_PURE && typeof NativePromise == 'function' && !NativePromise.prototype['finally']) {\n redefine(NativePromise.prototype, 'finally', getBuiltIn('Promise').prototype['finally']);\n}\n","/* eslint-disable @typescript-eslint/explicit-function-return-type */\n/* eslint-disable @typescript-eslint/typedef */\n/* eslint-disable @typescript-eslint/explicit-module-boundary-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { isThenable } from './is';\n/** SyncPromise internal states */\nvar States;\n(function (States) {\n /** Pending */\n States[\"PENDING\"] = \"PENDING\";\n /** Resolved / OK */\n States[\"RESOLVED\"] = \"RESOLVED\";\n /** Rejected / Error */\n States[\"REJECTED\"] = \"REJECTED\";\n})(States || (States = {}));\n/**\n * Thenable class that behaves like a Promise and follows it's interface\n * but is not async internally\n */\nvar SyncPromise = /** @class */ (function () {\n function SyncPromise(executor) {\n var _this = this;\n this._state = States.PENDING;\n this._handlers = [];\n /** JSDoc */\n this._resolve = function (value) {\n _this._setResult(States.RESOLVED, value);\n };\n /** JSDoc */\n this._reject = function (reason) {\n _this._setResult(States.REJECTED, reason);\n };\n /** JSDoc */\n this._setResult = function (state, value) {\n if (_this._state !== States.PENDING) {\n return;\n }\n if (isThenable(value)) {\n value.then(_this._resolve, _this._reject);\n return;\n }\n _this._state = state;\n _this._value = value;\n _this._executeHandlers();\n };\n // TODO: FIXME\n /** JSDoc */\n this._attachHandler = function (handler) {\n _this._handlers = _this._handlers.concat(handler);\n _this._executeHandlers();\n };\n /** JSDoc */\n this._executeHandlers = function () {\n if (_this._state === States.PENDING) {\n return;\n }\n var cachedHandlers = _this._handlers.slice();\n _this._handlers = [];\n cachedHandlers.forEach(function (handler) {\n if (handler.done) {\n return;\n }\n if (_this._state === States.RESOLVED) {\n if (handler.onfulfilled) {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n handler.onfulfilled(_this._value);\n }\n }\n if (_this._state === States.REJECTED) {\n if (handler.onrejected) {\n handler.onrejected(_this._value);\n }\n }\n handler.done = true;\n });\n };\n try {\n executor(this._resolve, this._reject);\n }\n catch (e) {\n this._reject(e);\n }\n }\n /** JSDoc */\n SyncPromise.resolve = function (value) {\n return new SyncPromise(function (resolve) {\n resolve(value);\n });\n };\n /** JSDoc */\n SyncPromise.reject = function (reason) {\n return new SyncPromise(function (_, reject) {\n reject(reason);\n });\n };\n /** JSDoc */\n SyncPromise.all = function (collection) {\n return new SyncPromise(function (resolve, reject) {\n if (!Array.isArray(collection)) {\n reject(new TypeError(\"Promise.all requires an array as input.\"));\n return;\n }\n if (collection.length === 0) {\n resolve([]);\n return;\n }\n var counter = collection.length;\n var resolvedCollection = [];\n collection.forEach(function (item, index) {\n SyncPromise.resolve(item)\n .then(function (value) {\n resolvedCollection[index] = value;\n counter -= 1;\n if (counter !== 0) {\n return;\n }\n resolve(resolvedCollection);\n })\n .then(null, reject);\n });\n });\n };\n /** JSDoc */\n SyncPromise.prototype.then = function (onfulfilled, onrejected) {\n var _this = this;\n return new SyncPromise(function (resolve, reject) {\n _this._attachHandler({\n done: false,\n onfulfilled: function (result) {\n if (!onfulfilled) {\n // TODO: ¯\\_(ツ)_/¯\n // TODO: FIXME\n resolve(result);\n return;\n }\n try {\n resolve(onfulfilled(result));\n return;\n }\n catch (e) {\n reject(e);\n return;\n }\n },\n onrejected: function (reason) {\n if (!onrejected) {\n reject(reason);\n return;\n }\n try {\n resolve(onrejected(reason));\n return;\n }\n catch (e) {\n reject(e);\n return;\n }\n },\n });\n });\n };\n /** JSDoc */\n SyncPromise.prototype.catch = function (onrejected) {\n return this.then(function (val) { return val; }, onrejected);\n };\n /** JSDoc */\n SyncPromise.prototype.finally = function (onfinally) {\n var _this = this;\n return new SyncPromise(function (resolve, reject) {\n var val;\n var isRejected;\n return _this.then(function (value) {\n isRejected = false;\n val = value;\n if (onfinally) {\n onfinally();\n }\n }, function (reason) {\n isRejected = true;\n val = reason;\n if (onfinally) {\n onfinally();\n }\n }).then(function () {\n if (isRejected) {\n reject(val);\n return;\n }\n resolve(val);\n });\n });\n };\n /** JSDoc */\n SyncPromise.prototype.toString = function () {\n return '[object SyncPromise]';\n };\n return SyncPromise;\n}());\nexport { SyncPromise };\n//# sourceMappingURL=syncpromise.js.map","import { SentryError } from './error';\nimport { SyncPromise } from './syncpromise';\n/** A simple queue that holds promises. */\nvar PromiseBuffer = /** @class */ (function () {\n function PromiseBuffer(_limit) {\n this._limit = _limit;\n /** Internal set of queued Promises */\n this._buffer = [];\n }\n /**\n * Says if the buffer is ready to take more requests\n */\n PromiseBuffer.prototype.isReady = function () {\n return this._limit === undefined || this.length() < this._limit;\n };\n /**\n * Add a promise to the queue.\n *\n * @param task Can be any PromiseLike<T>\n * @returns The original promise.\n */\n PromiseBuffer.prototype.add = function (task) {\n var _this = this;\n if (!this.isReady()) {\n return SyncPromise.reject(new SentryError('Not adding Promise due to buffer limit reached.'));\n }\n if (this._buffer.indexOf(task) === -1) {\n this._buffer.push(task);\n }\n task\n .then(function () { return _this.remove(task); })\n .then(null, function () {\n return _this.remove(task).then(null, function () {\n // We have to add this catch here otherwise we have an unhandledPromiseRejection\n // because it's a new Promise chain.\n });\n });\n return task;\n };\n /**\n * Remove a promise to the queue.\n *\n * @param task Can be any PromiseLike<T>\n * @returns Removed promise.\n */\n PromiseBuffer.prototype.remove = function (task) {\n var removedTask = this._buffer.splice(this._buffer.indexOf(task), 1)[0];\n return removedTask;\n };\n /**\n * This function returns the number of unresolved promises in the queue.\n */\n PromiseBuffer.prototype.length = function () {\n return this._buffer.length;\n };\n /**\n * This will drain the whole queue, returns true if queue is empty or drained.\n * If timeout is provided and the queue takes longer to drain, the promise still resolves but with false.\n *\n * @param timeout Number in ms to wait until it resolves with false.\n */\n PromiseBuffer.prototype.drain = function (timeout) {\n var _this = this;\n return new SyncPromise(function (resolve) {\n var capturedSetTimeout = setTimeout(function () {\n if (timeout && timeout > 0) {\n resolve(false);\n }\n }, timeout);\n SyncPromise.all(_this._buffer)\n .then(function () {\n clearTimeout(capturedSetTimeout);\n resolve(true);\n })\n .then(null, function () {\n resolve(true);\n });\n });\n };\n return PromiseBuffer;\n}());\nexport { PromiseBuffer };\n//# sourceMappingURL=promisebuffer.js.map","import { logger } from './logger';\nimport { getGlobalObject } from './misc';\n/**\n * Tells whether current environment supports ErrorEvent objects\n * {@link supportsErrorEvent}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsErrorEvent() {\n try {\n new ErrorEvent('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports DOMError objects\n * {@link supportsDOMError}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMError() {\n try {\n // Chrome: VM89:1 Uncaught TypeError: Failed to construct 'DOMError':\n // 1 argument required, but only 0 present.\n // @ts-ignore It really needs 1 argument, not 0.\n new DOMError('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports DOMException objects\n * {@link supportsDOMException}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsDOMException() {\n try {\n new DOMException('');\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports Fetch API\n * {@link supportsFetch}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsFetch() {\n if (!('fetch' in getGlobalObject())) {\n return false;\n }\n try {\n new Headers();\n new Request('');\n new Response();\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * isNativeFetch checks if the given function is a native implementation of fetch()\n */\n// eslint-disable-next-line @typescript-eslint/ban-types\nfunction isNativeFetch(func) {\n return func && /^function fetch\\(\\)\\s+\\{\\s+\\[native code\\]\\s+\\}$/.test(func.toString());\n}\n/**\n * Tells whether current environment supports Fetch API natively\n * {@link supportsNativeFetch}.\n *\n * @returns true if `window.fetch` is natively implemented, false otherwise\n */\nexport function supportsNativeFetch() {\n if (!supportsFetch()) {\n return false;\n }\n var global = getGlobalObject();\n // Fast path to avoid DOM I/O\n // eslint-disable-next-line @typescript-eslint/unbound-method\n if (isNativeFetch(global.fetch)) {\n return true;\n }\n // window.fetch is implemented, but is polyfilled or already wrapped (e.g: by a chrome extension)\n // so create a \"pure\" iframe to see if that has native fetch\n var result = false;\n var doc = global.document;\n // eslint-disable-next-line deprecation/deprecation\n if (doc && typeof doc.createElement === \"function\") {\n try {\n var sandbox = doc.createElement('iframe');\n sandbox.hidden = true;\n doc.head.appendChild(sandbox);\n if (sandbox.contentWindow && sandbox.contentWindow.fetch) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n result = isNativeFetch(sandbox.contentWindow.fetch);\n }\n doc.head.removeChild(sandbox);\n }\n catch (err) {\n logger.warn('Could not create sandbox iframe for pure fetch check, bailing to window.fetch: ', err);\n }\n }\n return result;\n}\n/**\n * Tells whether current environment supports ReportingObserver API\n * {@link supportsReportingObserver}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReportingObserver() {\n return 'ReportingObserver' in getGlobalObject();\n}\n/**\n * Tells whether current environment supports Referrer Policy API\n * {@link supportsReferrerPolicy}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsReferrerPolicy() {\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 if (!supportsFetch()) {\n return false;\n }\n try {\n new Request('_', {\n referrerPolicy: 'origin',\n });\n return true;\n }\n catch (e) {\n return false;\n }\n}\n/**\n * Tells whether current environment supports History API\n * {@link supportsHistory}.\n *\n * @returns Answer to the given question.\n */\nexport function supportsHistory() {\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 global = getGlobalObject();\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var chrome = global.chrome;\n var isChromePackagedApp = chrome && chrome.app && chrome.app.runtime;\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n var hasHistoryApi = 'history' in global && !!global.history.pushState && !!global.history.replaceState;\n return !isChromePackagedApp && hasHistoryApi;\n}\n//# sourceMappingURL=supports.js.map","import { __assign, __values } from \"tslib\";\nimport { isInstanceOf, isString } from './is';\nimport { logger } from './logger';\nimport { getFunctionName, getGlobalObject } from './misc';\nimport { fill } from './object';\nimport { supportsHistory, supportsNativeFetch } from './supports';\nvar global = getGlobalObject();\n/**\n * Instrument native APIs to call handlers that can be used to create breadcrumbs, APM spans etc.\n * - Console API\n * - Fetch API\n * - XHR API\n * - History API\n * - DOM API (click/typing)\n * - Error API\n * - UnhandledRejection API\n */\nvar handlers = {};\nvar instrumented = {};\n/** Instruments given API */\nfunction instrument(type) {\n if (instrumented[type]) {\n return;\n }\n instrumented[type] = true;\n switch (type) {\n case 'console':\n instrumentConsole();\n break;\n case 'dom':\n instrumentDOM();\n break;\n case 'xhr':\n instrumentXHR();\n break;\n case 'fetch':\n instrumentFetch();\n break;\n case 'history':\n instrumentHistory();\n break;\n case 'error':\n instrumentError();\n break;\n case 'unhandledrejection':\n instrumentUnhandledRejection();\n break;\n default:\n logger.warn('unknown instrumentation type:', type);\n }\n}\n/**\n * Add handler that will be called when given type of instrumentation triggers.\n * Use at your own risk, this might break without changelog notice, only used internally.\n * @hidden\n */\nexport function addInstrumentationHandler(handler) {\n if (!handler || typeof handler.type !== 'string' || typeof handler.callback !== 'function') {\n return;\n }\n handlers[handler.type] = handlers[handler.type] || [];\n handlers[handler.type].push(handler.callback);\n instrument(handler.type);\n}\n/** JSDoc */\nfunction triggerHandlers(type, data) {\n var e_1, _a;\n if (!type || !handlers[type]) {\n return;\n }\n try {\n for (var _b = __values(handlers[type] || []), _c = _b.next(); !_c.done; _c = _b.next()) {\n var handler = _c.value;\n try {\n handler(data);\n }\n catch (e) {\n logger.error(\"Error while triggering instrumentation handler.\\nType: \" + type + \"\\nName: \" + getFunctionName(handler) + \"\\nError: \" + e);\n }\n }\n }\n catch (e_1_1) { e_1 = { error: e_1_1 }; }\n finally {\n try {\n if (_c && !_c.done && (_a = _b.return)) _a.call(_b);\n }\n finally { if (e_1) throw e_1.error; }\n }\n}\n/** JSDoc */\nfunction instrumentConsole() {\n if (!('console' in global)) {\n return;\n }\n ['debug', 'info', 'warn', 'error', 'log', 'assert'].forEach(function (level) {\n if (!(level in global.console)) {\n return;\n }\n fill(global.console, level, function (originalConsoleLevel) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n triggerHandlers('console', { args: args, level: level });\n // this fails for some browsers. :(\n if (originalConsoleLevel) {\n Function.prototype.apply.call(originalConsoleLevel, global.console, args);\n }\n };\n });\n });\n}\n/** JSDoc */\nfunction instrumentFetch() {\n if (!supportsNativeFetch()) {\n return;\n }\n fill(global, 'fetch', function (originalFetch) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var commonHandlerData = {\n args: args,\n fetchData: {\n method: getFetchMethod(args),\n url: getFetchUrl(args),\n },\n startTimestamp: Date.now(),\n };\n triggerHandlers('fetch', __assign({}, commonHandlerData));\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return originalFetch.apply(global, args).then(function (response) {\n triggerHandlers('fetch', __assign(__assign({}, commonHandlerData), { endTimestamp: Date.now(), response: response }));\n return response;\n }, function (error) {\n triggerHandlers('fetch', __assign(__assign({}, commonHandlerData), { endTimestamp: Date.now(), error: error }));\n // NOTE: If you are a Sentry user, and you are seeing this stack frame,\n // it means the sentry.javascript SDK caught an error invoking your application code.\n // This is expected behavior and NOT indicative of a bug with sentry.javascript.\n throw error;\n });\n };\n });\n}\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/** Extract `method` from fetch call arguments */\nfunction getFetchMethod(fetchArgs) {\n if (fetchArgs === void 0) { fetchArgs = []; }\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request) && fetchArgs[0].method) {\n return String(fetchArgs[0].method).toUpperCase();\n }\n if (fetchArgs[1] && fetchArgs[1].method) {\n return String(fetchArgs[1].method).toUpperCase();\n }\n return 'GET';\n}\n/** Extract `url` from fetch call arguments */\nfunction getFetchUrl(fetchArgs) {\n if (fetchArgs === void 0) { fetchArgs = []; }\n if (typeof fetchArgs[0] === 'string') {\n return fetchArgs[0];\n }\n if ('Request' in global && isInstanceOf(fetchArgs[0], Request)) {\n return fetchArgs[0].url;\n }\n return String(fetchArgs[0]);\n}\n/* eslint-enable @typescript-eslint/no-unsafe-member-access */\n/** JSDoc */\nfunction instrumentXHR() {\n if (!('XMLHttpRequest' in global)) {\n return;\n }\n var xhrproto = XMLHttpRequest.prototype;\n fill(xhrproto, 'open', function (originalOpen) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var xhr = this;\n var url = args[1];\n xhr.__sentry_xhr__ = {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n method: isString(args[0]) ? args[0].toUpperCase() : args[0],\n url: args[1],\n };\n // if Sentry key appears in URL, don't capture it as a request\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (isString(url) && xhr.__sentry_xhr__.method === 'POST' && url.match(/sentry_key/)) {\n xhr.__sentry_own_request__ = true;\n }\n var onreadystatechangeHandler = function () {\n if (xhr.readyState === 4) {\n try {\n // touching statusCode in some platforms throws\n // an exception\n if (xhr.__sentry_xhr__) {\n xhr.__sentry_xhr__.status_code = xhr.status;\n }\n }\n catch (e) {\n /* do nothing */\n }\n triggerHandlers('xhr', {\n args: args,\n endTimestamp: Date.now(),\n startTimestamp: Date.now(),\n xhr: xhr,\n });\n }\n };\n if ('onreadystatechange' in xhr && typeof xhr.onreadystatechange === 'function') {\n fill(xhr, 'onreadystatechange', function (original) {\n return function () {\n var readyStateArgs = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n readyStateArgs[_i] = arguments[_i];\n }\n onreadystatechangeHandler();\n return original.apply(xhr, readyStateArgs);\n };\n });\n }\n else {\n xhr.addEventListener('readystatechange', onreadystatechangeHandler);\n }\n return originalOpen.apply(xhr, args);\n };\n });\n fill(xhrproto, 'send', function (originalSend) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n triggerHandlers('xhr', {\n args: args,\n startTimestamp: Date.now(),\n xhr: this,\n });\n return originalSend.apply(this, args);\n };\n });\n}\nvar lastHref;\n/** JSDoc */\nfunction instrumentHistory() {\n if (!supportsHistory()) {\n return;\n }\n var oldOnPopState = global.onpopstate;\n global.onpopstate = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var to = global.location.href;\n // keep track of the current URL state, as we always receive only the updated state\n var from = lastHref;\n lastHref = to;\n triggerHandlers('history', {\n from: from,\n to: to,\n });\n if (oldOnPopState) {\n return oldOnPopState.apply(this, args);\n }\n };\n /** @hidden */\n function historyReplacementFunction(originalHistoryFunction) {\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var url = args.length > 2 ? args[2] : undefined;\n if (url) {\n // coerce to string (this is what pushState does)\n var from = lastHref;\n var to = String(url);\n // keep track of the current URL state, as we always receive only the updated state\n lastHref = to;\n triggerHandlers('history', {\n from: from,\n to: to,\n });\n }\n return originalHistoryFunction.apply(this, args);\n };\n }\n fill(global.history, 'pushState', historyReplacementFunction);\n fill(global.history, 'replaceState', historyReplacementFunction);\n}\n/** JSDoc */\nfunction instrumentDOM() {\n if (!('document' in global)) {\n return;\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 global.document.addEventListener('click', domEventHandler('click', triggerHandlers.bind(null, 'dom')), false);\n global.document.addEventListener('keypress', keypressEventHandler(triggerHandlers.bind(null, 'dom')), false);\n // After hooking into document bubbled up click and keypresses events, we also hook into user handled click & keypresses.\n ['EventTarget', 'Node'].forEach(function (target) {\n /* eslint-disable @typescript-eslint/no-unsafe-member-access */\n var proto = global[target] && global[target].prototype;\n // eslint-disable-next-line no-prototype-builtins\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n /* eslint-enable @typescript-eslint/no-unsafe-member-access */\n fill(proto, 'addEventListener', function (original) {\n return function (eventName, fn, options) {\n if (fn && fn.handleEvent) {\n if (eventName === 'click') {\n fill(fn, 'handleEvent', function (innerOriginal) {\n return function (event) {\n domEventHandler('click', triggerHandlers.bind(null, 'dom'))(event);\n return innerOriginal.call(this, event);\n };\n });\n }\n if (eventName === 'keypress') {\n fill(fn, 'handleEvent', function (innerOriginal) {\n return function (event) {\n keypressEventHandler(triggerHandlers.bind(null, 'dom'))(event);\n return innerOriginal.call(this, event);\n };\n });\n }\n }\n else {\n if (eventName === 'click') {\n domEventHandler('click', triggerHandlers.bind(null, 'dom'), true)(this);\n }\n if (eventName === 'keypress') {\n keypressEventHandler(triggerHandlers.bind(null, 'dom'))(this);\n }\n }\n return original.call(this, eventName, fn, options);\n };\n });\n fill(proto, 'removeEventListener', function (original) {\n return function (eventName, fn, options) {\n try {\n original.call(this, eventName, fn.__sentry_wrapped__, options);\n }\n catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return original.call(this, eventName, fn, options);\n };\n });\n });\n}\nvar debounceDuration = 1000;\nvar debounceTimer = 0;\nvar keypressTimeout;\nvar lastCapturedEvent;\n/**\n * Wraps addEventListener to capture UI breadcrumbs\n * @param name the event name (e.g. \"click\")\n * @param handler function that will be triggered\n * @param debounce decides whether it should wait till another event loop\n * @returns wrapped breadcrumb events handler\n * @hidden\n */\nfunction domEventHandler(name, handler, debounce) {\n if (debounce === void 0) { debounce = false; }\n return function (event) {\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 keypressTimeout = undefined;\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 (!event || lastCapturedEvent === event) {\n return;\n }\n lastCapturedEvent = event;\n if (debounceTimer) {\n clearTimeout(debounceTimer);\n }\n if (debounce) {\n debounceTimer = setTimeout(function () {\n handler({ event: event, name: name });\n });\n }\n else {\n handler({ event: event, name: name });\n }\n };\n}\n/**\n * Wraps addEventListener to capture keypress UI events\n * @param handler function that will be triggered\n * @returns wrapped keypress events handler\n * @hidden\n */\nfunction keypressEventHandler(handler) {\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 (event) {\n var target;\n try {\n target = event.target;\n }\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 // 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 (!tagName || (tagName !== 'INPUT' && tagName !== 'TEXTAREA' && !target.isContentEditable)) {\n return;\n }\n // record first keypress in a series, but ignore subsequent\n // keypresses until debounce clears\n if (!keypressTimeout) {\n domEventHandler('input', handler)(event);\n }\n clearTimeout(keypressTimeout);\n keypressTimeout = setTimeout(function () {\n keypressTimeout = undefined;\n }, debounceDuration);\n };\n}\nvar _oldOnErrorHandler = null;\n/** JSDoc */\nfunction instrumentError() {\n _oldOnErrorHandler = global.onerror;\n global.onerror = function (msg, url, line, column, error) {\n triggerHandlers('error', {\n column: column,\n error: error,\n line: line,\n msg: msg,\n url: url,\n });\n if (_oldOnErrorHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnErrorHandler.apply(this, arguments);\n }\n return false;\n };\n}\nvar _oldOnUnhandledRejectionHandler = null;\n/** JSDoc */\nfunction instrumentUnhandledRejection() {\n _oldOnUnhandledRejectionHandler = global.onunhandledrejection;\n global.onunhandledrejection = function (e) {\n triggerHandlers('unhandledrejection', e);\n if (_oldOnUnhandledRejectionHandler) {\n // eslint-disable-next-line prefer-rest-params\n return _oldOnUnhandledRejectionHandler.apply(this, arguments);\n }\n return true;\n };\n}\n//# sourceMappingURL=instrument.js.map","import { __read } from \"tslib\";\nimport { SentryError } from './error';\n/** Regular expression used to parse a Dsn. */\nvar DSN_REGEX = /^(?:(\\w+):)\\/\\/(?:(\\w+)(?::(\\w+))?@)([\\w.-]+)(?::(\\d+))?\\/(.+)/;\n/** Error message */\nvar ERROR_MESSAGE = 'Invalid Dsn';\n/** The Sentry Dsn, identifying a Sentry instance and project. */\nvar Dsn = /** @class */ (function () {\n /** Creates a new Dsn component */\n function Dsn(from) {\n if (typeof from === 'string') {\n this._fromString(from);\n }\n else {\n this._fromComponents(from);\n }\n this._validate();\n }\n /**\n * Renders the string representation of this Dsn.\n *\n * By default, this will render the public representation without the password\n * component. To get the deprecated private representation, set `withPassword`\n * to true.\n *\n * @param withPassword When set to true, the password will be included.\n */\n Dsn.prototype.toString = function (withPassword) {\n if (withPassword === void 0) { withPassword = false; }\n var _a = this, host = _a.host, path = _a.path, pass = _a.pass, port = _a.port, projectId = _a.projectId, protocol = _a.protocol, user = _a.user;\n return (protocol + \"://\" + user + (withPassword && pass ? \":\" + pass : '') +\n (\"@\" + host + (port ? \":\" + port : '') + \"/\" + (path ? path + \"/\" : path) + projectId));\n };\n /** Parses a string into this Dsn. */\n Dsn.prototype._fromString = function (str) {\n var match = DSN_REGEX.exec(str);\n if (!match) {\n throw new SentryError(ERROR_MESSAGE);\n }\n var _a = __read(match.slice(1), 6), protocol = _a[0], user = _a[1], _b = _a[2], pass = _b === void 0 ? '' : _b, host = _a[3], _c = _a[4], port = _c === void 0 ? '' : _c, lastPath = _a[5];\n var path = '';\n var projectId = lastPath;\n var split = projectId.split('/');\n if (split.length > 1) {\n path = split.slice(0, -1).join('/');\n projectId = split.pop();\n }\n if (projectId) {\n var projectMatch = projectId.match(/^\\d+/);\n if (projectMatch) {\n projectId = projectMatch[0];\n }\n }\n this._fromComponents({ host: host, pass: pass, path: path, projectId: projectId, port: port, protocol: protocol, user: user });\n };\n /** Maps Dsn components into this instance. */\n Dsn.prototype._fromComponents = function (components) {\n this.protocol = components.protocol;\n this.user = components.user;\n this.pass = components.pass || '';\n this.host = components.host;\n this.port = components.port || '';\n this.path = components.path || '';\n this.projectId = components.projectId;\n };\n /** Validates this Dsn and throws on error. */\n Dsn.prototype._validate = function () {\n var _this = this;\n ['protocol', 'user', 'host', 'projectId'].forEach(function (component) {\n if (!_this[component]) {\n throw new SentryError(ERROR_MESSAGE + \": \" + component + \" missing\");\n }\n });\n if (!this.projectId.match(/^\\d+$/)) {\n throw new SentryError(ERROR_MESSAGE + \": Invalid projectId \" + this.projectId);\n }\n if (this.protocol !== 'http' && this.protocol !== 'https') {\n throw new SentryError(ERROR_MESSAGE + \": Invalid protocol \" + this.protocol);\n }\n if (this.port && isNaN(parseInt(this.port, 10))) {\n throw new SentryError(ERROR_MESSAGE + \": Invalid port \" + this.port);\n }\n };\n return Dsn;\n}());\nexport { Dsn };\n//# sourceMappingURL=dsn.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { getGlobalObject, isPlainObject, isThenable, SyncPromise, timestampWithMs } from '@sentry/utils';\n/**\n * Holds additional event information. {@link Scope.applyToEvent} will be\n * called by the client before an event will be sent.\n */\nvar Scope = /** @class */ (function () {\n function Scope() {\n /** Flag if notifiying is happening. */\n this._notifyingListeners = false;\n /** Callback for client to receive scope changes. */\n this._scopeListeners = [];\n /** Callback list that will be called after {@link applyToEvent}. */\n this._eventProcessors = [];\n /** Array of breadcrumbs. */\n this._breadcrumbs = [];\n /** User */\n this._user = {};\n /** Tags */\n this._tags = {};\n /** Extra */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this._extra = {};\n /** Contexts */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this._contexts = {};\n }\n /**\n * Inherit values from the parent scope.\n * @param scope to clone.\n */\n Scope.clone = function (scope) {\n var newScope = new Scope();\n if (scope) {\n newScope._breadcrumbs = __spread(scope._breadcrumbs);\n newScope._tags = __assign({}, scope._tags);\n newScope._extra = __assign({}, scope._extra);\n newScope._contexts = __assign({}, scope._contexts);\n newScope._user = scope._user;\n newScope._level = scope._level;\n newScope._span = scope._span;\n newScope._transactionName = scope._transactionName;\n newScope._fingerprint = scope._fingerprint;\n newScope._eventProcessors = __spread(scope._eventProcessors);\n }\n return newScope;\n };\n /**\n * Add internal on change listener. Used for sub SDKs that need to store the scope.\n * @hidden\n */\n Scope.prototype.addScopeListener = function (callback) {\n this._scopeListeners.push(callback);\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.addEventProcessor = function (callback) {\n this._eventProcessors.push(callback);\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setUser = function (user) {\n this._user = user || {};\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setTags = function (tags) {\n this._tags = __assign(__assign({}, this._tags), tags);\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setTag = function (key, value) {\n var _a;\n this._tags = __assign(__assign({}, this._tags), (_a = {}, _a[key] = value, _a));\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setExtras = function (extras) {\n this._extra = __assign(__assign({}, this._extra), extras);\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setExtra = function (key, extra) {\n var _a;\n this._extra = __assign(__assign({}, this._extra), (_a = {}, _a[key] = extra, _a));\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setFingerprint = function (fingerprint) {\n this._fingerprint = fingerprint;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setLevel = function (level) {\n this._level = level;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setTransactionName = function (name) {\n this._transactionName = name;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * Can be removed in major version.\n * @deprecated in favor of {@link this.setTransactionName}\n */\n Scope.prototype.setTransaction = function (name) {\n return this.setTransactionName(name);\n };\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Scope.prototype.setContext = function (key, context) {\n var _a;\n this._contexts = __assign(__assign({}, this._contexts), (_a = {}, _a[key] = context, _a));\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.setSpan = function (span) {\n this._span = span;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.getSpan = function () {\n return this._span;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.getTransaction = function () {\n var span = this.getSpan();\n if (span && span.spanRecorder && span.spanRecorder.spans[0]) {\n return span.spanRecorder.spans[0];\n }\n return undefined;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.update = function (captureContext) {\n if (!captureContext) {\n return this;\n }\n if (typeof captureContext === 'function') {\n var updatedScope = captureContext(this);\n return updatedScope instanceof Scope ? updatedScope : this;\n }\n if (captureContext instanceof Scope) {\n this._tags = __assign(__assign({}, this._tags), captureContext._tags);\n this._extra = __assign(__assign({}, this._extra), captureContext._extra);\n this._contexts = __assign(__assign({}, this._contexts), captureContext._contexts);\n if (captureContext._user) {\n this._user = captureContext._user;\n }\n if (captureContext._level) {\n this._level = captureContext._level;\n }\n if (captureContext._fingerprint) {\n this._fingerprint = captureContext._fingerprint;\n }\n }\n else if (isPlainObject(captureContext)) {\n // eslint-disable-next-line no-param-reassign\n captureContext = captureContext;\n this._tags = __assign(__assign({}, this._tags), captureContext.tags);\n this._extra = __assign(__assign({}, this._extra), captureContext.extra);\n this._contexts = __assign(__assign({}, this._contexts), captureContext.contexts);\n if (captureContext.user) {\n this._user = captureContext.user;\n }\n if (captureContext.level) {\n this._level = captureContext.level;\n }\n if (captureContext.fingerprint) {\n this._fingerprint = captureContext.fingerprint;\n }\n }\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.clear = function () {\n this._breadcrumbs = [];\n this._tags = {};\n this._extra = {};\n this._user = {};\n this._contexts = {};\n this._level = undefined;\n this._transactionName = undefined;\n this._fingerprint = undefined;\n this._span = undefined;\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.addBreadcrumb = function (breadcrumb, maxBreadcrumbs) {\n var mergedBreadcrumb = __assign({ timestamp: timestampWithMs() }, breadcrumb);\n this._breadcrumbs =\n maxBreadcrumbs !== undefined && maxBreadcrumbs >= 0\n ? __spread(this._breadcrumbs, [mergedBreadcrumb]).slice(-maxBreadcrumbs)\n : __spread(this._breadcrumbs, [mergedBreadcrumb]);\n this._notifyScopeListeners();\n return this;\n };\n /**\n * @inheritDoc\n */\n Scope.prototype.clearBreadcrumbs = function () {\n this._breadcrumbs = [];\n this._notifyScopeListeners();\n return this;\n };\n /**\n * Applies the current context and fingerprint to the event.\n * Note that breadcrumbs will be added by the client.\n * Also if the event has already breadcrumbs on it, we do not merge them.\n * @param event Event\n * @param hint May contain additional informartion about the original exception.\n * @hidden\n */\n Scope.prototype.applyToEvent = function (event, hint) {\n if (this._extra && Object.keys(this._extra).length) {\n event.extra = __assign(__assign({}, this._extra), event.extra);\n }\n if (this._tags && Object.keys(this._tags).length) {\n event.tags = __assign(__assign({}, this._tags), event.tags);\n }\n if (this._user && Object.keys(this._user).length) {\n event.user = __assign(__assign({}, this._user), event.user);\n }\n if (this._contexts && Object.keys(this._contexts).length) {\n event.contexts = __assign(__assign({}, this._contexts), event.contexts);\n }\n if (this._level) {\n event.level = this._level;\n }\n if (this._transactionName) {\n event.transaction = this._transactionName;\n }\n // We want to set the trace context for normal events only if there isn't already\n // a trace context on the event. There is a product feature in place where we link\n // errors with transaction and it relys on that.\n if (this._span) {\n event.contexts = __assign({ trace: this._span.getTraceContext() }, event.contexts);\n }\n this._applyFingerprint(event);\n event.breadcrumbs = __spread((event.breadcrumbs || []), this._breadcrumbs);\n event.breadcrumbs = event.breadcrumbs.length > 0 ? event.breadcrumbs : undefined;\n return this._notifyEventProcessors(__spread(getGlobalEventProcessors(), this._eventProcessors), event, hint);\n };\n /**\n * This will be called after {@link applyToEvent} is finished.\n */\n Scope.prototype._notifyEventProcessors = function (processors, event, hint, index) {\n var _this = this;\n if (index === void 0) { index = 0; }\n return new SyncPromise(function (resolve, reject) {\n var processor = processors[index];\n if (event === null || typeof processor !== 'function') {\n resolve(event);\n }\n else {\n var result = processor(__assign({}, event), hint);\n if (isThenable(result)) {\n result\n .then(function (final) { return _this._notifyEventProcessors(processors, final, hint, index + 1).then(resolve); })\n .then(null, reject);\n }\n else {\n _this._notifyEventProcessors(processors, result, hint, index + 1)\n .then(resolve)\n .then(null, reject);\n }\n }\n });\n };\n /**\n * This will be called on every set call.\n */\n Scope.prototype._notifyScopeListeners = function () {\n var _this = this;\n if (!this._notifyingListeners) {\n this._notifyingListeners = true;\n setTimeout(function () {\n _this._scopeListeners.forEach(function (callback) {\n callback(_this);\n });\n _this._notifyingListeners = false;\n });\n }\n };\n /**\n * Applies fingerprint from the scope to the event if there's one,\n * uses message if there's one instead or get rid of empty fingerprint\n */\n Scope.prototype._applyFingerprint = function (event) {\n // Make sure it's an array first and we actually have something in place\n event.fingerprint = event.fingerprint\n ? Array.isArray(event.fingerprint)\n ? event.fingerprint\n : [event.fingerprint]\n : [];\n // If we have something on the scope, then merge it with event\n if (this._fingerprint) {\n event.fingerprint = event.fingerprint.concat(this._fingerprint);\n }\n // If we have no data at all, remove empty array default\n if (event.fingerprint && !event.fingerprint.length) {\n delete event.fingerprint;\n }\n };\n return Scope;\n}());\nexport { Scope };\n/**\n * Retruns the global event processors.\n */\nfunction getGlobalEventProcessors() {\n var global = getGlobalObject();\n global.__SENTRY__ = global.__SENTRY__ || {};\n global.__SENTRY__.globalEventProcessors = global.__SENTRY__.globalEventProcessors || [];\n return global.__SENTRY__.globalEventProcessors;\n}\n/**\n * Add a EventProcessor to be kept globally.\n * @param callback EventProcessor to add\n */\nexport function addGlobalEventProcessor(callback) {\n getGlobalEventProcessors().push(callback);\n}\n//# sourceMappingURL=scope.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { consoleSandbox, getGlobalObject, isNodeEnv, logger, timestampWithMs, uuid4 } from '@sentry/utils';\nimport { Scope } from './scope';\n/**\n * API compatibility version of this hub.\n *\n * WARNING: This number should only be increased when the global interface\n * changes and new methods are introduced.\n *\n * @hidden\n */\nexport var API_VERSION = 3;\n/**\n * Default maximum number of breadcrumbs added to an event. Can be overwritten\n * with {@link Options.maxBreadcrumbs}.\n */\nvar DEFAULT_BREADCRUMBS = 100;\n/**\n * Absolute maximum number of breadcrumbs added to an event. The\n * `maxBreadcrumbs` option cannot be higher than this value.\n */\nvar MAX_BREADCRUMBS = 100;\n/**\n * @inheritDoc\n */\nvar Hub = /** @class */ (function () {\n /**\n * Creates a new instance of the hub, will push one {@link Layer} into the\n * internal stack on creation.\n *\n * @param client bound to the hub.\n * @param scope bound to the hub.\n * @param version number, higher number means higher priority.\n */\n function Hub(client, scope, _version) {\n if (scope === void 0) { scope = new Scope(); }\n if (_version === void 0) { _version = API_VERSION; }\n this._version = _version;\n /** Is a {@link Layer}[] containing the client and scope */\n this._stack = [];\n this._stack.push({ client: client, scope: scope });\n this.bindClient(client);\n }\n /**\n * @inheritDoc\n */\n Hub.prototype.isOlderThan = function (version) {\n return this._version < version;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.bindClient = function (client) {\n var top = this.getStackTop();\n top.client = client;\n if (client && client.setupIntegrations) {\n client.setupIntegrations();\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.pushScope = function () {\n // We want to clone the content of prev scope\n var stack = this.getStack();\n var parentScope = stack.length > 0 ? stack[stack.length - 1].scope : undefined;\n var scope = Scope.clone(parentScope);\n this.getStack().push({\n client: this.getClient(),\n scope: scope,\n });\n return scope;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.popScope = function () {\n return this.getStack().pop() !== undefined;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.withScope = function (callback) {\n var scope = this.pushScope();\n try {\n callback(scope);\n }\n finally {\n this.popScope();\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.getClient = function () {\n return this.getStackTop().client;\n };\n /** Returns the scope of the top stack. */\n Hub.prototype.getScope = function () {\n return this.getStackTop().scope;\n };\n /** Returns the scope stack for domains or the process. */\n Hub.prototype.getStack = function () {\n return this._stack;\n };\n /** Returns the topmost scope layer in the order domain > local > process. */\n Hub.prototype.getStackTop = function () {\n return this._stack[this._stack.length - 1];\n };\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n Hub.prototype.captureException = function (exception, hint) {\n var eventId = (this._lastEventId = uuid4());\n var finalHint = hint;\n // If there's no explicit hint provided, mimick the same thing that would happen\n // in the minimal itself to create a consistent behavior.\n // We don't do this in the client, as it's the lowest level API, and doing this,\n // would prevent user from having full control over direct calls.\n if (!hint) {\n var syntheticException = void 0;\n try {\n throw new Error('Sentry syntheticException');\n }\n catch (exception) {\n syntheticException = exception;\n }\n finalHint = {\n originalException: exception,\n syntheticException: syntheticException,\n };\n }\n this._invokeClient('captureException', exception, __assign(__assign({}, finalHint), { event_id: eventId }));\n return eventId;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.captureMessage = function (message, level, hint) {\n var eventId = (this._lastEventId = uuid4());\n var finalHint = hint;\n // If there's no explicit hint provided, mimick the same thing that would happen\n // in the minimal itself to create a consistent behavior.\n // We don't do this in the client, as it's the lowest level API, and doing this,\n // would prevent user from having full control over direct calls.\n if (!hint) {\n var syntheticException = void 0;\n try {\n throw new Error(message);\n }\n catch (exception) {\n syntheticException = exception;\n }\n finalHint = {\n originalException: message,\n syntheticException: syntheticException,\n };\n }\n this._invokeClient('captureMessage', message, level, __assign(__assign({}, finalHint), { event_id: eventId }));\n return eventId;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.captureEvent = function (event, hint) {\n var eventId = (this._lastEventId = uuid4());\n this._invokeClient('captureEvent', event, __assign(__assign({}, hint), { event_id: eventId }));\n return eventId;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.lastEventId = function () {\n return this._lastEventId;\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.addBreadcrumb = function (breadcrumb, hint) {\n var top = this.getStackTop();\n if (!top.scope || !top.client) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/unbound-method\n var _a = (top.client.getOptions && top.client.getOptions()) || {}, _b = _a.beforeBreadcrumb, beforeBreadcrumb = _b === void 0 ? null : _b, _c = _a.maxBreadcrumbs, maxBreadcrumbs = _c === void 0 ? DEFAULT_BREADCRUMBS : _c;\n if (maxBreadcrumbs <= 0) {\n return;\n }\n var timestamp = timestampWithMs();\n var mergedBreadcrumb = __assign({ timestamp: timestamp }, breadcrumb);\n var finalBreadcrumb = beforeBreadcrumb\n ? consoleSandbox(function () { return beforeBreadcrumb(mergedBreadcrumb, hint); })\n : mergedBreadcrumb;\n if (finalBreadcrumb === null) {\n return;\n }\n top.scope.addBreadcrumb(finalBreadcrumb, Math.min(maxBreadcrumbs, MAX_BREADCRUMBS));\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setUser = function (user) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setUser(user);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setTags = function (tags) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setTags(tags);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setExtras = function (extras) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setExtras(extras);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setTag = function (key, value) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setTag(key, value);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.setExtra = function (key, extra) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setExtra(key, extra);\n };\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Hub.prototype.setContext = function (name, context) {\n var top = this.getStackTop();\n if (!top.scope) {\n return;\n }\n top.scope.setContext(name, context);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.configureScope = function (callback) {\n var top = this.getStackTop();\n if (top.scope && top.client) {\n callback(top.scope);\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.run = function (callback) {\n var oldHub = makeMain(this);\n try {\n callback(this);\n }\n finally {\n makeMain(oldHub);\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.getIntegration = function (integration) {\n var client = this.getClient();\n if (!client) {\n return null;\n }\n try {\n return client.getIntegration(integration);\n }\n catch (_oO) {\n logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Hub\");\n return null;\n }\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.startSpan = function (context) {\n return this._callExtensionMethod('startSpan', context);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.startTransaction = function (context) {\n return this._callExtensionMethod('startTransaction', context);\n };\n /**\n * @inheritDoc\n */\n Hub.prototype.traceHeaders = function () {\n return this._callExtensionMethod('traceHeaders');\n };\n /**\n * Internal helper function to call a method on the top client if it exists.\n *\n * @param method The method to call on the client.\n * @param args Arguments to pass to the client function.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Hub.prototype._invokeClient = function (method) {\n var _a;\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var top = this.getStackTop();\n if (top && top.client && top.client[method]) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access, @typescript-eslint/no-explicit-any\n (_a = top.client)[method].apply(_a, __spread(args, [top.scope]));\n }\n };\n /**\n * Calls global extension method and binding current instance to the function call\n */\n // @ts-ignore Function lacks ending return statement and return type does not include 'undefined'. ts(2366)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Hub.prototype._callExtensionMethod = function (method) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var carrier = getMainCarrier();\n var sentry = carrier.__SENTRY__;\n if (sentry && sentry.extensions && typeof sentry.extensions[method] === 'function') {\n return sentry.extensions[method].apply(this, args);\n }\n logger.warn(\"Extension method \" + method + \" couldn't be found, doing nothing.\");\n };\n return Hub;\n}());\nexport { Hub };\n/** Returns the global shim registry. */\nexport function getMainCarrier() {\n var carrier = getGlobalObject();\n carrier.__SENTRY__ = carrier.__SENTRY__ || {\n extensions: {},\n hub: undefined,\n };\n return carrier;\n}\n/**\n * Replaces the current main hub with the passed one on the global object\n *\n * @returns The old replaced hub\n */\nexport function makeMain(hub) {\n var registry = getMainCarrier();\n var oldHub = getHubFromCarrier(registry);\n setHubOnCarrier(registry, hub);\n return oldHub;\n}\n/**\n * Returns the default hub instance.\n *\n * If a hub is already registered in the global carrier but this module\n * contains a more recent version, it replaces the registered version.\n * Otherwise, the currently registered hub will be returned.\n */\nexport function getCurrentHub() {\n // Get main carrier (global for every environment)\n var registry = getMainCarrier();\n // If there's no hub, or its an old API, assign a new one\n if (!hasHubOnCarrier(registry) || getHubFromCarrier(registry).isOlderThan(API_VERSION)) {\n setHubOnCarrier(registry, new Hub());\n }\n // Prefer domains over global if they are there (applicable only to Node environment)\n if (isNodeEnv()) {\n return getHubFromActiveDomain(registry);\n }\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n}\n/**\n * Try to read the hub from an active domain, and fallback to the registry if one doesn't exist\n * @returns discovered hub\n */\nfunction getHubFromActiveDomain(registry) {\n try {\n var property = 'domain';\n var carrier = getMainCarrier();\n var sentry = carrier.__SENTRY__;\n if (!sentry || !sentry.extensions || !sentry.extensions[property]) {\n return getHubFromCarrier(registry);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var domain = sentry.extensions[property];\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n var activeDomain = domain.active;\n // If there's no active domain, just return global hub\n if (!activeDomain) {\n return getHubFromCarrier(registry);\n }\n // If there's no hub on current domain, or it's an old API, assign a new one\n if (!hasHubOnCarrier(activeDomain) || getHubFromCarrier(activeDomain).isOlderThan(API_VERSION)) {\n var registryHubTopStack = getHubFromCarrier(registry).getStackTop();\n setHubOnCarrier(activeDomain, new Hub(registryHubTopStack.client, Scope.clone(registryHubTopStack.scope)));\n }\n // Return hub that lives on a domain\n return getHubFromCarrier(activeDomain);\n }\n catch (_Oo) {\n // Return hub that lives on a global object\n return getHubFromCarrier(registry);\n }\n}\n/**\n * This will tell whether a carrier has a hub on it or not\n * @param carrier object\n */\nfunction hasHubOnCarrier(carrier) {\n if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n return true;\n }\n return false;\n}\n/**\n * This will create a new {@link Hub} and add to the passed object on\n * __SENTRY__.hub.\n * @param carrier object\n * @hidden\n */\nexport function getHubFromCarrier(carrier) {\n if (carrier && carrier.__SENTRY__ && carrier.__SENTRY__.hub) {\n return carrier.__SENTRY__.hub;\n }\n carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n carrier.__SENTRY__.hub = new Hub();\n return carrier.__SENTRY__.hub;\n}\n/**\n * This will set passed {@link Hub} on the passed object's __SENTRY__.hub attribute\n * @param carrier object\n * @param hub Hub\n */\nexport function setHubOnCarrier(carrier, hub) {\n if (!carrier) {\n return false;\n }\n carrier.__SENTRY__ = carrier.__SENTRY__ || {};\n carrier.__SENTRY__.hub = hub;\n return true;\n}\n//# sourceMappingURL=hub.js.map","import { __assign, __read, __spread } from \"tslib\";\nimport { getCurrentHub } from '@sentry/hub';\n/**\n * This calls a function on the current hub.\n * @param method function to call on hub.\n * @param args to pass to function.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction callOnHub(method) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n var hub = getCurrentHub();\n if (hub && hub[method]) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return hub[method].apply(hub, __spread(args));\n }\n throw new Error(\"No hub defined or \" + method + \" was not found on the hub, please open a bug report.\");\n}\n/**\n * Captures an exception event and sends it to Sentry.\n *\n * @param exception An exception-like object.\n * @returns The generated eventId.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function captureException(exception, captureContext) {\n var syntheticException;\n try {\n throw new Error('Sentry syntheticException');\n }\n catch (exception) {\n syntheticException = exception;\n }\n return callOnHub('captureException', exception, {\n captureContext: captureContext,\n originalException: exception,\n syntheticException: syntheticException,\n });\n}\n/**\n * Captures a message event and sends it to Sentry.\n *\n * @param message The message to send to Sentry.\n * @param level Define the level of the message.\n * @returns The generated eventId.\n */\nexport function captureMessage(message, captureContext) {\n var syntheticException;\n try {\n throw new Error(message);\n }\n catch (exception) {\n syntheticException = exception;\n }\n // This is necessary to provide explicit scopes upgrade, without changing the original\n // arrity of the `captureMessage(message, level)` method.\n var level = typeof captureContext === 'string' ? captureContext : undefined;\n var context = typeof captureContext !== 'string' ? { captureContext: captureContext } : undefined;\n return callOnHub('captureMessage', message, level, __assign({ originalException: message, syntheticException: syntheticException }, context));\n}\n/**\n * Captures a manually created event and sends it to Sentry.\n *\n * @param event The event to send to Sentry.\n * @returns The generated eventId.\n */\nexport function captureEvent(event) {\n return callOnHub('captureEvent', event);\n}\n/**\n * Callback to set context information onto the scope.\n * @param callback Callback function that receives Scope.\n */\nexport function configureScope(callback) {\n callOnHub('configureScope', callback);\n}\n/**\n * Records a new breadcrumb which will be attached to future events.\n *\n * Breadcrumbs will be added to subsequent events to provide more context on\n * user's actions prior to an error or crash.\n *\n * @param breadcrumb The breadcrumb to record.\n */\nexport function addBreadcrumb(breadcrumb) {\n callOnHub('addBreadcrumb', breadcrumb);\n}\n/**\n * Sets context data with the given name.\n * @param name of the context\n * @param context Any kind of data. This data will be normalized.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function setContext(name, context) {\n callOnHub('setContext', name, context);\n}\n/**\n * Set an object that will be merged sent as extra data with the event.\n * @param extras Extras object to merge into current context.\n */\nexport function setExtras(extras) {\n callOnHub('setExtras', extras);\n}\n/**\n * Set an object that will be merged sent as tags data with the event.\n * @param tags Tags context object to merge into current context.\n */\nexport function setTags(tags) {\n callOnHub('setTags', tags);\n}\n/**\n * Set key:value that will be sent as extra data with the event.\n * @param key String of extra\n * @param extra Any kind of data. This data will be normalized.\n */\nexport function setExtra(key, extra) {\n callOnHub('setExtra', key, extra);\n}\n/**\n * Set key:value that will be sent as tags data with the event.\n * @param key String key of tag\n * @param value String value of tag\n */\nexport function setTag(key, value) {\n callOnHub('setTag', key, value);\n}\n/**\n * Updates user context information for future events.\n *\n * @param user User context object to be set in the current context. Pass `null` to unset the user.\n */\nexport function setUser(user) {\n callOnHub('setUser', user);\n}\n/**\n * Creates a new scope with and executes the given operation within.\n * The scope is automatically removed once the operation\n * finishes or throws.\n *\n * This is essentially a convenience function for:\n *\n * pushScope();\n * callback();\n * popScope();\n *\n * @param callback that will be enclosed into push/popScope.\n */\nexport function withScope(callback) {\n callOnHub('withScope', callback);\n}\n/**\n * Calls a function on the latest client. Use this with caution, it's meant as\n * in \"internal\" helper so we don't need to expose every possible function in\n * the shim. It is not guaranteed that the client actually implements the\n * function.\n *\n * @param method The method to call on the client/client.\n * @param args Arguments to pass to the client/fontend.\n * @hidden\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function _callOnClient(method) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n callOnHub.apply(void 0, __spread(['_invokeClient', method], args));\n}\n/**\n * Starts a new `Transaction` and returns it. This is the entry point to manual\n * tracing instrumentation.\n *\n * A tree structure can be built by adding child spans to the transaction, and\n * child spans to other spans. To start a new child span within the transaction\n * or any span, call the respective `.startChild()` method.\n *\n * Every child span must be finished before the transaction is finished,\n * otherwise the unfinished spans are discarded.\n *\n * The transaction must be finished with a call to its `.finish()` method, at\n * which point the transaction with all its finished child spans will be sent to\n * Sentry.\n *\n * @param context Properties of the new `Transaction`.\n */\nexport function startTransaction(context) {\n return callOnHub('startTransaction', __assign({}, context));\n}\n//# sourceMappingURL=index.js.map","import { Dsn, urlEncode } from '@sentry/utils';\nvar SENTRY_API_VERSION = '7';\n/** Helper class to provide urls to different Sentry endpoints. */\nvar API = /** @class */ (function () {\n /** Create a new instance of API */\n function API(dsn) {\n this.dsn = dsn;\n this._dsnObject = new Dsn(dsn);\n }\n /** Returns the Dsn object. */\n API.prototype.getDsn = function () {\n return this._dsnObject;\n };\n /** Returns the prefix to construct Sentry ingestion API endpoints. */\n API.prototype.getBaseApiEndpoint = function () {\n var dsn = this._dsnObject;\n var protocol = dsn.protocol ? dsn.protocol + \":\" : '';\n var port = dsn.port ? \":\" + dsn.port : '';\n return protocol + \"//\" + dsn.host + port + (dsn.path ? \"/\" + dsn.path : '') + \"/api/\";\n };\n /** Returns the store endpoint URL. */\n API.prototype.getStoreEndpoint = function () {\n return this._getIngestEndpoint('store');\n };\n /**\n * Returns the store endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\n API.prototype.getStoreEndpointWithUrlEncodedAuth = function () {\n return this.getStoreEndpoint() + \"?\" + this._encodedAuth();\n };\n /**\n * Returns the envelope endpoint URL with auth in the query string.\n *\n * Sending auth as part of the query string and not as custom HTTP headers avoids CORS preflight requests.\n */\n API.prototype.getEnvelopeEndpointWithUrlEncodedAuth = function () {\n return this._getEnvelopeEndpoint() + \"?\" + this._encodedAuth();\n };\n /** Returns only the path component for the store endpoint. */\n API.prototype.getStoreEndpointPath = function () {\n var dsn = this._dsnObject;\n return (dsn.path ? \"/\" + dsn.path : '') + \"/api/\" + dsn.projectId + \"/store/\";\n };\n /**\n * Returns an object that can be used in request headers.\n * This is needed for node and the old /store endpoint in sentry\n */\n API.prototype.getRequestHeaders = function (clientName, clientVersion) {\n var dsn = this._dsnObject;\n var header = [\"Sentry sentry_version=\" + SENTRY_API_VERSION];\n header.push(\"sentry_client=\" + clientName + \"/\" + clientVersion);\n header.push(\"sentry_key=\" + dsn.user);\n if (dsn.pass) {\n header.push(\"sentry_secret=\" + dsn.pass);\n }\n return {\n 'Content-Type': 'application/json',\n 'X-Sentry-Auth': header.join(', '),\n };\n };\n /** Returns the url to the report dialog endpoint. */\n API.prototype.getReportDialogEndpoint = function (dialogOptions) {\n if (dialogOptions === void 0) { dialogOptions = {}; }\n var dsn = this._dsnObject;\n var endpoint = this.getBaseApiEndpoint() + \"embed/error-page/\";\n var encodedOptions = [];\n encodedOptions.push(\"dsn=\" + dsn.toString());\n for (var key in dialogOptions) {\n if (key === 'user') {\n if (!dialogOptions.user) {\n continue;\n }\n if (dialogOptions.user.name) {\n encodedOptions.push(\"name=\" + encodeURIComponent(dialogOptions.user.name));\n }\n if (dialogOptions.user.email) {\n encodedOptions.push(\"email=\" + encodeURIComponent(dialogOptions.user.email));\n }\n }\n else {\n encodedOptions.push(encodeURIComponent(key) + \"=\" + encodeURIComponent(dialogOptions[key]));\n }\n }\n if (encodedOptions.length) {\n return endpoint + \"?\" + encodedOptions.join('&');\n }\n return endpoint;\n };\n /** Returns the envelope endpoint URL. */\n API.prototype._getEnvelopeEndpoint = function () {\n return this._getIngestEndpoint('envelope');\n };\n /** Returns the ingest API endpoint for target. */\n API.prototype._getIngestEndpoint = function (target) {\n var base = this.getBaseApiEndpoint();\n var dsn = this._dsnObject;\n return \"\" + base + dsn.projectId + \"/\" + target + \"/\";\n };\n /** Returns a URL-encoded string with auth config suitable for a query string. */\n API.prototype._encodedAuth = function () {\n var dsn = this._dsnObject;\n var auth = {\n // We send only the minimum set of required information. See\n // https://github.com/getsentry/sentry-javascript/issues/2572.\n sentry_key: dsn.user,\n sentry_version: SENTRY_API_VERSION,\n };\n return urlEncode(auth);\n };\n return API;\n}());\nexport { API };\n//# sourceMappingURL=api.js.map","import { __read, __spread } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\nexport var installedIntegrations = [];\n/** Gets integration to install */\nexport function getIntegrationsToSetup(options) {\n var defaultIntegrations = (options.defaultIntegrations && __spread(options.defaultIntegrations)) || [];\n var userIntegrations = options.integrations;\n var integrations = [];\n if (Array.isArray(userIntegrations)) {\n var userIntegrationsNames_1 = userIntegrations.map(function (i) { return i.name; });\n var pickedIntegrationsNames_1 = [];\n // Leave only unique default integrations, that were not overridden with provided user integrations\n defaultIntegrations.forEach(function (defaultIntegration) {\n if (userIntegrationsNames_1.indexOf(defaultIntegration.name) === -1 &&\n pickedIntegrationsNames_1.indexOf(defaultIntegration.name) === -1) {\n integrations.push(defaultIntegration);\n pickedIntegrationsNames_1.push(defaultIntegration.name);\n }\n });\n // Don't add same user integration twice\n userIntegrations.forEach(function (userIntegration) {\n if (pickedIntegrationsNames_1.indexOf(userIntegration.name) === -1) {\n integrations.push(userIntegration);\n pickedIntegrationsNames_1.push(userIntegration.name);\n }\n });\n }\n else if (typeof userIntegrations === 'function') {\n integrations = userIntegrations(defaultIntegrations);\n integrations = Array.isArray(integrations) ? integrations : [integrations];\n }\n else {\n integrations = __spread(defaultIntegrations);\n }\n // Make sure that if present, `Debug` integration will always run last\n var integrationsNames = integrations.map(function (i) { return i.name; });\n var alwaysLastToRun = 'Debug';\n if (integrationsNames.indexOf(alwaysLastToRun) !== -1) {\n integrations.push.apply(integrations, __spread(integrations.splice(integrationsNames.indexOf(alwaysLastToRun), 1)));\n }\n return integrations;\n}\n/** Setup given integration */\nexport function setupIntegration(integration) {\n if (installedIntegrations.indexOf(integration.name) !== -1) {\n return;\n }\n integration.setupOnce(addGlobalEventProcessor, getCurrentHub);\n installedIntegrations.push(integration.name);\n logger.log(\"Integration installed: \" + integration.name);\n}\n/**\n * Given a list of integration instances this installs them all. When `withDefaults` is set to `true` then all default\n * integrations are added unless they were already provided before.\n * @param integrations array of integration instances\n * @param withDefault should enable default integrations\n */\nexport function setupIntegrations(options) {\n var integrations = {};\n getIntegrationsToSetup(options).forEach(function (integration) {\n integrations[integration.name] = integration;\n setupIntegration(integration);\n });\n return integrations;\n}\n//# sourceMappingURL=integration.js.map","import { __assign } from \"tslib\";\n/* eslint-disable max-lines */\nimport { Scope } from '@sentry/hub';\nimport { Dsn, isPrimitive, isThenable, logger, normalize, SyncPromise, timestampWithMs, truncate, uuid4, } from '@sentry/utils';\nimport { setupIntegrations } from './integration';\n/**\n * Base implementation for all JavaScript SDK clients.\n *\n * Call the constructor with the corresponding backend constructor and options\n * specific to the client subclass. To access these options later, use\n * {@link Client.getOptions}. Also, the Backend instance is available via\n * {@link Client.getBackend}.\n *\n * If a Dsn is specified in the options, it will be parsed and stored. Use\n * {@link Client.getDsn} to retrieve the Dsn at any moment. In case the Dsn is\n * invalid, the constructor will throw a {@link SentryException}. Note that\n * without a valid Dsn, the SDK will not send any events to Sentry.\n *\n * Before sending an event via the backend, it is passed through\n * {@link BaseClient.prepareEvent} to add SDK information and scope data\n * (breadcrumbs and context). To add more custom information, override this\n * method and extend the resulting prepared event.\n *\n * To issue automatically created events (e.g. via instrumentation), use\n * {@link Client.captureEvent}. It will prepare the event and pass it through\n * the callback lifecycle. To issue auto-breadcrumbs, use\n * {@link Client.addBreadcrumb}.\n *\n * @example\n * class NodeClient extends BaseClient<NodeBackend, NodeOptions> {\n * public constructor(options: NodeOptions) {\n * super(NodeBackend, options);\n * }\n *\n * // ...\n * }\n */\nvar BaseClient = /** @class */ (function () {\n /**\n * Initializes this client instance.\n *\n * @param backendClass A constructor function to create the backend.\n * @param options Options for the client.\n */\n function BaseClient(backendClass, options) {\n /** Array of used integrations. */\n this._integrations = {};\n /** Is the client still processing a call? */\n this._processing = false;\n this._backend = new backendClass(options);\n this._options = options;\n if (options.dsn) {\n this._dsn = new Dsn(options.dsn);\n }\n }\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n BaseClient.prototype.captureException = function (exception, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this._getBackend()\n .eventFromException(exception, hint)\n .then(function (event) {\n eventId = _this.captureEvent(event, hint, scope);\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.captureMessage = function (message, level, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n var promisedEvent = isPrimitive(message)\n ? this._getBackend().eventFromMessage(\"\" + message, level, hint)\n : this._getBackend().eventFromException(message, hint);\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n promisedEvent.then(function (event) {\n eventId = _this.captureEvent(event, hint, scope);\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.captureEvent = function (event, hint, scope) {\n var _this = this;\n var eventId = hint && hint.event_id;\n this._processing = true;\n this._processEvent(event, hint, scope)\n .then(function (finalEvent) {\n // We need to check for finalEvent in case beforeSend returned null\n eventId = finalEvent && finalEvent.event_id;\n _this._processing = false;\n })\n .then(null, function (reason) {\n logger.error(reason);\n _this._processing = false;\n });\n return eventId;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getDsn = function () {\n return this._dsn;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getOptions = function () {\n return this._options;\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.flush = function (timeout) {\n var _this = this;\n return this._isClientProcessing(timeout).then(function (status) {\n clearInterval(status.interval);\n return _this._getBackend()\n .getTransport()\n .close(timeout)\n .then(function (transportFlushed) { return status.ready && transportFlushed; });\n });\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.close = function (timeout) {\n var _this = this;\n return this.flush(timeout).then(function (result) {\n _this.getOptions().enabled = false;\n return result;\n });\n };\n /**\n * Sets up the integrations\n */\n BaseClient.prototype.setupIntegrations = function () {\n if (this._isEnabled()) {\n this._integrations = setupIntegrations(this._options);\n }\n };\n /**\n * @inheritDoc\n */\n BaseClient.prototype.getIntegration = function (integration) {\n try {\n return this._integrations[integration.id] || null;\n }\n catch (_oO) {\n logger.warn(\"Cannot retrieve integration \" + integration.id + \" from the current Client\");\n return null;\n }\n };\n /** Waits for the client to be done with processing. */\n BaseClient.prototype._isClientProcessing = function (timeout) {\n var _this = this;\n return new SyncPromise(function (resolve) {\n var ticked = 0;\n var tick = 1;\n var interval = 0;\n clearInterval(interval);\n interval = setInterval(function () {\n if (!_this._processing) {\n resolve({\n interval: interval,\n ready: true,\n });\n }\n else {\n ticked += tick;\n if (timeout && ticked >= timeout) {\n resolve({\n interval: interval,\n ready: false,\n });\n }\n }\n }, tick);\n });\n };\n /** Returns the current backend. */\n BaseClient.prototype._getBackend = function () {\n return this._backend;\n };\n /** Determines whether this SDK is enabled and a valid Dsn is present. */\n BaseClient.prototype._isEnabled = function () {\n return this.getOptions().enabled !== false && this._dsn !== undefined;\n };\n /**\n * Adds common information to events.\n *\n * The information includes release and environment from `options`,\n * breadcrumbs and context (extra, tags and user) from the scope.\n *\n * Information that is already present in the event is never overwritten. For\n * nested objects, such as the context, keys are merged.\n *\n * @param event The original event.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A new event with more information.\n */\n BaseClient.prototype._prepareEvent = function (event, scope, hint) {\n var _this = this;\n var _a = this.getOptions().normalizeDepth, normalizeDepth = _a === void 0 ? 3 : _a;\n var prepared = __assign(__assign({}, event), { event_id: event.event_id || (hint && hint.event_id ? hint.event_id : uuid4()), timestamp: event.timestamp || timestampWithMs() });\n this._applyClientOptions(prepared);\n this._applyIntegrationsMetadata(prepared);\n // If we have scope given to us, use it as the base for further modifications.\n // This allows us to prevent unnecessary copying of data if `captureContext` is not provided.\n var finalScope = scope;\n if (hint && hint.captureContext) {\n finalScope = Scope.clone(finalScope).update(hint.captureContext);\n }\n // We prepare the result here with a resolved Event.\n var result = SyncPromise.resolve(prepared);\n // This should be the last thing called, since we want that\n // {@link Hub.addEventProcessor} gets the finished prepared event.\n if (finalScope) {\n // In case we have a hub we reassign it.\n result = finalScope.applyToEvent(prepared, hint);\n }\n return result.then(function (evt) {\n if (typeof normalizeDepth === 'number' && normalizeDepth > 0) {\n return _this._normalizeEvent(evt, normalizeDepth);\n }\n return evt;\n });\n };\n /**\n * Applies `normalize` function on necessary `Event` attributes to make them safe for serialization.\n * Normalized keys:\n * - `breadcrumbs.data`\n * - `user`\n * - `contexts`\n * - `extra`\n * @param event Event\n * @returns Normalized event\n */\n BaseClient.prototype._normalizeEvent = function (event, depth) {\n if (!event) {\n return null;\n }\n var normalized = __assign(__assign(__assign(__assign(__assign({}, event), (event.breadcrumbs && {\n breadcrumbs: event.breadcrumbs.map(function (b) { return (__assign(__assign({}, b), (b.data && {\n data: normalize(b.data, depth),\n }))); }),\n })), (event.user && {\n user: normalize(event.user, depth),\n })), (event.contexts && {\n contexts: normalize(event.contexts, depth),\n })), (event.extra && {\n extra: normalize(event.extra, depth),\n }));\n // event.contexts.trace stores information about a Transaction. Similarly,\n // event.spans[] stores information about child Spans. Given that a\n // Transaction is conceptually a Span, normalization should apply to both\n // Transactions and Spans consistently.\n // For now the decision is to skip normalization of Transactions and Spans,\n // so this block overwrites the normalized event to add back the original\n // Transaction information prior to normalization.\n if (event.contexts && event.contexts.trace) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n normalized.contexts.trace = event.contexts.trace;\n }\n return normalized;\n };\n /**\n * Enhances event using the client configuration.\n * It takes care of all \"static\" values like environment, release and `dist`,\n * as well as truncating overly long values.\n * @param event event instance to be enhanced\n */\n BaseClient.prototype._applyClientOptions = function (event) {\n var _a = this.getOptions(), environment = _a.environment, release = _a.release, dist = _a.dist, _b = _a.maxValueLength, maxValueLength = _b === void 0 ? 250 : _b;\n if (event.environment === undefined && environment !== undefined) {\n event.environment = environment;\n }\n if (event.release === undefined && release !== undefined) {\n event.release = release;\n }\n if (event.dist === undefined && dist !== undefined) {\n event.dist = dist;\n }\n if (event.message) {\n event.message = truncate(event.message, maxValueLength);\n }\n var exception = event.exception && event.exception.values && event.exception.values[0];\n if (exception && exception.value) {\n exception.value = truncate(exception.value, maxValueLength);\n }\n var request = event.request;\n if (request && request.url) {\n request.url = truncate(request.url, maxValueLength);\n }\n };\n /**\n * This function adds all used integrations to the SDK info in the event.\n * @param sdkInfo The sdkInfo of the event that will be filled with all integrations.\n */\n BaseClient.prototype._applyIntegrationsMetadata = function (event) {\n var sdkInfo = event.sdk;\n var integrationsArray = Object.keys(this._integrations);\n if (sdkInfo && integrationsArray.length > 0) {\n sdkInfo.integrations = integrationsArray;\n }\n };\n /**\n * Tells the backend to send this event\n * @param event The Sentry event to send\n */\n BaseClient.prototype._sendEvent = function (event) {\n this._getBackend().sendEvent(event);\n };\n /**\n * Processes an event (either error or message) and sends it to Sentry.\n *\n * This also adds breadcrumbs and context information to the event. However,\n * platform specific meta data (such as the User's IP address) must be added\n * by the SDK implementor.\n *\n *\n * @param event The event to send to Sentry.\n * @param hint May contain additional information about the original exception.\n * @param scope A scope containing event metadata.\n * @returns A SyncPromise that resolves with the event or rejects in case event was/will not be send.\n */\n BaseClient.prototype._processEvent = function (event, hint, scope) {\n var _this = this;\n // eslint-disable-next-line @typescript-eslint/unbound-method\n var _a = this.getOptions(), beforeSend = _a.beforeSend, sampleRate = _a.sampleRate;\n if (!this._isEnabled()) {\n return SyncPromise.reject('SDK not enabled, will not send event.');\n }\n var isTransaction = event.type === 'transaction';\n // 1.0 === 100% events are sent\n // 0.0 === 0% events are sent\n // Sampling for transaction happens somewhere else\n if (!isTransaction && typeof sampleRate === 'number' && Math.random() > sampleRate) {\n return SyncPromise.reject('This event has been sampled, will not send event.');\n }\n return new SyncPromise(function (resolve, reject) {\n _this._prepareEvent(event, scope, hint)\n .then(function (prepared) {\n if (prepared === null) {\n reject('An event processor returned null, will not send event.');\n return;\n }\n var finalEvent = prepared;\n var isInternalException = hint && hint.data && hint.data.__sentry__ === true;\n // We skip beforeSend in case of transactions\n if (isInternalException || !beforeSend || isTransaction) {\n _this._sendEvent(finalEvent);\n resolve(finalEvent);\n return;\n }\n var beforeSendResult = beforeSend(prepared, hint);\n if (typeof beforeSendResult === 'undefined') {\n logger.error('`beforeSend` method has to return `null` or a valid event.');\n }\n else if (isThenable(beforeSendResult)) {\n _this._handleAsyncBeforeSend(beforeSendResult, resolve, reject);\n }\n else {\n finalEvent = beforeSendResult;\n if (finalEvent === null) {\n logger.log('`beforeSend` returned `null`, will not send event.');\n resolve(null);\n return;\n }\n // From here on we are really async\n _this._sendEvent(finalEvent);\n resolve(finalEvent);\n }\n })\n .then(null, function (reason) {\n _this.captureException(reason, {\n data: {\n __sentry__: true,\n },\n originalException: reason,\n });\n reject(\"Event processing pipeline threw an error, original event will not be sent. Details have been sent as a new event.\\nReason: \" + reason);\n });\n });\n };\n /**\n * Resolves before send Promise and calls resolve/reject on parent SyncPromise.\n */\n BaseClient.prototype._handleAsyncBeforeSend = function (beforeSend, resolve, reject) {\n var _this = this;\n beforeSend\n .then(function (processedEvent) {\n if (processedEvent === null) {\n reject('`beforeSend` returned `null`, will not send event.');\n return;\n }\n // From here on we are really async\n _this._sendEvent(processedEvent);\n resolve(processedEvent);\n })\n .then(null, function (e) {\n reject(\"beforeSend rejected with \" + e);\n });\n };\n return BaseClient;\n}());\nexport { BaseClient };\n//# sourceMappingURL=baseclient.js.map","var originalFunctionToString;\n/** Patch toString calls to return proper name for wrapped functions */\nvar FunctionToString = /** @class */ (function () {\n function FunctionToString() {\n /**\n * @inheritDoc\n */\n this.name = FunctionToString.id;\n }\n /**\n * @inheritDoc\n */\n FunctionToString.prototype.setupOnce = function () {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n originalFunctionToString = Function.prototype.toString;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Function.prototype.toString = function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var context = this.__sentry_original__ || this;\n return originalFunctionToString.apply(context, args);\n };\n };\n /**\n * @inheritDoc\n */\n FunctionToString.id = 'FunctionToString';\n return FunctionToString;\n}());\nexport { FunctionToString };\n//# sourceMappingURL=functiontostring.js.map","import { Status } from '@sentry/types';\nimport { SyncPromise } from '@sentry/utils';\n/** Noop transport */\nvar NoopTransport = /** @class */ (function () {\n function NoopTransport() {\n }\n /**\n * @inheritDoc\n */\n NoopTransport.prototype.sendEvent = function (_) {\n return SyncPromise.resolve({\n reason: \"NoopTransport: Event has been skipped because no Dsn is configured.\",\n status: Status.Skipped,\n });\n };\n /**\n * @inheritDoc\n */\n NoopTransport.prototype.close = function (_) {\n return SyncPromise.resolve(true);\n };\n return NoopTransport;\n}());\nexport { NoopTransport };\n//# sourceMappingURL=noop.js.map","import { logger, SentryError } from '@sentry/utils';\nimport { NoopTransport } from './transports/noop';\n/**\n * This is the base implemention of a Backend.\n * @hidden\n */\nvar BaseBackend = /** @class */ (function () {\n /** Creates a new backend instance. */\n function BaseBackend(options) {\n this._options = options;\n if (!this._options.dsn) {\n logger.warn('No DSN provided, backend will not do anything.');\n }\n this._transport = this._setupTransport();\n }\n /**\n * @inheritDoc\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\n BaseBackend.prototype.eventFromException = function (_exception, _hint) {\n throw new SentryError('Backend has to implement `eventFromException` method');\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.eventFromMessage = function (_message, _level, _hint) {\n throw new SentryError('Backend has to implement `eventFromMessage` method');\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.sendEvent = function (event) {\n this._transport.sendEvent(event).then(null, function (reason) {\n logger.error(\"Error while sending event: \" + reason);\n });\n };\n /**\n * @inheritDoc\n */\n BaseBackend.prototype.getTransport = function () {\n return this._transport;\n };\n /**\n * Sets up the transport so it can be used later to send requests.\n */\n BaseBackend.prototype._setupTransport = function () {\n return new NoopTransport();\n };\n return BaseBackend;\n}());\nexport { BaseBackend };\n//# sourceMappingURL=basebackend.js.map","import { timestampWithMs } from '@sentry/utils';\n/** Creates a SentryRequest from an event. */\nexport function eventToSentryRequest(event, api) {\n var useEnvelope = event.type === 'transaction';\n var req = {\n body: JSON.stringify(event),\n url: useEnvelope ? api.getEnvelopeEndpointWithUrlEncodedAuth() : api.getStoreEndpointWithUrlEncodedAuth(),\n };\n // https://develop.sentry.dev/sdk/envelopes/\n // Since we don't need to manipulate envelopes nor store them, there is no\n // exported concept of an Envelope with operations including serialization and\n // deserialization. Instead, we only implement a minimal subset of the spec to\n // serialize events inline here.\n if (useEnvelope) {\n var envelopeHeaders = JSON.stringify({\n event_id: event.event_id,\n // We need to add * 1000 since we divide it by 1000 by default but JS works with ms precision\n // The reason we use timestampWithMs here is that all clocks across the SDK use the same clock\n sent_at: new Date(timestampWithMs() * 1000).toISOString(),\n });\n var itemHeaders = JSON.stringify({\n type: event.type,\n });\n // The trailing newline is optional. We intentionally don't send it to avoid\n // sending unnecessary bytes.\n //\n // const envelope = `${envelopeHeaders}\\n${itemHeaders}\\n${req.body}\\n`;\n var envelope = envelopeHeaders + \"\\n\" + itemHeaders + \"\\n\" + req.body;\n req.body = envelope;\n }\n return req;\n}\n//# sourceMappingURL=request.js.map","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","import { __read, __spread } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/hub';\nimport { getEventDescription, isMatchingPattern, logger } from '@sentry/utils';\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.\nvar DEFAULT_IGNORE_ERRORS = [/^Script error\\.?$/, /^Javascript error: Script error\\.? on line 0$/];\n/** Inbound filters configurable by the user */\nvar InboundFilters = /** @class */ (function () {\n function InboundFilters(_options) {\n if (_options === void 0) { _options = {}; }\n this._options = _options;\n /**\n * @inheritDoc\n */\n this.name = InboundFilters.id;\n }\n /**\n * @inheritDoc\n */\n InboundFilters.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event) {\n var hub = getCurrentHub();\n if (!hub) {\n return event;\n }\n var self = hub.getIntegration(InboundFilters);\n if (self) {\n var client = hub.getClient();\n var clientOptions = client ? client.getOptions() : {};\n var options = self._mergeOptions(clientOptions);\n if (self._shouldDropEvent(event, options)) {\n return null;\n }\n }\n return event;\n });\n };\n /** JSDoc */\n InboundFilters.prototype._shouldDropEvent = function (event, options) {\n if (this._isSentryError(event, options)) {\n logger.warn(\"Event dropped due to being internal Sentry Error.\\nEvent: \" + getEventDescription(event));\n return true;\n }\n if (this._isIgnoredError(event, options)) {\n logger.warn(\"Event dropped due to being matched by `ignoreErrors` option.\\nEvent: \" + getEventDescription(event));\n return true;\n }\n if (this._isDeniedUrl(event, options)) {\n logger.warn(\"Event dropped due to being matched by `denyUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n return true;\n }\n if (!this._isAllowedUrl(event, options)) {\n logger.warn(\"Event dropped due to not being matched by `allowUrls` option.\\nEvent: \" + getEventDescription(event) + \".\\nUrl: \" + this._getEventFilterUrl(event));\n return true;\n }\n return false;\n };\n /** JSDoc */\n InboundFilters.prototype._isSentryError = function (event, options) {\n if (!options.ignoreInternal) {\n return false;\n }\n try {\n return ((event &&\n event.exception &&\n event.exception.values &&\n event.exception.values[0] &&\n event.exception.values[0].type === 'SentryError') ||\n false);\n }\n catch (_oO) {\n return false;\n }\n };\n /** JSDoc */\n InboundFilters.prototype._isIgnoredError = function (event, options) {\n if (!options.ignoreErrors || !options.ignoreErrors.length) {\n return false;\n }\n return this._getPossibleEventMessages(event).some(function (message) {\n // Not sure why TypeScript complains here...\n return options.ignoreErrors.some(function (pattern) { return isMatchingPattern(message, pattern); });\n });\n };\n /** JSDoc */\n InboundFilters.prototype._isDeniedUrl = function (event, options) {\n // TODO: Use Glob instead?\n if (!options.denyUrls || !options.denyUrls.length) {\n return false;\n }\n var url = this._getEventFilterUrl(event);\n return !url ? false : options.denyUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n };\n /** JSDoc */\n InboundFilters.prototype._isAllowedUrl = function (event, options) {\n // TODO: Use Glob instead?\n if (!options.allowUrls || !options.allowUrls.length) {\n return true;\n }\n var url = this._getEventFilterUrl(event);\n return !url ? true : options.allowUrls.some(function (pattern) { return isMatchingPattern(url, pattern); });\n };\n /** JSDoc */\n InboundFilters.prototype._mergeOptions = function (clientOptions) {\n if (clientOptions === void 0) { clientOptions = {}; }\n return {\n allowUrls: __spread((this._options.whitelistUrls || []), (this._options.allowUrls || []), (clientOptions.whitelistUrls || []), (clientOptions.allowUrls || [])),\n denyUrls: __spread((this._options.blacklistUrls || []), (this._options.denyUrls || []), (clientOptions.blacklistUrls || []), (clientOptions.denyUrls || [])),\n ignoreErrors: __spread((this._options.ignoreErrors || []), (clientOptions.ignoreErrors || []), DEFAULT_IGNORE_ERRORS),\n ignoreInternal: typeof this._options.ignoreInternal !== 'undefined' ? this._options.ignoreInternal : true,\n };\n };\n /** JSDoc */\n InboundFilters.prototype._getPossibleEventMessages = function (event) {\n if (event.message) {\n return [event.message];\n }\n if (event.exception) {\n try {\n var _a = (event.exception.values && event.exception.values[0]) || {}, _b = _a.type, type = _b === void 0 ? '' : _b, _c = _a.value, value = _c === void 0 ? '' : _c;\n return [\"\" + value, type + \": \" + value];\n }\n catch (oO) {\n logger.error(\"Cannot extract message for event \" + getEventDescription(event));\n return [];\n }\n }\n return [];\n };\n /** JSDoc */\n InboundFilters.prototype._getEventFilterUrl = function (event) {\n try {\n if (event.stacktrace) {\n var frames_1 = event.stacktrace.frames;\n return (frames_1 && frames_1[frames_1.length - 1].filename) || null;\n }\n if (event.exception) {\n var frames_2 = event.exception.values && event.exception.values[0].stacktrace && event.exception.values[0].stacktrace.frames;\n return (frames_2 && frames_2[frames_2.length - 1].filename) || null;\n }\n return null;\n }\n catch (oO) {\n logger.error(\"Cannot extract url for event \" + getEventDescription(event));\n return null;\n }\n };\n /**\n * @inheritDoc\n */\n InboundFilters.id = 'InboundFilters';\n return InboundFilters;\n}());\nexport { InboundFilters };\n//# sourceMappingURL=inboundfilters.js.map","/**\n * This was originally forked from https://github.com/occ/TraceKit, but has since been\n * largely modified and is now maintained as part of Sentry JS SDK.\n */\nimport { __assign } from \"tslib\";\n// global reference to slice\nvar UNKNOWN_FUNCTION = '?';\n// Chromium based browsers: Chrome, Brave, new Opera, new Edge\nvar chrome = /^\\s*at (?:(.*?) ?\\()?((?:file|https?|blob|chrome-extension|address|native|eval|webpack|<anonymous>|[-a-z]+:|.*bundle|\\/).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i;\n// gecko regex: `(?:bundle|\\d+\\.js)`: `bundle` is for react native, `\\d+\\.js` also but specifically for ram bundles because it\n// generates filenames without a prefix like `file://` the filenames in the stacktrace are just 42.js\n// We need this specific case for now because we want no other regex to match.\nvar gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)?((?:file|https?|blob|chrome|webpack|resource|moz-extension|capacitor).*?:\\/.*?|\\[native code\\]|[^@]*(?:bundle|\\d+\\.js))(?::(\\d+))?(?::(\\d+))?\\s*$/i;\nvar winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:file|ms-appx|https?|webpack|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i;\nvar geckoEval = /(\\S+) line (\\d+)(?: > eval line \\d+)* > eval/i;\nvar chromeEval = /\\((\\S*)(?::(\\d+))(?::(\\d+))\\)/;\n// Based on our own mapping pattern - https://github.com/getsentry/sentry/blob/9f08305e09866c8bd6d0c24f5b0aabdd7dd6c59c/src/sentry/lang/javascript/errormapping.py#L83-L108\nvar reactMinifiedRegexp = /Minified React error #\\d+;/i;\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/explicit-module-boundary-types\nexport function computeStackTrace(ex) {\n var stack = null;\n var popSize = 0;\n if (ex) {\n if (typeof ex.framesToPop === 'number') {\n popSize = ex.framesToPop;\n }\n else if (reactMinifiedRegexp.test(ex.message)) {\n popSize = 1;\n }\n }\n try {\n // This must be tried first because Opera 10 *destroys*\n // its stacktrace property if you try to access the stack\n // property first!!\n stack = computeStackTraceFromStacktraceProp(ex);\n if (stack) {\n return popFrames(stack, popSize);\n }\n }\n catch (e) {\n // no-empty\n }\n try {\n stack = computeStackTraceFromStackProp(ex);\n if (stack) {\n return popFrames(stack, popSize);\n }\n }\n catch (e) {\n // no-empty\n }\n return {\n message: extractMessage(ex),\n name: ex && ex.name,\n stack: [],\n failed: true,\n };\n}\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any, complexity\nfunction computeStackTraceFromStackProp(ex) {\n if (!ex || !ex.stack) {\n return null;\n }\n var stack = [];\n var lines = ex.stack.split('\\n');\n var isEval;\n var submatch;\n var parts;\n var element;\n for (var i = 0; i < lines.length; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') === 0; // start of line\n 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 // working with the regexp above is super painful. it is quite a hack, but just stripping the `address at `\n // prefix here seems like the quickest solution for now.\n url: parts[2] && parts[2].indexOf('address at ') === 0 ? parts[2].substr('address at '.length) : parts[2],\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 }\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 }\n else if ((parts = gecko.exec(lines[i]))) {\n 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[1] = parts[1] || \"eval\";\n parts[3] = submatch[1];\n parts[4] = submatch[2];\n parts[5] = ''; // no column when eval\n }\n else if (i === 0 && !parts[5] && ex.columnNumber !== void 0) {\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 }\n else {\n continue;\n }\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n stack.push(element);\n }\n if (!stack.length) {\n return null;\n }\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack: stack,\n };\n}\n/** JSDoc */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction computeStackTraceFromStacktraceProp(ex) {\n if (!ex || !ex.stacktrace) {\n return null;\n }\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n var stacktrace = ex.stacktrace;\n var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i;\n var opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:<anonymous function: ([^>]+)>|([^)]+))\\((.*)\\))? in (.*):\\s*$/i;\n var lines = stacktrace.split('\\n');\n var stack = [];\n var parts;\n for (var line = 0; line < lines.length; line += 2) {\n var element = null;\n if ((parts = opera10Regex.exec(lines[line]))) {\n element = {\n url: parts[2],\n func: parts[3],\n args: [],\n line: +parts[1],\n column: null,\n };\n }\n else if ((parts = opera11Regex.exec(lines[line]))) {\n element = {\n url: parts[6],\n func: parts[3] || parts[4],\n args: parts[5] ? parts[5].split(',') : [],\n line: +parts[1],\n column: +parts[2],\n };\n }\n if (element) {\n if (!element.func && element.line) {\n element.func = UNKNOWN_FUNCTION;\n }\n stack.push(element);\n }\n }\n if (!stack.length) {\n return null;\n }\n return {\n message: extractMessage(ex),\n name: ex.name,\n stack: stack,\n };\n}\n/** Remove N number of frames from the stack */\nfunction popFrames(stacktrace, popSize) {\n try {\n return __assign(__assign({}, stacktrace), { stack: stacktrace.stack.slice(popSize) });\n }\n catch (e) {\n return stacktrace;\n }\n}\n/**\n * There are cases where stacktrace.message is an Event object\n * https://github.com/getsentry/sentry-javascript/issues/1949\n * In this specific case we try to extract stacktrace.message.error.message\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction extractMessage(ex) {\n var message = ex && ex.message;\n if (!message) {\n return 'No error message';\n }\n if (message.error && typeof message.error.message === 'string') {\n return message.error.message;\n }\n return message;\n}\n//# sourceMappingURL=tracekit.js.map","import { extractExceptionKeysForMessage, isEvent, normalizeToSize } from '@sentry/utils';\nimport { computeStackTrace } from './tracekit';\nvar STACKTRACE_LIMIT = 50;\n/**\n * This function creates an exception from an TraceKitStackTrace\n * @param stacktrace TraceKitStackTrace that will be converted to an exception\n * @hidden\n */\nexport function exceptionFromStacktrace(stacktrace) {\n var frames = prepareFramesForEvent(stacktrace.stack);\n var exception = {\n type: stacktrace.name,\n value: stacktrace.message,\n };\n if (frames && frames.length) {\n exception.stacktrace = { frames: frames };\n }\n if (exception.type === undefined && exception.value === '') {\n exception.value = 'Unrecoverable error caught';\n }\n return exception;\n}\n/**\n * @hidden\n */\nexport function eventFromPlainObject(exception, syntheticException, rejection) {\n var event = {\n exception: {\n values: [\n {\n type: isEvent(exception) ? exception.constructor.name : rejection ? 'UnhandledRejection' : 'Error',\n value: \"Non-Error \" + (rejection ? 'promise rejection' : 'exception') + \" captured with keys: \" + extractExceptionKeysForMessage(exception),\n },\n ],\n },\n extra: {\n __serialized__: normalizeToSize(exception),\n },\n };\n if (syntheticException) {\n var stacktrace = computeStackTrace(syntheticException);\n var frames_1 = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames: frames_1,\n };\n }\n return event;\n}\n/**\n * @hidden\n */\nexport function eventFromStacktrace(stacktrace) {\n var exception = exceptionFromStacktrace(stacktrace);\n return {\n exception: {\n values: [exception],\n },\n };\n}\n/**\n * @hidden\n */\nexport function prepareFramesForEvent(stack) {\n if (!stack || !stack.length) {\n return [];\n }\n var localStack = stack;\n var firstFrameFunction = localStack[0].func || '';\n var lastFrameFunction = localStack[localStack.length - 1].func || '';\n // If stack starts with one of our API calls, remove it (starts, meaning it's the top of the stack - aka last call)\n if (firstFrameFunction.indexOf('captureMessage') !== -1 || firstFrameFunction.indexOf('captureException') !== -1) {\n localStack = localStack.slice(1);\n }\n // If stack ends with one of our internal API calls, remove it (ends, meaning it's the bottom of the stack - aka top-most call)\n if (lastFrameFunction.indexOf('sentryWrapped') !== -1) {\n localStack = localStack.slice(0, -1);\n }\n // The frame where the crash happened, should be the last entry in the array\n return localStack\n .slice(0, STACKTRACE_LIMIT)\n .map(function (frame) { return ({\n colno: frame.column === null ? undefined : frame.column,\n filename: frame.url || localStack[0].url,\n function: frame.func || '?',\n in_app: true,\n lineno: frame.line === null ? undefined : frame.line,\n }); })\n .reverse();\n}\n//# sourceMappingURL=parsers.js.map","import { Severity } from '@sentry/types';\nimport { addExceptionMechanism, addExceptionTypeValue, isDOMError, isDOMException, isError, isErrorEvent, isEvent, isPlainObject, SyncPromise, } from '@sentry/utils';\nimport { eventFromPlainObject, eventFromStacktrace, prepareFramesForEvent } from './parsers';\nimport { computeStackTrace } from './tracekit';\n/**\n * Builds and Event from a Exception\n * @hidden\n */\nexport function eventFromException(options, exception, hint) {\n var syntheticException = (hint && hint.syntheticException) || undefined;\n var event = eventFromUnknownInput(exception, syntheticException, {\n attachStacktrace: options.attachStacktrace,\n });\n addExceptionMechanism(event, {\n handled: true,\n type: 'generic',\n });\n event.level = Severity.Error;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return SyncPromise.resolve(event);\n}\n/**\n * Builds and Event from a Message\n * @hidden\n */\nexport function eventFromMessage(options, message, level, hint) {\n if (level === void 0) { level = Severity.Info; }\n var syntheticException = (hint && hint.syntheticException) || undefined;\n var event = eventFromString(message, syntheticException, {\n attachStacktrace: options.attachStacktrace,\n });\n event.level = level;\n if (hint && hint.event_id) {\n event.event_id = hint.event_id;\n }\n return SyncPromise.resolve(event);\n}\n/**\n * @hidden\n */\nexport function eventFromUnknownInput(exception, syntheticException, options) {\n if (options === void 0) { options = {}; }\n var event;\n if (isErrorEvent(exception) && exception.error) {\n // If it is an ErrorEvent with `error` property, extract it to get actual Error\n var errorEvent = exception;\n // eslint-disable-next-line no-param-reassign\n exception = errorEvent.error;\n event = eventFromStacktrace(computeStackTrace(exception));\n return event;\n }\n if (isDOMError(exception) || isDOMException(exception)) {\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 domException = exception;\n var name_1 = domException.name || (isDOMError(domException) ? 'DOMError' : 'DOMException');\n var message = domException.message ? name_1 + \": \" + domException.message : name_1;\n event = eventFromString(message, syntheticException, options);\n addExceptionTypeValue(event, message);\n return event;\n }\n if (isError(exception)) {\n // we have a real Error object, do nothing\n event = eventFromStacktrace(computeStackTrace(exception));\n return event;\n }\n if (isPlainObject(exception) || isEvent(exception)) {\n // If it is plain Object or Event, 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 var objectException = exception;\n event = eventFromPlainObject(objectException, syntheticException, options.rejection);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n }\n // If none of previous checks were valid, then it means that it's not:\n // - an instance of DOMError\n // - an instance of DOMException\n // - an instance of Event\n // - an instance of Error\n // - a valid ErrorEvent (one with an error property)\n // - a plain Object\n //\n // So bail out and capture it as a simple message:\n event = eventFromString(exception, syntheticException, options);\n addExceptionTypeValue(event, \"\" + exception, undefined);\n addExceptionMechanism(event, {\n synthetic: true,\n });\n return event;\n}\n/**\n * @hidden\n */\nexport function eventFromString(input, syntheticException, options) {\n if (options === void 0) { options = {}; }\n var event = {\n message: input,\n };\n if (options.attachStacktrace && syntheticException) {\n var stacktrace = computeStackTrace(syntheticException);\n var frames_1 = prepareFramesForEvent(stacktrace.stack);\n event.stacktrace = {\n frames: frames_1,\n };\n }\n return event;\n}\n//# sourceMappingURL=eventbuilder.js.map","import { API } from '@sentry/core';\nimport { PromiseBuffer, SentryError } from '@sentry/utils';\n/** Base Transport class implementation */\nvar BaseTransport = /** @class */ (function () {\n function BaseTransport(options) {\n this.options = options;\n /** A simple buffer holding all requests. */\n this._buffer = new PromiseBuffer(30);\n this._api = new API(this.options.dsn);\n // eslint-disable-next-line deprecation/deprecation\n this.url = this._api.getStoreEndpointWithUrlEncodedAuth();\n }\n /**\n * @inheritDoc\n */\n BaseTransport.prototype.sendEvent = function (_) {\n throw new SentryError('Transport Class has to implement `sendEvent` method');\n };\n /**\n * @inheritDoc\n */\n BaseTransport.prototype.close = function (timeout) {\n return this._buffer.drain(timeout);\n };\n return BaseTransport;\n}());\nexport { BaseTransport };\n//# sourceMappingURL=base.js.map","import { __extends } from \"tslib\";\nimport { eventToSentryRequest } from '@sentry/core';\nimport { Status } from '@sentry/types';\nimport { getGlobalObject, logger, parseRetryAfterHeader, supportsReferrerPolicy, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\nvar global = getGlobalObject();\n/** `fetch` based transport */\nvar FetchTransport = /** @class */ (function (_super) {\n __extends(FetchTransport, _super);\n function FetchTransport() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n /** Locks transport after receiving 429 response */\n _this._disabledUntil = new Date(Date.now());\n return _this;\n }\n /**\n * @inheritDoc\n */\n FetchTransport.prototype.sendEvent = function (event) {\n var _this = this;\n if (new Date(Date.now()) < this._disabledUntil) {\n return Promise.reject({\n event: event,\n reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n status: 429,\n });\n }\n var sentryReq = eventToSentryRequest(event, this._api);\n var options = {\n body: sentryReq.body,\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 if (this.options.fetchParameters !== undefined) {\n Object.assign(options, this.options.fetchParameters);\n }\n if (this.options.headers !== undefined) {\n options.headers = this.options.headers;\n }\n return this._buffer.add(new SyncPromise(function (resolve, reject) {\n global\n .fetch(sentryReq.url, options)\n .then(function (response) {\n var status = Status.fromHttpCode(response.status);\n if (status === Status.Success) {\n resolve({ status: status });\n return;\n }\n if (status === Status.RateLimit) {\n var now = Date.now();\n /**\n * \"The name is case-insensitive.\"\n * https://developer.mozilla.org/en-US/docs/Web/API/Headers/get\n */\n var retryAfterHeader = response.headers.get('Retry-After');\n _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, retryAfterHeader));\n logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n }\n reject(response);\n })\n .catch(reject);\n }));\n };\n return FetchTransport;\n}(BaseTransport));\nexport { FetchTransport };\n//# sourceMappingURL=fetch.js.map","import { __extends } from \"tslib\";\nimport { eventToSentryRequest } from '@sentry/core';\nimport { Status } from '@sentry/types';\nimport { logger, parseRetryAfterHeader, SyncPromise } from '@sentry/utils';\nimport { BaseTransport } from './base';\n/** `XHR` based transport */\nvar XHRTransport = /** @class */ (function (_super) {\n __extends(XHRTransport, _super);\n function XHRTransport() {\n var _this = _super !== null && _super.apply(this, arguments) || this;\n /** Locks transport after receiving 429 response */\n _this._disabledUntil = new Date(Date.now());\n return _this;\n }\n /**\n * @inheritDoc\n */\n XHRTransport.prototype.sendEvent = function (event) {\n var _this = this;\n if (new Date(Date.now()) < this._disabledUntil) {\n return Promise.reject({\n event: event,\n reason: \"Transport locked till \" + this._disabledUntil + \" due to too many requests.\",\n status: 429,\n });\n }\n var sentryReq = eventToSentryRequest(event, this._api);\n return this._buffer.add(new SyncPromise(function (resolve, reject) {\n var request = new XMLHttpRequest();\n request.onreadystatechange = function () {\n if (request.readyState !== 4) {\n return;\n }\n var status = Status.fromHttpCode(request.status);\n if (status === Status.Success) {\n resolve({ status: status });\n return;\n }\n if (status === Status.RateLimit) {\n var now = Date.now();\n /**\n * \"The search for the header name is case-insensitive.\"\n * https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest/getResponseHeader\n */\n var retryAfterHeader = request.getResponseHeader('Retry-After');\n _this._disabledUntil = new Date(now + parseRetryAfterHeader(now, retryAfterHeader));\n logger.warn(\"Too many requests, backing off till: \" + _this._disabledUntil);\n }\n reject(request);\n };\n request.open('POST', sentryReq.url);\n for (var header in _this.options.headers) {\n if (_this.options.headers.hasOwnProperty(header)) {\n request.setRequestHeader(header, _this.options.headers[header]);\n }\n }\n request.send(sentryReq.body);\n }));\n };\n return XHRTransport;\n}(BaseTransport));\nexport { XHRTransport };\n//# sourceMappingURL=xhr.js.map","import { __assign, __extends } from \"tslib\";\nimport { BaseBackend } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { supportsFetch } from '@sentry/utils';\nimport { eventFromException, eventFromMessage } from './eventbuilder';\nimport { FetchTransport, XHRTransport } from './transports';\n/**\n * The Sentry Browser SDK Backend.\n * @hidden\n */\nvar BrowserBackend = /** @class */ (function (_super) {\n __extends(BrowserBackend, _super);\n function BrowserBackend() {\n return _super !== null && _super.apply(this, arguments) || this;\n }\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype.eventFromException = function (exception, hint) {\n return eventFromException(this._options, exception, hint);\n };\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype.eventFromMessage = function (message, level, hint) {\n if (level === void 0) { level = Severity.Info; }\n return eventFromMessage(this._options, message, level, hint);\n };\n /**\n * @inheritDoc\n */\n BrowserBackend.prototype._setupTransport = function () {\n if (!this._options.dsn) {\n // We return the noop transport here in case there is no Dsn.\n return _super.prototype._setupTransport.call(this);\n }\n var transportOptions = __assign(__assign({}, this._options.transportOptions), { dsn: this._options.dsn });\n if (this._options.transport) {\n return new this._options.transport(transportOptions);\n }\n if (supportsFetch()) {\n return new FetchTransport(transportOptions);\n }\n return new XHRTransport(transportOptions);\n };\n return BrowserBackend;\n}(BaseBackend));\nexport { BrowserBackend };\n//# sourceMappingURL=backend.js.map","import { __assign } from \"tslib\";\nimport { API, captureException, withScope } from '@sentry/core';\nimport { addExceptionMechanism, addExceptionTypeValue, logger } from '@sentry/utils';\nvar ignoreOnError = 0;\n/**\n * @hidden\n */\nexport function shouldIgnoreOnError() {\n return ignoreOnError > 0;\n}\n/**\n * @hidden\n */\nexport function ignoreNextOnError() {\n // onerror should trigger before setTimeout\n ignoreOnError += 1;\n setTimeout(function () {\n ignoreOnError -= 1;\n });\n}\n/**\n * Instruments the given function and sends an event to Sentry every time the\n * function throws an exception.\n *\n * @param fn A function to wrap.\n * @returns The wrapped function.\n * @hidden\n */\nexport function wrap(fn, options, before) {\n if (options === void 0) { options = {}; }\n if (typeof fn !== 'function') {\n return fn;\n }\n try {\n // We don't wanna wrap it twice\n if (fn.__sentry__) {\n return fn;\n }\n // If this has already been wrapped in the past, return that wrapped function\n if (fn.__sentry_wrapped__) {\n return fn.__sentry_wrapped__;\n }\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 fn;\n }\n /* eslint-disable prefer-rest-params */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var sentryWrapped = function () {\n var args = Array.prototype.slice.call(arguments);\n try {\n if (before && typeof before === 'function') {\n before.apply(this, arguments);\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-unsafe-member-access\n var wrappedArguments = args.map(function (arg) { return wrap(arg, options); });\n if (fn.handleEvent) {\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 the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return fn.handleEvent.apply(this, wrappedArguments);\n }\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 the sentry.javascript SDK caught an error invoking your application code. This\n // is expected behavior and NOT indicative of a bug with sentry.javascript.\n return fn.apply(this, wrappedArguments);\n }\n catch (ex) {\n ignoreNextOnError();\n withScope(function (scope) {\n scope.addEventProcessor(function (event) {\n var processedEvent = __assign({}, event);\n if (options.mechanism) {\n addExceptionTypeValue(processedEvent, undefined, undefined);\n addExceptionMechanism(processedEvent, options.mechanism);\n }\n processedEvent.extra = __assign(__assign({}, processedEvent.extra), { arguments: args });\n return processedEvent;\n });\n captureException(ex);\n });\n throw ex;\n }\n };\n /* eslint-enable prefer-rest-params */\n // Accessing some objects may throw\n // ref: https://github.com/getsentry/sentry-javascript/issues/1168\n try {\n for (var property in fn) {\n if (Object.prototype.hasOwnProperty.call(fn, property)) {\n sentryWrapped[property] = fn[property];\n }\n }\n }\n catch (_oO) { } // eslint-disable-line no-empty\n fn.prototype = fn.prototype || {};\n sentryWrapped.prototype = fn.prototype;\n Object.defineProperty(fn, '__sentry_wrapped__', {\n enumerable: false,\n value: sentryWrapped,\n });\n // Signal that this function has been wrapped/filled already\n // for both debugging and to prevent it to being wrapped/filled twice\n Object.defineProperties(sentryWrapped, {\n __sentry__: {\n enumerable: false,\n value: true,\n },\n __sentry_original__: {\n enumerable: false,\n value: fn,\n },\n });\n // Restore original function name (not all browsers allow that)\n try {\n var descriptor = Object.getOwnPropertyDescriptor(sentryWrapped, 'name');\n if (descriptor.configurable) {\n Object.defineProperty(sentryWrapped, 'name', {\n get: function () {\n return fn.name;\n },\n });\n }\n // eslint-disable-next-line no-empty\n }\n catch (_oO) { }\n return sentryWrapped;\n}\n/**\n * Injects the Report Dialog script\n * @hidden\n */\nexport function injectReportDialog(options) {\n if (options === void 0) { options = {}; }\n if (!options.eventId) {\n logger.error(\"Missing eventId option in showReportDialog call\");\n return;\n }\n if (!options.dsn) {\n logger.error(\"Missing dsn option in showReportDialog call\");\n return;\n }\n var script = document.createElement('script');\n script.async = true;\n script.src = new API(options.dsn).getReportDialogEndpoint(options);\n if (options.onLoad) {\n // eslint-disable-next-line @typescript-eslint/unbound-method\n script.onload = options.onLoad;\n }\n (document.head || document.body).appendChild(script);\n}\n//# sourceMappingURL=helpers.js.map","import { __assign } from \"tslib\";\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addExceptionMechanism, addInstrumentationHandler, getLocationHref, isErrorEvent, isPrimitive, isString, logger, } from '@sentry/utils';\nimport { eventFromUnknownInput } from '../eventbuilder';\nimport { shouldIgnoreOnError } from '../helpers';\n/** Global handlers */\nvar GlobalHandlers = /** @class */ (function () {\n /** JSDoc */\n function GlobalHandlers(options) {\n /**\n * @inheritDoc\n */\n this.name = GlobalHandlers.id;\n /** JSDoc */\n this._onErrorHandlerInstalled = false;\n /** JSDoc */\n this._onUnhandledRejectionHandlerInstalled = false;\n this._options = __assign({ onerror: true, onunhandledrejection: true }, options);\n }\n /**\n * @inheritDoc\n */\n GlobalHandlers.prototype.setupOnce = function () {\n Error.stackTraceLimit = 50;\n if (this._options.onerror) {\n logger.log('Global Handler attached: onerror');\n this._installGlobalOnErrorHandler();\n }\n if (this._options.onunhandledrejection) {\n logger.log('Global Handler attached: onunhandledrejection');\n this._installGlobalOnUnhandledRejectionHandler();\n }\n };\n /** JSDoc */\n GlobalHandlers.prototype._installGlobalOnErrorHandler = function () {\n var _this = this;\n if (this._onErrorHandlerInstalled) {\n return;\n }\n addInstrumentationHandler({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback: function (data) {\n var error = data.error;\n var currentHub = getCurrentHub();\n var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n return;\n }\n var client = currentHub.getClient();\n var event = isPrimitive(error)\n ? _this._eventFromIncompleteOnError(data.msg, data.url, data.line, data.column)\n : _this._enhanceEventWithInitialFrame(eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: false,\n }), data.url, data.line, data.column);\n addExceptionMechanism(event, {\n handled: false,\n type: 'onerror',\n });\n currentHub.captureEvent(event, {\n originalException: error,\n });\n },\n type: 'error',\n });\n this._onErrorHandlerInstalled = true;\n };\n /** JSDoc */\n GlobalHandlers.prototype._installGlobalOnUnhandledRejectionHandler = function () {\n var _this = this;\n if (this._onUnhandledRejectionHandlerInstalled) {\n return;\n }\n addInstrumentationHandler({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n callback: function (e) {\n var error = e;\n // dig the object of the rejection out of known event types\n try {\n // PromiseRejectionEvents store the object of the rejection under 'reason'\n // see https://developer.mozilla.org/en-US/docs/Web/API/PromiseRejectionEvent\n if ('reason' in e) {\n error = e.reason;\n }\n // something, somewhere, (likely a browser extension) effectively casts PromiseRejectionEvents\n // to CustomEvents, moving the `promise` and `reason` attributes of the PRE into\n // the CustomEvent's `detail` attribute, since they're not part of CustomEvent's spec\n // see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent and\n // https://github.com/getsentry/sentry-javascript/issues/2380\n else if ('detail' in e && 'reason' in e.detail) {\n error = e.detail.reason;\n }\n }\n catch (_oO) {\n // no-empty\n }\n var currentHub = getCurrentHub();\n var hasIntegration = currentHub.getIntegration(GlobalHandlers);\n var isFailedOwnDelivery = error && error.__sentry_own_request__ === true;\n if (!hasIntegration || shouldIgnoreOnError() || isFailedOwnDelivery) {\n return true;\n }\n var client = currentHub.getClient();\n var event = isPrimitive(error)\n ? _this._eventFromIncompleteRejection(error)\n : eventFromUnknownInput(error, undefined, {\n attachStacktrace: client && client.getOptions().attachStacktrace,\n rejection: true,\n });\n event.level = Severity.Error;\n addExceptionMechanism(event, {\n handled: false,\n type: 'onunhandledrejection',\n });\n currentHub.captureEvent(event, {\n originalException: error,\n });\n return;\n },\n type: 'unhandledrejection',\n });\n this._onUnhandledRejectionHandlerInstalled = true;\n };\n /**\n * This function creates a stack from an old, error-less onerror handler.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n GlobalHandlers.prototype._eventFromIncompleteOnError = function (msg, url, line, column) {\n var ERROR_TYPES_RE = /^(?:[Uu]ncaught (?:exception: )?)?(?:((?:Eval|Internal|Range|Reference|Syntax|Type|URI|)Error): )?(.*)$/i;\n // If 'message' is ErrorEvent, get real message from inside\n var message = isErrorEvent(msg) ? msg.message : msg;\n var name;\n if (isString(message)) {\n var groups = message.match(ERROR_TYPES_RE);\n if (groups) {\n name = groups[1];\n message = groups[2];\n }\n }\n var event = {\n exception: {\n values: [\n {\n type: name || 'Error',\n value: message,\n },\n ],\n },\n };\n return this._enhanceEventWithInitialFrame(event, url, line, column);\n };\n /**\n * This function creates an Event from an TraceKitStackTrace that has part of it missing.\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n GlobalHandlers.prototype._eventFromIncompleteRejection = function (error) {\n return {\n exception: {\n values: [\n {\n type: 'UnhandledRejection',\n value: \"Non-Error promise rejection captured with value: \" + error,\n },\n ],\n },\n };\n };\n /** JSDoc */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n GlobalHandlers.prototype._enhanceEventWithInitialFrame = function (event, url, line, column) {\n event.exception = event.exception || {};\n event.exception.values = event.exception.values || [];\n event.exception.values[0] = event.exception.values[0] || {};\n event.exception.values[0].stacktrace = event.exception.values[0].stacktrace || {};\n event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames || [];\n var colno = isNaN(parseInt(column, 10)) ? undefined : column;\n var lineno = isNaN(parseInt(line, 10)) ? undefined : line;\n var filename = isString(url) && url.length > 0 ? url : getLocationHref();\n if (event.exception.values[0].stacktrace.frames.length === 0) {\n event.exception.values[0].stacktrace.frames.push({\n colno: colno,\n filename: filename,\n function: '?',\n in_app: true,\n lineno: lineno,\n });\n }\n return event;\n };\n /**\n * @inheritDoc\n */\n GlobalHandlers.id = 'GlobalHandlers';\n return GlobalHandlers;\n}());\nexport { GlobalHandlers };\n//# sourceMappingURL=globalhandlers.js.map","import { __assign } from \"tslib\";\nimport { fill, getFunctionName, getGlobalObject } from '@sentry/utils';\nimport { wrap } from '../helpers';\nvar DEFAULT_EVENT_TARGET = [\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/** Wrap timer functions and event targets to catch errors and provide better meta data */\nvar TryCatch = /** @class */ (function () {\n /**\n * @inheritDoc\n */\n function TryCatch(options) {\n /**\n * @inheritDoc\n */\n this.name = TryCatch.id;\n this._options = __assign({ XMLHttpRequest: true, eventTarget: true, requestAnimationFrame: true, setInterval: true, setTimeout: true }, options);\n }\n /**\n * Wrap timer functions and event targets to catch errors\n * and provide better metadata.\n */\n TryCatch.prototype.setupOnce = function () {\n var global = getGlobalObject();\n if (this._options.setTimeout) {\n fill(global, 'setTimeout', this._wrapTimeFunction.bind(this));\n }\n if (this._options.setInterval) {\n fill(global, 'setInterval', this._wrapTimeFunction.bind(this));\n }\n if (this._options.requestAnimationFrame) {\n fill(global, 'requestAnimationFrame', this._wrapRAF.bind(this));\n }\n if (this._options.XMLHttpRequest && 'XMLHttpRequest' in global) {\n fill(XMLHttpRequest.prototype, 'send', this._wrapXHR.bind(this));\n }\n if (this._options.eventTarget) {\n var eventTarget = Array.isArray(this._options.eventTarget) ? this._options.eventTarget : DEFAULT_EVENT_TARGET;\n eventTarget.forEach(this._wrapEventTarget.bind(this));\n }\n };\n /** JSDoc */\n TryCatch.prototype._wrapTimeFunction = function (original) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n var originalCallback = args[0];\n args[0] = wrap(originalCallback, {\n mechanism: {\n data: { function: getFunctionName(original) },\n handled: true,\n type: 'instrument',\n },\n });\n return original.apply(this, args);\n };\n };\n /** JSDoc */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n TryCatch.prototype._wrapRAF = function (original) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function (callback) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n return original.call(this, wrap(callback, {\n mechanism: {\n data: {\n function: 'requestAnimationFrame',\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n }));\n };\n };\n /** JSDoc */\n TryCatch.prototype._wrapEventTarget = function (target) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n var global = getGlobalObject();\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n var proto = global[target] && global[target].prototype;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (!proto || !proto.hasOwnProperty || !proto.hasOwnProperty('addEventListener')) {\n return;\n }\n fill(proto, 'addEventListener', function (original) {\n return function (eventName, fn, options) {\n try {\n if (typeof fn.handleEvent === 'function') {\n fn.handleEvent = wrap(fn.handleEvent.bind(fn), {\n mechanism: {\n data: {\n function: 'handleEvent',\n handler: getFunctionName(fn),\n target: target,\n },\n handled: true,\n type: 'instrument',\n },\n });\n }\n }\n catch (err) {\n // can sometimes get 'Permission denied to access property \"handle Event'\n }\n return original.call(this, eventName, \n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n wrap(fn, {\n mechanism: {\n data: {\n function: 'addEventListener',\n handler: getFunctionName(fn),\n target: target,\n },\n handled: true,\n type: 'instrument',\n },\n }), options);\n };\n });\n fill(proto, 'removeEventListener', function (original) {\n return function (eventName, fn, options) {\n /**\n * There are 2 possible scenarios here:\n *\n * 1. Someone passes a callback, which was attached prior to Sentry initialization, or by using unmodified\n * method, eg. `document.addEventListener.call(el, name, handler). In this case, we treat this function\n * as a pass-through, and call original `removeEventListener` with it.\n *\n * 2. Someone passes a callback, which was attached after Sentry was initialized, which means that it was using\n * our wrapped version of `addEventListener`, which internally calls `wrap` helper.\n * This helper \"wraps\" whole callback inside a try/catch statement, and attached appropriate metadata to it,\n * in order for us to make a distinction between wrapped/non-wrapped functions possible.\n * If a function was wrapped, it has additional property of `__sentry_wrapped__`, holding the handler.\n *\n * When someone adds a handler prior to initialization, and then do it again, but after,\n * then we have to detach both of them. Otherwise, if we'd detach only wrapped one, it'd be impossible\n * to get rid of the initial handler and it'd stick there forever.\n */\n try {\n original.call(this, eventName, fn.__sentry_wrapped__, options);\n }\n catch (e) {\n // ignore, accessing __sentry_wrapped__ will throw in some Selenium environments\n }\n return original.call(this, eventName, fn, options);\n };\n });\n };\n /** JSDoc */\n TryCatch.prototype._wrapXHR = function (originalSend) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n // eslint-disable-next-line @typescript-eslint/no-this-alias\n var xhr = this;\n var xmlHttpRequestProps = ['onload', 'onerror', 'onprogress', 'onreadystatechange'];\n xmlHttpRequestProps.forEach(function (prop) {\n if (prop in xhr && typeof xhr[prop] === 'function') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n fill(xhr, prop, function (original) {\n var wrapOptions = {\n mechanism: {\n data: {\n function: prop,\n handler: getFunctionName(original),\n },\n handled: true,\n type: 'instrument',\n },\n };\n // If Instrument integration has been called before TryCatch, get the name of original function\n if (original.__sentry_original__) {\n wrapOptions.mechanism.data.handler = getFunctionName(original.__sentry_original__);\n }\n // Otherwise wrap directly\n return wrap(original, wrapOptions);\n });\n }\n });\n return originalSend.apply(this, args);\n };\n };\n /**\n * @inheritDoc\n */\n TryCatch.id = 'TryCatch';\n return TryCatch;\n}());\nexport { TryCatch };\n//# sourceMappingURL=trycatch.js.map","import { __assign, __read, __spread } from \"tslib\";\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable max-lines */\nimport { getCurrentHub } from '@sentry/core';\nimport { Severity } from '@sentry/types';\nimport { addInstrumentationHandler, getEventDescription, getGlobalObject, htmlTreeAsString, parseUrl, safeJoin, } from '@sentry/utils';\n/**\n * Default Breadcrumbs instrumentations\n * TODO: Deprecated - with v6, this will be renamed to `Instrument`\n */\nvar Breadcrumbs = /** @class */ (function () {\n /**\n * @inheritDoc\n */\n function Breadcrumbs(options) {\n /**\n * @inheritDoc\n */\n this.name = Breadcrumbs.id;\n this._options = __assign({ console: true, dom: true, fetch: true, history: true, sentry: true, xhr: true }, options);\n }\n /**\n * Create a breadcrumb of `sentry` from the events themselves\n */\n Breadcrumbs.prototype.addSentryBreadcrumb = function (event) {\n if (!this._options.sentry) {\n return;\n }\n getCurrentHub().addBreadcrumb({\n category: \"sentry.\" + (event.type === 'transaction' ? 'transaction' : 'event'),\n event_id: event.event_id,\n level: event.level,\n message: getEventDescription(event),\n }, {\n event: event,\n });\n };\n /**\n * Instrument browser built-ins w/ breadcrumb capturing\n * - Console API\n * - DOM API (click/typing)\n * - XMLHttpRequest API\n * - Fetch API\n * - History API\n */\n Breadcrumbs.prototype.setupOnce = function () {\n var _this = this;\n if (this._options.console) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._consoleBreadcrumb.apply(_this, __spread(args));\n },\n type: 'console',\n });\n }\n if (this._options.dom) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._domBreadcrumb.apply(_this, __spread(args));\n },\n type: 'dom',\n });\n }\n if (this._options.xhr) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._xhrBreadcrumb.apply(_this, __spread(args));\n },\n type: 'xhr',\n });\n }\n if (this._options.fetch) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._fetchBreadcrumb.apply(_this, __spread(args));\n },\n type: 'fetch',\n });\n }\n if (this._options.history) {\n addInstrumentationHandler({\n callback: function () {\n var args = [];\n for (var _i = 0; _i < arguments.length; _i++) {\n args[_i] = arguments[_i];\n }\n _this._historyBreadcrumb.apply(_this, __spread(args));\n },\n type: 'history',\n });\n }\n };\n /**\n * Creates breadcrumbs from console API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Breadcrumbs.prototype._consoleBreadcrumb = function (handlerData) {\n var breadcrumb = {\n category: 'console',\n data: {\n arguments: handlerData.args,\n logger: 'console',\n },\n level: Severity.fromString(handlerData.level),\n message: safeJoin(handlerData.args, ' '),\n };\n if (handlerData.level === 'assert') {\n if (handlerData.args[0] === false) {\n breadcrumb.message = \"Assertion failed: \" + (safeJoin(handlerData.args.slice(1), ' ') || 'console.assert');\n breadcrumb.data.arguments = handlerData.args.slice(1);\n }\n else {\n // Don't capture a breadcrumb for passed assertions\n return;\n }\n }\n getCurrentHub().addBreadcrumb(breadcrumb, {\n input: handlerData.args,\n level: handlerData.level,\n });\n };\n /**\n * Creates breadcrumbs from DOM API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Breadcrumbs.prototype._domBreadcrumb = function (handlerData) {\n var target;\n // Accessing event.target can throw (see getsentry/raven-js#838, #768)\n try {\n target = handlerData.event.target\n ? htmlTreeAsString(handlerData.event.target)\n : htmlTreeAsString(handlerData.event);\n }\n catch (e) {\n target = '<unknown>';\n }\n if (target.length === 0) {\n return;\n }\n getCurrentHub().addBreadcrumb({\n category: \"ui.\" + handlerData.name,\n message: target,\n }, {\n event: handlerData.event,\n name: handlerData.name,\n });\n };\n /**\n * Creates breadcrumbs from XHR API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Breadcrumbs.prototype._xhrBreadcrumb = function (handlerData) {\n if (handlerData.endTimestamp) {\n // We only capture complete, non-sentry requests\n if (handlerData.xhr.__sentry_own_request__) {\n return;\n }\n getCurrentHub().addBreadcrumb({\n category: 'xhr',\n data: handlerData.xhr.__sentry_xhr__,\n type: 'http',\n }, {\n xhr: handlerData.xhr,\n });\n return;\n }\n };\n /**\n * Creates breadcrumbs from fetch API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Breadcrumbs.prototype._fetchBreadcrumb = function (handlerData) {\n // We only capture complete fetch requests\n if (!handlerData.endTimestamp) {\n return;\n }\n if (handlerData.fetchData.url.match(/sentry_key/) && handlerData.fetchData.method === 'POST') {\n // We will not create breadcrumbs for fetch requests that contain `sentry_key` (internal sentry requests)\n return;\n }\n if (handlerData.error) {\n getCurrentHub().addBreadcrumb({\n category: 'fetch',\n data: handlerData.fetchData,\n level: Severity.Error,\n type: 'http',\n }, {\n data: handlerData.error,\n input: handlerData.args,\n });\n }\n else {\n getCurrentHub().addBreadcrumb({\n category: 'fetch',\n data: __assign(__assign({}, handlerData.fetchData), { status_code: handlerData.response.status }),\n type: 'http',\n }, {\n input: handlerData.args,\n response: handlerData.response,\n });\n }\n };\n /**\n * Creates breadcrumbs from history API calls\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n Breadcrumbs.prototype._historyBreadcrumb = function (handlerData) {\n var global = getGlobalObject();\n var from = handlerData.from;\n var to = handlerData.to;\n var parsedLoc = parseUrl(global.location.href);\n var parsedFrom = parseUrl(from);\n var parsedTo = parseUrl(to);\n // Initial pushState doesn't provide `from` information\n if (!parsedFrom.path) {\n parsedFrom = parsedLoc;\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 }\n if (parsedLoc.protocol === parsedFrom.protocol && parsedLoc.host === parsedFrom.host) {\n from = parsedFrom.relative;\n }\n getCurrentHub().addBreadcrumb({\n category: 'navigation',\n data: {\n from: from,\n to: to,\n },\n });\n };\n /**\n * @inheritDoc\n */\n Breadcrumbs.id = 'Breadcrumbs';\n return Breadcrumbs;\n}());\nexport { Breadcrumbs };\n//# sourceMappingURL=breadcrumbs.js.map","import { __read, __spread } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { isInstanceOf } from '@sentry/utils';\nimport { exceptionFromStacktrace } from '../parsers';\nimport { computeStackTrace } from '../tracekit';\nvar DEFAULT_KEY = 'cause';\nvar DEFAULT_LIMIT = 5;\n/** Adds SDK info to an event. */\nvar LinkedErrors = /** @class */ (function () {\n /**\n * @inheritDoc\n */\n function LinkedErrors(options) {\n if (options === void 0) { options = {}; }\n /**\n * @inheritDoc\n */\n this.name = LinkedErrors.id;\n this._key = options.key || DEFAULT_KEY;\n this._limit = options.limit || DEFAULT_LIMIT;\n }\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event, hint) {\n var self = getCurrentHub().getIntegration(LinkedErrors);\n if (self) {\n return self._handler(event, hint);\n }\n return event;\n });\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype._handler = function (event, hint) {\n if (!event.exception || !event.exception.values || !hint || !isInstanceOf(hint.originalException, Error)) {\n return event;\n }\n var linkedErrors = this._walkErrorTree(hint.originalException, this._key);\n event.exception.values = __spread(linkedErrors, event.exception.values);\n return event;\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.prototype._walkErrorTree = function (error, key, stack) {\n if (stack === void 0) { stack = []; }\n if (!isInstanceOf(error[key], Error) || stack.length + 1 >= this._limit) {\n return stack;\n }\n var stacktrace = computeStackTrace(error[key]);\n var exception = exceptionFromStacktrace(stacktrace);\n return this._walkErrorTree(error[key], key, __spread([exception], stack));\n };\n /**\n * @inheritDoc\n */\n LinkedErrors.id = 'LinkedErrors';\n return LinkedErrors;\n}());\nexport { LinkedErrors };\n//# sourceMappingURL=linkederrors.js.map","import { __assign } from \"tslib\";\nimport { addGlobalEventProcessor, getCurrentHub } from '@sentry/core';\nimport { getGlobalObject } from '@sentry/utils';\nvar global = getGlobalObject();\n/** UserAgent */\nvar UserAgent = /** @class */ (function () {\n function UserAgent() {\n /**\n * @inheritDoc\n */\n this.name = UserAgent.id;\n }\n /**\n * @inheritDoc\n */\n UserAgent.prototype.setupOnce = function () {\n addGlobalEventProcessor(function (event) {\n if (getCurrentHub().getIntegration(UserAgent)) {\n if (!global.navigator || !global.location) {\n return event;\n }\n var request = event.request || {};\n request.url = request.url || global.location.href;\n request.headers = request.headers || {};\n request.headers['User-Agent'] = global.navigator.userAgent;\n return __assign(__assign({}, event), { request: request });\n }\n return event;\n });\n };\n /**\n * @inheritDoc\n */\n UserAgent.id = 'UserAgent';\n return UserAgent;\n}());\nexport { UserAgent };\n//# sourceMappingURL=useragent.js.map","export var SDK_NAME = 'sentry.javascript.browser';\nexport var SDK_VERSION = '5.22.3';\n//# sourceMappingURL=version.js.map","import { __assign, __extends, __read, __spread } from \"tslib\";\nimport { BaseClient } from '@sentry/core';\nimport { getGlobalObject, logger } from '@sentry/utils';\nimport { BrowserBackend } from './backend';\nimport { injectReportDialog } from './helpers';\nimport { Breadcrumbs } from './integrations';\nimport { SDK_NAME, SDK_VERSION } from './version';\n/**\n * The Sentry Browser SDK Client.\n *\n * @see BrowserOptions for documentation on configuration options.\n * @see SentryClient for usage documentation.\n */\nvar BrowserClient = /** @class */ (function (_super) {\n __extends(BrowserClient, _super);\n /**\n * Creates a new Browser SDK instance.\n *\n * @param options Configuration options for this SDK.\n */\n function BrowserClient(options) {\n if (options === void 0) { options = {}; }\n return _super.call(this, BrowserBackend, options) || this;\n }\n /**\n * Show a report dialog to the user to send feedback to a specific event.\n *\n * @param options Set individual options for the dialog\n */\n BrowserClient.prototype.showReportDialog = function (options) {\n if (options === void 0) { options = {}; }\n // doesn't work without a document (React Native)\n var document = getGlobalObject().document;\n if (!document) {\n return;\n }\n if (!this._isEnabled()) {\n logger.error('Trying to call showReportDialog with Sentry Client disabled');\n return;\n }\n injectReportDialog(__assign(__assign({}, options), { dsn: options.dsn || this.getDsn() }));\n };\n /**\n * @inheritDoc\n */\n BrowserClient.prototype._prepareEvent = function (event, scope, hint) {\n event.platform = event.platform || 'javascript';\n event.sdk = __assign(__assign({}, event.sdk), { name: SDK_NAME, packages: __spread(((event.sdk && event.sdk.packages) || []), [\n {\n name: 'npm:@sentry/browser',\n version: SDK_VERSION,\n },\n ]), version: SDK_VERSION });\n return _super.prototype._prepareEvent.call(this, event, scope, hint);\n };\n /**\n * @inheritDoc\n */\n BrowserClient.prototype._sendEvent = function (event) {\n var integration = this.getIntegration(Breadcrumbs);\n if (integration) {\n integration.addSentryBreadcrumb(event);\n }\n _super.prototype._sendEvent.call(this, event);\n };\n return BrowserClient;\n}(BaseClient));\nexport { BrowserClient };\n//# sourceMappingURL=client.js.map","import { getCurrentHub, initAndBind, Integrations as CoreIntegrations } from '@sentry/core';\nimport { getGlobalObject, SyncPromise } from '@sentry/utils';\nimport { BrowserClient } from './client';\nimport { wrap as internalWrap } from './helpers';\nimport { Breadcrumbs, GlobalHandlers, LinkedErrors, TryCatch, UserAgent } from './integrations';\nexport var defaultIntegrations = [\n new CoreIntegrations.InboundFilters(),\n new CoreIntegrations.FunctionToString(),\n new TryCatch(),\n new Breadcrumbs(),\n new GlobalHandlers(),\n new LinkedErrors(),\n new UserAgent(),\n];\n/**\n * The Sentry Browser SDK Client.\n *\n * To use this SDK, call the {@link init} function as early as possible when\n * loading the web page. To set context information or send manual events, use\n * the provided methods.\n *\n * @example\n *\n * ```\n *\n * import { init } from '@sentry/browser';\n *\n * init({\n * dsn: '__DSN__',\n * // ...\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { configureScope } from '@sentry/browser';\n * configureScope((scope: Scope) => {\n * scope.setExtra({ battery: 0.7 });\n * scope.setTag({ user_mode: 'admin' });\n * scope.setUser({ id: '4711' });\n * });\n * ```\n *\n * @example\n * ```\n *\n * import { addBreadcrumb } from '@sentry/browser';\n * addBreadcrumb({\n * message: 'My Breadcrumb',\n * // ...\n * });\n * ```\n *\n * @example\n *\n * ```\n *\n * import * as Sentry from '@sentry/browser';\n * Sentry.captureMessage('Hello, world!');\n * Sentry.captureException(new Error('Good bye'));\n * Sentry.captureEvent({\n * message: 'Manual',\n * stacktrace: [\n * // ...\n * ],\n * });\n * ```\n *\n * @see {@link BrowserOptions} for documentation on configuration options.\n */\nexport function init(options) {\n if (options === void 0) { options = {}; }\n if (options.defaultIntegrations === undefined) {\n options.defaultIntegrations = defaultIntegrations;\n }\n if (options.release === undefined) {\n var window_1 = getGlobalObject();\n // This supports the variable that sentry-webpack-plugin injects\n if (window_1.SENTRY_RELEASE && window_1.SENTRY_RELEASE.id) {\n options.release = window_1.SENTRY_RELEASE.id;\n }\n }\n initAndBind(BrowserClient, options);\n}\n/**\n * Present the user with a report dialog.\n *\n * @param options Everything is optional, we try to fetch all info need from the global scope.\n */\nexport function showReportDialog(options) {\n if (options === void 0) { options = {}; }\n if (!options.eventId) {\n options.eventId = getCurrentHub().lastEventId();\n }\n var client = getCurrentHub().getClient();\n if (client) {\n client.showReportDialog(options);\n }\n}\n/**\n * This is the getter for lastEventId.\n *\n * @returns The last event id of a captured event.\n */\nexport function lastEventId() {\n return getCurrentHub().lastEventId();\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function forceLoad() {\n // Noop\n}\n/**\n * This function is here to be API compatible with the loader.\n * @hidden\n */\nexport function onLoad(callback) {\n callback();\n}\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function flush(timeout) {\n var client = getCurrentHub().getClient();\n if (client) {\n return client.flush(timeout);\n }\n return SyncPromise.reject(false);\n}\n/**\n * A promise that resolves when all current events have been sent.\n * If you provide a timeout and the queue takes longer to drain the promise returns false.\n *\n * @param timeout Maximum time in ms the client should wait.\n */\nexport function close(timeout) {\n var client = getCurrentHub().getClient();\n if (client) {\n return client.close(timeout);\n }\n return SyncPromise.reject(false);\n}\n/**\n * Wrap code within a try/catch block so the SDK is able to capture errors.\n *\n * @param fn A function to wrap.\n *\n * @returns The result of wrapped function call.\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport function wrap(fn) {\n return internalWrap(fn)();\n}\n//# sourceMappingURL=sdk.js.map","import { getCurrentHub } from '@sentry/hub';\nimport { logger } from '@sentry/utils';\n/**\n * Internal function to create a new SDK client instance. The client is\n * installed and then bound to the current scope.\n *\n * @param clientClass The client class to instanciate.\n * @param options Options to pass to the client.\n */\nexport function initAndBind(clientClass, options) {\n if (options.debug === true) {\n logger.enable();\n }\n var hub = getCurrentHub();\n var client = new clientClass(options);\n hub.bindClient(client);\n}\n//# sourceMappingURL=sdk.js.map","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_nonIterableRest()}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArrayLimit(e,t){var n=[],r=!0,o=!1,i=void 0;try{for(var s,a=e[Symbol.iterator]();!(r=(s=a.next()).done)&&(n.push(s.value),!t||n.length!==t);r=!0);}catch(e){o=!0,i=e}finally{try{r||null==a.return||a.return()}finally{if(o)throw i}}return n}function _nonIterableRest(){throw new TypeError(\"Invalid attempt to destructure non-iterable instance\")}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty},constants={facebook:{domain:\"facebook.com\",url:function(e){return\"https://graph.facebook.com/?id=\".concat(e,\"&fields=og_object{engagement}\")},shareCount:function(e){return e.og_object.engagement.count},popup:{width:640,height:360}},twitter:{domain:\"twitter.com\",url:function(){return null},shareCount:function(){return null},popup:{width:640,height:240}},pinterest:{domain:\"pinterest.com\",url:function(e){return\"https://widgets.pinterest.com/v1/urls/count.json?url=\".concat(e)},shareCount:function(e){return e.count},popup:{width:830,height:700}},github:{domain:\"github.com\",url:function(e,t){return\"https://api.github.com/repos/\".concat(e).concat(is.string(t)?\"?access_token=\".concat(t):\"\")},shareCount:function(e){return e.data.stargazers_count}},youtube:{domain:\"youtube.com\",url:function(e,t){return\"https://www.googleapis.com/youtube/v3/channels?part=statistics&id=\".concat(e,\"&key=\").concat(t)},shareCount:function(e){if(!is.empty(e.error))return null;var t=_slicedToArray(e.items,1)[0];return is.empty(t)?null:t.statistics.subscriberCount}}},defaults={debug:!1,wrapper:{className:\"shr\"},count:{className:\"shr__count\",displayZero:!1,format:!0,position:\"after\",increment:!0},tokens:{github:\"\",youtube:\"\"},storage:{enabled:!0,key:\"shr\",ttl:3e5}};function getJSONP(e){return new Promise(function(t,n){var r=\"jsonp_callback_\".concat(Math.round(1e5*Math.random())),o=document.createElement(\"script\");o.addEventListener(\"error\",function(e){return n(e)}),window[r]=function(e){delete window[r],document.body.removeChild(o),t(e)};var i=new URL(e);i.searchParams.set(\"callback\",r),o.setAttribute(\"src\",i.toString()),document.body.appendChild(o)})}var noop=function(){},Console=function(){function e(){var t=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0];_classCallCheck(this,e),this.enabled=window.console&&t,this.enabled&&this.log(\"Debugging enabled\")}return _createClass(e,[{key:\"log\",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):noop}},{key:\"warn\",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):noop}},{key:\"error\",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):noop}}]),e}();function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function wrap(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach(function(e,n){var r=0<n?t.cloneNode(!0):t,o=e.parentNode,i=e.nextSibling;r.appendChild(e),i?o.insertBefore(r,i):o.appendChild(r)})}function setAttributes(e,t){!is.element(e)||is.empty(t)||Object.entries(t).filter(function(e){var t=_slicedToArray(e,2)[1];return!is.nullOrUndefined(t)}).forEach(function(t){var n=_slicedToArray(t,2),r=n[0],o=n[1];return e.setAttribute(r,o)})}function createElement(e,t,n){var r=document.createElement(e);return is.object(t)&&setAttributes(r,t),is.string(n)&&(r.innerText=n),r}function formatNumber(e){var t=/\\./.test(1.1.toLocaleString())?\".\":\",\",n=new RegExp(\"\\\\\".concat(t,\"\\\\d+$\"));return Math.round(e).toLocaleString().replace(n,\"\")}function extend(){for(var e=0<arguments.length&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=Array(1<t?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(!n.length)return e;var o=n.shift();return is.object(o)?(Object.keys(o).forEach(function(t){is.object(o[t])?(!Object.keys(e).includes(t)&&Object.assign(e,_defineProperty({},t,{})),extend(e[t],o[t])):Object.assign(e,_defineProperty({},t,o[t]))}),extend.apply(void 0,[e].concat(n))):e}var Storage=function(){function e(t,n){var r=!(2<arguments.length&&void 0!==arguments[2])||arguments[2];_classCallCheck(this,e),this.enabled=r&&e.supported,this.key=t,this.ttl=n}return _createClass(e,[{key:\"get\",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(is.empty(n))return null;var r=window.localStorage.getItem(\"\".concat(this.key,\"_ttl\"));if(is.empty(r)||r<Date.now())return null;var o=JSON.parse(n);return is.string(t)&&t.length?o[t]:o}},{key:\"set\",value:function(t){if(e.supported&&this.enabled&&is.object(t)){var n=this.get();is.empty(n)&&(n={}),extend(n,t),window.localStorage.setItem(this.key,JSON.stringify(n)),window.localStorage.setItem(\"\".concat(this.key,\"_ttl\"),Date.now()+this.ttl)}}}],[{key:\"supported\",get:function(){try{return\"localStorage\"in window&&(window.localStorage.setItem(\"___test\",\"___test\"),window.localStorage.removeItem(\"___test\"),!0)}catch(e){return!1}}}]),e}();function getDomain(e){var t=new URL(e).hostname,n=t.split(\".\"),r=n.length;return 2<r&&(t=\"\".concat(n[r-2],\".\").concat(n[r-1]),2===n[r-2].length&&2===n[r-1].length&&(t=\"\".concat(n[r-3],\".\").concat(t))),t}var Shr=function(){function e(t,n){var r=this;_classCallCheck(this,e),this.elements={count:null,trigger:null,popup:null},is.element(t)?this.elements.trigger=t:is.string(t)&&(this.elements.trigger=document.querySelector(t)),is.element(this.elements.trigger)&&is.empty(this.elements.trigger.shr)&&(this.config=extend({},defaults,n,{networks:constants}),this.console=new Console(this.config.debug),this.storage=new Storage(this.config.storage.key,this.config.storage.ttl,this.config.storage.enabled),this.getCount().then(function(e){return r.updateDisplay(e)}).catch(function(){}),this.listeners(!0),this.elements.trigger.shr=this)}return _createClass(e,[{key:\"destroy\",value:function(){this.listeners(!1)}},{key:\"listeners\",value:function(){var e=this,t=!!(0<arguments.length&&void 0!==arguments[0])&&arguments[0]?\"addEventListener\":\"removeEventListener\";this.elements.trigger[t](\"click\",function(t){return e.share(t)},!1)}},{key:\"share\",value:function(e){var t=this;this.openPopup(e);var n=this.config.count.increment;this.getCount().then(function(e){return t.updateDisplay(e,n)}).catch(function(){})}},{key:\"openPopup\",value:function(e){if(!is.empty(this.network)&&this.networkConfig.popup){is.event(e)&&e.preventDefault();var t=this.networkConfig.popup,n=t.width,r=t.height,o=\"shr-popup--\".concat(this.network);if(this.popup&&!this.popup.closed)this.popup.focus(),this.console.log(\"Popup re-focused.\");else{var i=void 0===window.screenLeft?window.screen.left:window.screenLeft,s=void 0===window.screenTop?window.screen.top:window.screenTop,a=window.screen.width/2-n/2+i,c=window.screen.height/2-r/2+s;this.popup=window.open(this.href,o,\"top=\".concat(c,\",left=\").concat(a,\",width=\").concat(n,\",height=\").concat(r)),!this.popup||this.popup.closed||!is.boolean(this.popup.closed)?this.console.error(\"Popup blocked.\"):(this.popup.focus(),this.console.log(\"Popup opened.\"))}}}},{key:\"getCount\",value:function(){var e=this,t=!(0<arguments.length&&void 0!==arguments[0])||arguments[0];return new Promise(function(n,r){var o=e.apiUrl;if(is.empty(o))r(new Error(\"No URL available for \".concat(e.network,\".\")));else{if(t){var i=e.storage.get(e.target);if(!is.empty(i)&&Object.keys(i).includes(e.network)){var s=i[e.network];return n(is.number(s)?s:0),void e.console.log(\"getCount for '\".concat(e.target,\"' for '\").concat(e.network,\"' resolved from cache.\"))}}getJSONP(o).then(function(t){var r=0,o=e.elements.trigger.getAttribute(\"data-shr-display\");r=is.empty(o)?e.networkConfig.shareCount(t):t[o],is.empty(r)?r=0:(r=parseInt(r,10),!is.number(r)&&(r=0)),e.storage.set(_defineProperty({},e.target,_defineProperty({},e.network,r))),n(r)}).catch(r)}})}},{key:\"updateDisplay\",value:function(e){var t=!!(1<arguments.length&&void 0!==arguments[1])&&arguments[1],n=this.config,r=n.count,o=n.wrapper,i=t?e+1:e,s=r.position.toLowerCase();if(0<i||r.displayZero){var a=function(e){return Math.round(i/e*10)/10},c=formatNumber(i);r.format&&(1e6<i?c=\"\".concat(a(1e6),\"M\"):1e3<i&&(c=\"\".concat(a(1e3),\"K\"))),is.element(this.elements.count)?this.elements.count.textContent=c:(wrap(this.elements.trigger,createElement(\"span\",{class:o.className})),this.elements.count=createElement(\"span\",{class:\"\".concat(r.className,\" \").concat(r.className,\"--\").concat(s)},c),this.elements.trigger.insertAdjacentElement(\"after\"===s?\"afterend\":\"beforebegin\",this.elements.count))}}},{key:\"href\",get:function(){return is.element(this.elements.trigger)?this.elements.trigger.href:null}},{key:\"network\",get:function(){var e=this;if(!is.element(this.elements.trigger))return null;var t=this.config.networks;return Object.keys(t).find(function(n){return getDomain(e.href)===t[n].domain})}},{key:\"networkConfig\",get:function(){return is.empty(this.network)?null:this.config.networks[this.network]}},{key:\"target\",get:function(){if(is.empty(this.network))return null;var e=new URL(this.href);switch(this.network){case\"facebook\":return e.searchParams.get(\"u\");case\"github\":return e.pathname.substring(1);case\"youtube\":return e.pathname.split(\"/\").pop();default:return e.searchParams.get(\"url\")}}},{key:\"apiUrl\",get:function(){if(is.empty(this.network))return null;var e=this.config.tokens;switch(this.network){case\"github\":return this.networkConfig.url(this.target,e.github);case\"youtube\":return this.networkConfig.url(this.target,e.youtube);default:return this.networkConfig.url(encodeURIComponent(this.target))}}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.string(t)?r=Array.from(document.querySelectorAll(t)):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var o=Object.assign({},defaults,n);is.string(t)&&o.watch&&new MutationObserver(function(n){Array.from(n).forEach(function(n){Array.from(n.addedNodes).forEach(function(n){is.element(n)&&matches(n,t)&&new e(n,o)})})}).observe(document.body,{childList:!0,subtree:!0});return r.map(function(t){return new e(t,n)})}}]),e}();export default Shr;","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\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 toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\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 (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.7.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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 bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var anObject = require('../internals/an-object');\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n","module.exports = {};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? 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 ? ObjectPrototype : null;\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\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","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","'use strict';\nvar redefineAll = require('../internals/redefine-all');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar $has = require('../internals/has');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && $has(data, state.id) && delete data[state.id];\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && $has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","'use strict';\nvar global = require('../internals/global');\nvar redefineAll = require('../internals/redefine-all');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceIternalState = require('../internals/internal-state').enforce;\nvar NATIVE_WEAK_MAP = require('../internals/native-weak-map');\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar $every = require('../internals/array-iteration').every;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('every');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var classof = require('../internals/classof-raw');\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nmodule.exports = function (value) {\n if (typeof value != 'number' && classof(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toInteger = require('../internals/to-integer');\nvar thisNumberValue = require('../internals/this-number-value');\nvar repeat = require('../internals/string-repeat');\nvar fails = require('../internals/fails');\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor = Math.floor;\n\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n$({ target: 'Number', proto: true, forced: FORCED }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow(2, 69, 1)) - 69;\n z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + repeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + repeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\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 nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n }\n});\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","var $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar ownKeys = require('../internals/own-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar createProperty = require('../internals/create-property');\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(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 (\n global.addEventListener &&\n typeof postMessage == 'function' &&\n !global.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!IS_IOS && !IS_NODE && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\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 promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(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\nmodule.exports = queueMicrotask || 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","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can 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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\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 $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\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 var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (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\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/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","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\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 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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\n\nconst isElement = (input) =>\n input !== null &&\n typeof input === 'object' &&\n input.nodeType === 1 &&\n typeof input.style === 'object' &&\n typeof input.ownerDocument === 'object';\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 isEdge: window.navigator.userAgent.includes('Edge'),\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","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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","var $ = require('../internals/export');\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.github.io/ecma262/#sec-math.trunc\n$({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor : ceil)(it);\n }\n});\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = (value) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.4/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\n\n // Update the UI\n this.update();\n\n // this.toggle = this.toggle.bind(this);\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n };\n\n 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\n // Toggle button and fire events\n this.onChange();\n };\n\n // Trap focus inside container\n trapFocus = (event) => {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update = () => {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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","// `Math.sign` method implementation\n// https://tc39.github.io/ecma262/#sec-math.sign\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","var $ = require('../internals/export');\nvar sign = require('../internals/math-sign');\n\n// `Math.sign` method\n// https://tc39.github.io/ecma262/#sec-math.sign\n$({ target: 'Math', stat: true }, {\n sign: sign\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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n };\n\n // Container listeners\n container = () => {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load = () => {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready = () => {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n };\n\n addCuePoints = () => {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","'use strict';\nvar $ = require('../internals/export');\nvar $findIndex = require('../internals/array-iteration').findIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","var $ = require('../internals/export');\nvar lastIndexOf = require('../internals/array-last-index-of');\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: lastIndexOf\n});\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load = () => {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n };\n\n // Download VTT files and parse them\n getThumbnails = () => {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n };\n\n // Process individual VTT file\n getThumbnail = (url) => {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n };\n\n startMove = (event) => {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n };\n\n endMove = () => {\n this.toggleThumbContainer(false, true);\n };\n\n startScrubbing = (event) => {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n };\n\n endScrubbing = () => {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n };\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners = () => {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n };\n\n /**\n * Create HTML elements for image containers\n */\n render = () => {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n };\n\n destroy = () => {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n };\n\n showImageAtCurrentTime = () => {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n };\n\n // Show the image that's currently specified in this.showingThumb\n loadImage = (qualityIndex = 0) => {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n };\n\n showImage = (previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) => {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n };\n\n // Remove all preview images that aren't the designated current image\n removeOldImages = (currentImage) => {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n };\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby = (thumbNum, forward = true) => {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n };\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality = (currentQualityIndex, previewImage, frame, thumbFilename) => {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n };\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer = (toggle = false, clearShowing = false) => {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n toggleScrubbingContainer = (toggle = false) => {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n determineContainerAutoSizing = () => {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n };\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos = () => {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n };\n\n setThumbContainerPos = () => {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n };\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize = () => {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n };\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset = (previewImage, frame) => {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n };\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\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.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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.values(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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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) => support.mime.call(this, type);\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} 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 * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n","const sources = {\n video: {\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 previewThumbnails: {\n src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt'],\n },\n },\n audio: {\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 youtube: {\n type: 'video',\n sources: [\n {\n src: 'https://youtube.com/watch?v=bTqVqk7FSmY',\n provider: 'youtube',\n },\n ],\n },\n vimeo: {\n type: 'video',\n sources: [\n {\n src: 'https://vimeo.com/40648169',\n provider: 'vimeo',\n },\n ],\n },\n};\n\nexport default sources;\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 './tab-focus';\nimport 'custom-event-polyfill';\nimport 'url-polyfill';\n\nimport * as Sentry from '@sentry/browser';\nimport Shr from 'shr-buttons';\n\nimport Plyr from '../../../src/js/plyr';\nimport sources from './sources';\nimport toggleClass from './toggle-class';\n\n(() => {\n const production = 'plyr.io';\n\n // Sentry for demo site (https://plyr.io) only\n if (window.location.host === production) {\n Sentry.init({\n dsn: 'https://d4ad9866ad834437a4754e23937071e4@sentry.io/305555',\n whitelistUrls: [production].map((d) => new RegExp(`https://(([a-z0-9])+(.))*${d}`)),\n });\n }\n\n document.addEventListener('DOMContentLoaded', () => {\n const selector = '#player';\n\n // Setup share buttons\n Shr.setup('.js-shr', {\n count: {\n className: 'button__count',\n },\n wrapper: {\n className: 'button--with-count',\n },\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/demo.svg',\n keyboard: {\n global: true,\n },\n tooltips: {\n controls: true,\n },\n captions: {\n active: true,\n },\n ads: {\n enabled: window.location.host.includes(production),\n publisherId: '918848828995742',\n },\n previewThumbnails: {\n enabled: true,\n src: ['https://cdn.plyr.io/static/demo/thumbs/100p.vtt', 'https://cdn.plyr.io/static/demo/thumbs/240p.vtt'],\n },\n vimeo: {\n // Prevent Vimeo blocking plyr.io demo site\n referrerPolicy: 'no-referrer',\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 = Object.keys(sources);\n const historySupport = Boolean(window.history && window.history.pushState);\n let currentType = window.location.hash.substring(1);\n const hasInitialType = currentType.length;\n\n function render(type) {\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 // eslint-disable-next-line no-param-reassign\n cite.hidden = true;\n });\n\n document.querySelector(`.plyr__cite--${type}`).hidden = false;\n }\n\n // Set a new source\n function setSource(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 (!types.includes(type) || (!init && type === currentType) || (!currentType.length && type === 'video')) {\n return;\n }\n\n // Set the new source\n player.source = sources[type];\n\n // Set the current type for next time\n currentType = type;\n\n render(type);\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 setSource(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 && Object.keys(event.state).includes('type')) {\n setSource(event.state.type);\n }\n });\n\n // If there's no current type set, assume video\n if (!hasInitialType) {\n currentType = 'video';\n }\n\n // Replace current history state\n if (historySupport && types.includes(currentType)) {\n window.history.replaceState({ type: currentType }, '', hasInitialType ? `#${currentType}` : '');\n }\n\n // If it's not video, load the source\n if (currentType !== 'video') {\n setSource(currentType, true);\n }\n\n render(currentType);\n });\n})();\n","// Toggle class on an element\nconst toggleClass = (element, className = '', toggle = false) =>\n element && element.classList[toggle ? 'add' : 'remove'](className);\n\nexport default toggleClass;\n"]} \ No newline at end of file
diff --git a/dist/plyr.css b/dist/plyr.css
index b0092765..4a5116b0 100644
--- a/dist/plyr.css
+++ b/dist/plyr.css
@@ -1 +1 @@
-@keyframes plyr-progress{to{background-position:25px 0;background-position:var(--plyr-progress-loading-size,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;align-items:center;direction:ltr;display:flex;flex-direction:column;font-family:inherit;font-family:var(--plyr-font-family,inherit);font-variant-numeric:tabular-nums;font-weight:400;font-weight:var(--plyr-font-weight-regular,400);line-height:1.7;line-height:var(--plyr-line-height,1.7);max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease;z-index:0}.plyr audio,.plyr iframe,.plyr video{display:block;height:100%;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:#4a5464;background:var(--plyr-badge-background,#4a5464);border-radius:2px;border-radius:var(--plyr-badge-border-radius,2px);color:#fff;color:var(--plyr-badge-text-color,#fff);font-size:9px;font-size:var(--plyr-font-size-badge,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;display:none;font-size:13px;font-size:var(--plyr-font-size-small,13px);left:0;padding:10px;padding:var(--plyr-control-spacing,10px);position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:15px;font-size:var(--plyr-font-size-base,15px);padding:calc(10px * 2);padding:calc(var(--plyr-control-spacing,10px) * 2)}}@media (min-width:768px){.plyr__captions{font-size:18px;font-size:var(--plyr-font-size-large,18px)}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(calc(10px * -4));transform:translateY(calc(var(--plyr-control-spacing,10px) * -4))}.plyr__caption{background:rgba(0,0,0,.8);background:var(--plyr-captions-background,rgba(0,0,0,.8));border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;color:#fff;color:var(--plyr-captions-text-color,#fff);line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__caption div{display:inline}.plyr__control{background:0 0;border:0;border-radius:3px;border-radius:var(--plyr-control-radius,3px);color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7);position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;height:var(--plyr-control-icon-size,18px);pointer-events:none;width:18px;width:var(--plyr-control-icon-size,18px)}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.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--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:calc(10px / 4);margin-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:calc(10px / 4);padding-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item.plyr__time{padding:0 calc(10px / 2);padding:0 calc(var(--plyr-control-spacing,10px)/ 2)}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls:empty{display:none}.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__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);background:var(--plyr-menu-background,rgba(255,255,255,.9));border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-menu-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-menu-color,#4a5464);font-size:15px;font-size:var(--plyr-font-size-base,15px);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:var(--plyr-menu-arrow-size,4px) solid transparent;border-top-color:rgba(255,255,255,.9);border-top-color:var(--plyr-menu-background,rgba(255,255,255,.9));content:'';height:0;position:absolute;right:calc(((18px / 2) + calc(10px * .7)) - (4px / 2));right:calc(((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7)) - (var(--plyr-menu-arrow-size,4px)/ 2));top:100%;width:0}.plyr__menu__container [role=menu]{padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7)}.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:#4a5464;color:var(--plyr-menu-color,#4a5464);display:flex;font-size:13px;font-size:var(--plyr-font-size-menu,var(--plyr-font-size-small,13px));padding-bottom:calc(calc(10px * .7)/ 1.5);padding-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);padding-left:calc(calc(10px * .7) * 1.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-right:calc(calc(10px * .7) * 1.5);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-top:calc(calc(10px * .7)/ 1.5);padding-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);-webkit-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;border:var(--plyr-menu-item-arrow-size,4px) solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:calc(calc(10px * .7) * 4);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4)}.plyr__menu__container .plyr__control--forward::after{border-left-color:#728197;border-left-color:var(--plyr-menu-arrow-color,#728197);right:calc((calc(10px * .7) * 1.5) - 4px);right:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.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:400;font-weight:var(--plyr-font-weight-regular,400);margin:calc(10px * .7);margin:calc(var(--plyr-control-spacing,10px) * .7);margin-bottom:calc(calc(10px * .7)/ 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);padding-left:calc(calc(10px * .7) * 4);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4);position:relative;width:calc(100% - (calc(10px * .7) * 2));width:calc(100% - (calc(var(--plyr-control-spacing,10px) * .7) * 2))}.plyr__menu__container .plyr__control--back::after{border-right-color:#728197;border-right-color:var(--plyr-menu-arrow-color,#728197);left:calc((calc(10px * .7) * 1.5) - 4px);left:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.plyr__menu__container .plyr__control--back::before{background:#dcdfe5;background:var(--plyr-menu-back-border-color,#dcdfe5);box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 var(--plyr-menu-back-border-shadow-color,#fff);content:'';height:1px;left:0;margin-top:calc(calc(10px * .7)/ 2);margin-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);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:calc(10px * .7);padding-left:calc(var(--plyr-control-spacing,10px) * .7)}.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;margin-right:var(--plyr-control-spacing,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:#00b3ff;background:var(--plyr-control-toggle-checked-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)))}.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(35,40,47,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:calc((calc(10px * .7) - 2) * -1);margin-right:calc((calc(var(--plyr-control-spacing,10px) * .7) - 2) * -1);overflow:hidden;padding-left:calc(calc(10px * .7) * 3.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 3.5);pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:calc(13px * 2);border-radius:calc(var(--plyr-range-thumb-height,13px) * 2);color:#00b3ff;color:var(--plyr-range-fill-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));display:block;height:calc((3px * 2) + 13px);height:calc((var(--plyr-range-thumb-active-shadow-width,3px) * 2) + var(--plyr-range-thumb-height,13px));margin:0;min-width: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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor 0,transparent 0);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;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-webkit-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);-webkit-appearance:none;margin-top:calc(((13px - 5px)/ 2) * -1);margin-top:calc(((var(--plyr-range-thumb-height,13px) - var(--plyr-range-track-height,5px))/ 2) * -1)}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-moz-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-moz-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px)}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-ms-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);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{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.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:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px;margin-right:var(--plyr-control-spacing,10px)}@media (max-width:calc(768px - 1px)){.plyr__time+.plyr__time{display:none}}.plyr__tooltip{background:rgba(255,255,255,.9);background:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;border-radius:var(--plyr-tooltip-radius,3px);bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-tooltip-color,#4a5464);font-size:13px;font-size:var(--plyr-font-size-small,13px);font-weight:400;font-weight:var(--plyr-font-weight-regular,400);left:50%;line-height:1.3;margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:calc(10px / 2) calc(calc(10px / 2) * 1.5);padding:calc(var(--plyr-control-spacing,10px)/ 2) calc(calc(var(--plyr-control-spacing,10px)/ 2) * 1.5);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-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);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:calc((18px / 2) + calc(10px * .7));left:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7))}.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:calc((18px / 2) + calc(10px * .7));right:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7));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__progress{left:calc(13px * .5);left:calc(var(--plyr-range-thumb-height,13px) * .5);margin-right:13px;margin-right:var(--plyr-range-thumb-height,13px);position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:calc(13px * -.5);margin-left:calc(var(--plyr-range-thumb-height,13px) * -.5);margin-right:calc(13px * -.5);margin-right:calc(var(--plyr-range-thumb-height,13px) * -.5);width:calc(100% + 13px);width:calc(100% + var(--plyr-range-thumb-height,13px))}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin-top:calc((5px / 2) * -1);margin-top:calc((var(--plyr-range-track-height,5px)/ 2) * -1);padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-webkit-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-moz-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;-ms-transition:width .2s ease;transition:width .2s ease}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,40,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,40,47,.6) 50%,rgba(35,40,47,.6) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 25%,transparent 25%,transparent 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;background-size:var(--plyr-progress-loading-size,25px) var(--plyr-progress-loading-size,25px);color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr__volume{align-items:center;display:flex;max-width:110px;min-width:80px;position:relative;width:20%}.plyr__volume input[type=range]{margin-left:calc(10px / 2);margin-left:calc(var(--plyr-control-spacing,10px)/ 2);margin-right:calc(10px / 2);margin-right:calc(var(--plyr-control-spacing,10px)/ 2);position:relative;z-index:2}.plyr--is-ios .plyr__volume{min-width:0;width:auto}.plyr--audio{display:block}.plyr--audio .plyr__controls{background:#fff;background:var(--plyr-audio-controls-background,#fff);border-radius:inherit;color:#4a5464;color:var(--plyr-audio-control-color,#4a5464);padding:10px;padding:var(--plyr-control-spacing,10px)}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;background:var(--plyr-audio-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-audio-control-color-hover,#fff)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--audio .plyr__progress__buffer{color:rgba(193,200,209,.6);color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;height:100%;margin:auto;overflow:hidden;position:relative;width:100%}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;left:0;position:absolute;top:0}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75));background:var(--plyr-video-controls-background,linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75)));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;color:var(--plyr-video-control-color,#fff);left:0;padding:calc(10px / 2);padding:calc(var(--plyr-control-spacing,10px)/ 2);padding-top:calc(10px * 2);padding-top:calc(var(--plyr-control-spacing,10px) * 2);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:10px;padding:var(--plyr-control-spacing,10px);padding-top:calc(10px * 3.5);padding-top:calc(var(--plyr-control-spacing,10px) * 3.5)}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-video-control-color-hover,#fff)}.plyr__control--overlaid{background:#00b3ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));border:0;border-radius:100%;color:#fff;color:var(--plyr-video-control-color,#fff);display:none;left:50%;opacity:.9;padding:calc(10px * 1.5);padding:calc(var(--plyr-control-spacing,10px) * 1.5);position:absolute;top:50%;transform:translate(-50%,-50%);transition:.3s;z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{opacity:1}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--video .plyr__progress__buffer{color:rgba(255,255,255,.25);color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr:-webkit-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:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-webkit-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:-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:-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;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:-ms-fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;display:block;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%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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:#23282f;border-radius:2px;bottom:10px;bottom:var(--plyr-control-spacing,10px);color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;right:var(--plyr-control-spacing,10px);z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin:-var(--plyr-range-track-height,5px)/2 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);background-color:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:3px;padding:var(--plyr-tooltip-radius,3px);pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c8d1;border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);color:#fff;font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.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;background-position:var(--plyr-progress-loading-size,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;align-items:center;direction:ltr;display:flex;flex-direction:column;font-family:inherit;font-family:var(--plyr-font-family,inherit);font-variant-numeric:tabular-nums;font-weight:400;font-weight:var(--plyr-font-weight-regular,400);line-height:1.7;line-height:var(--plyr-line-height,1.7);max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease;z-index:0}.plyr audio,.plyr iframe,.plyr video{display:block;height:100%;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:#4a5464;background:var(--plyr-badge-background,#4a5464);border-radius:2px;border-radius:var(--plyr-badge-border-radius,2px);color:#fff;color:var(--plyr-badge-text-color,#fff);font-size:9px;font-size:var(--plyr-font-size-badge,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;display:none;font-size:13px;font-size:var(--plyr-font-size-small,13px);left:0;padding:10px;padding:var(--plyr-control-spacing,10px);position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:15px;font-size:var(--plyr-font-size-base,15px);padding:calc(10px * 2);padding:calc(var(--plyr-control-spacing,10px) * 2)}}@media (min-width:768px){.plyr__captions{font-size:18px;font-size:var(--plyr-font-size-large,18px)}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(calc(10px * -4));transform:translateY(calc(var(--plyr-control-spacing,10px) * -4))}.plyr__caption{background:rgba(0,0,0,.8);background:var(--plyr-captions-background,rgba(0,0,0,.8));border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;color:#fff;color:var(--plyr-captions-text-color,#fff);line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__caption div{display:inline}.plyr__control{background:0 0;border:0;border-radius:3px;border-radius:var(--plyr-control-radius,3px);color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7);position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;height:var(--plyr-control-icon-size,18px);pointer-events:none;width:18px;width:var(--plyr-control-icon-size,18px)}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.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--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:calc(10px / 4);margin-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:calc(10px / 4);padding-left:calc(var(--plyr-control-spacing,10px)/ 4)}.plyr__controls .plyr__controls__item.plyr__time{padding:0 calc(10px / 2);padding:0 calc(var(--plyr-control-spacing,10px)/ 2)}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls:empty{display:none}.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__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);background:var(--plyr-menu-background,rgba(255,255,255,.9));border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-menu-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-menu-color,#4a5464);font-size:15px;font-size:var(--plyr-font-size-base,15px);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:var(--plyr-menu-arrow-size,4px) solid transparent;border-top-color:rgba(255,255,255,.9);border-top-color:var(--plyr-menu-background,rgba(255,255,255,.9));content:'';height:0;position:absolute;right:calc(((18px / 2) + calc(10px * .7)) - (4px / 2));right:calc(((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7)) - (var(--plyr-menu-arrow-size,4px)/ 2));top:100%;width:0}.plyr__menu__container [role=menu]{padding:calc(10px * .7);padding:calc(var(--plyr-control-spacing,10px) * .7)}.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:#4a5464;color:var(--plyr-menu-color,#4a5464);display:flex;font-size:13px;font-size:var(--plyr-font-size-menu,var(--plyr-font-size-small,13px));padding-bottom:calc(calc(10px * .7)/ 1.5);padding-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);padding-left:calc(calc(10px * .7) * 1.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-right:calc(calc(10px * .7) * 1.5);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 1.5);padding-top:calc(calc(10px * .7)/ 1.5);padding-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 1.5);-webkit-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;border:var(--plyr-menu-item-arrow-size,4px) solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:calc(calc(10px * .7) * 4);padding-right:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4)}.plyr__menu__container .plyr__control--forward::after{border-left-color:#728197;border-left-color:var(--plyr-menu-arrow-color,#728197);right:calc((calc(10px * .7) * 1.5) - 4px);right:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.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:400;font-weight:var(--plyr-font-weight-regular,400);margin:calc(10px * .7);margin:calc(var(--plyr-control-spacing,10px) * .7);margin-bottom:calc(calc(10px * .7)/ 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);padding-left:calc(calc(10px * .7) * 4);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 4);position:relative;width:calc(100% - (calc(10px * .7) * 2));width:calc(100% - (calc(var(--plyr-control-spacing,10px) * .7) * 2))}.plyr__menu__container .plyr__control--back::after{border-right-color:#728197;border-right-color:var(--plyr-menu-arrow-color,#728197);left:calc((calc(10px * .7) * 1.5) - 4px);left:calc((calc(var(--plyr-control-spacing,10px) * .7) * 1.5) - var(--plyr-menu-item-arrow-size,4px))}.plyr__menu__container .plyr__control--back::before{background:#dcdfe5;background:var(--plyr-menu-back-border-color,#dcdfe5);box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 var(--plyr-menu-back-border-shadow-color,#fff);content:'';height:1px;left:0;margin-top:calc(calc(10px * .7)/ 2);margin-top:calc(calc(var(--plyr-control-spacing,10px) * .7)/ 2);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:calc(10px * .7);padding-left:calc(var(--plyr-control-spacing,10px) * .7)}.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;margin-right:var(--plyr-control-spacing,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:#00b3ff;background:var(--plyr-control-toggle-checked-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)))}.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(35,40,47,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:calc((calc(10px * .7) - 2) * -1);margin-right:calc((calc(var(--plyr-control-spacing,10px) * .7) - 2) * -1);overflow:hidden;padding-left:calc(calc(10px * .7) * 3.5);padding-left:calc(calc(var(--plyr-control-spacing,10px) * .7) * 3.5);pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:calc(13px * 2);border-radius:calc(var(--plyr-range-thumb-height,13px) * 2);color:#00b3ff;color:var(--plyr-range-fill-background,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));display:block;height:calc((3px * 2) + 13px);height:calc((var(--plyr-range-thumb-active-shadow-width,3px) * 2) + var(--plyr-range-thumb-height,13px));margin:0;min-width: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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-webkit-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor 0,transparent 0);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;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-webkit-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);-webkit-appearance:none;margin-top:calc(((13px - 5px)/ 2) * -1);margin-top:calc(((var(--plyr-range-thumb-height,13px) - var(--plyr-range-track-height,5px))/ 2) * -1)}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-moz-transition:box-shadow .3s ease;transition:box-shadow .3s ease;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-moz-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px)}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px)}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;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:calc(5px / 2);border-radius:calc(var(--plyr-range-track-height,5px)/ 2);height:5px;height:var(--plyr-range-track-height,5px);-ms-transition:box-shadow .3s ease;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;background:var(--plyr-range-thumb-background,#fff);border:0;border-radius:100%;box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2));height:13px;height:var(--plyr-range-thumb-height,13px);position:relative;-ms-transition:all .2s ease;transition:all .2s ease;width:13px;width:var(--plyr-range-thumb-height,13px);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{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{outline-color:#00b3ff;outline-color:var(--plyr-tab-focus-color,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));outline-offset:2px;outline-style:dotted;outline-width:3px}.plyr__poster{background-color:#000;background-color:var(--plyr-video-background,var(--plyr-video-background,#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:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px))}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px;margin-right:var(--plyr-control-spacing,10px)}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr__tooltip{background:rgba(255,255,255,.9);background:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;border-radius:var(--plyr-tooltip-radius,3px);bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));color:#4a5464;color:var(--plyr-tooltip-color,#4a5464);font-size:13px;font-size:var(--plyr-font-size-small,13px);font-weight:400;font-weight:var(--plyr-font-weight-regular,400);left:50%;line-height:1.3;margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:calc(10px / 2) calc(calc(10px / 2) * 1.5);padding:calc(var(--plyr-control-spacing,10px)/ 2) calc(calc(var(--plyr-control-spacing,10px)/ 2) * 1.5);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-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);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:calc((18px / 2) + calc(10px * .7));left:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7))}.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:calc((18px / 2) + calc(10px * .7));right:calc((var(--plyr-control-icon-size,18px)/ 2) + calc(var(--plyr-control-spacing,10px) * .7));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__progress{left:calc(13px * .5);left:calc(var(--plyr-range-thumb-height,13px) * .5);margin-right:13px;margin-right:var(--plyr-range-thumb-height,13px);position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:calc(13px * -.5);margin-left:calc(var(--plyr-range-thumb-height,13px) * -.5);margin-right:calc(13px * -.5);margin-right:calc(var(--plyr-range-thumb-height,13px) * -.5);width:calc(100% + 13px);width:calc(100% + var(--plyr-range-thumb-height,13px))}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin-top:calc((5px / 2) * -1);margin-top:calc((var(--plyr-range-track-height,5px)/ 2) * -1);padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-webkit-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;min-width:var(--plyr-range-track-height,5px);-moz-transition:width .2s ease;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;-ms-transition:width .2s ease;transition:width .2s ease}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,40,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,40,47,.6) 50%,rgba(35,40,47,.6) 75%,transparent 75%,transparent);background-image:linear-gradient(-45deg,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 25%,transparent 25%,transparent 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 50%,var(--plyr-progress-loading-background,rgba(35,40,47,.6)) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;background-size:var(--plyr-progress-loading-size,25px) var(--plyr-progress-loading-size,25px);color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr__volume{align-items:center;display:flex;max-width:110px;min-width:80px;position:relative;width:20%}.plyr__volume input[type=range]{margin-left:calc(10px / 2);margin-left:calc(var(--plyr-control-spacing,10px)/ 2);margin-right:calc(10px / 2);margin-right:calc(var(--plyr-control-spacing,10px)/ 2);position:relative;z-index:2}.plyr--is-ios .plyr__volume{min-width:0;width:auto}.plyr--audio{display:block}.plyr--audio .plyr__controls{background:#fff;background:var(--plyr-audio-controls-background,#fff);border-radius:inherit;color:#4a5464;color:var(--plyr-audio-control-color,#4a5464);padding:10px;padding:var(--plyr-control-spacing,10px)}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;background:var(--plyr-audio-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-audio-control-color-hover,#fff)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,200,209,.6);background-color:var(--plyr-audio-range-track-background,var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6)))}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(35,40,47,.1);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(35,40,47,.1))}.plyr--audio .plyr__progress__buffer{color:rgba(193,200,209,.6);color:var(--plyr-audio-progress-buffered-background,rgba(193,200,209,.6))}.plyr--video{background:#000;background:var(--plyr-video-background,var(--plyr-video-background,#000));overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;background:var(--plyr-video-background,var(--plyr-video-background,#000));height:100%;margin:auto;overflow:hidden;position:relative;width:100%}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;left:0;position:absolute;top:0}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75));background:var(--plyr-video-controls-background,linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.75)));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;color:var(--plyr-video-control-color,#fff);left:0;padding:calc(10px / 2);padding:calc(var(--plyr-control-spacing,10px)/ 2);padding-top:calc(10px * 2);padding-top:calc(var(--plyr-control-spacing,10px) * 2);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:10px;padding:var(--plyr-control-spacing,10px);padding-top:calc(10px * 3.5);padding-top:calc(var(--plyr-control-spacing,10px) * 3.5)}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));color:#fff;color:var(--plyr-video-control-color-hover,#fff)}.plyr__control--overlaid{background:#00b3ff;background:var(--plyr-video-control-background-hover,var(--plyr-color-main,var(--plyr-color-main,#00b3ff)));border:0;border-radius:100%;color:#fff;color:var(--plyr-video-control-color,#fff);display:none;left:50%;opacity:.9;padding:calc(10px * 1.5);padding:calc(var(--plyr-control-spacing,10px) * 1.5);position:absolute;top:50%;transform:translate(-50%,-50%);transition:.3s;z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{opacity:1}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25);background-color:var(--plyr-video-range-track-background,var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25)))}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2),0 0 0 3px rgba(255,255,255,.5);box-shadow:var(--plyr-range-thumb-shadow,0 1px 1px rgba(35,40,47,.15),0 0 0 1px rgba(35,40,47,.2)),0 0 0 var(--plyr-range-thumb-active-shadow-width,3px) var(--plyr-audio-range-thumb-active-shadow-color,rgba(255,255,255,.5))}.plyr--video .plyr__progress__buffer{color:rgba(255,255,255,.25);color:var(--plyr-video-progress-buffered-background,rgba(255,255,255,.25))}.plyr:-webkit-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:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.plyr:-webkit-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:-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:-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;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:-ms-fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,21px)}.plyr:fullscreen .plyr__captions{font-size:21px;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,21px)}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;display:block;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%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative}.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;font-size:var(--plyr-font-size-xlarge,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:#23282f;border-radius:2px;bottom:10px;bottom:var(--plyr-control-spacing,10px);color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;right:var(--plyr-control-spacing,10px);z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;height:var(--plyr-range-track-height,5px);left:0;margin:-var(--plyr-range-track-height,5px)/2 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);background-color:var(--plyr-tooltip-background,rgba(255,255,255,.9));border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);box-shadow:var(--plyr-tooltip-shadow,0 1px 2px rgba(0,0,0,.15));margin-bottom:calc(calc(10px / 2) * 2);margin-bottom:calc(calc(var(--plyr-control-spacing,10px)/ 2) * 2);opacity:0;padding:3px;padding:var(--plyr-tooltip-radius,3px);pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-left:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-right:4px solid transparent;border-right:var(--plyr-tooltip-arrow-size,4px) solid transparent;border-top:4px solid rgba(255,255,255,.9);border-top:var(--plyr-tooltip-arrow-size,4px) solid var(--plyr-tooltip-background,rgba(255,255,255,.9));bottom:calc(4px * -1);bottom:calc(var(--plyr-tooltip-arrow-size,4px) * -1);content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c8d1;border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:calc(3px - 1px);border-radius:calc(var(--plyr-tooltip-radius,3px) - 1px);color:#fff;font-size:13px;font-size:var(--plyr-font-size-time,var(--plyr-font-size-small,13px));padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;pointer-events:none;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.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 588f047b..4ce50405 100644
--- a/dist/plyr.js
+++ b/dist/plyr.js
@@ -4,6 +4,22 @@ typeof navigator === "object" && (function (global, factory) {
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());
}(this, (function () { 'use strict';
+ function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+ }
+
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
@@ -448,10 +464,6 @@ typeof navigator === "object" && (function (global, factory) {
return instanceOf$1(input, NodeList);
};
- var isElement$1 = function isElement(input) {
- return instanceOf$1(input, Element);
- };
-
var isTextNode = function isTextNode(input) {
return getConstructor$1(input) === Text;
};
@@ -476,6 +488,10 @@ typeof navigator === "object" && (function (global, factory) {
return instanceOf$1(input, Promise) && isFunction$1(input.then);
};
+ var isElement$1 = function isElement(input) {
+ return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';
+ };
+
var isEmpty$1 = function isEmpty(input) {
return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;
};
@@ -1487,21 +1503,16 @@ typeof navigator === "object" && (function (global, factory) {
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 _this = this;
+ _classCallCheck(this, Storage);
- _createClass(Storage, [{
- key: "get",
- value: function get(key) {
- if (!Storage.supported || !this.enabled) {
+ _defineProperty(this, "get", function (key) {
+ if (!Storage.supported || !_this.enabled) {
return null;
}
- var store = window.localStorage.getItem(this.key);
+ var store = window.localStorage.getItem(_this.key);
if (is$1.empty(store)) {
return null;
@@ -1509,12 +1520,11 @@ typeof navigator === "object" && (function (global, factory) {
var json = JSON.parse(store);
return is$1.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: "set",
- value: function set(object) {
+ });
+
+ _defineProperty(this, "set", function (object) {
// Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
+ if (!Storage.supported || !_this.enabled) {
return;
} // Can only store objectst
@@ -1524,7 +1534,8 @@ typeof navigator === "object" && (function (global, factory) {
} // Get current storage
- var storage = this.get(); // Default to empty object
+ var storage = _this.get(); // Default to empty object
+
if (is$1.empty(storage)) {
storage = {};
@@ -1533,9 +1544,15 @@ typeof navigator === "object" && (function (global, factory) {
extend(storage, object); // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
+ window.localStorage.setItem(_this.key, JSON.stringify(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, null, [{
key: "supported",
get: function get() {
try {
@@ -3659,7 +3676,7 @@ typeof navigator === "object" && (function (global, factory) {
// Sprite (for icons)
loadSprite: true,
iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',
+ iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',
// Blank video (used to prevent errors on source change)
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
// Quality default
@@ -4058,83 +4075,41 @@ typeof navigator === "object" && (function (global, factory) {
_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
- }; // Force the use of 'full window/browser' rather than fullscreen
-
- this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
- // Checks container is an ancestor, defaults to null
-
- this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
- _this.onChange();
- }); // 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.player.listeners.proxy(event, _this.toggle, 'fullscreen');
- }); // Tap focus when in fullscreen
-
- on.call(this, this.player.elements.container, 'keydown', function (event) {
- return _this.trapFocus(event);
- }); // Update the UI
-
- this.update();
- } // Determine if native supported
-
-
- _createClass(Fullscreen, [{
- key: "onChange",
- value: function onChange() {
- if (!this.enabled) {
+ _defineProperty(this, "onChange", function () {
+ if (!_this.enabled) {
return;
} // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
+ var button = _this.player.elements.buttons.fullscreen;
if (is$1.element(button)) {
- button.pressed = this.active;
+ button.pressed = _this.active;
} // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up
- var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event
+ var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event
- triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
- }
- }, {
- key: "toggleFallback",
- value: function toggleFallback() {
+ triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);
+ });
+
+ _defineProperty(this, "toggleFallback", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
// Store or restore scroll position
if (toggle) {
- this.scrollPosition = {
+ _this.scrollPosition = {
x: window.scrollX || 0,
y: window.scrollY || 0
};
} else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ 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); // Force full viewport on iPhone X+
+ toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
if (browser.isIos) {
var viewport = document.head.querySelector('meta[name="viewport"]');
@@ -4149,12 +4124,12 @@ typeof navigator === "object" && (function (global, factory) {
var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);
if (toggle) {
- this.cleanupViewport = !hasProperty;
+ _this.cleanupViewport = !hasProperty;
if (!hasProperty) {
viewport.content += ",".concat(property);
}
- } else if (this.cleanupViewport) {
+ } else if (_this.cleanupViewport) {
viewport.content = viewport.content.split(',').filter(function (part) {
return part.trim() !== property;
}).join(',');
@@ -4162,20 +4137,18 @@ typeof navigator === "object" && (function (global, factory) {
} // Toggle button and fire events
- this.onChange();
- } // Trap focus inside container
+ _this.onChange();
+ });
- }, {
- key: "trapFocus",
- value: function trapFocus(event) {
+ _defineProperty(this, "trapFocus", function (event) {
// Bail if iOS, not active, not the tab key
- if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {
+ if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {
return;
} // Get the current focused element
var focused = document.activeElement;
- var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
+ var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
var _focusable = _slicedToArray(focusable, 1),
first = _focusable[0];
@@ -4191,15 +4164,13 @@ typeof navigator === "object" && (function (global, factory) {
last.focus();
event.preventDefault();
}
- } // Update UI
+ });
- }, {
- key: "update",
- value: function update() {
- if (this.enabled) {
+ _defineProperty(this, "update", function () {
+ if (_this.enabled) {
var mode;
- if (this.forceFallback) {
+ if (_this.forceFallback) {
mode = 'Fallback (forced)';
} else if (Fullscreen.native) {
mode = 'Native';
@@ -4207,67 +4178,106 @@ typeof navigator === "object" && (function (global, factory) {
mode = 'Fallback';
}
- this.player.debug.log("".concat(mode, " fullscreen enabled"));
+ _this.player.debug.log("".concat(mode, " fullscreen enabled"));
} else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
+ _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
+ toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);
+ });
- }, {
- key: "enter",
- value: function enter() {
- if (!this.enabled) {
+ _defineProperty(this, "enter", function () {
+ 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 || this.forceFallback) {
- this.toggleFallback(true);
- } else if (!this.prefix) {
- this.target.requestFullscreen({
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ if (_this.player.isVimeo) {
+ _this.player.embed.requestFullscreen();
+ } else {
+ _this.target.webkitEnterFullscreen();
+ }
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(true);
+ } else if (!_this.prefix) {
+ _this.target.requestFullscreen({
navigationUI: 'hide'
});
- } else if (!is$1.empty(this.prefix)) {
- this.target["".concat(this.prefix, "Request").concat(this.property)]();
+ } 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) {
+ _defineProperty(this, "exit", function () {
+ if (!_this.enabled) {
return;
} // iOS native fullscreen
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- silencePromise(this.player.play());
- } else if (!Fullscreen.native || this.forceFallback) {
- this.toggleFallback(false);
- } else if (!this.prefix) {
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ _this.target.webkitExitFullscreen();
+
+ silencePromise(_this.player.play());
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(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)]();
+ } 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();
+ _defineProperty(this, "toggle", function () {
+ if (!_this.active) {
+ _this.enter();
} else {
- this.exit();
+ _this.exit();
}
- }
- }, {
+ });
+
+ // 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
+ }; // Force the use of 'full window/browser' rather than fullscreen
+
+ this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
+ // Checks container is an ancestor, defaults to null
+
+ this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
+ _this.onChange();
+ }); // 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.player.listeners.proxy(event, _this.toggle, 'fullscreen');
+ }); // Tap focus when in fullscreen
+
+ on.call(this, this.player.elements.container, 'keydown', function (event) {
+ return _this.trapFocus(event);
+ }); // Update the UI
+
+ this.update(); // this.toggle = this.toggle.bind(this);
+ } // Determine if native supported
+
+
+ _createClass(Fullscreen, [{
key: "usingNative",
// If we're actually using native
get: function get() {
@@ -4598,182 +4608,23 @@ typeof navigator === "object" && (function (global, factory) {
};
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$1(focused, editable)) {
- return;
- }
-
- if (event.which === 32 && matches$1(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) {
- silencePromise(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;
- } // Escape is handle natively when in full screen
- // So we only need to worry about non native
-
-
- if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
- player.fullscreen.toggle();
- } // Store last code for next cycle
-
-
- this.lastKey = code;
- } else {
- this.lastKey = null;
- }
- } // Toggle menu
+ function Listeners(_player) {
+ var _this = this;
- }, {
- key: "toggleMenu",
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- } // Device is touch enabled
+ _classCallCheck(this, Listeners);
- }, {
- key: "firstTouch",
- value: function firstTouch() {
- var player = this.player;
+ _defineProperty(this, "firstTouch", function () {
+ 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;
+ });
+
+ _defineProperty(this, "setTabFocus", function (event) {
+ var player = _this.player;
var elements = player.elements;
- clearTimeout(this.focusTimer); // Ignore any key other than tab
+ clearTimeout(_this.focusTimer); // Ignore any key other than tab
if (event.type === 'keydown' && event.which !== 9) {
return;
@@ -4781,7 +4632,7 @@ typeof navigator === "object" && (function (global, factory) {
if (event.type === 'keydown') {
- this.lastKeyDown = event.timeStamp;
+ _this.lastKeyDown = event.timeStamp;
} // Remove current classes
@@ -4792,7 +4643,7 @@ typeof navigator === "object" && (function (global, factory) {
}; // 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
+ var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
if (event.type === 'focus' && !wasKeyDown) {
return;
@@ -4803,7 +4654,7 @@ typeof navigator === "object" && (function (global, factory) {
// This event fires before the focusin event
if (event.type !== 'focusout') {
- this.focusTimer = setTimeout(function () {
+ _this.focusTimer = setTimeout(function () {
var focused = document.activeElement; // Ignore if current focus element isn't inside the player
if (!elements.container.contains(focused)) {
@@ -4813,36 +4664,32 @@ typeof navigator === "object" && (function (global, factory) {
toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
}, 10);
}
- } // Global window & document listeners
+ });
- }, {
- key: "global",
- value: function global() {
+ _defineProperty(this, "global", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- var player = this.player; // Keyboard shortcuts
+ var player = _this.player; // Keyboard shortcuts
if (player.config.keyboard.global) {
- toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
+ 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
+ toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events
- once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
+ once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection
- toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);
- } // Container listeners
+ toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);
+ });
- }, {
- key: "container",
- value: function container() {
- var player = this.player;
+ _defineProperty(this, "container", function () {
+ var player = _this.player;
var config = player.config,
elements = player.elements,
timers = player.timers; // Keyboard shortcuts
if (!config.keyboard.global && config.keyboard.focused) {
- on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
+ on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);
} // Toggle controls on mouse events and entering fullscreen
@@ -4947,14 +4794,10 @@ typeof navigator === "object" && (function (global, factory) {
}
}
});
- } // Listen for media events
-
- }, {
- key: "media",
- value: function media() {
- var _this = this;
+ });
- var player = this.player;
+ _defineProperty(this, "media", function () {
+ var player = _this.player;
var elements = player.elements; // Time change on media
on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
@@ -5046,7 +4889,6 @@ typeof navigator === "object" && (function (global, factory) {
// Update UI
controls.updateSetting.call(player, 'speed'); // Save to storage
-
player.storage.set({
speed: player.speed
});
@@ -5073,12 +4915,10 @@ typeof navigator === "object" && (function (global, factory) {
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;
+ _defineProperty(this, "proxy", function (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
@@ -5091,89 +4931,90 @@ typeof navigator === "object" && (function (global, factory) {
if (returned !== false && is$1.function(defaultHandler)) {
defaultHandler.call(player, event);
}
- } // Trigger custom and default handlers
-
- }, {
- key: "bind",
- value: function bind(element, type, defaultHandler, customHandlerKey) {
- var _this2 = this;
+ });
+ _defineProperty(this, "bind", function (element, type, defaultHandler, customHandlerKey) {
var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var player = this.player;
+ var player = _this.player;
var customHandler = player.config.listeners[customHandlerKey];
var hasCustomHandler = is$1.function(customHandler);
on.call(player, element, type, function (event) {
- return _this2.proxy(event, defaultHandler, customHandlerKey);
+ return _this.proxy(event, defaultHandler, customHandlerKey);
}, passive && !hasCustomHandler);
- } // Listen for control events
-
- }, {
- key: "controls",
- value: function controls$1() {
- var _this3 = this;
+ });
- var player = this.player;
+ _defineProperty(this, "controls", function () {
+ 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) {
- _this3.bind(button, 'click', function () {
+ _this.bind(button, 'click', function () {
silencePromise(player.togglePlay());
}, 'play');
});
} // Pause
- this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+ _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+
- this.bind(elements.buttons.rewind, 'click', function () {
+ _this.bind(elements.buttons.rewind, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after rewind
player.lastSeekTime = Date.now();
player.rewind();
}, 'rewind'); // Rewind
- this.bind(elements.buttons.fastForward, 'click', function () {
+
+ _this.bind(elements.buttons.fastForward, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after fast forward
player.lastSeekTime = Date.now();
player.forward();
}, 'fastForward'); // Mute toggle
- this.bind(elements.buttons.mute, 'click', function () {
+
+ _this.bind(elements.buttons.mute, 'click', function () {
player.muted = !player.muted;
}, 'mute'); // Captions toggle
- this.bind(elements.buttons.captions, 'click', function () {
+
+ _this.bind(elements.buttons.captions, 'click', function () {
return player.toggleCaptions();
}); // Download
- this.bind(elements.buttons.download, 'click', function () {
+
+ _this.bind(elements.buttons.download, 'click', function () {
triggerEvent.call(player, player.media, 'download');
}, 'download'); // Fullscreen toggle
- this.bind(elements.buttons.fullscreen, 'click', function () {
+
+ _this.bind(elements.buttons.fullscreen, 'click', function () {
player.fullscreen.toggle();
}, 'fullscreen'); // Picture-in-Picture
- this.bind(elements.buttons.pip, 'click', function () {
+
+ _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) {
+ _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();
event.preventDefault();
-
controls.toggleMenu.call(player, event);
}, null, false); // Can't be passive as we're preventing default
// 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) {
+
+ _this.bind(elements.buttons.settings, 'keyup', function (event) {
var code = event.which; // We only care about space and return
if (![13, 32].includes(code)) {
@@ -5183,7 +5024,6 @@ typeof navigator === "object" && (function (global, factory) {
if (code === 13) {
controls.focusFirstMenuItem.call(player, null, true);
-
return;
} // Prevent scroll
@@ -5196,19 +5036,22 @@ typeof navigator === "object" && (function (global, factory) {
}, null, false // Can't be passive as we're preventing default
); // Escape closes menu
- this.bind(elements.settings.menu, 'keydown', function (event) {
+
+ _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) {
+
+ _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) {
+
+ _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';
@@ -5235,17 +5078,18 @@ typeof navigator === "object" && (function (global, factory) {
// 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 _this3.bind(input, inputEvent, function (event) {
+ return _this.bind(input, inputEvent, function (event) {
return repaint(event.target);
});
});
} // Seek
- this.bind(elements.inputs.seek, inputEvent, function (event) {
+ _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');
@@ -5258,12 +5102,14 @@ typeof navigator === "object" && (function (global, factory) {
player.currentTime = seekTo / seek.max * player.duration;
}, 'seek'); // Seek tooltip
- this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+
+ _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
return controls.updateSeekTooltip.call(player, event);
}); // Preview thumbnails plugin
// TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this
- this.bind(elements.progress, 'mousemove touchmove', function (event) {
+
+ _this.bind(elements.progress, 'mousemove touchmove', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -5271,7 +5117,8 @@ typeof navigator === "object" && (function (global, factory) {
}
}); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
- this.bind(elements.progress, 'mouseleave touchend click', function () {
+
+ _this.bind(elements.progress, 'mouseleave touchend click', function () {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -5279,14 +5126,16 @@ typeof navigator === "object" && (function (global, factory) {
}
}); // Show scrubbing preview
- this.bind(elements.progress, 'mousedown touchstart', function (event) {
+
+ _this.bind(elements.progress, 'mousedown touchstart', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
previewThumbnails.startScrubbing(event);
}
});
- this.bind(elements.progress, 'mouseup touchend', function (event) {
+
+ _this.bind(elements.progress, 'mouseup touchend', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -5294,9 +5143,10 @@ typeof navigator === "object" && (function (global, factory) {
}
}); // Polyfill for lower fill in <input type="range"> for webkit
+
if (browser.isWebkit) {
Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
- _this3.bind(element, 'input', function (event) {
+ _this.bind(element, 'input', function (event) {
return controls.updateRangeFill.call(player, event.target);
});
});
@@ -5305,43 +5155,45 @@ typeof navigator === "object" && (function (global, factory) {
if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
- this.bind(elements.display.currentTime, 'click', function () {
+ _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) {
+ _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) {
+
+ _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
elements.controls.hover = !player.touch && event.type === 'mouseenter';
}); // Also update controls.hover state for any non-player children of fullscreen element (as above)
+
if (elements.fullscreen) {
Array.from(elements.fullscreen.children).filter(function (c) {
return !c.contains(elements.container);
}).forEach(function (child) {
- _this3.bind(child, 'mouseenter mouseleave', function (event) {
+ _this.bind(child, '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) {
+ _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
}); // Show controls when they receive focus (e.g., when using keyboard tab key)
- this.bind(elements.controls, 'focusin', function () {
+
+ _this.bind(elements.controls, 'focusin', function () {
var config = player.config,
timers = player.timers; // Skip transition to prevent focus from scrolling the parent element
@@ -5353,7 +5205,7 @@ typeof navigator === "object" && (function (global, factory) {
toggleClass(elements.controls, config.classNames.noTransition, false);
}, 0); // Delay a little more for mouse users
- var delay = _this3.touch ? 3000 : 4000; // Clear timer
+ var delay = _this.touch ? 3000 : 4000; // Clear timer
clearTimeout(timers.controls); // Hide again after delay
@@ -5362,7 +5214,8 @@ typeof navigator === "object" && (function (global, factory) {
}, delay);
}); // Mouse wheel for volume
- this.bind(elements.inputs.volume, 'wheel', function (event) {
+
+ _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
@@ -5385,7 +5238,166 @@ typeof navigator === "object" && (function (global, factory) {
event.preventDefault();
}
}, 'volume', false);
- }
+ });
+
+ 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$1(focused, editable)) {
+ return;
+ }
+
+ if (event.which === 32 && matches$1(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) {
+ silencePromise(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;
+ } // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+
+
+ if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
+ 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
+
}]);
return Listeners;
@@ -5786,7 +5798,7 @@ typeof navigator === "object" && (function (global, factory) {
var src = format(player.config.urls.vimeo.iframe, id, params);
iframe.setAttribute('src', src);
iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required
+ iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required
if (!is$1.empty(referrerPolicy)) {
iframe.setAttribute('referrerPolicy', referrerPolicy);
@@ -6545,135 +6557,84 @@ typeof navigator === "object" && (function (global, factory) {
_classCallCheck(this, Ads);
- this.player = player;
- this.config = player.config.ads;
- 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) {
+ _defineProperty(this, "load", function () {
+ if (!_this.enabled) {
return;
} // 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();
+ loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {
+ _this.ready();
}).catch(function () {
// Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
+ _this.trigger('error', new Error('Google IMA SDK failed to load'));
});
} else {
- this.ready();
+ _this.ready();
}
- }
- /**
- * Get the ads instance ready
- */
-
- }, {
- key: "ready",
- value: function ready() {
- var _this3 = this;
+ });
+ _defineProperty(this, "ready", function () {
// Double check we're enabled
- if (!this.enabled) {
- destroy(this);
+ if (!_this.enabled) {
+ destroy(_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.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
+
+ _this.managerPromise.then(function () {
+ _this.clearSafetyTimer('onAdsManagerLoaded()');
}); // Set listeners on the Plyr instance
- this.listeners(); // Setup the IMA SDK
- this.setupIMA();
- } // Build the tag URL
+ _this.listeners(); // Setup the IMA SDK
- }, {
- 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() {
- var _this4 = this;
+ _this.setupIMA();
+ });
+ _defineProperty(this, "setupIMA", function () {
// Create the container for our advertisements
- this.elements.container = createElement('div', {
- class: this.player.config.classNames.ads
+ _this.elements.container = createElement('div', {
+ class: _this.player.config.classNames.ads
});
- this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
+
+ _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); // Set playback for iOS10+
+ google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+
- google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
+ google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // 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, this.player.media); // Create ads loader
+ _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
+ _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);
+ _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this.onAdsManagerLoaded(event);
}, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
+
+ _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}, false); // Request video ads to be pre-loaded
- this.requestAds();
- }
- /**
- * Request advertisements
- */
- }, {
- key: "requestAds",
- value: function requestAds() {
- var container = this.player.elements.container;
+ _this.requestAds();
+ });
+
+ _defineProperty(this, "requestAds", function () {
+ var container = _this.player.elements.container;
try {
// Request video ads
var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
+ 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;
@@ -6683,51 +6644,38 @@ typeof navigator === "object" && (function (global, factory) {
request.forceNonLinearFullSlot = false; // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
- this.loader.requestAds(request);
+ request.setAdWillPlayMuted(!_this.player.muted);
+
+ _this.loader.requestAds(request);
} catch (e) {
- this.onAdError(e);
+ _this.onAdError(e);
}
- }
- /**
- * Update the ad countdown
- * @param {Boolean} start
- */
-
- }, {
- key: "pollCountdown",
- value: function pollCountdown() {
- var _this5 = this;
+ });
+ _defineProperty(this, "pollCountdown", function () {
var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
+ 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);
+ var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));
+ var label = "".concat(i18n.get('advertisement', _this.player.config), " - ").concat(time);
- _this5.elements.container.setAttribute('data-badge-text', label);
+ _this.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;
+ _this.countdownTimer = setInterval(update, 100);
+ });
+ _defineProperty(this, "onAdsManagerLoaded", function (event) {
// Load could occur after a source change (race condition)
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
} // Get the ads manager
@@ -6738,38 +6686,36 @@ typeof navigator === "object" && (function (global, factory) {
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.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 listeners to the required events
+ _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events
// Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
+ _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}); // Advertisement regular events
+
Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
- return _this6.onAdEvent(e);
+ _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
+ return _this.onAdEvent(e);
});
}); // Resolve our adsManager
- this.trigger('loaded');
- }
- }, {
- key: "addCuePoints",
- value: function addCuePoints() {
- var _this7 = this;
+ _this.trigger('loaded');
+ });
+ _defineProperty(this, "addCuePoints", function () {
// 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 < _this7.player.duration) {
- var seekElement = _this7.player.elements.progress;
+ if (!is$1.empty(_this.cuePoints)) {
+ _this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {
+ var seekElement = _this.player.elements.progress;
if (is$1.element(seekElement)) {
- var cuePercentage = 100 / _this7.player.duration * cuePoint;
+ var cuePercentage = 100 / _this.player.duration * cuePoint;
var cue = createElement('span', {
- class: _this7.player.config.classNames.cues
+ class: _this.player.config.classNames.cues
});
cue.style.left = "".concat(cuePercentage.toString(), "%");
seekElement.appendChild(cue);
@@ -6777,27 +6723,17 @@ typeof navigator === "object" && (function (global, factory) {
}
});
}
- }
- /**
- * 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 _this8 = this;
+ });
- var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ _defineProperty(this, "onAdEvent", function (event) {
+ 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();
var adData = event.getAdData(); // Proxy event
var dispatchEvent = function dispatchEvent(type) {
- triggerEvent.call(_this8.player, _this8.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
+ triggerEvent.call(_this.player, _this.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
}; // Bubble the event
@@ -6807,9 +6743,10 @@ typeof navigator === "object" && (function (global, factory) {
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'); // Start countdown
+ _this.trigger('loaded'); // Start countdown
+
- this.pollCountdown(true);
+ _this.pollCountdown(true);
if (!ad.isLinear()) {
// Position AdDisplayContainer correctly for overlay
@@ -6823,7 +6760,8 @@ typeof navigator === "object" && (function (global, factory) {
case google.ima.AdEvent.Type.STARTED:
// Set volume to match player
- this.manager.setVolume(this.player.volume);
+ _this.manager.setVolume(_this.player.volume);
+
break;
case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
@@ -6850,11 +6788,11 @@ typeof navigator === "object" && (function (global, factory) {
// };
// 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
- if (this.player.ended) {
- this.loadAds();
+ if (_this.player.ended) {
+ _this.loadAds();
} else {
// The SDK won't allow new ads to be called without receiving a contentComplete()
- this.loader.contentComplete();
+ _this.loader.contentComplete();
}
break;
@@ -6863,7 +6801,8 @@ typeof navigator === "object" && (function (global, factory) {
// 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
- this.pauseContent();
+ _this.pauseContent();
+
break;
case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
@@ -6871,275 +6810,237 @@ typeof navigator === "object" && (function (global, factory) {
// 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
- this.pollCountdown();
- this.resumeContent();
+ _this.pollCountdown();
+
+ _this.resumeContent();
+
break;
case google.ima.AdEvent.Type.LOG:
if (adData.adError) {
- this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
+ _this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
}
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
- */
+ _defineProperty(this, "onAdError", function (event) {
+ _this.cancel();
- }, {
- key: "listeners",
- value: function listeners() {
- var _this9 = this;
+ _this.player.debug.warn('Ads error', event);
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "listeners", function () {
+ var container = _this.player.elements.container;
var time;
- this.player.on('canplay', function () {
- _this9.addCuePoints();
+
+ _this.player.on('canplay', function () {
+ _this.addCuePoints();
});
- this.player.on('ended', function () {
- _this9.loader.contentComplete();
+
+ _this.player.on('ended', function () {
+ _this.loader.contentComplete();
});
- this.player.on('timeupdate', function () {
- time = _this9.player.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ time = _this.player.currentTime;
});
- this.player.on('seeked', function () {
- var seekedTime = _this9.player.currentTime;
- if (is$1.empty(_this9.cuePoints)) {
+ _this.player.on('seeked', function () {
+ var seekedTime = _this.player.currentTime;
+
+ if (is$1.empty(_this.cuePoints)) {
return;
}
- _this9.cuePoints.forEach(function (cuePoint, index) {
+ _this.cuePoints.forEach(function (cuePoint, index) {
if (time < cuePoint && cuePoint < seekedTime) {
- _this9.manager.discardAdBreak();
+ _this.manager.discardAdBreak();
- _this9.cuePoints.splice(index, 1);
+ _this.cuePoints.splice(index, 1);
}
});
}); // Listen to the resizing of the window. And resize ad accordingly
// TODO: eventually implement ResizeObserver
+
window.addEventListener('resize', function () {
- if (_this9.manager) {
- _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ if (_this.manager) {
+ _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
}
});
- }
- /**
- * Initialize the adsManager and start playing advertisements
- */
-
- }, {
- key: "play",
- value: function play() {
- var _this10 = this;
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "play", function () {
+ var container = _this.player.elements.container;
- if (!this.managerPromise) {
- this.resumeContent();
+ if (!_this.managerPromise) {
+ _this.resumeContent();
} // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Set volume to match player
- _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices
+ _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices
- _this10.elements.displayContainer.initialize();
+ _this.elements.displayContainer.initialize();
try {
- if (!_this10.initialized) {
+ if (!_this.initialized) {
// Initialize the ads manager. Ad rules playlist will start at this time
- _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
+ _this.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
- _this10.manager.start();
+ _this.manager.start();
}
- _this10.initialized = true;
+ _this.initialized = true;
} catch (adError) {
// An error may be thrown if there was a problem with the
// VAST response
- _this10.onAdError(adError);
+ _this.onAdError(adError);
}
}).catch(function () {});
- }
- /**
- * Resume our video
- */
+ });
- }, {
- key: "resumeContent",
- value: function resumeContent() {
+ _defineProperty(this, "resumeContent", function () {
// Hide the advertisement container
- this.elements.container.style.zIndex = ''; // Ad is stopped
+ _this.elements.container.style.zIndex = ''; // Ad is stopped
- this.playing = false; // Play video
+ _this.playing = false; // Play video
- silencePromise(this.player.media.play());
- }
- /**
- * Pause our video
- */
+ silencePromise(_this.player.media.play());
+ });
- }, {
- key: "pauseContent",
- value: function pauseContent() {
+ _defineProperty(this, "pauseContent", function () {
// Show the advertisement container
- this.elements.container.style.zIndex = 3; // Ad is playing
+ _this.elements.container.style.zIndex = 3; // Ad is playing
- this.playing = true; // Pause our video.
+ _this.playing = true; // Pause our video.
- this.player.media.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
- */
+ _this.player.media.pause();
+ });
- }, {
- key: "cancel",
- value: function cancel() {
+ _defineProperty(this, "cancel", function () {
// Pause our video
- if (this.initialized) {
- this.resumeContent();
+ if (_this.initialized) {
+ _this.resumeContent();
} // Tell our instance that we're done for now
- this.trigger('error'); // Re-create our adsManager
+ _this.trigger('error'); // Re-create our adsManager
- this.loadAds();
- }
- /**
- * Re-create our adsManager
- */
- }, {
- key: "loadAds",
- value: function loadAds() {
- var _this11 = this;
+ _this.loadAds();
+ });
+ _defineProperty(this, "loadAds", function () {
// Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Destroy our adsManager
- if (_this11.manager) {
- _this11.manager.destroy();
+ if (_this.manager) {
+ _this.manager.destroy();
} // Re-set our adsManager promises
- _this11.managerPromise = new Promise(function (resolve) {
- _this11.on('loaded', resolve);
+ _this.managerPromise = new Promise(function (resolve) {
+ _this.on('loaded', resolve);
- _this11.player.debug.log(_this11.manager);
+ _this.player.debug.log(_this.manager);
}); // Now that the manager has been destroyed set it to also be un-initialized
- _this11.initialized = false; // Now request some new advertisements
+ _this.initialized = false; // Now request some new advertisements
- _this11.requestAds();
+ _this.requestAds();
}).catch(function () {});
- }
- /**
- * Handles callbacks after an ad event was invoked
- * @param {String} event - Event type
- */
-
- }, {
- key: "trigger",
- value: function trigger(event) {
- var _this12 = this;
+ });
+ _defineProperty(this, "trigger", function (event) {
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];
+ var handlers = _this.events[event];
if (is$1.array(handlers)) {
handlers.forEach(function (handler) {
if (is$1.function(handler)) {
- handler.apply(_this12, args);
+ handler.apply(_this, args);
}
});
}
- }
- /**
- * Add event listeners
- * @param {String} event - Event type
- * @param {Function} callback - Callback for when event occurs
- * @return {Ads}
- */
+ });
- }, {
- key: "on",
- value: function on(event, callback) {
- if (!is$1.array(this.events[event])) {
- this.events[event] = [];
+ _defineProperty(this, "on", function (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
- */
+ _this.events[event].push(callback);
- }, {
- key: "startSafetyTimer",
- value: function startSafetyTimer(time, from) {
- var _this13 = this;
+ return _this;
+ });
+
+ _defineProperty(this, "startSafetyTimer", function (time, from) {
+ _this.player.debug.log("Safety timer invoked from: ".concat(from));
- this.player.debug.log("Safety timer invoked from: ".concat(from));
- this.safetyTimer = setTimeout(function () {
- _this13.cancel();
+ _this.safetyTimer = setTimeout(function () {
+ _this.cancel();
- _this13.clearSafetyTimer('startSafetyTimer()');
+ _this.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;
+ _defineProperty(this, "clearSafetyTimer", function (from) {
+ if (!is$1.nullOrUndefined(_this.safetyTimer)) {
+ _this.player.debug.log("Safety timer cleared from: ".concat(from));
+
+ clearTimeout(_this.safetyTimer);
+ _this.safetyTimer = null;
}
- }
- }, {
+ });
+
+ this.player = player;
+ this.config = player.config.ads;
+ 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: "enabled",
get: function get() {
var config = this.config;
return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));
}
+ /**
+ * Load the IMA SDK
+ */
+
}, {
key: "tagUrl",
+ // Build the tag URL
get: function get() {
var config = this.config;
@@ -7159,6 +7060,15 @@ typeof navigator === "object" && (function (global, factory) {
var base = 'https://go.aniview.com/api/adserver6/vast/';
return "".concat(base, "?").concat(buildUrlParams(params));
}
+ /**
+ * 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.
+ */
+
}]);
return Ads;
@@ -7241,36 +7151,21 @@ typeof navigator === "object" && (function (global, factory) {
* @return {PreviewThumbnails}
*/
function PreviewThumbnails(player) {
- _classCallCheck(this, PreviewThumbnails);
-
- this.player = player;
- this.thumbnails = [];
- this.loaded = false;
- this.lastMouseMoveTime = Date.now();
- this.mouseDown = false;
- this.loadedImages = [];
- this.elements = {
- thumb: {},
- scrubbing: {}
- };
- this.load();
- }
+ var _this = this;
- _createClass(PreviewThumbnails, [{
- key: "load",
- value: function load() {
- var _this = this;
+ _classCallCheck(this, PreviewThumbnails);
+ _defineProperty(this, "load", function () {
// Toggle the regular seek tooltip
- if (this.player.elements.display.seekTooltip) {
- this.player.elements.display.seekTooltip.hidden = this.enabled;
+ if (_this.player.elements.display.seekTooltip) {
+ _this.player.elements.display.seekTooltip.hidden = _this.enabled;
}
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
}
- this.getThumbnails().then(function () {
+ _this.getThumbnails().then(function () {
if (!_this.enabled) {
return;
} // Render DOM elements
@@ -7283,15 +7178,11 @@ typeof navigator === "object" && (function (global, factory) {
_this.loaded = true;
});
- } // Download VTT files and parse them
-
- }, {
- key: "getThumbnails",
- value: function getThumbnails() {
- var _this2 = this;
+ });
+ _defineProperty(this, "getThumbnails", function () {
return new Promise(function (resolve) {
- var src = _this2.player.config.previewThumbnails.src;
+ var src = _this.player.config.previewThumbnails.src;
if (is$1.empty(src)) {
throw new Error('Missing previewThumbnails.src config attribute');
@@ -7300,11 +7191,11 @@ typeof navigator === "object" && (function (global, factory) {
var sortAndResolve = function sortAndResolve() {
// Sort smallest to biggest (e.g., [120p, 480p, 1080p])
- _this2.thumbnails.sort(function (x, y) {
+ _this.thumbnails.sort(function (x, y) {
return x.height - y.height;
});
- _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
+ _this.player.debug.log('Preview thumbnails', _this.thumbnails);
resolve();
}; // Via callback()
@@ -7312,7 +7203,7 @@ typeof navigator === "object" && (function (global, factory) {
if (is$1.function(src)) {
src(function (thumbnails) {
- _this2.thumbnails = thumbnails;
+ _this.thumbnails = thumbnails;
sortAndResolve();
});
} // VTT urls
@@ -7321,19 +7212,15 @@ typeof navigator === "object" && (function (global, factory) {
var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
var promises = urls.map(function (u) {
- return _this2.getThumbnail(u);
+ return _this.getThumbnail(u);
}); // Resolve
Promise.all(promises).then(sortAndResolve);
}
});
- } // Process individual VTT file
-
- }, {
- key: "getThumbnail",
- value: function getThumbnail(url) {
- var _this3 = this;
+ });
+ _defineProperty(this, "getThumbnail", function (url) {
return new Promise(function (resolve) {
fetch(url).then(function (response) {
var thumbnail = {
@@ -7355,7 +7242,7 @@ typeof navigator === "object" && (function (global, factory) {
thumbnail.height = tempImage.naturalHeight;
thumbnail.width = tempImage.naturalWidth;
- _this3.thumbnails.push(thumbnail);
+ _this.thumbnails.push(thumbnail);
resolve();
};
@@ -7363,11 +7250,10 @@ typeof navigator === "object" && (function (global, factory) {
tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;
});
});
- }
- }, {
- key: "startMove",
- value: function startMove(event) {
- if (!this.loaded) {
+ });
+
+ _defineProperty(this, "startMove", function (event) {
+ if (!_this.loaded) {
return;
}
@@ -7376,163 +7262,153 @@ typeof navigator === "object" && (function (global, factory) {
} // Wait until media has a duration
- if (!this.player.media.duration) {
+ if (!_this.player.media.duration) {
return;
}
if (event.type === 'touchmove') {
// Calculate seek hover position as approx video seconds
- this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
+ _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);
} else {
// Calculate seek hover position as approx video seconds
- var clientRect = this.player.elements.progress.getBoundingClientRect();
+ var clientRect = _this.player.elements.progress.getBoundingClientRect();
+
var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);
- this.seekTime = this.player.media.duration * (percentage / 100);
+ _this.seekTime = _this.player.media.duration * (percentage / 100);
- if (this.seekTime < 0) {
+ if (_this.seekTime < 0) {
// The mousemove fires for 10+px out to the left
- this.seekTime = 0;
+ _this.seekTime = 0;
}
- if (this.seekTime > this.player.media.duration - 1) {
+ if (_this.seekTime > _this.player.media.duration - 1) {
// Took 1 second off the duration for safety, because different players can disagree on the real duration of a video
- this.seekTime = this.player.media.duration - 1;
+ _this.seekTime = _this.player.media.duration - 1;
}
- this.mousePosX = event.pageX; // Set time text inside image container
+ _this.mousePosX = event.pageX; // Set time text inside image container
- this.elements.thumb.time.innerText = formatTime(this.seekTime);
+ _this.elements.thumb.time.innerText = formatTime(_this.seekTime);
} // Download and show image
- this.showImageAtCurrentTime();
- }
- }, {
- key: "endMove",
- value: function endMove() {
- this.toggleThumbContainer(false, true);
- }
- }, {
- key: "startScrubbing",
- value: function startScrubbing(event) {
+ _this.showImageAtCurrentTime();
+ });
+
+ _defineProperty(this, "endMove", function () {
+ _this.toggleThumbContainer(false, true);
+ });
+
+ _defineProperty(this, "startScrubbing", function (event) {
// Only act on left mouse button (0), or touch device (event.button does not exist or is false)
if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {
- this.mouseDown = true; // Wait until media has a duration
+ _this.mouseDown = true; // Wait until media has a duration
+
+ if (_this.player.media.duration) {
+ _this.toggleScrubbingContainer(true);
- if (this.player.media.duration) {
- this.toggleScrubbingContainer(true);
- this.toggleThumbContainer(false, true); // Download and show image
+ _this.toggleThumbContainer(false, true); // Download and show image
- this.showImageAtCurrentTime();
+
+ _this.showImageAtCurrentTime();
}
}
- }
- }, {
- key: "endScrubbing",
- value: function endScrubbing() {
- var _this4 = this;
+ });
- this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
+ _defineProperty(this, "endScrubbing", function () {
+ _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
- if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {
+ if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {
// The video was already seeked/loaded at the chosen time - hide immediately
- this.toggleScrubbingContainer(false);
+ _this.toggleScrubbingContainer(false);
} else {
// The video hasn't seeked yet. Wait for that
- once.call(this.player, this.player.media, 'timeupdate', function () {
+ once.call(_this.player, _this.player.media, 'timeupdate', function () {
// Re-check mousedown - we might have already started scrubbing again
- if (!_this4.mouseDown) {
- _this4.toggleScrubbingContainer(false);
+ if (!_this.mouseDown) {
+ _this.toggleScrubbingContainer(false);
}
});
}
- }
- /**
- * Setup hooks for Plyr and window events
- */
-
- }, {
- key: "listeners",
- value: function listeners() {
- var _this5 = this;
+ });
+ _defineProperty(this, "listeners", function () {
// Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
- this.player.on('play', function () {
- _this5.toggleThumbContainer(false, true);
+ _this.player.on('play', function () {
+ _this.toggleThumbContainer(false, true);
});
- this.player.on('seeked', function () {
- _this5.toggleThumbContainer(false);
+
+ _this.player.on('seeked', function () {
+ _this.toggleThumbContainer(false);
});
- this.player.on('timeupdate', function () {
- _this5.lastTime = _this5.player.media.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ _this.lastTime = _this.player.media.currentTime;
});
- }
- /**
- * Create HTML elements for image containers
- */
+ });
- }, {
- key: "render",
- value: function render() {
+ _defineProperty(this, "render", function () {
// Create HTML element: plyr__preview-thumbnail-container
- this.elements.thumb.container = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.thumbContainer
+ _this.elements.thumb.container = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.thumbContainer
}); // Wrapper for the image for styling
- this.elements.thumb.imageContainer = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.imageContainer
+ _this.elements.thumb.imageContainer = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.imageContainer
});
- this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
+ _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
var timeContainer = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.timeContainer
+ class: _this.player.config.classNames.previewThumbnails.timeContainer
});
- this.elements.thumb.time = createElement('span', {}, '00:00');
- timeContainer.appendChild(this.elements.thumb.time);
- this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+ _this.elements.thumb.time = createElement('span', {}, '00:00');
+ timeContainer.appendChild(_this.elements.thumb.time);
+
+ _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+
- if (is$1.element(this.player.elements.progress)) {
- this.player.elements.progress.appendChild(this.elements.thumb.container);
+ if (is$1.element(_this.player.elements.progress)) {
+ _this.player.elements.progress.appendChild(_this.elements.thumb.container);
} // Create HTML element: plyr__preview-scrubbing-container
- this.elements.scrubbing.container = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.scrubbingContainer
+ _this.elements.scrubbing.container = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.scrubbingContainer
});
- this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
- }
- }, {
- key: "destroy",
- value: function destroy() {
- if (this.elements.thumb.container) {
- this.elements.thumb.container.remove();
+
+ _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);
+ });
+
+ _defineProperty(this, "destroy", function () {
+ if (_this.elements.thumb.container) {
+ _this.elements.thumb.container.remove();
}
- if (this.elements.scrubbing.container) {
- this.elements.scrubbing.container.remove();
+ if (_this.elements.scrubbing.container) {
+ _this.elements.scrubbing.container.remove();
}
- }
- }, {
- key: "showImageAtCurrentTime",
- value: function showImageAtCurrentTime() {
- var _this6 = this;
+ });
- if (this.mouseDown) {
- this.setScrubbingContainerSize();
+ _defineProperty(this, "showImageAtCurrentTime", function () {
+ if (_this.mouseDown) {
+ _this.setScrubbingContainerSize();
} else {
- this.setThumbContainerSizeAndPos();
+ _this.setThumbContainerSizeAndPos();
} // Find the desired thumbnail index
// TODO: Handle a video longer than the thumbs where thumbNum is null
- var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {
- return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;
+ var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {
+ return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;
});
+
var hasThumb = thumbNum >= 0;
var qualityIndex = 0; // Show the thumb container if we're not scrubbing
- if (!this.mouseDown) {
- this.toggleThumbContainer(hasThumb);
+ if (!_this.mouseDown) {
+ _this.toggleThumbContainer(hasThumb);
} // No matching thumb found
@@ -7541,36 +7417,34 @@ typeof navigator === "object" && (function (global, factory) {
} // Check to see if we've already downloaded higher quality versions of this image
- this.thumbnails.forEach(function (thumbnail, index) {
- if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
+ _this.thumbnails.forEach(function (thumbnail, index) {
+ if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
qualityIndex = index;
}
}); // Only proceed if either thumbnum or thumbfilename has changed
- if (thumbNum !== this.showingThumb) {
- this.showingThumb = thumbNum;
- this.loadImage(qualityIndex);
- }
- } // Show the image that's currently specified in this.showingThumb
- }, {
- key: "loadImage",
- value: function loadImage() {
- var _this7 = this;
+ if (thumbNum !== _this.showingThumb) {
+ _this.showingThumb = thumbNum;
+ _this.loadImage(qualityIndex);
+ }
+ });
+
+ _defineProperty(this, "loadImage", function () {
var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var thumbNum = this.showingThumb;
- var thumbnail = this.thumbnails[qualityIndex];
+ var thumbNum = _this.showingThumb;
+ var thumbnail = _this.thumbnails[qualityIndex];
var urlPrefix = thumbnail.urlPrefix;
var frame = thumbnail.frames[thumbNum];
var thumbFilename = thumbnail.frames[thumbNum].text;
var thumbUrl = urlPrefix + thumbFilename;
- if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {
+ if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {
// If we're already loading a previous image, remove its onload handler - we don't want it to load after this one
// Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort
- if (this.loadingImage && this.usingSprites) {
- this.loadingImage.onload = null;
+ if (_this.loadingImage && _this.usingSprites) {
+ _this.loadingImage.onload = null;
} // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image
// is instead used. But this causes issues with larger images in Firefox and Safari - switching between background
// images causes a flicker. Putting a new image over the top does not
@@ -7580,56 +7454,59 @@ typeof navigator === "object" && (function (global, factory) {
previewImage.src = thumbUrl;
previewImage.dataset.index = thumbNum;
previewImage.dataset.filename = thumbFilename;
- this.showingThumbFilename = thumbFilename;
- this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+ _this.showingThumbFilename = thumbFilename;
+
+ _this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+
previewImage.onload = function () {
- return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
+ return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
};
- this.loadingImage = previewImage;
- this.removeOldImages(previewImage);
+ _this.loadingImage = previewImage;
+
+ _this.removeOldImages(previewImage);
} else {
// Update the existing image
- this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
- this.currentImageElement.dataset.index = thumbNum;
- this.removeOldImages(this.currentImageElement);
+ _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
+
+ _this.currentImageElement.dataset.index = thumbNum;
+
+ _this.removeOldImages(_this.currentImageElement);
}
- }
- }, {
- key: "showImage",
- value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
+ });
+
+ _defineProperty(this, "showImage", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
- this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
- this.setImageSizeAndOffset(previewImage, frame);
+
+ _this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
+
+ _this.setImageSizeAndOffset(previewImage, frame);
if (newImage) {
- this.currentImageContainer.appendChild(previewImage);
- this.currentImageElement = previewImage;
+ _this.currentImageContainer.appendChild(previewImage);
- if (!this.loadedImages.includes(thumbFilename)) {
- this.loadedImages.push(thumbFilename);
+ _this.currentImageElement = previewImage;
+
+ if (!_this.loadedImages.includes(thumbFilename)) {
+ _this.loadedImages.push(thumbFilename);
}
} // Preload images before and after the current one
// Show higher quality of the same frame
// Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
- this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
- } // Remove all preview images that aren't the designated current image
-
- }, {
- key: "removeOldImages",
- value: function removeOldImages(currentImage) {
- var _this8 = this;
+ _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
+ });
+ _defineProperty(this, "removeOldImages", function (currentImage) {
// Get a list of all images, convert it from a DOM list to an array
- Array.from(this.currentImageContainer.children).forEach(function (image) {
+ Array.from(_this.currentImageContainer.children).forEach(function (image) {
if (image.tagName.toLowerCase() !== 'img') {
return;
}
- var removeDelay = _this8.usingSprites ? 500 : 1000;
+ var removeDelay = _this.usingSprites ? 500 : 1000;
if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {
// Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients
@@ -7637,35 +7514,30 @@ typeof navigator === "object" && (function (global, factory) {
// eslint-disable-next-line no-param-reassign
image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub
- var currentImageContainer = _this8.currentImageContainer;
+ var currentImageContainer = _this.currentImageContainer;
setTimeout(function () {
currentImageContainer.removeChild(image);
- _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
+ _this.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
}, removeDelay);
}
});
- } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
- // This will only preload the lowest quality
-
- }, {
- key: "preloadNearby",
- value: function preloadNearby(thumbNum) {
- var _this9 = this;
+ });
+ _defineProperty(this, "preloadNearby", function (thumbNum) {
var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return new Promise(function (resolve) {
setTimeout(function () {
- var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;
+ var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;
- if (_this9.showingThumbFilename === oldThumbFilename) {
+ if (_this.showingThumbFilename === oldThumbFilename) {
// Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away
var thumbnailsClone;
if (forward) {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);
+ thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);
} else {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();
+ thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();
}
var foundOne = false;
@@ -7674,20 +7546,20 @@ typeof navigator === "object" && (function (global, factory) {
if (newThumbFilename !== oldThumbFilename) {
// Found one with a different filename. Make sure it hasn't already been loaded on this page visit
- if (!_this9.loadedImages.includes(newThumbFilename)) {
+ if (!_this.loadedImages.includes(newThumbFilename)) {
foundOne = true;
- _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
- var urlPrefix = _this9.thumbnails[0].urlPrefix;
+ var urlPrefix = _this.thumbnails[0].urlPrefix;
var thumbURL = urlPrefix + newThumbFilename;
var previewImage = new Image();
previewImage.src = thumbURL;
previewImage.onload = function () {
- _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
- if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
+ if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
resolve();
};
@@ -7701,97 +7573,91 @@ typeof navigator === "object" && (function (global, factory) {
}
}, 300);
});
- } // If user has been hovering current image for half a second, look for a higher quality one
-
- }, {
- key: "getHigherQuality",
- value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {
- var _this10 = this;
+ });
- if (currentQualityIndex < this.thumbnails.length - 1) {
+ _defineProperty(this, "getHigherQuality", function (currentQualityIndex, previewImage, frame, thumbFilename) {
+ if (currentQualityIndex < _this.thumbnails.length - 1) {
// Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
var previewImageHeight = previewImage.naturalHeight;
- if (this.usingSprites) {
+ if (_this.usingSprites) {
previewImageHeight = frame.h;
}
- if (previewImageHeight < this.thumbContainerHeight) {
+ if (previewImageHeight < _this.thumbContainerHeight) {
// Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while
setTimeout(function () {
// Make sure the mouse hasn't already moved on and started hovering at another image
- if (_this10.showingThumbFilename === thumbFilename) {
- _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
+ if (_this.showingThumbFilename === thumbFilename) {
+ _this.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
- _this10.loadImage(currentQualityIndex + 1);
+ _this.loadImage(currentQualityIndex + 1);
}
}, 300);
}
}
- }
- }, {
- key: "toggleThumbContainer",
- value: function toggleThumbContainer() {
+ });
+
+ _defineProperty(this, "toggleThumbContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;
- this.elements.thumb.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;
+
+ _this.elements.thumb.container.classList.toggle(className, toggle);
if (!toggle && clearShowing) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "toggleScrubbingContainer",
- value: function toggleScrubbingContainer() {
+ });
+
+ _defineProperty(this, "toggleScrubbingContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
- this.elements.scrubbing.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
+
+ _this.elements.scrubbing.container.classList.toggle(className, toggle);
if (!toggle) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "determineContainerAutoSizing",
- value: function determineContainerAutoSizing() {
- if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {
+ });
+
+ _defineProperty(this, "determineContainerAutoSizing", function () {
+ if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {
// This will prevent auto sizing in this.setThumbContainerSizeAndPos()
- this.sizeSpecifiedInCSS = true;
+ _this.sizeSpecifiedInCSS = true;
}
- } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
+ });
- }, {
- key: "setThumbContainerSizeAndPos",
- value: function setThumbContainerSizeAndPos() {
- if (!this.sizeSpecifiedInCSS) {
- var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px");
- this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {
- var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);
-
- this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {
- var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
+ _defineProperty(this, "setThumbContainerSizeAndPos", function () {
+ if (!_this.sizeSpecifiedInCSS) {
+ var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(_this.thumbContainerHeight, "px");
+ _this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {
+ var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);
+
+ _this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {
+ var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
}
- this.setThumbContainerPos();
- }
- }, {
- key: "setThumbContainerPos",
- value: function setThumbContainerPos() {
- var seekbarRect = this.player.elements.progress.getBoundingClientRect();
- var plyrRect = this.player.elements.container.getBoundingClientRect();
- var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
+ _this.setThumbContainerPos();
+ });
+
+ _defineProperty(this, "setThumbContainerPos", function () {
+ var seekbarRect = _this.player.elements.progress.getBoundingClientRect();
+
+ var plyrRect = _this.player.elements.container.getBoundingClientRect();
+
+ var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
var minVal = plyrRect.left - seekbarRect.left + 10;
var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth
- var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;
+ var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;
if (previewPos < minVal) {
previewPos = minVal;
@@ -7802,31 +7668,27 @@ typeof navigator === "object" && (function (global, factory) {
}
container.style.left = "".concat(previewPos, "px");
- } // Can't use 100% width, in case the video is a different aspect ratio to the video container
+ });
- }, {
- key: "setScrubbingContainerSize",
- value: function setScrubbingContainerSize() {
- var _fitRatio = fitRatio(this.thumbAspectRatio, {
- width: this.player.media.clientWidth,
- height: this.player.media.clientHeight
+ _defineProperty(this, "setScrubbingContainerSize", function () {
+ var _fitRatio = fitRatio(_this.thumbAspectRatio, {
+ width: _this.player.media.clientWidth,
+ height: _this.player.media.clientHeight
}),
width = _fitRatio.width,
height = _fitRatio.height;
- this.elements.scrubbing.container.style.width = "".concat(width, "px");
- this.elements.scrubbing.container.style.height = "".concat(height, "px");
- } // Sprites need to be offset to the correct location
+ _this.elements.scrubbing.container.style.width = "".concat(width, "px");
+ _this.elements.scrubbing.container.style.height = "".concat(height, "px");
+ });
- }, {
- key: "setImageSizeAndOffset",
- value: function setImageSizeAndOffset(previewImage, frame) {
- if (!this.usingSprites) {
+ _defineProperty(this, "setImageSizeAndOffset", function (previewImage, frame) {
+ if (!_this.usingSprites) {
return;
} // Find difference between height and preview container height
- var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
+ var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
previewImage.style.height = "".concat(previewImage.naturalHeight * multiplier, "px"); // eslint-disable-next-line no-param-reassign
@@ -7835,8 +7697,22 @@ typeof navigator === "object" && (function (global, factory) {
previewImage.style.left = "-".concat(frame.x * multiplier, "px"); // eslint-disable-next-line no-param-reassign
previewImage.style.top = "-".concat(frame.y * multiplier, "px");
- }
- }, {
+ });
+
+ this.player = player;
+ this.thumbnails = [];
+ this.loaded = false;
+ this.lastMouseMoveTime = Date.now();
+ this.mouseDown = false;
+ this.loadedImages = [];
+ this.elements = {
+ thumb: {},
+ scrubbing: {}
+ };
+ this.load();
+ }
+
+ _createClass(PreviewThumbnails, [{
key: "enabled",
get: function get() {
return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;
@@ -8082,6 +7958,214 @@ typeof navigator === "object" && (function (global, factory) {
_classCallCheck(this, Plyr);
+ _defineProperty(this, "play", function () {
+ if (!is$1.function(_this.media.play)) {
+ return null;
+ } // Intecept play with ads
+
+
+ if (_this.ads && _this.ads.enabled) {
+ _this.ads.managerPromise.then(function () {
+ return _this.ads.play();
+ }).catch(function () {
+ return silencePromise(_this.media.play());
+ });
+ } // Return the promise (for HTML5)
+
+
+ return _this.media.play();
+ });
+
+ _defineProperty(this, "pause", function () {
+ if (!_this.playing || !is$1.function(_this.media.pause)) {
+ return null;
+ }
+
+ return _this.media.pause();
+ });
+
+ _defineProperty(this, "togglePlay", function (input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is$1.boolean(input) ? input : !_this.playing;
+
+ if (toggle) {
+ return _this.play();
+ }
+
+ return _this.pause();
+ });
+
+ _defineProperty(this, "stop", function () {
+ if (_this.isHTML5) {
+ _this.pause();
+
+ _this.restart();
+ } else if (is$1.function(_this.media.stop)) {
+ _this.media.stop();
+ }
+ });
+
+ _defineProperty(this, "restart", function () {
+ _this.currentTime = 0;
+ });
+
+ _defineProperty(this, "rewind", function (seekTime) {
+ _this.currentTime -= is$1.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "forward", function (seekTime) {
+ _this.currentTime += is$1.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "increaseVolume", function (step) {
+ var volume = _this.media.muted ? 0 : _this.volume;
+ _this.volume = volume + (is$1.number(step) ? step : 0);
+ });
+
+ _defineProperty(this, "decreaseVolume", function (step) {
+ _this.increaseVolume(-step);
+ });
+
+ _defineProperty(this, "airplay", function () {
+ // Show dialog if supported
+ if (support.airplay) {
+ _this.media.webkitShowPlaybackTargetPicker();
+ }
+ });
+
+ _defineProperty(this, "toggleControls", function (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 && is$1.array(_this.config.controls) && _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;
+ });
+
+ _defineProperty(this, "on", function (event, callback) {
+ on.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "once", function (event, callback) {
+ once.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "off", function (event, callback) {
+ off(_this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "destroy", function (callback) {
+ 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
+
+ _this.embed = null; // If it's a soft destroy, make minimal changes
+
+ if (soft) {
+ if (Object.keys(_this.elements).length) {
+ // Remove elements
+ removeElement(_this.elements.buttons.play);
+ removeElement(_this.elements.captions);
+ removeElement(_this.elements.controls);
+ removeElement(_this.elements.wrapper); // Clear for GC
+
+ _this.elements.buttons.play = null;
+ _this.elements.captions = null;
+ _this.elements.controls = null;
+ _this.elements.wrapper = null;
+ } // Callback
+
+
+ if (is$1.function(callback)) {
+ callback();
+ }
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this); // Cancel current network requests
+
+ html5.cancelRequests.call(_this); // Replace the container with the original element provided
+
+ replaceElement(_this.elements.original, _this.elements.container); // Event
+
+ triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback
+
+ if (is$1.function(callback)) {
+ callback.call(_this.elements.original);
+ } // Reset state
+
+
+ _this.ready = false; // Clear for garbage collection
+
+ setTimeout(function () {
+ _this.elements = null;
+ _this.media = null;
+ }, 200);
+ }
+ }; // Stop playback
+
+
+ _this.stop(); // Clear timeouts
+
+
+ clearTimeout(_this.timers.loading);
+ clearTimeout(_this.timers.controls);
+ clearTimeout(_this.timers.resized); // Provider specific stuff
+
+ if (_this.isHTML5) {
+ // 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);
+ }
+ });
+
+ _defineProperty(this, "supports", function (type) {
+ return support.mime.call(_this, type);
+ });
+
this.timers = {}; // State
this.ready = false;
@@ -8178,12 +8262,13 @@ typeof navigator === "object" && (function (global, factory) {
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 _type = this.media.tagName.toLowerCase(); // Embed properties
+
var iframe = null;
var url = null; // Different setup based on type
- switch (type) {
+ switch (_type) {
case 'div':
// Find the frame
iframe = this.media.querySelector('iframe'); // <iframe> type
@@ -8226,7 +8311,7 @@ typeof navigator === "object" && (function (global, factory) {
} // Unsupported or missing provider
- if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ if (is$1.empty(this.provider) || !Object.values(providers).includes(this.provider)) {
this.debug.error('Setup failed: Invalid provider');
return;
} // Audio will come later for external providers
@@ -8237,7 +8322,7 @@ typeof navigator === "object" && (function (global, factory) {
case 'video':
case 'audio':
- this.type = type;
+ this.type = _type;
this.provider = providers.html5; // Get config from attributes
if (this.media.hasAttribute('crossorigin')) {
@@ -8343,139 +8428,6 @@ typeof navigator === "object" && (function (global, factory) {
_createClass(Plyr, [{
- key: "play",
-
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- var _this2 = this;
-
- if (!is$1.function(this.media.play)) {
- return null;
- } // Intecept play with ads
-
-
- if (this.ads && this.ads.enabled) {
- this.ads.managerPromise.then(function () {
- return _this2.ads.play();
- }).catch(function () {
- return silencePromise(_this2.media.play());
- });
- } // 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 null;
- }
-
- 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) {
- return this.play();
- }
-
- return 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 -= 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 += 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",
/**
@@ -8491,202 +8443,6 @@ typeof navigator === "object" && (function (global, factory) {
*/
}, {
- 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 && is$1.array(this.config.controls) && 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 _this3 = 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
-
- _this3.embed = null; // If it's a soft destroy, make minimal changes
-
- if (soft) {
- if (Object.keys(_this3.elements).length) {
- // Remove elements
- removeElement(_this3.elements.buttons.play);
- removeElement(_this3.elements.captions);
- removeElement(_this3.elements.controls);
- removeElement(_this3.elements.wrapper); // Clear for GC
-
- _this3.elements.buttons.play = null;
- _this3.elements.captions = null;
- _this3.elements.controls = null;
- _this3.elements.wrapper = null;
- } // Callback
-
-
- if (is$1.function(callback)) {
- callback();
- }
- } else {
- // Unbind listeners
- unbindListeners.call(_this3); // Cancel current network requests
-
- html5.cancelRequests.call(_this3); // Replace the container with the original element provided
-
- replaceElement(_this3.elements.original, _this3.elements.container); // Event
-
- triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback
-
- if (is$1.function(callback)) {
- callback.call(_this3.elements.original);
- } // Reset state
-
-
- _this3.ready = false; // Clear for garbage collection
-
- setTimeout(function () {
- _this3.elements = null;
- _this3.media = null;
- }, 200);
- }
- }; // Stop playback
-
-
- this.stop(); // Clear timeouts
-
- clearTimeout(this.timers.loading);
- clearTimeout(this.timers.controls);
- clearTimeout(this.timers.resized); // Provider specific stuff
-
- if (this.isHTML5) {
- // 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 {Boolean} inline - Where player has `playsinline` sttribute
- */
-
- }, {
key: "isHTML5",
get: function get() {
return this.provider === providers.html5;
@@ -8716,8 +8472,16 @@ typeof navigator === "object" && (function (global, factory) {
get: function get() {
return this.type === types.audio;
}
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+
}, {
key: "playing",
+
+ /**
+ * Get playing state
+ */
get: function get() {
return Boolean(this.ready && !this.paused && !this.ended);
}
@@ -8748,8 +8512,18 @@ typeof navigator === "object" && (function (global, factory) {
get: function get() {
return Boolean(this.media.ended);
}
+ /**
+ * Toggle playback based on current status
+ * @param {Boolean} input
+ */
+
}, {
key: "currentTime",
+
+ /**
+ * Seek to a time
+ * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
set: function set(input) {
// Bail if media duration isn't available yet
if (!this.duration) {
@@ -8868,8 +8642,18 @@ typeof navigator === "object" && (function (global, factory) {
get: function get() {
return Number(this.media.volume);
}
+ /**
+ * Increase volume
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
+ */
+
}, {
key: "muted",
+
+ /**
+ * Set muted state
+ * @param {Boolean} mute
+ */
set: function set(mute) {
var toggle = mute; // Load muted state from storage
@@ -8921,7 +8705,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "speed",
set: function set(input) {
- var _this4 = this;
+ var _this2 = this;
var speed = null;
@@ -8945,7 +8729,7 @@ typeof navigator === "object" && (function (global, factory) {
this.config.speed.selected = speed; // Set media speed
setTimeout(function () {
- _this4.media.playbackRate = speed;
+ _this2.media.playbackRate = speed;
}, 0);
}
/**
@@ -9293,8 +9077,20 @@ typeof navigator === "object" && (function (global, factory) {
return this.media === document.pictureInPictureElement;
}
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+
}], [{
key: "supported",
+
+ /**
+ * Check for support
+ * @param {String} type - Player type (audio/video)
+ * @param {String} provider - Provider (html5/youtube/vimeo)
+ * @param {Boolean} inline - Where player has `playsinline` sttribute
+ */
value: function supported(type, provider, inline) {
return support.check(type, provider, inline);
}
diff --git a/dist/plyr.min.js b/dist/plyr.min.js
index 53a23736..ee851059 100644
--- a/dist/plyr.min.js
+++ b/dist/plyr.min.js
@@ -1,4 +1,4 @@
-"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):(e="undefined"!=typeof globalThis?globalThis:e||self).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 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)}}function i(e,i,n){return i&&t(e.prototype,i),n&&t(e,n),e}function n(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function a(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function s(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?a(Object(i),!0).forEach((function(t){n(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):a(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function r(e,t){if(null==e)return{};var i,n,a=function(e,t){if(null==e)return{};var i,n,a={},s=Object.keys(e);for(n=0;n<s.length;n++)i=s[n],t.indexOf(i)>=0||(a[i]=e[i]);return a}(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(n=0;n<s.length;n++)i=s[n],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(a[i]=e[i])}return a}function o(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var i=[],n=!0,a=!1,s=void 0;try{for(var r,o=e[Symbol.iterator]();!(n=(r=o.next()).done)&&(i.push(r.value),!t||i.length!==t);n=!0);}catch(e){a=!0,s=e}finally{try{n||null==o.return||o.return()}finally{if(a)throw s}}return i}(e,t)||c(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function l(e){return function(e){if(Array.isArray(e))return u(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||c(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e,t){if(e){if("string"==typeof e)return u(e,t);var i=Object.prototype.toString.call(e).slice(8,-1);return"Object"===i&&e.constructor&&(i=e.constructor.name),"Map"===i||"Set"===i?Array.from(e):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?u(e,t):void 0}}function u(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i<t;i++)n[i]=e[i];return n}function d(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)}}function h(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function m(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function p(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?m(Object(i),!0).forEach((function(t){h(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):m(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}var f={addCSS:!0,thumbWidth:15,watch:!0};function g(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}var y=function(e){return null!=e?e.constructor:null},v=function(e,t){return!!(e&&t&&e instanceof t)},b=function(e){return null==e},w=function(e){return y(e)===Object},k=function(e){return y(e)===String},T=function(e){return Array.isArray(e)},C=function(e){return v(e,NodeList)},A=k,S=T,P=C,E=function(e){return v(e,Element)},N=function(e){return v(e,Event)},M=function(e){return b(e)||(k(e)||T(e)||C(e))&&!e.length||w(e)&&!Object.keys(e).length};function x(e,t){if(1>t){var i=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}var I,L,O,_=function(){function e(t,i){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),E(t)?this.element=t:A(t)&&(this.element=document.querySelector(t)),E(this.element)&&M(this.element.rangeTouch)&&(this.config=p({},f,{},i),this.init())}return function(e,t,i){t&&d(e.prototype,t),i&&d(e,i)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,i=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[i](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!N(t))return null;var i,n=t.target,a=t.changedTouches[0],s=parseFloat(n.getAttribute("min"))||0,r=parseFloat(n.getAttribute("max"))||100,o=parseFloat(n.getAttribute("step"))||1,l=n.getBoundingClientRect(),c=100/l.width*(this.config.thumbWidth/2)/100;return 0>(i=100/l.width*(a.clientX-l.left))?i=0:100<i&&(i=100),50>i?i-=(100-2*i)*c:50<i&&(i+=2*(i-50)*c),s+x(i/100*(r-s),o)}},{key:"set",value:function(t){e.enabled&&N(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var i=new Event(t,{bubbles:!0});e.dispatchEvent(i)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=null;if(M(t)||A(t)?n=Array.from(document.querySelectorAll(A(t)?t:'input[type="range"]')):E(t)?n=[t]:P(t)?n=Array.from(t):S(t)&&(n=t.filter(E)),M(n))return null;var a=p({},f,{},i);if(A(t)&&a.watch){var s=new MutationObserver((function(i){Array.from(i).forEach((function(i){Array.from(i.addedNodes).forEach((function(i){E(i)&&g(i,t)&&new e(i,a)}))}))}));s.observe(document.body,{childList:!0,subtree:!0})}return n.map((function(t){return new e(t,i)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),j=function(e){return null!=e?e.constructor:null},D=function(e,t){return Boolean(e&&t&&e instanceof t)},q=function(e){return null==e},H=function(e){return j(e)===Object},F=function(e){return j(e)===String},R=function(e){return j(e)===Function},V=function(e){return Array.isArray(e)},B=function(e){return D(e,NodeList)},U=function(e){return q(e)||(F(e)||V(e)||B(e))&&!e.length||H(e)&&!Object.keys(e).length},W=q,z=H,K=function(e){return j(e)===Number&&!Number.isNaN(e)},Y=F,Q=function(e){return j(e)===Boolean},X=R,$=V,J=B,G=function(e){return D(e,Element)},Z=function(e){return D(e,Event)},ee=function(e){return D(e,KeyboardEvent)},te=function(e){return D(e,TextTrack)||!q(e)&&F(e.kind)},ie=function(e){return D(e,Promise)&&R(e.then)},ne=function(e){if(D(e,window.URL))return!0;if(!F(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!U(new URL(t).hostname)}catch(e){return!1}},ae=U,se=(I=document.createElement("span"),L={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},O=Object.keys(L).find((function(e){return void 0!==I.style[e]})),!!Y(O)&&L[O]);function re(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var oe={isIE:
+"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):(e="undefined"!=typeof globalThis?globalThis:e||self).Plyr=t()}(this,(function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(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 i(e,t,i){return t&&n(e.prototype,t),i&&n(e,i),e}function a(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function r(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function o(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?r(Object(n),!0).forEach((function(t){a(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):r(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,i,a=function(e,t){if(null==e)return{};var n,i,a={},r=Object.keys(e);for(i=0;i<r.length;i++)n=r[i],t.indexOf(n)>=0||(a[n]=e[n]);return a}(e,t);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);for(i=0;i<r.length;i++)n=r[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(a[n]=e[n])}return a}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;var n=[],i=!0,a=!1,r=void 0;try{for(var o,s=e[Symbol.iterator]();!(i=(o=s.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){a=!0,r=e}finally{try{i||null==s.return||s.return()}finally{if(a)throw r}}return n}(e,t)||u(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e){return function(e){if(Array.isArray(e))return d(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||u(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e,t){if(e){if("string"==typeof e)return d(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?d(e,t):void 0}}function d(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n<t;n++)i[n]=e[n];return i}function h(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 m(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function p(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function f(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?p(Object(n),!0).forEach((function(t){m(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):p(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var g={addCSS:!0,thumbWidth:15,watch:!0};function y(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}var b=function(e){return null!=e?e.constructor:null},v=function(e,t){return!!(e&&t&&e instanceof t)},w=function(e){return null==e},k=function(e){return b(e)===Object},T=function(e){return b(e)===String},C=function(e){return Array.isArray(e)},A=function(e){return v(e,NodeList)},S=T,P=C,E=A,N=function(e){return v(e,Element)},M=function(e){return v(e,Event)},x=function(e){return w(e)||(T(e)||C(e)||A(e))&&!e.length||k(e)&&!Object.keys(e).length};function I(e,t){if(1>t){var n=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var L,O,_,j=function(){function e(t,n){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),N(t)?this.element=t:S(t)&&(this.element=document.querySelector(t)),N(this.element)&&x(this.element.rangeTouch)&&(this.config=f({},g,{},n),this.init())}return function(e,t,n){t&&h(e.prototype,t),n&&h(e,n)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!M(t))return null;var n,i=t.target,a=t.changedTouches[0],r=parseFloat(i.getAttribute("min"))||0,o=parseFloat(i.getAttribute("max"))||100,s=parseFloat(i.getAttribute("step"))||1,l=i.getBoundingClientRect(),c=100/l.width*(this.config.thumbWidth/2)/100;return 0>(n=100/l.width*(a.clientX-l.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*c:50<n&&(n+=2*(n-50)*c),r+I(n/100*(o-r),s)}},{key:"set",value:function(t){e.enabled&&M(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},i=null;if(x(t)||S(t)?i=Array.from(document.querySelectorAll(S(t)?t:'input[type="range"]')):N(t)?i=[t]:E(t)?i=Array.from(t):P(t)&&(i=t.filter(N)),x(i))return null;var a=f({},g,{},n);if(S(t)&&a.watch){var r=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){N(n)&&y(n,t)&&new e(n,a)}))}))}));r.observe(document.body,{childList:!0,subtree:!0})}return i.map((function(t){return new e(t,n)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),D=function(e){return null!=e?e.constructor:null},q=function(e,t){return Boolean(e&&t&&e instanceof t)},H=function(e){return null==e},F=function(e){return D(e)===Object},R=function(e){return D(e)===String},V=function(e){return D(e)===Function},B=function(e){return Array.isArray(e)},U=function(e){return q(e,NodeList)},W=function(e){return H(e)||(R(e)||B(e)||U(e))&&!e.length||F(e)&&!Object.keys(e).length},z=H,K=F,Y=function(e){return D(e)===Number&&!Number.isNaN(e)},Q=R,X=function(e){return D(e)===Boolean},$=V,J=B,G=U,Z=function(t){return null!==t&&"object"===e(t)&&1===t.nodeType&&"object"===e(t.style)&&"object"===e(t.ownerDocument)},ee=function(e){return q(e,Event)},te=function(e){return q(e,KeyboardEvent)},ne=function(e){return q(e,TextTrack)||!H(e)&&R(e.kind)},ie=function(e){return q(e,Promise)&&V(e.then)},ae=function(e){if(q(e,window.URL))return!0;if(!R(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!W(new URL(t).hostname)}catch(e){return!1}},re=W,oe=(L=document.createElement("span"),O={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},_=Object.keys(O).find((function(e){return void 0!==L.style[e]})),!!Q(_)&&O[_]);function se(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var le={isIE:
/* @cc_on!@ */
-!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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 le(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function ce(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,i=new Array(t>1?t-1:0),a=1;a<t;a++)i[a-1]=arguments[a];if(!i.length)return e;var s=i.shift();return z(s)?(Object.keys(s).forEach((function(t){z(s[t])?(Object.keys(e).includes(t)||Object.assign(e,n({},t,{})),ce(e[t],s[t])):Object.assign(e,n({},t,s[t]))})),ce.apply(void 0,[e].concat(i))):e}function ue(e,t){var i=e.length?e:[e];Array.from(i).reverse().forEach((function(e,i){var n=i>0?t.cloneNode(!0):t,a=e.parentNode,s=e.nextSibling;n.appendChild(e),s?a.insertBefore(n,s):a.appendChild(n)}))}function de(e,t){G(e)&&!ae(t)&&Object.entries(t).filter((function(e){var t=o(e,2)[1];return!W(t)})).forEach((function(t){var i=o(t,2),n=i[0],a=i[1];return e.setAttribute(n,a)}))}function he(e,t,i){var n=document.createElement(e);return z(t)&&de(n,t),Y(i)&&(n.innerText=i),n}function me(e,t,i,n){G(t)&&t.appendChild(he(e,i,n))}function pe(e){J(e)||$(e)?Array.from(e).forEach(pe):G(e)&&G(e.parentNode)&&e.parentNode.removeChild(e)}function fe(e){if(G(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function ge(e,t){return G(t)&&G(t.parentNode)&&G(e)?(t.parentNode.replaceChild(e,t),e):null}function ye(e,t){if(!Y(e)||ae(e))return{};var i={},n=ce({},t);return e.split(",").forEach((function(e){var t=e.trim(),a=t.replace(".",""),s=t.replace(/[[\]]/g,"").split("="),r=o(s,1)[0],l=s.length>1?s[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":Y(n.class)?i.class="".concat(n.class," ").concat(a):i.class=a;break;case"#":i.id=t.replace("#","");break;case"[":i[r]=l}})),ce(n,i)}function ve(e,t){if(G(e)){var i=t;Q(i)||(i=!e.hidden),e.hidden=i}}function be(e,t,i){if(J(e))return Array.from(e).map((function(e){return be(e,t,i)}));if(G(e)){var n="toggle";return void 0!==i&&(n=i?"add":"remove"),e.classList[n](t),e.classList.contains(t)}return!1}function we(e,t){return G(e)&&e.classList.contains(t)}function ke(e,t){var i=Element.prototype;return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function Te(e){return this.elements.container.querySelectorAll(e)}function Ce(e){return this.elements.container.querySelector(e)}function Ae(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];G(e)&&(e.focus({preventScroll:!0}),t&&be(e,this.config.classNames.tabFocus))}var Se,Pe={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},Ee={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,i){var n=oe.isIPhone&&i&&Ee.playsinline,a=Ee[e]||"html5"!==t;return{api:a,ui:a&&Ee.rangeInput&&("video"!==e||!oe.isIPhone||n)}},pip:!(oe.isIPhone||!X(he("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||he("video").disablePictureInPicture)),airplay:X(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(ae(e))return!1;var t=o(e.split("/"),1)[0],i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(Pe).includes(i)&&(i+='; codecs="'.concat(Pe[e],'"'));try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(Se=document.createElement("input"),Se.type="range","range"===Se.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==se,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Ne=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 Me(e,t,i){var n=this,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],r=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!ae(t)&&X(i)){var o=t.split(" "),l=r;Ne&&(l={passive:s,capture:r}),o.forEach((function(t){n&&n.eventListeners&&a&&n.eventListeners.push({element:e,type:t,callback:i,options:l}),e[a?"addEventListener":"removeEventListener"](t,i,l)}))}}function xe(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Me.call(this,e,t,i,!0,n,a)}function Ie(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4];Me.call(this,e,t,i,!1,n,a)}function Le(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r=function r(){Ie(e,i,r,a,s);for(var o=arguments.length,l=new Array(o),c=0;c<o;c++)l[c]=arguments[c];n.apply(t,l)};Me.call(this,e,i,r,!0,a,s)}function Oe(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(G(e)&&!ae(t)){var a=new CustomEvent(t,{bubbles:i,detail:s(s({},n),{},{plyr:this})});e.dispatchEvent(a)}}function _e(){this&&this.eventListeners&&(this.eventListeners.forEach((function(e){var t=e.element,i=e.type,n=e.callback,a=e.options;t.removeEventListener(i,n,a)})),this.eventListeners=[])}function je(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):xe.call(e,e.elements.container,"ready",t)})).then((function(){}))}function De(e){ie(e)&&e.then(null,(function(){}))}function qe(e){return!!($(e)||Y(e)&&e.includes(":"))&&($(e)?e:e.split(":")).map(Number).every(K)}function He(e){if(!$(e)||!e.every(K))return null;var t=o(e,2),i=t[0],n=t[1],a=function e(t,i){return 0===i?t:e(i,t%i)}(i,n);return[i/a,n/a]}function Fe(e){var t=function(e){return qe(e)?e.split(":").map(Number):null},i=t(e);if(null===i&&(i=t(this.config.ratio)),null===i&&!ae(this.embed)&&$(this.embed.ratio)&&(i=this.embed.ratio),null===i&&this.isHTML5){var n=this.media;i=He([n.videoWidth,n.videoHeight])}return i}function Re(e){if(!this.isVideo)return{};var t=this.elements.wrapper,i=Fe.call(this,e),n=o($(i)?i:[0,0],2),a=100/n[0]*n[1];if(t.style.paddingBottom="".concat(a,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var s=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),r=(s-a)/(s/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(r,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==i);return{padding:a,ratio:i}}var Ve={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var i=t.getAttribute("type");return!!ae(i)||Ee.mime.call(e,i)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:Ve.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,ae(this.config.ratio)||Re.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=Ve.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&X(e.config.quality.onChange))e.config.quality.onChange(t);else{var i=Ve.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!i)return;var n=e.media,a=n.currentTime,s=n.paused,r=n.preload,o=n.readyState,l=n.playbackRate;e.media.src=i.getAttribute("src"),("none"!==r||o)&&(e.once("loadedmetadata",(function(){e.speed=l,e.currentTime=a,s||De(e.play())})),e.media.load())}Oe.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(pe(Ve.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Be(e){return $(e)?e.filter((function(t,i){return e.indexOf(t)===i})):e}function Ue(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];return ae(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return i[t].toString()}))}var We=function(){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())},ze=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function Ke(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=We(t,"-"," "),t=We(t,"_"," "),t=ze(t),We(t," ","")}function Ye(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var Qe={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},Xe=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(ae(e)||ae(t))return"";var i=le(t.i18n,e);if(ae(i))return Object.keys(Qe).includes(e)?Qe[e]:"";var n={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(n).forEach((function(e){var t=o(e,2),n=t[0],a=t[1];i=We(i,n,a)})),i},$e=function(){function t(i){e(this,t),this.enabled=i.config.storage.enabled,this.key=i.config.storage.key}return i(t,[{key:"get",value:function(e){if(!t.supported||!this.enabled)return null;var i=window.localStorage.getItem(this.key);if(ae(i))return null;var n=JSON.parse(i);return Y(e)&&e.length?n[e]:n}},{key:"set",value:function(e){if(t.supported&&this.enabled&&z(e)){var i=this.get();ae(i)&&(i={}),ce(i,e),window.localStorage.setItem(this.key,JSON.stringify(i))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),t}();function Je(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise((function(i,n){try{var a=new XMLHttpRequest;if(!("withCredentials"in a))return;a.addEventListener("load",(function(){if("text"===t)try{i(JSON.parse(a.responseText))}catch(e){i(a.responseText)}else i(a.response)})),a.addEventListener("error",(function(){throw new Error(a.status)})),a.open("GET",e,!0),a.responseType=t,a.send()}catch(e){n(e)}}))}function Ge(e,t){if(Y(e)){var i="cache",n=Y(t),a=function(){return null!==document.getElementById(t)},s=function(e,t){e.innerHTML=t,n&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!a()){var r=$e.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),n&&o.setAttribute("id",t),r){var l=window.localStorage.getItem("".concat(i,"-").concat(t));if(null!==l){var c=JSON.parse(l);s(o,c.content)}}Je(e).then((function(e){ae(e)||(r&&window.localStorage.setItem("".concat(i,"-").concat(t),JSON.stringify({content:e})),s(o,e))})).catch((function(){}))}}}var Ze=function(e){return Math.trunc(e/60/60%60,10)},et=function(e){return Math.trunc(e/60%60,10)},tt=function(e){return Math.trunc(e%60,10)};function it(){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(!K(e))return it(void 0,t,i);var n=function(e){return"0".concat(e).slice(-2)},a=Ze(e),s=et(e),r=tt(e);return a=t||a>0?"".concat(a,":"):"","".concat(i&&e>0?"-":"").concat(a).concat(n(s),":").concat(n(r))}var nt={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||oe.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=Ce.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:Te.call(this,this.config.selectors.buttons.play),pause:Ce.call(this,this.config.selectors.buttons.pause),restart:Ce.call(this,this.config.selectors.buttons.restart),rewind:Ce.call(this,this.config.selectors.buttons.rewind),fastForward:Ce.call(this,this.config.selectors.buttons.fastForward),mute:Ce.call(this,this.config.selectors.buttons.mute),pip:Ce.call(this,this.config.selectors.buttons.pip),airplay:Ce.call(this,this.config.selectors.buttons.airplay),settings:Ce.call(this,this.config.selectors.buttons.settings),captions:Ce.call(this,this.config.selectors.buttons.captions),fullscreen:Ce.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=Ce.call(this,this.config.selectors.progress),this.elements.inputs={seek:Ce.call(this,this.config.selectors.inputs.seek),volume:Ce.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:Ce.call(this,this.config.selectors.display.buffer),currentTime:Ce.call(this,this.config.selectors.display.currentTime),duration:Ce.call(this,this.config.selectors.display.duration)},G(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 i="http://www.w3.org/2000/svg",n=nt.getIconUrl.call(this),a="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),s=document.createElementNS(i,"svg");de(s,ce(t,{"aria-hidden":"true",focusable:"false"}));var r=document.createElementNS(i,"use"),o="".concat(a,"-").concat(e);return"href"in r&&r.setAttributeNS("http://www.w3.org/1999/xlink","href",o),r.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),s.appendChild(r),s},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=Xe(e,this.config),n=s(s({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return he("span",n,i)},createBadge:function(e){if(ae(e))return null;var t=he("span",{class:this.config.classNames.menu.value});return t.appendChild(he("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var i=this,n=ce({},t),a=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=Ke(e)).charAt(0).toLowerCase()+e.slice(1)}(e),s={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(n).includes(e)&&(s[e]=n[e],delete n[e])})),"button"!==s.element||Object.keys(n).includes("type")||(n.type="button"),Object.keys(n).includes("class")?n.class.split(" ").some((function(e){return e===i.config.classNames.control}))||ce(n,{class:"".concat(n.class," ").concat(this.config.classNames.control)}):n.class=this.config.classNames.control,e){case"play":s.toggle=!0,s.label="play",s.labelPressed="pause",s.icon="play",s.iconPressed="pause";break;case"mute":s.toggle=!0,s.label="mute",s.labelPressed="unmute",s.icon="volume",s.iconPressed="muted";break;case"captions":s.toggle=!0,s.label="enableCaptions",s.labelPressed="disableCaptions",s.icon="captions-off",s.iconPressed="captions-on";break;case"fullscreen":s.toggle=!0,s.label="enterFullscreen",s.labelPressed="exitFullscreen",s.icon="enter-fullscreen",s.iconPressed="exit-fullscreen";break;case"play-large":n.class+=" ".concat(this.config.classNames.control,"--overlaid"),a="play",s.label="play",s.icon="play";break;default:ae(s.label)&&(s.label=a),ae(s.icon)&&(s.icon=e)}var r=he(s.element);return s.toggle?(r.appendChild(nt.createIcon.call(this,s.iconPressed,{class:"icon--pressed"})),r.appendChild(nt.createIcon.call(this,s.icon,{class:"icon--not-pressed"})),r.appendChild(nt.createLabel.call(this,s.labelPressed,{class:"label--pressed"})),r.appendChild(nt.createLabel.call(this,s.label,{class:"label--not-pressed"}))):(r.appendChild(nt.createIcon.call(this,s.icon)),r.appendChild(nt.createLabel.call(this,s.label))),ce(n,ye(this.config.selectors.buttons[a],n)),de(r,n),"play"===a?($(this.elements.buttons[a])||(this.elements.buttons[a]=[]),this.elements.buttons[a].push(r)):this.elements.buttons[a]=r,r},createRange:function(e,t){var i=he("input",ce(ye(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":Xe(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,nt.updateRangeFill.call(this,i),_.setup(i),i},createProgress:function(e,t){var i=he("progress",ce(ye(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild(he("span",null,"0"));var n={played:"played",buffer:"buffered"}[e],a=n?Xe(n,this.config):"";i.innerText="% ".concat(a.toLowerCase())}return this.elements.display[e]=i,i},createTime:function(e,t){var i=ye(this.config.selectors.display[e],t),n=he("div",ce(i,{class:"".concat(i.class?i.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":Xe(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var i=this;xe.call(this,e,"keydown keyup",(function(n){if([32,38,39,40].includes(n.which)&&(n.preventDefault(),n.stopPropagation(),"keydown"!==n.type)){var a,s=ke(e,'[role="menuitemradio"]');if(!s&&[32,39].includes(n.which))nt.showMenuPanel.call(i,t,!0);else 32!==n.which&&(40===n.which||s&&39===n.which?(a=e.nextElementSibling,G(a)||(a=e.parentNode.firstElementChild)):(a=e.previousElementSibling,G(a)||(a=e.parentNode.lastElementChild)),Ae.call(i,a,!0))}}),!1),xe.call(this,e,"keyup",(function(e){13===e.which&&nt.focusFirstMenuItem.call(i,null,!0)}))},createMenuItem:function(e){var t=this,i=e.value,n=e.list,a=e.type,s=e.title,r=e.badge,o=void 0===r?null:r,l=e.checked,c=void 0!==l&&l,u=ye(this.config.selectors.inputs[a]),d=he("button",ce(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:i})),h=he("span");h.innerHTML=s,G(o)&&h.appendChild(o),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 ke(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(!ee(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,a){case"language":t.currentTrack=Number(i);break;case"quality":t.quality=i;break;case"speed":t.speed=parseFloat(i)}nt.showMenuPanel.call(t,"home",ee(e))}}),a,!1),nt.bindMenuItemShortcuts.call(this,d,a),n.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];if(!K(e))return e;var i=Ze(this.duration)>0;return it(e,i,t)},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];G(e)&&K(t)&&(e.innerText=nt.formatTime(t,i))},updateVolume:function(){this.supported.ui&&(G(this.elements.inputs.volume)&&nt.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),G(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;G(e)&&(e.value=t,nt.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&Z(e)){var i,n,a=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":i=this.currentTime,n=this.duration,a=0===i||0===n||Number.isNaN(i)||Number.isNaN(n)?0:(i/n*100).toFixed(2),"timeupdate"===e.type&&nt.setRange.call(this,this.elements.inputs.seek,a);break;case"playing":case"progress":!function(e,i){var n=K(i)?i:0,a=G(e)?e:t.elements.display.buffer;if(G(a)){a.value=n;var s=a.getElementsByTagName("span")[0];G(s)&&(s.childNodes[0].nodeValue=n)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=Z(e)?e.target:e;if(G(t)&&"range"===t.getAttribute("type")){if(ke(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var i=nt.formatTime(this.currentTime),n=nt.formatTime(this.duration),a=Xe("seekLabel",this.config);t.setAttribute("aria-valuetext",a.replace("{currentTime}",i).replace("{duration}",n))}else if(ke(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);oe.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&G(this.elements.inputs.seek)&&G(this.elements.display.seekTooltip)&&0!==this.duration){var i="".concat(this.config.classNames.tooltip,"--visible"),n=function(e){return be(t.elements.display.seekTooltip,i,e)};if(this.touch)n(!1);else{var a=0,s=this.elements.progress.getBoundingClientRect();if(Z(e))a=100/s.width*(e.pageX-s.left);else{if(!we(this.elements.display.seekTooltip,i))return;a=parseFloat(this.elements.display.seekTooltip.style.left,10)}a<0?a=0:a>100&&(a=100),nt.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*a),this.elements.display.seekTooltip.style.left="".concat(a,"%"),Z(e)&&["mouseenter","mouseleave"].includes(e.type)&&n("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!G(this.elements.display.duration)&&this.config.invertTime;nt.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||nt.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return ve(this.elements.display.currentTime,!0),void ve(this.elements.progress,!0);G(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=G(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&nt.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&nt.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),nt.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){ve(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,i){var n=this.elements.settings.panels[e],a=null,s=t;if("captions"===e)a=this.currentTrack;else{if(a=ae(i)?this[e]:i,ae(a)&&(a=this.config[e].default),!ae(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(G(s)||(s=n&&n.querySelector('[role="menu"]')),G(s)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=nt.getLabel.call(this,e,a);var r=s&&s.querySelector('[value="'.concat(a,'"]'));G(r)&&(r.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?Xe("normal",this.config):"".concat(t,"&times;");case"quality":if(K(t)){var i=Xe("qualityLabel.".concat(t),this.config);return i.length?i:"".concat(t,"p")}return ze(t);case"captions":return rt.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(G(this.elements.settings.panels.quality)){var i="quality",n=this.elements.settings.panels.quality.querySelector('[role="menu"]');$(e)&&(this.options.quality=Be(e).filter((function(e){return t.config.quality.options.includes(e)})));var a=!ae(this.options.quality)&&this.options.quality.length>1;if(nt.toggleMenuButton.call(this,i,a),fe(n),nt.checkMenu.call(this),a){var s=function(e){var i=Xe("qualityBadge.".concat(e),t.config);return i.length?nt.createBadge.call(t,i):null};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){nt.createMenuItem.call(t,{value:e,list:n,type:i,title:nt.getLabel.call(t,"quality",e),badge:s(e)})})),nt.updateSetting.call(this,i,n)}}},setCaptionsMenu:function(){var e=this;if(G(this.elements.settings.panels.captions)){var t="captions",i=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=rt.getTracks.call(this),a=Boolean(n.length);if(nt.toggleMenuButton.call(this,t,a),fe(i),nt.checkMenu.call(this),a){var s=n.map((function(t,n){return{value:n,checked:e.captions.toggled&&e.currentTrack===n,title:rt.getLabel.call(e,t),badge:t.language&&nt.createBadge.call(e,t.language.toUpperCase()),list:i,type:"language"}}));s.unshift({value:-1,checked:!this.captions.toggled,title:Xe("disabled",this.config),list:i,type:"language"}),s.forEach(nt.createMenuItem.bind(this)),nt.updateSetting.call(this,t,i)}}},setSpeedMenu:function(){var e=this;if(G(this.elements.settings.panels.speed)){var t="speed",i=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var n=!ae(this.options.speed)&&this.options.speed.length>1;nt.toggleMenuButton.call(this,t,n),fe(i),nt.checkMenu.call(this),n&&(this.options.speed.forEach((function(n){nt.createMenuItem.call(e,{value:n,list:i,type:t,title:nt.getLabel.call(e,"speed",n)})})),nt.updateSetting.call(this,t,i))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!ae(e)&&Object.values(e).some((function(e){return!e.hidden}));ve(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;G(i)||(i=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var n=i.querySelector('[role^="menuitem"]');Ae.call(this,n,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,i=this.elements.buttons.settings;if(G(t)&&G(i)){var n=t.hidden,a=n;if(Q(e))a=e;else if(ee(e)&&27===e.which)a=!1;else if(Z(e)){var s=X(e.composedPath)?e.composedPath()[0]:e.target,r=t.contains(s);if(r||!r&&e.target!==i&&a)return}i.setAttribute("aria-expanded",a),ve(t,!a),be(this.elements.container,this.config.classNames.menu.open,a),a&&ee(e)?nt.focusFirstMenuItem.call(this,null,!0):a||n||Ae.call(this,i,ee(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 pe(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=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(G(n)){var a=n.parentNode,s=Array.from(a.children).find((function(e){return!e.hidden}));if(Ee.transitions&&!Ee.reducedMotion){a.style.width="".concat(s.scrollWidth,"px"),a.style.height="".concat(s.scrollHeight,"px");var r=nt.getMenuSize.call(this,n),o=function t(i){i.target===a&&["width","height"].includes(i.propertyName)&&(a.style.width="",a.style.height="",Ie.call(e,a,se,t))};xe.call(this,a,se,o),a.style.width="".concat(r.width,"px"),a.style.height="".concat(r.height,"px")}ve(s,!0),ve(n,!1),nt.focusFirstMenuItem.call(this,n,i)}},setDownloadUrl:function(){var e=this.elements.buttons.download;G(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,i=nt.bindMenuItemShortcuts,n=nt.createButton,a=nt.createProgress,s=nt.createRange,r=nt.createTime,o=nt.setQualityMenu,l=nt.setSpeedMenu,c=nt.showMenuPanel;this.elements.controls=null,$(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(n.call(this,"play-large"));var u=he("div",ye(this.config.selectors.controls.wrapper));this.elements.controls=u;var d={class:"plyr__controls__item"};return Be($(this.config.controls)?this.config.controls:[]).forEach((function(o){if("restart"===o&&u.appendChild(n.call(t,"restart",d)),"rewind"===o&&u.appendChild(n.call(t,"rewind",d)),"play"===o&&u.appendChild(n.call(t,"play",d)),"fast-forward"===o&&u.appendChild(n.call(t,"fast-forward",d)),"progress"===o){var l=he("div",{class:"".concat(d.class," plyr__progress__container")}),h=he("div",ye(t.config.selectors.progress));if(h.appendChild(s.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),h.appendChild(a.call(t,"buffer")),t.config.tooltips.seek){var m=he("span",{class:t.config.classNames.tooltip},"00:00");h.appendChild(m),t.elements.display.seekTooltip=m}t.elements.progress=h,l.appendChild(t.elements.progress),u.appendChild(l)}if("current-time"===o&&u.appendChild(r.call(t,"currentTime",d)),"duration"===o&&u.appendChild(r.call(t,"duration",d)),"mute"===o||"volume"===o){var p=t.elements.volume;if(G(p)&&u.contains(p)||(p=he("div",ce({},d,{class:"".concat(d.class," plyr__volume").trim()})),t.elements.volume=p,u.appendChild(p)),"mute"===o&&p.appendChild(n.call(t,"mute")),"volume"===o&&!oe.isIos){var f={max:1,step:.05,value:t.config.volume};p.appendChild(s.call(t,"volume",ce(f,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===o&&u.appendChild(n.call(t,"captions",d)),"settings"===o&&!ae(t.config.settings)){var g=he("div",ce({},d,{class:"".concat(d.class," plyr__menu").trim(),hidden:""}));g.appendChild(n.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var y=he("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),v=he("div"),b=he("div",{id:"plyr-settings-".concat(e.id,"-home")}),w=he("div",{role:"menu"});b.appendChild(w),v.appendChild(b),t.elements.settings.panels.home=b,t.config.settings.forEach((function(n){var a=he("button",ce(ye(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:""}));i.call(t,a,n),xe.call(t,a,"click",(function(){c.call(t,n,!1)}));var s=he("span",null,Xe(n,t.config)),r=he("span",{class:t.config.classNames.menu.value});r.innerHTML=e[n],s.appendChild(r),a.appendChild(s),w.appendChild(a);var o=he("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),l=he("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});l.appendChild(he("span",{"aria-hidden":!0},Xe(n,t.config))),l.appendChild(he("span",{class:t.config.classNames.hidden},Xe("menuBack",t.config))),xe.call(t,o,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),c.call(t,"home",!0))}),!1),xe.call(t,l,"click",(function(){c.call(t,"home",!1)})),o.appendChild(l),o.appendChild(he("div",{role:"menu"})),v.appendChild(o),t.elements.settings.buttons[n]=a,t.elements.settings.panels[n]=o})),y.appendChild(v),g.appendChild(y),u.appendChild(g),t.elements.settings.popup=y,t.elements.settings.menu=g}if("pip"===o&&Ee.pip&&u.appendChild(n.call(t,"pip",d)),"airplay"===o&&Ee.airplay&&u.appendChild(n.call(t,"airplay",d)),"download"===o){var k=ce({},d,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(k.download="");var T=t.config.urls.download;!ne(T)&&t.isEmbed&&ce(k,{icon:"logo-".concat(t.provider),label:t.provider}),u.appendChild(n.call(t,"download",k))}"fullscreen"===o&&u.appendChild(n.call(t,"fullscreen",d))})),this.isHTML5&&o.call(this,Ve.getQualityOptions.call(this)),l.call(this),u},inject:function(){var e=this;if(this.config.loadSprite){var t=nt.getIconUrl.call(this);t.cors&&Ge(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},a=!0;X(this.config.controls)&&(this.config.controls=this.config.controls.call(this,n)),this.config.controls||(this.config.controls=[]),G(this.config.controls)||Y(this.config.controls)?i=this.config.controls:(i=nt.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:rt.getLabel.call(this)}),a=!1);var s,r;if(a&&Y(this.config.controls)&&(s=i,Object.entries(n).forEach((function(e){var t=o(e,2),i=t[0],n=t[1];s=We(s,"{".concat(i,"}"),n)})),i=s),Y(this.config.selectors.controls.container)&&(r=document.querySelector(this.config.selectors.controls.container)),G(r)||(r=this.elements.container),r[G(i)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",i),G(this.elements.controls)||nt.findElements.call(this),!ae(this.elements.buttons)){var l=function(t){var i=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return we(t,i)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];be(t,i,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){$(e)||J(e)?Array.from(e).filter(Boolean).forEach(l):l(e)}))}if(oe.isEdge&&re(r),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),m=Te.call(this,h);Array.from(m).forEach((function(t){be(t,e.config.classNames.hidden,!1),be(t,e.config.classNames.tooltip,!0)}))}}};function at(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=e;if(t){var n=document.createElement("a");n.href=i,i=n.href}try{return new URL(i)}catch(e){return null}}function st(e){var t=new URLSearchParams;return z(e)&&Object.entries(e).forEach((function(e){var i=o(e,2),n=i[0],a=i[1];t.set(n,a)})),t}var rt={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Ee.textTracks)$(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&nt.setCaptionsMenu.call(this);else{if(G(this.elements.captions)||(this.elements.captions=he("div",ye(this.config.selectors.captions)),function(e,t){G(e)&&G(t)&&t.parentNode.insertBefore(e,t.nextSibling)}(this.elements.captions,this.elements.wrapper)),oe.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),i=at(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&Je(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){pe(e)}))}))}var t=Be((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),i=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===i)i=o(t,1)[0];var n=this.storage.get("captions");if(Q(n)||(n=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:n,language:i,languages:t}),this.isHTML5){var a=this.config.captions.update?"addtrack removetrack":"removetrack";xe.call(this,this.media.textTracks,a,rt.update.bind(this))}setTimeout(rt.update.bind(this),0)}},update:function(){var e=this,t=rt.getTracks.call(this,!0),i=this.captions,n=i.active,a=i.language,s=i.meta,r=i.currentTrackNode,o=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}),"showing"===t.mode&&(t.mode="hidden"),xe.call(e,t,"cuechange",(function(){return rt.updateCues.call(e)}))})),(o&&this.language!==a||!t.includes(r))&&(rt.setLanguage.call(this,a),rt.toggle.call(this,n&&o)),be(this.elements.container,this.config.classNames.captions.enabled,!ae(t)),$(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&nt.setCaptionsMenu.call(this)},toggle:function(e){var t=this,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,a=this.config.classNames.captions.active,s=W(e)?!n:e;if(s!==n){if(i||(this.captions.active=s,this.storage.set({captions:s})),!this.language&&s&&!i){var r=rt.getTracks.call(this),o=rt.findTrack.call(this,[this.captions.language].concat(l(this.captions.languages)),!0);return this.captions.language=o.language,void rt.set.call(this,r.indexOf(o))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=s),be(this.elements.container,a,s),this.captions.toggled=s,nt.updateSetting.call(this,"captions"),Oe.call(this,this.media,s?"captionsenabled":"captionsdisabled")}setTimeout((function(){s&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=rt.getTracks.call(this);if(-1!==e)if(K(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var n=i[e],a=n||{},s=a.language;this.captions.currentTrackNode=n,nt.updateSetting.call(this,"captions"),t||(this.captions.language=s,this.storage.set({language:s})),this.isVimeo&&this.embed.enableTextTrack(s),Oe.call(this,this.media,"languagechange")}rt.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&rt.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else rt.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(Y(e)){var i=e.toLowerCase();this.captions.language=i;var n=rt.getTracks.call(this),a=rt.findTrack.call(this,[i]);rt.set.call(this,n.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],i=Array.from((this.media||{}).textTracks||[]);return i.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,i=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],a=rt.getTracks.call(this),s=function(e){return Number((i.captions.meta.get(e)||{}).default)},r=Array.from(a).sort((function(e,t){return s(t)-s(e)}));return e.every((function(e){return!(t=r.find((function(t){return t.language===e})))})),t||(n?r[0]:void 0)},getCurrentTrack:function(){return rt.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!te(t)&&Ee.textTracks&&this.captions.toggled&&(t=rt.getCurrentTrack.call(this)),te(t)?ae(t.label)?ae(t.language)?Xe("enabled",this.config):e.language.toUpperCase():t.label:Xe("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(G(this.elements.captions))if(W(e)||Array.isArray(e)){var t=e;if(!t){var i=rt.getCurrentTrack.call(this);t=Array.from((i||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(Ye)}var n=t.map((function(e){return e.trim()})).join("\n");if(n!==this.elements.captions.innerHTML){fe(this.elements.captions);var a=he("span",ye(this.config.selectors.caption));a.innerHTML=n,this.elements.captions.appendChild(a),Oe.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},ot={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.3/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},lt="picture-in-picture",ct="inline",ut={html5:"html5",youtube:"youtube",vimeo:"vimeo"},dt="audio",ht="video";var mt=function(){},pt=function(){function t(){var i=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e(this,t),this.enabled=window.console&&i,this.enabled&&this.log("Debugging enabled")}return i(t,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):mt}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):mt}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):mt}}]),t}(),ft=function(){function t(i){var n=this;e(this,t),this.player=i,this.prefix=t.prefix,this.property=t.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===i.config.fullscreen.fallback,this.player.elements.fullscreen=i.config.fullscreen.container&&function(e,t){return(Element.prototype.closest||function(){var e=this;do{if(ke.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,i.config.fullscreen.container),xe.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){n.onChange()})),xe.call(this.player,this.player.elements.container,"dblclick",(function(e){G(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.player.listeners.proxy(e,n.toggle,"fullscreen")})),xe.call(this,this.player.elements.container,"keydown",(function(e){return n.trapFocus(e)})),this.update()}return i(t,[{key:"onChange",value:function(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;G(e)&&(e.pressed=this.active);var t=this.target===this.player.media?this.target:this.player.elements.container;Oe.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)}}},{key:"toggleFallback",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(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":"",be(this.target,this.player.config.classNames.fullscreen.fallback,e),oe.isIos){var t=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var n=Y(t.content)&&t.content.includes(i);e?(this.cleanupViewport=!n,n||(t.content+=",".concat(i))):this.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==i})).join(","))}this.onChange()}},{key:"trapFocus",value:function(e){if(!oe.isIos&&this.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,i=Te.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),n=o(i,1)[0],a=i[i.length-1];t!==a||e.shiftKey?t===n&&e.shiftKey&&(a.focus(),e.preventDefault()):(n.focus(),e.preventDefault())}}},{key:"update",value:function(){var e;this.enabled?(e=this.forceFallback?"Fallback (forced)":t.native?"Native":"Fallback",this.player.debug.log("".concat(e," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");be(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(oe.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!t.native||this.forceFallback?this.toggleFallback(!0):this.prefix?ae(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen({navigationUI:"hide"}))}},{key:"exit",value:function(){if(this.enabled)if(oe.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),De(this.player.play());else if(!t.native||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!ae(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)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return t.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!t.native||this.forceFallback)return we(this.target,this.player.config.classNames.fullscreen.fallback);var e=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return e&&e.shadowRoot?e===this.target.getRootNode().host:e===this.target}},{key:"target",get:function(){return oe.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(X(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!X(document["".concat(t,"ExitFullscreen")])&&!X(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),t}();function gt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise((function(i,n){var a=new Image,s=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?i:n)(a)};Object.assign(a,{onload:s,onerror:s,src:e})}))}var yt={addStyleHook:function(){be(this.elements.container,this.config.selectors.container.replace(".",""),!0),be(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 yt.toggleNativeControls.call(this,!0);G(this.elements.controls)||(nt.inject.call(this),this.listeners.controls()),yt.toggleNativeControls.call(this),this.isHTML5&&rt.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,nt.updateVolume.call(this),nt.timeUpdate.call(this),yt.checkPlaying.call(this),be(this.elements.container,this.config.classNames.pip.supported,Ee.pip&&this.isHTML5&&this.isVideo),be(this.elements.container,this.config.classNames.airplay.supported,Ee.airplay&&this.isHTML5),be(this.elements.container,this.config.classNames.isIos,oe.isIos),be(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){Oe.call(e,e.media,"ready")}),0),yt.setTitle.call(this),this.poster&&yt.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&nt.durationUpdate.call(this)},setTitle:function(){var e=Xe("play",this.config);if(Y(this.config.title)&&!ae(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=Ce.call(this,"iframe");if(!G(t))return;var i=ae(this.config.title)?"video":this.config.title,n=Xe("frameTitle",this.config);t.setAttribute("title",n.replace("{title}",i))}},togglePoster:function(e){be(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return i&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),je.call(this).then((function(){return gt(e)})).catch((function(i){throw e===t.poster&&yt.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('".concat(e,"')"),backgroundSize:""}),yt.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;be(this.elements.container,this.config.classNames.playing,this.playing),be(this.elements.container,this.config.classNames.paused,this.paused),be(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",Xe(t.playing?"pause":"play",t.config))})),Z(e)&&"timeupdate"===e.type||yt.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(){be(t.elements.container,t.config.classNames.loading,t.loading),yt.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var i=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||i))}},migrateStyles:function(){var e=this;Object.values(s({},this.media.style)).filter((function(e){return!ae(e)&&Y(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),ae(this.media.style)&&this.media.removeAttribute("style")}},vt=function(){function t(i){e(this,t),this.player=i,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 i(t,[{key:"handleKey",value:function(e){var t=this.player,i=t.elements,n=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,s=a&&n===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&K(n)){if(a){var r=document.activeElement;if(G(r)){var o=t.config.selectors.editable;if(r!==i.inputs.seek&&ke(r,o))return;if(32===e.which&&ke(r,'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:s||(t.currentTime=t.duration/10*(n-48));break;case 32:case 75:s||De(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}27===n&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){nt.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,be(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,a=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||a)n=t.config.classNames.tabFocus,be(Te.call(t,".".concat(n)),n,!1),"focusout"!==e.type&&(this.focusTimer=setTimeout((function(){var e=document.activeElement;i.container.contains(e)&&be(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&&Me.call(t,window,"keydown keyup",this.handleKey,e,!1),Me.call(t,document.body,"click",this.toggleMenu,e),Le.call(t,document.body,"touchstart",this.firstTouch),Me.call(t,document.body,"keydown focus blur focusout",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,i=e.elements,n=e.timers;!t.keyboard.global&&t.keyboard.focused&&xe.call(e,i.container,"keydown keyup",this.handleKey,!1),xe.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var a=i.controls;a&&"enterfullscreen"===t.type&&(a.pressed=!1,a.hover=!1);var s=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(yt.toggleControls.call(e,!0),s=e.touch?3e3:2e3),clearTimeout(n.controls),n.controls=setTimeout((function(){return yt.toggleControls.call(e,!1)}),s)}));var a=function(t){if(!t)return Re.call(e);var n=i.container.getBoundingClientRect(),a=n.width,s=n.height;return Re.call(e,"".concat(a,":").concat(s))},s=function(){clearTimeout(n.resized),n.resized=setTimeout(a,50)};xe.call(e,i.container,"enterfullscreen exitfullscreen",(function(t){var n=e.fullscreen,r=n.target,l=n.usingNative;if(r===i.container&&(e.isEmbed||!ae(e.config.ratio))){var c="enterfullscreen"===t.type,u=a(c);u.padding;!function(t,i,n){if(e.isVimeo&&!e.config.vimeo.premium){var a=e.elements.wrapper.firstChild,s=o(t,2)[1],r=o(Fe.call(e),2),l=r[0],c=r[1];a.style.maxWidth=n?"".concat(s/c*l,"px"):null,a.style.margin=n?"0 auto":null}}(u.ratio,0,c),c&&setTimeout((function(){return re(i.container)}),100),l||(c?xe.call(e,window,"resize",s):Ie.call(e,window,"resize",s))}}))}},{key:"media",value:function(){var e=this,t=this.player,i=t.elements;if(xe.call(t,t.media,"timeupdate seeking seeked",(function(e){return nt.timeUpdate.call(t,e)})),xe.call(t,t.media,"durationchange loadeddata loadedmetadata",(function(e){return nt.durationUpdate.call(t,e)})),xe.call(t,t.media,"ended",(function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&(t.restart(),t.pause())})),xe.call(t,t.media,"progress playing seeking seeked",(function(e){return nt.updateProgress.call(t,e)})),xe.call(t,t.media,"volumechange",(function(e){return nt.updateVolume.call(t,e)})),xe.call(t,t.media,"playing play pause ended emptied timeupdate",(function(e){return yt.checkPlaying.call(t,e)})),xe.call(t,t.media,"waiting canplay seeked playing",(function(e){return yt.checkLoading.call(t,e)})),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var n=Ce.call(t,".".concat(t.config.classNames.video));if(!G(n))return;xe.call(t,i.container,"click",(function(a){([i.container,n].includes(a.target)||n.contains(a.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(a,t.restart,"restart"),e.proxy(a,(function(){De(t.play())}),"play")):e.proxy(a,(function(){De(t.togglePlay())}),"play")))}))}t.supported.ui&&t.config.disableContextMenu&&xe.call(t,i.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),xe.call(t,t.media,"volumechange",(function(){t.storage.set({volume:t.volume,muted:t.muted})})),xe.call(t,t.media,"ratechange",(function(){nt.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})})),xe.call(t,t.media,"qualitychange",(function(e){nt.updateSetting.call(t,"quality",null,e.detail.quality)})),xe.call(t,t.media,"ready qualitychange",(function(){nt.setDownloadUrl.call(t)}));var a=t.config.events.concat(["keyup","keydown"]).join(" ");xe.call(t,t.media,a,(function(e){var n=e.detail,a=void 0===n?{}:n;"error"===e.type&&(a=t.media.error),Oe.call(t,i.container,e.type,!0,a)}))}},{key:"proxy",value:function(e,t,i){var n=this.player,a=n.config.listeners[i],s=!0;X(a)&&(s=a.call(n,e)),!1!==s&&X(t)&&t.call(n,e)}},{key:"bind",value:function(e,t,i,n){var a=this,s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],r=this.player,o=r.config.listeners[n],l=X(o);xe.call(r,e,t,(function(e){return a.proxy(e,i,n)}),s&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,i=t.elements,n=oe.isIE?"change":"input";if(i.buttons.play&&Array.from(i.buttons.play).forEach((function(i){e.bind(i,"click",(function(){De(t.togglePlay())}),"play")})),this.bind(i.buttons.restart,"click",t.restart,"restart"),this.bind(i.buttons.rewind,"click",(function(){t.lastSeekTime=Date.now(),t.rewind()}),"rewind"),this.bind(i.buttons.fastForward,"click",(function(){t.lastSeekTime=Date.now(),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.download,"click",(function(){Oe.call(t,t.media,"download")}),"download"),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(),e.preventDefault(),nt.toggleMenu.call(t,e)}),null,!1),this.bind(i.buttons.settings,"keyup",(function(e){var i=e.which;[13,32].includes(i)&&(13!==i?(e.preventDefault(),e.stopPropagation(),nt.toggleMenu.call(t,e)):nt.focusFirstMenuItem.call(t,null,!0))}),null,!1),this.bind(i.settings.menu,"keydown",(function(e){27===e.which&&nt.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,a="play-on-seeked";if(!ee(e)||39===n||37===n){t.lastSeekTime=Date.now();var s=i.hasAttribute(a),r=["mouseup","touchend","keyup"].includes(e.type);s&&r?(i.removeAttribute(a),De(t.play())):!r&&t.playing&&(i.setAttribute(a,""),t.pause())}})),oe.isIos){var a=Te.call(t,'input[type="range"]');Array.from(a).forEach((function(t){return e.bind(t,n,(function(e){return re(e.target)}))}))}this.bind(i.inputs.seek,n,(function(e){var i=e.currentTarget,n=i.getAttribute("seek-value");ae(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 nt.updateSeekTooltip.call(t,e)})),this.bind(i.progress,"mousemove touchmove",(function(e){var i=t.previewThumbnails;i&&i.loaded&&i.startMove(e)})),this.bind(i.progress,"mouseleave touchend click",(function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)})),this.bind(i.progress,"mousedown touchstart",(function(e){var i=t.previewThumbnails;i&&i.loaded&&i.startScrubbing(e)})),this.bind(i.progress,"mouseup touchend",(function(e){var i=t.previewThumbnails;i&&i.loaded&&i.endScrubbing(e)})),oe.isWebkit&&Array.from(Te.call(t,'input[type="range"]')).forEach((function(i){e.bind(i,"input",(function(e){return nt.updateRangeFill.call(t,e.target)}))})),t.config.toggleInvert&&!G(i.display.duration)&&this.bind(i.display.currentTime,"click",(function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,nt.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})),i.fullscreen&&Array.from(i.fullscreen.children).filter((function(e){return!e.contains(i.container)})).forEach((function(n){e.bind(n,"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",(function(){var n=t.config,a=t.timers;be(i.controls,n.classNames.noTransition,!0),yt.toggleControls.call(t,!0),setTimeout((function(){be(i.controls,n.classNames.noTransition,!1)}),0);var s=e.touch?3e3:4e3;clearTimeout(a.controls),a.controls=setTimeout((function(){return yt.toggleControls.call(t,!1)}),s)})),this.bind(i.inputs.volume,"wheel",(function(e){var i=e.webkitDirectionInvertedFromDevice,n=o([e.deltaX,-e.deltaY].map((function(e){return i?-e:e})),2),a=n[0],s=n[1],r=Math.sign(Math.abs(a)>Math.abs(s)?a:s);t.increaseVolume(r/50);var l=t.media.volume;(1===r&&l<1||-1===r&&l>0)&&e.preventDefault()}),"volume",!1)}}]),t}();"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var bt=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){e.exports=function(){var e=function(){},t={},i={},n={};function a(e,t){e=e.push?e:[e];var a,s,r,o=[],l=e.length,c=l;for(a=function(e,i){i.length&&o.push(e),--c||t(o)};l--;)s=e[l],(r=i[s])?a(s,r):(n[s]=n[s]||[]).push(a)}function s(e,t){if(e){var a=n[e];if(i[e]=t,a)for(;a.length;)a[0](e,t),a.splice(0,1)}}function r(t,i){t.call&&(t={success:t}),i.length?(t.error||e)(i):(t.success||e)(t)}function o(t,i,n,a){var s,r,l=document,c=n.async,u=(n.numRetries||0)+1,d=n.before||e,h=t.replace(/[\?|#].*$/,""),m=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(h)?((r=l.createElement("link")).rel="stylesheet",r.href=m,(s="hideFocus"in r)&&r.relList&&(s=0,r.rel="preload",r.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(h)?(r=l.createElement("img")).src=m:((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)try{r.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l){if((a+=1)<u)return o(t,i,n,a)}else if("preload"==r.rel&&"style"==r.as)return r.rel="stylesheet";i(t,l,e.defaultPrevented)},!1!==d(t,r)&&l.head.appendChild(r)}function l(e,t,i){var n,a,s=(e=e.push?e:[e]).length,r=s,l=[];for(n=function(e,i,n){if("e"==i&&l.push(e),"b"==i){if(!n)return;l.push(e)}--s||t(l)},a=0;a<r;a++)o(e[a],n,i)}function c(e,i,n){var a,o;if(i&&i.trim&&(a=i),o=(a?n:i)||{},a){if(a in t)throw"LoadJS";t[a]=!0}function c(t,i){l(e,(function(e){r(o,e),t&&r({success:t,error:i},e),s(a,e)}),o)}if(o.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return a(e,(function(e){r(t,e)})),c},c.done=function(e){s(e,[])},c.reset=function(){t={},i={},n={}},c.isDefined=function(e){return e in t},c}()}));function wt(e){return new Promise((function(t,i){bt(e,{success:t,error:i})}))}function kt(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Oe.call(this,this.media,e?"play":"pause"))}var Tt={setup:function(){var e=this;be(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,Re.call(e),z(window.Vimeo)?Tt.ready.call(e):wt(e.config.urls.vimeo.sdk).then((function(){Tt.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,i=t.config.vimeo,n=i.premium,a=i.referrerPolicy,l=r(i,["premium","referrerPolicy"]);n&&Object.assign(l,{controls:!1,sidedock:!1});var c=st(s({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},l)),u=t.media.getAttribute("src");ae(u)&&(u=t.media.getAttribute(t.config.attributes.embed.id));var d,h=ae(d=u)?null:K(Number(d))?d:d.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:d,m=he("iframe"),p=Ue(t.config.urls.vimeo.iframe,h,c);if(m.setAttribute("src",p),m.setAttribute("allowfullscreen",""),m.setAttribute("allow","autoplay,fullscreen,picture-in-picture"),ae(a)||m.setAttribute("referrerPolicy",a),n||!i.customControls)m.setAttribute("data-poster",t.poster),t.media=ge(m,t.media);else{var f=he("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});f.appendChild(m),t.media=ge(f,t.media)}i.customControls||Je(Ue(t.config.urls.vimeo.api,p)).then((function(e){!ae(e)&&e.thumbnail_url&&yt.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(m,{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 kt.call(t,!0),t.embed.play()},t.media.pause=function(){return kt.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var g=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return g},set:function(e){var i=t.embed,n=t.media,a=t.paused,s=t.volume,r=a&&!i.hasPlayed;n.seeking=!0,Oe.call(t,n,"seeking"),Promise.resolve(r&&i.setVolume(0)).then((function(){return i.setCurrentTime(e)})).then((function(){return r&&i.pause()})).then((function(){return r&&i.setVolume(s)})).catch((function(){}))}});var y=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return y},set:function(e){t.embed.setPlaybackRate(e).then((function(){y=e,Oe.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});var v=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return v},set:function(e){t.embed.setVolume(e).then((function(){v=e,Oe.call(t,t.media,"volumechange")}))}});var b=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return b},set:function(e){var i=!!Q(e)&&e;t.embed.setVolume(i?0:t.config.volume).then((function(){b=i,Oe.call(t,t.media,"volumechange")}))}});var w,k=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return k},set:function(e){var i=Q(e)?e:t.config.loop.active;t.embed.setLoop(i).then((function(){k=i}))}}),t.embed.getVideoUrl().then((function(e){w=e,nt.setDownloadUrl.call(t)})).catch((function(t){e.debug.warn(t)})),Object.defineProperty(t.media,"currentSrc",{get:function(){return w}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then((function(i){var n=o(i,2),a=n[0],s=n[1];t.embed.ratio=[a,s],Re.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(i){t.config.title=i,yt.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){g=e,Oe.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,Oe.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,rt.setup.call(t)})),t.embed.on("cuechange",(function(e){var i=e.cues,n=(void 0===i?[]:i).map((function(e){return function(e){var t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.innerText}(e.text)}));rt.updateCues.call(t,n)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){kt.call(t,!e),e||Oe.call(t,t.media,"playing")})),G(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){Oe.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){Oe.call(t,t.media,"playing")})),t.embed.on("play",(function(){kt.call(t,!0),Oe.call(t,t.media,"playing")})),t.embed.on("pause",(function(){kt.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,g=e.seconds,Oe.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,Oe.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&Oe.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,Oe.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,Oe.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,Oe.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,Oe.call(t,t.media,"error")})),i.customControls&&setTimeout((function(){return yt.build.call(t)}),0)}};function Ct(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,Oe.call(this,this.media,e?"play":"pause"))}function At(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var St={setup:function(){var e=this;if(be(this.elements.wrapper,this.config.classNames.embed,!0),z(window.YT)&&X(window.YT.Player))St.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){X(t)&&t(),St.ready.call(e)},wt(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;Je(Ue(this.config.urls.youtube.api,e)).then((function(e){if(z(e)){var i=e.title,n=e.height,a=e.width;t.config.title=i,yt.setTitle.call(t),t.embed.ratio=[a,n]}Re.call(t)})).catch((function(){Re.call(t)}))},ready:function(){var e=this,t=e.config.youtube,i=e.media&&e.media.getAttribute("id");if(ae(i)||!i.startsWith("youtube-")){var n=e.media.getAttribute("src");ae(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var a,s,r=ae(a=n)?null:a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:a,o=he("div",{id:(s=e.provider,"".concat(s,"-").concat(Math.floor(1e4*Math.random()))),"data-poster":t.customControls?e.poster:void 0});if(e.media=ge(o,e.media),t.customControls){var l=function(e){return"https://i.ytimg.com/vi/".concat(r,"/").concat(e,"default.jpg")};gt(l("maxres"),121).catch((function(){return gt(l("sd"),121)})).catch((function(){return gt(l("hq"))})).then((function(t){return yt.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(e.media,{videoId:r,host:At(t),playerVars:ce({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),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},Oe.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var i=t.target;e.media.playbackRate=i.getPlaybackRate(),Oe.call(e,e.media,"ratechange")},onReady:function(i){if(!X(e.media.play)){var n=i.target;St.getTitle.call(e,r),e.media.play=function(){Ct.call(e,!0),n.playVideo()},e.media.pause=function(){Ct.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,Oe.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 a=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return a},set:function(t){a=t,n.setVolume(100*a),Oe.call(e,e.media,"volumechange")}});var s=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return s},set:function(t){var i=Q(t)?t:s;s=i,n[i?"mute":"unMute"](),n.setVolume(100*a),Oe.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}});var o=n.getAvailablePlaybackRates();e.options.speed=o.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),Oe.call(e,e.media,"timeupdate"),Oe.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)&&Oe.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),Oe.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return yt.build.call(e)}),50)}},onStateChange:function(i){var n=i.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(i.data)&&(e.media.seeking=!1,Oe.call(e,e.media,"seeked")),i.data){case-1:Oe.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),Oe.call(e,e.media,"progress");break;case 0:Ct.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):Oe.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Ct.call(e,!0),Oe.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){Oe.call(e,e.media,"timeupdate")}),50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),Oe.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Ct.call(e,!1);break;case 3:Oe.call(e,e.media,"waiting")}Oe.call(e,e.elements.container,"statechange",!1,{code:i.data})}}})}}},Pt={setup:function(){this.media?(be(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),be(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&be(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=he("div",{class:this.config.classNames.video}),ue(this.media,this.elements.wrapper),this.elements.poster=he("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Ve.setup.call(this):this.isYouTube?St.setup.call(this):this.isVimeo&&Tt.setup.call(this)):this.debug.warn("No media element found!")}},Et=function(){function t(i){var n=this;e(this,t),this.player=i,this.config=i.config.ads,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 i(t,[{key:"load",value:function(){var e=this;this.enabled&&(z(window.google)&&z(window.google.ima)?this.ready():wt(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,t=this;this.enabled||((e=this).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then((function(){t.clearSafetyTimer("onAdsManagerLoaded()")})),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){var e=this;this.elements.container=he("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),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),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),this.requestAds()}},{key:"requestAds",value:function(){var e=this.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!t)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");var i=function(){var t=it(Math.max(e.manager.getRemainingTime(),0)),i="".concat(Xe("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",i)};this.countdownTimer=setInterval(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(),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:"addCuePoints",value:function(){var e=this;ae(this.cuePoints)||this.cuePoints.forEach((function(t){if(0!==t&&-1!==t&&t<e.player.duration){var i=e.player.elements.progress;if(G(i)){var n=100/e.player.duration*t,a=he("span",{class:e.player.config.classNames.cues});a.style.left="".concat(n.toString(),"%"),i.appendChild(a)}}}))}},{key:"onAdEvent",value:function(e){var t=this,i=this.player.elements.container,n=e.getAd(),a=e.getAdData();switch(function(e){Oe.call(t.player,t.player.media,"ads".concat(e.replace(/_/g,"").toLowerCase()))}(e.type),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),n.isLinear()||(n.width=i.offsetWidth,n.height=i.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:a.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(a.adError.getMessage()))}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e,t=this,i=this.player.elements.container;this.player.on("canplay",(function(){t.addCuePoints()})),this.player.on("ended",(function(){t.loader.contentComplete()})),this.player.on("timeupdate",(function(){e=t.player.currentTime})),this.player.on("seeked",(function(){var i=t.player.currentTime;ae(t.cuePoints)||t.cuePoints.forEach((function(n,a){e<n&&n<i&&(t.manager.discardAdBreak(),t.cuePoints.splice(a,1))}))})),window.addEventListener("resize",(function(){t.manager&&t.manager.resize(i.offsetWidth,i.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.manager.setVolume(e.player.volume),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,De(this.player.media.play())}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.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.initialized=!1,e.requestAds()})).catch((function(){}))}},{key:"trigger",value:function(e){for(var t=this,i=arguments.length,n=new Array(i>1?i-1:0),a=1;a<i;a++)n[a-1]=arguments[a];var s=this.events[e];$(s)&&s.forEach((function(e){X(e)&&e.apply(t,n)}))}},{key:"on",value:function(e,t){return $(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: ".concat(t)),this.safetyTimer=setTimeout((function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")}),e)}},{key:"clearSafetyTimer",value:function(e){W(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!ae(e.publisherId)||ne(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(ne(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(st(t))}}]),t}(),Nt=function(e,t){var i={};return e>t.width/t.height?(i.width=t.width,i.height=1/e*t.width):(i.height=t.height,i.width=e*t.height),i},Mt=function(){function t(i){e(this,t),this.player=i,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return i(t,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then((function(){e.enabled&&(e.render(),e.determineContainerAutoSizing(),e.loaded=!0)}))}},{key:"getThumbnails",value:function(){var e=this;return new Promise((function(t){var i=e.player.config.previewThumbnails.src;if(ae(i))throw new Error("Missing previewThumbnails.src config attribute");var n=function(){e.thumbnails.sort((function(e,t){return e.height-t.height})),e.player.debug.log("Preview thumbnails",e.thumbnails),t()};if(X(i))i((function(t){e.thumbnails=t,n()}));else{var a=(Y(i)?[i]:i).map((function(t){return e.getThumbnail(t)}));Promise.all(a).then(n)}}))}},{key:"getThumbnail",value:function(e){var t=this;return new Promise((function(i){Je(e).then((function(n){var a,s,r={frames:(a=n,s=[],a.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var t={};e.split(/\r\n|\n|\r/).forEach((function(e){if(K(t.startTime)){if(!ae(e.trim())&&ae(t.text)){var i=e.trim().split("#xywh="),n=o(i,1);if(t.text=n[0],i[1]){var a=o(i[1].split(","),4);t.x=a[0],t.y=a[1],t.w=a[2],t.h=a[3]}}}else{var s=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);s&&(t.startTime=60*Number(s[1]||0)*60+60*Number(s[2])+Number(s[3])+Number("0.".concat(s[4])),t.endTime=60*Number(s[6]||0)*60+60*Number(s[7])+Number(s[8])+Number("0.".concat(s[9])))}})),t.text&&s.push(t)})),s),height:null,urlPrefix:""};r.frames[0].text.startsWith("/")||r.frames[0].text.startsWith("http://")||r.frames[0].text.startsWith("https://")||(r.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var l=new Image;l.onload=function(){r.height=l.naturalHeight,r.width=l.naturalWidth,t.thumbnails.push(r),i()},l.src=r.urlPrefix+r.frames[0].text}))}))}},{key:"startMove",value:function(e){if(this.loaded&&Z(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(i/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=it(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){(W(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):Le.call(this.player,this.player.media,"timeupdate",(function(){e.mouseDown||e.toggleScrubbingContainer(!1)}))}},{key:"listeners",value:function(){var e=this;this.player.on("play",(function(){e.toggleThumbContainer(!1,!0)})),this.player.on("seeked",(function(){e.toggleThumbContainer(!1)})),this.player.on("timeupdate",(function(){e.lastTime=e.player.media.currentTime}))}},{key:"render",value:function(){this.elements.thumb.container=he("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=he("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=he("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=he("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),G(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=he("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"destroy",value:function(){this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();var t=this.thumbnails[0].frames.findIndex((function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime})),i=t>=0,n=0;this.mouseDown||this.toggleThumbContainer(i),i&&(this.thumbnails.forEach((function(i,a){e.loadedImages.includes(i.frames[t].text)&&(n=a)})),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(n)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=this.showingThumb,n=this.thumbnails[t],a=n.urlPrefix,s=n.frames[i],r=n.frames[i].text,o=a+r;if(this.currentImageElement&&this.currentImageElement.dataset.filename===r)this.showImage(this.currentImageElement,s,t,i,r,!1),this.currentImageElement.dataset.index=i,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var l=new Image;l.src=o,l.dataset.index=i,l.dataset.filename=r,this.showingThumbFilename=r,this.player.debug.log("Loading image: ".concat(o)),l.onload=function(){return e.showImage(l,s,t,i,r,!0)},this.loadingImage=l,this.removeOldImages(l)}}},{key:"showImage",value:function(e,t,i,n,a){var s=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(a,". num: ").concat(n,". qual: ").concat(i,". newimg: ").concat(s)),this.setImageSizeAndOffset(e,t),s&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(a)||this.loadedImages.push(a)),this.preloadNearby(n,!0).then(this.preloadNearby(n,!1)).then(this.getHigherQuality(i,e,t,a))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach((function(i){if("img"===i.tagName.toLowerCase()){var n=t.usingSprites?500:1e3;if(i.dataset.index!==e.dataset.index&&!i.dataset.deleting){i.dataset.deleting=!0;var a=t.currentImageContainer;setTimeout((function(){a.removeChild(i),t.player.debug.log("Removing thumb: ".concat(i.dataset.filename))}),n)}}}))}},{key:"preloadNearby",value:function(e){var t=this,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(n){setTimeout((function(){var a=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===a){var s;s=i?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var r=!1;s.forEach((function(e){var i=e.text;if(i!==a&&!t.loadedImages.includes(i)){r=!0,t.player.debug.log("Preloading thumb filename: ".concat(i));var s=t.thumbnails[0].urlPrefix+i,o=new Image;o.src=s,o.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(i)),t.loadedImages.includes(i)||t.loadedImages.push(i),n()}}})),r||n()}}),300)}))}},{key:"getHigherQuality",value:function(e,t,i,n){var a=this;if(e<this.thumbnails.length-1){var s=t.naturalHeight;this.usingSprites&&(s=i.h),s<this.thumbContainerHeight&&setTimeout((function(){a.showingThumbFilename===n&&(a.player.debug.log("Showing higher quality thumb for: ".concat(n)),a.loadImage(e+1))}),300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(i,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(this.sizeSpecifiedInCSS){if(this.elements.thumb.imageContainer.clientHeight>20&&this.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(this.elements.thumb.imageContainer.clientHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(this.elements.thumb.imageContainer.clientHeight<20&&this.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(this.elements.thumb.imageContainer.clientWidth/this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var i=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(i,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),i=this.elements.thumb.container,n=t.left-e.left+10,a=t.right-e.left-i.clientWidth-10,s=this.mousePosX-e.left-i.clientWidth/2;s<n&&(s=n),s>a&&(s=a),i.style.left="".concat(s,"px")}},{key:"setScrubbingContainerSize",value:function(){var e=Nt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}),t=e.width,i=e.height;this.elements.scrubbing.container.style.width="".concat(t,"px"),this.elements.scrubbing.container.style.height="".concat(i,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var i=this.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*i,"px"),e.style.width="".concat(e.naturalWidth*i,"px"),e.style.left="-".concat(t.x*i,"px"),e.style.top="-".concat(t.y*i,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?Nt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),t}(),xt={insertElements:function(e,t){var i=this;Y(t)?me(e,this.media,{src:t}):$(t)&&t.forEach((function(t){me(e,i.media,t)}))},change:function(e){var t=this;le(e,"sources.length")?(Ve.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],pe(t.media),t.media=null,G(t.elements.container)&&t.elements.container.removeAttribute("class");var i=e.sources,n=e.type,a=o(i,1)[0],s=a.provider,r=void 0===s?ut.html5:s,l=a.src,c="html5"===r?n:"div",u="html5"===r?{}:{src:l};Object.assign(t,{provider:r,type:n,supported:Ee.check(n,r,t.config.playsinline),media:he(c,u)}),t.elements.container.appendChild(t.media),Q(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),ae(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","")),yt.addStyleHook.call(t),t.isHTML5&&xt.insertElements.call(t,"source",i),t.config.title=e.title,Pt.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&xt.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&yt.build.call(t),t.isHTML5&&t.media.load(),ae(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new Mt(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};var It,Lt=function(){function t(i,n){var a=this;if(e(this,t),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Ee.touch,this.media=i,Y(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||J(this.media)||$(this.media))&&(this.media=this.media[0]),this.config=ce({},ot,t.defaults,n||{},function(){try{return JSON.parse(a.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 pt(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Ee),!W(this.media)&&G(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Ee.check().api){var s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;var r=this.media.tagName.toLowerCase(),o=null,l=null;switch(r){case"div":if(o=this.media.querySelector("iframe"),G(o)){if(l=at(o.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?ut.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?ut.vimeo:null}(l.toString()),this.elements.container=this.media,this.media=o,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.youtube.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(ae(this.provider)||!Object.keys(ut).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=ht;break;case"video":case"audio":this.type=r,this.provider=ut.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=Ee.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new vt(this),this.storage=new $e(this),this.media.plyr=this,G(this.elements.container)||(this.elements.container=he("div",{tabindex:0}),ue(this.media,this.elements.container)),yt.migrateStyles.call(this),yt.addStyleHook.call(this),Pt.setup.call(this),this.config.debug&&xe.call(this,this.elements.container,this.config.events.join(" "),(function(e){a.debug.log("event: ".concat(e.type))})),this.fullscreen=new ft(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&yt.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Et(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return De(a.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Mt(this))):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 i(t,[{key:"play",value:function(){var e=this;return X(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then((function(){return e.ads.play()})).catch((function(){return De(e.media.play())})),this.media.play()):null}},{key:"pause",value:function(){return this.playing&&X(this.media.pause)?this.media.pause():null}},{key:"togglePlay",value:function(e){return(Q(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):X(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime-=K(e)?e:this.config.seekTime}},{key:"forward",value:function(e){this.currentTime+=K(e)?e:this.config.seekTime}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(K(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){rt.toggle.call(this,e,!1)}},{key:"airplay",value:function(){Ee.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=we(this.elements.container,this.config.classNames.hideControls),i=void 0===e?void 0:!e,n=be(this.elements.container,this.config.classNames.hideControls,i);if(n&&$(this.config.controls)&&this.config.controls.includes("settings")&&!ae(this.config.settings)&&nt.toggleMenu.call(this,!1),n!==t){var a=n?"controlshidden":"controlsshown";Oe.call(this,this.media,a)}return!n}return!1}},{key:"on",value:function(e,t){xe.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){Le.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){Ie(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&&(pe(t.elements.buttons.play),pe(t.elements.captions),pe(t.elements.controls),pe(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),X(e)&&e()):(_e.call(t),Ve.cancelRequests.call(t),ge(t.elements.original,t.elements.container),Oe.call(t,t.elements.original,"destroyed",!0),X(e)&&e.call(t.elements.original),t.ready=!1,setTimeout((function(){t.elements=null,t.media=null}),200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(yt.toggleNativeControls.call(this,!0),n()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&X(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 Ee.mime.call(this,e)}},{key:"isHTML5",get:function(){return this.provider===ut.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===ut.youtube}},{key:"isVimeo",get:function(){return this.provider===ut.vimeo}},{key:"isVideo",get:function(){return this.type===ht}},{key:"isAudio",get:function(){return this.type===dt}},{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=K(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 K(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=K(t)&&t!==1/0?t:0;return e||i}},{key:"volume",set:function(e){var t=e;Y(t)&&(t=Number(t)),K(t)||(t=this.storage.get("volume")),K(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!ae(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;Q(t)||(t=this.storage.get("muted")),Q(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=this,i=null;K(e)&&(i=e),K(i)||(i=this.storage.get("speed")),K(i)||(i=this.config.speed.selected);var n=this.minimumSpeed,a=this.maximumSpeed;i=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),i)}(i,n,a),this.config.speed.selected=i,setTimeout((function(){t.media.playbackRate=i}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,l(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,l(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,i=this.options.quality;if(i.length){var n=[!ae(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(K),a=!0;if(!i.includes(n)){var s=function(e,t){return $(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: ".concat(n,", using ").concat(s," instead")),n=s,a=!1}t.selected=n,this.media.quality=n,a&&this.storage.set({quality:n})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=Q(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){xt.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return ne(e)?e:this.source},set:function(e){ne(e)&&(this.config.urls.download=e,nt.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?yt.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=He(Fe.call(this));return $(e)?e.join(":"):e},set:function(e){this.isVideo?Y(e)&&qe(e)?(this.config.ratio=e,Re.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=Q(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){rt.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){rt.setLanguage.call(this,e,!1)},get:function(){return(rt.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(Ee.pip){var t=Q(e)?e:!this.pip;X(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?lt:ct),X(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return Ee.pip?ae(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===lt:null}}],[{key:"supported",value:function(e,t,i){return Ee.check(e,t,i)}},{key:"loadSprite",value:function(e,t){return Ge(e,t)}},{key:"setup",value:function(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null;return Y(e)?n=Array.from(document.querySelectorAll(e)):J(e)?n=Array.from(e):$(e)&&(n=e.filter(G)),ae(n)?null:n.map((function(e){return new t(e,i)}))}}]),t}();return Lt.defaults=(It=ot,JSON.parse(JSON.stringify(It))),Lt}));
+!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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 ce(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function ue(){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 K(r)?(Object.keys(r).forEach((function(t){K(r[t])?(Object.keys(e).includes(t)||Object.assign(e,a({},t,{})),ue(e[t],r[t])):Object.assign(e,a({},t,r[t]))})),ue.apply(void 0,[e].concat(n))):e}function de(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,r=e.nextSibling;i.appendChild(e),r?a.insertBefore(i,r):a.appendChild(i)}))}function he(e,t){Z(e)&&!re(t)&&Object.entries(t).filter((function(e){var t=l(e,2)[1];return!z(t)})).forEach((function(t){var n=l(t,2),i=n[0],a=n[1];return e.setAttribute(i,a)}))}function me(e,t,n){var i=document.createElement(e);return K(t)&&he(i,t),Q(n)&&(i.innerText=n),i}function pe(e,t,n,i){Z(t)&&t.appendChild(me(e,n,i))}function fe(e){G(e)||J(e)?Array.from(e).forEach(fe):Z(e)&&Z(e.parentNode)&&e.parentNode.removeChild(e)}function ge(e){if(Z(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function ye(e,t){return Z(t)&&Z(t.parentNode)&&Z(e)?(t.parentNode.replaceChild(e,t),e):null}function be(e,t){if(!Q(e)||re(e))return{};var n={},i=ue({},t);return e.split(",").forEach((function(e){var t=e.trim(),a=t.replace(".",""),r=t.replace(/[[\]]/g,"").split("="),o=l(r,1)[0],s=r.length>1?r[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":Q(i.class)?n.class="".concat(i.class," ").concat(a):n.class=a;break;case"#":n.id=t.replace("#","");break;case"[":n[o]=s}})),ue(i,n)}function ve(e,t){if(Z(e)){var n=t;X(n)||(n=!e.hidden),e.hidden=n}}function we(e,t,n){if(G(e))return Array.from(e).map((function(e){return we(e,t,n)}));if(Z(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function ke(e,t){return Z(e)&&e.classList.contains(t)}function Te(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function Ce(e){return this.elements.container.querySelectorAll(e)}function Ae(e){return this.elements.container.querySelector(e)}function Se(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];Z(e)&&(e.focus({preventScroll:!0}),t&&we(e,this.config.classNames.tabFocus))}var Pe,Ee={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},Ne={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=le.isIPhone&&n&&Ne.playsinline,a=Ne[e]||"html5"!==t;return{api:a,ui:a&&Ne.rangeInput&&("video"!==e||!le.isIPhone||i)}},pip:!(le.isIPhone||!$(me("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||me("video").disablePictureInPicture)),airplay:$(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(re(e))return!1;var t=l(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(Ee).includes(n)&&(n+='; codecs="'.concat(Ee[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(Pe=document.createElement("input"),Pe.type="range","range"===Pe.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==oe,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},Me=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 xe(e,t,n){var i=this,a=arguments.length>3&&void 0!==arguments[3]&&arguments[3],r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!re(t)&&$(n)){var s=t.split(" "),l=o;Me&&(l={passive:r,capture:o}),s.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 Ie(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];xe.call(this,e,t,n,!0,i,a)}function Le(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];xe.call(this,e,t,n,!1,i,a)}function Oe(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,a=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],r=arguments.length>4&&void 0!==arguments[4]&&arguments[4],o=function o(){Le(e,n,o,a,r);for(var s=arguments.length,l=new Array(s),c=0;c<s;c++)l[c]=arguments[c];i.apply(t,l)};xe.call(this,e,n,o,!0,a,r)}function _e(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(Z(e)&&!re(t)){var a=new CustomEvent(t,{bubbles:n,detail:o(o({},i),{},{plyr:this})});e.dispatchEvent(a)}}function je(){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=[])}function De(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):Ie.call(e,e.elements.container,"ready",t)})).then((function(){}))}function qe(e){ie(e)&&e.then(null,(function(){}))}function He(e){return!!(J(e)||Q(e)&&e.includes(":"))&&(J(e)?e:e.split(":")).map(Number).every(Y)}function Fe(e){if(!J(e)||!e.every(Y))return null;var t=l(e,2),n=t[0],i=t[1],a=function e(t,n){return 0===n?t:e(n,t%n)}(n,i);return[n/a,i/a]}function Re(e){var t=function(e){return He(e)?e.split(":").map(Number):null},n=t(e);if(null===n&&(n=t(this.config.ratio)),null===n&&!re(this.embed)&&J(this.embed.ratio)&&(n=this.embed.ratio),null===n&&this.isHTML5){var i=this.media;n=Fe([i.videoWidth,i.videoHeight])}return n}function Ve(e){if(!this.isVideo)return{};var t=this.elements.wrapper,n=Re.call(this,e),i=l(J(n)?n:[0,0],2),a=100/i[0]*i[1];if(t.style.paddingBottom="".concat(a,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var r=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),o=(r-a)/(r/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(o,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==n);return{padding:a,ratio:n}}var Be={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var n=t.getAttribute("type");return!!re(n)||Ne.mime.call(e,n)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:Be.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,re(this.config.ratio)||Ve.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=Be.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&$(e.config.quality.onChange))e.config.quality.onChange(t);else{var n=Be.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!n)return;var i=e.media,a=i.currentTime,r=i.paused,o=i.preload,s=i.readyState,l=i.playbackRate;e.media.src=n.getAttribute("src"),("none"!==o||s)&&(e.once("loadedmetadata",(function(){e.speed=l,e.currentTime=a,r||qe(e.play())})),e.media.load())}_e.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(fe(Be.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Ue(e){return J(e)?e.filter((function(t,n){return e.indexOf(t)===n})):e}function We(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 re(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return n[t].toString()}))}var ze=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())},Ke=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function Ye(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=ze(t,"-"," "),t=ze(t,"_"," "),t=Ke(t),ze(t," ","")}function Qe(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var Xe={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},$e=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(re(e)||re(t))return"";var n=ce(t.i18n,e);if(re(n))return Object.keys(Xe).includes(e)?Xe[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach((function(e){var t=l(e,2),i=t[0],a=t[1];n=ze(n,i,a)})),n},Je=function(){function e(n){var i=this;t(this,e),a(this,"get",(function(t){if(!e.supported||!i.enabled)return null;var n=window.localStorage.getItem(i.key);if(re(n))return null;var a=JSON.parse(n);return Q(t)&&t.length?a[t]:a})),a(this,"set",(function(t){if(e.supported&&i.enabled&&K(t)){var n=i.get();re(n)&&(n={}),ue(n,t),window.localStorage.setItem(i.key,JSON.stringify(n))}})),this.enabled=n.config.storage.enabled,this.key=n.config.storage.key}return i(e,null,[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function Ge(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 Ze(e,t){if(Q(e)){var n="cache",i=Q(t),a=function(){return null!==document.getElementById(t)},r=function(e,t){e.innerHTML=t,i&&a()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!a()){var o=Je.supported,s=document.createElement("div");if(s.setAttribute("hidden",""),i&&s.setAttribute("id",t),o){var l=window.localStorage.getItem("".concat(n,"-").concat(t));if(null!==l){var c=JSON.parse(l);r(s,c.content)}}Ge(e).then((function(e){re(e)||(o&&window.localStorage.setItem("".concat(n,"-").concat(t),JSON.stringify({content:e})),r(s,e))})).catch((function(){}))}}}var et=function(e){return Math.trunc(e/60/60%60,10)},tt=function(e){return Math.trunc(e/60%60,10)},nt=function(e){return Math.trunc(e%60,10)};function it(){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(!Y(e))return it(void 0,t,n);var i=function(e){return"0".concat(e).slice(-2)},a=et(e),r=tt(e),o=nt(e);return a=t||a>0?"".concat(a,":"):"","".concat(n&&e>0?"-":"").concat(a).concat(i(r),":").concat(i(o))}var at={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||le.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=Ae.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:Ce.call(this,this.config.selectors.buttons.play),pause:Ae.call(this,this.config.selectors.buttons.pause),restart:Ae.call(this,this.config.selectors.buttons.restart),rewind:Ae.call(this,this.config.selectors.buttons.rewind),fastForward:Ae.call(this,this.config.selectors.buttons.fastForward),mute:Ae.call(this,this.config.selectors.buttons.mute),pip:Ae.call(this,this.config.selectors.buttons.pip),airplay:Ae.call(this,this.config.selectors.buttons.airplay),settings:Ae.call(this,this.config.selectors.buttons.settings),captions:Ae.call(this,this.config.selectors.buttons.captions),fullscreen:Ae.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=Ae.call(this,this.config.selectors.progress),this.elements.inputs={seek:Ae.call(this,this.config.selectors.inputs.seek),volume:Ae.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:Ae.call(this,this.config.selectors.display.buffer),currentTime:Ae.call(this,this.config.selectors.display.currentTime),duration:Ae.call(this,this.config.selectors.display.duration)},Z(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="http://www.w3.org/2000/svg",i=at.getIconUrl.call(this),a="".concat(i.cors?"":i.url,"#").concat(this.config.iconPrefix),r=document.createElementNS(n,"svg");he(r,ue(t,{"aria-hidden":"true",focusable:"false"}));var o=document.createElementNS(n,"use"),s="".concat(a,"-").concat(e);return"href"in o&&o.setAttributeNS("http://www.w3.org/1999/xlink","href",s),o.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",s),r.appendChild(o),r},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=$e(e,this.config),i=o(o({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return me("span",i,n)},createBadge:function(e){if(re(e))return null;var t=me("span",{class:this.config.classNames.menu.value});return t.appendChild(me("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=this,i=ue({},t),a=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=Ye(e)).charAt(0).toLowerCase()+e.slice(1)}(e),r={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(i).includes(e)&&(r[e]=i[e],delete i[e])})),"button"!==r.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").some((function(e){return e===n.config.classNames.control}))||ue(i,{class:"".concat(i.class," ").concat(this.config.classNames.control)}):i.class=this.config.classNames.control,e){case"play":r.toggle=!0,r.label="play",r.labelPressed="pause",r.icon="play",r.iconPressed="pause";break;case"mute":r.toggle=!0,r.label="mute",r.labelPressed="unmute",r.icon="volume",r.iconPressed="muted";break;case"captions":r.toggle=!0,r.label="enableCaptions",r.labelPressed="disableCaptions",r.icon="captions-off",r.iconPressed="captions-on";break;case"fullscreen":r.toggle=!0,r.label="enterFullscreen",r.labelPressed="exitFullscreen",r.icon="enter-fullscreen",r.iconPressed="exit-fullscreen";break;case"play-large":i.class+=" ".concat(this.config.classNames.control,"--overlaid"),a="play",r.label="play",r.icon="play";break;default:re(r.label)&&(r.label=a),re(r.icon)&&(r.icon=e)}var o=me(r.element);return r.toggle?(o.appendChild(at.createIcon.call(this,r.iconPressed,{class:"icon--pressed"})),o.appendChild(at.createIcon.call(this,r.icon,{class:"icon--not-pressed"})),o.appendChild(at.createLabel.call(this,r.labelPressed,{class:"label--pressed"})),o.appendChild(at.createLabel.call(this,r.label,{class:"label--not-pressed"}))):(o.appendChild(at.createIcon.call(this,r.icon)),o.appendChild(at.createLabel.call(this,r.label))),ue(i,be(this.config.selectors.buttons[a],i)),he(o,i),"play"===a?(J(this.elements.buttons[a])||(this.elements.buttons[a]=[]),this.elements.buttons[a].push(o)):this.elements.buttons[a]=o,o},createRange:function(e,t){var n=me("input",ue(be(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":$e(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,at.updateRangeFill.call(this,n),j.setup(n),n},createProgress:function(e,t){var n=me("progress",ue(be(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(me("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],a=i?$e(i,this.config):"";n.innerText="% ".concat(a.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e,t){var n=be(this.config.selectors.display[e],t),i=me("div",ue(n,{class:"".concat(n.class?n.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":$e(e,this.config)}),"00:00");return this.elements.display[e]=i,i},bindMenuItemShortcuts:function(e,t){var n=this;Ie.call(this,e,"keydown keyup",(function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var a,r=Te(e,'[role="menuitemradio"]');if(!r&&[32,39].includes(i.which))at.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||r&&39===i.which?(a=e.nextElementSibling,Z(a)||(a=e.parentNode.firstElementChild)):(a=e.previousElementSibling,Z(a)||(a=e.parentNode.lastElementChild)),Se.call(n,a,!0))}}),!1),Ie.call(this,e,"keyup",(function(e){13===e.which&&at.focusFirstMenuItem.call(n,null,!0)}))},createMenuItem:function(e){var t=this,n=e.value,i=e.list,a=e.type,r=e.title,o=e.badge,s=void 0===o?null:o,l=e.checked,c=void 0!==l&&l,u=be(this.config.selectors.inputs[a]),d=me("button",ue(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=me("span");h.innerHTML=r,Z(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 Te(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(!te(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)}at.showMenuPanel.call(t,"home",te(e))}}),a,!1),at.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];if(!Y(e))return e;var n=et(this.duration)>0;return it(e,n,t)},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];Z(e)&&Y(t)&&(e.innerText=at.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(Z(this.elements.inputs.volume)&&at.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),Z(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;Z(e)&&(e.value=t,at.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&ee(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&&at.setRange.call(this,this.elements.inputs.seek,a);break;case"playing":case"progress":!function(e,n){var i=Y(n)?n:0,a=Z(e)?e:t.elements.display.buffer;if(Z(a)){a.value=i;var r=a.getElementsByTagName("span")[0];Z(r)&&(r.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=ee(e)?e.target:e;if(Z(t)&&"range"===t.getAttribute("type")){if(Te(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=at.formatTime(this.currentTime),i=at.formatTime(this.duration),a=$e("seekLabel",this.config);t.setAttribute("aria-valuetext",a.replace("{currentTime}",n).replace("{duration}",i))}else if(Te(t,this.config.selectors.inputs.volume)){var r=100*t.value;t.setAttribute("aria-valuenow",r),t.setAttribute("aria-valuetext","".concat(r.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);le.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&Z(this.elements.inputs.seek)&&Z(this.elements.display.seekTooltip)&&0!==this.duration){var n="".concat(this.config.classNames.tooltip,"--visible"),i=function(e){return we(t.elements.display.seekTooltip,n,e)};if(this.touch)i(!1);else{var a=0,r=this.elements.progress.getBoundingClientRect();if(ee(e))a=100/r.width*(e.pageX-r.left);else{if(!ke(this.elements.display.seekTooltip,n))return;a=parseFloat(this.elements.display.seekTooltip.style.left,10)}a<0?a=0:a>100&&(a=100),at.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*a),this.elements.display.seekTooltip.style.left="".concat(a,"%"),ee(e)&&["mouseenter","mouseleave"].includes(e.type)&&i("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!Z(this.elements.display.duration)&&this.config.invertTime;at.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||at.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return ve(this.elements.display.currentTime,!0),void ve(this.elements.progress,!0);Z(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=Z(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&at.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&at.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),at.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){ve(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],a=null,r=t;if("captions"===e)a=this.currentTrack;else{if(a=re(n)?this[e]:n,re(a)&&(a=this.config[e].default),!re(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(Z(r)||(r=i&&i.querySelector('[role="menu"]')),Z(r)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=at.getLabel.call(this,e,a);var o=r&&r.querySelector('[value="'.concat(a,'"]'));Z(o)&&(o.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?$e("normal",this.config):"".concat(t,"&times;");case"quality":if(Y(t)){var n=$e("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return Ke(t);case"captions":return st.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(Z(this.elements.settings.panels.quality)){var n="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');J(e)&&(this.options.quality=Ue(e).filter((function(e){return t.config.quality.options.includes(e)})));var a=!re(this.options.quality)&&this.options.quality.length>1;if(at.toggleMenuButton.call(this,n,a),ge(i),at.checkMenu.call(this),a){var r=function(e){var n=$e("qualityBadge.".concat(e),t.config);return n.length?at.createBadge.call(t,n):null};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){at.createMenuItem.call(t,{value:e,list:i,type:n,title:at.getLabel.call(t,"quality",e),badge:r(e)})})),at.updateSetting.call(this,n,i)}}},setCaptionsMenu:function(){var e=this;if(Z(this.elements.settings.panels.captions)){var t="captions",n=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=st.getTracks.call(this),a=Boolean(i.length);if(at.toggleMenuButton.call(this,t,a),ge(n),at.checkMenu.call(this),a){var r=i.map((function(t,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:st.getLabel.call(e,t),badge:t.language&&at.createBadge.call(e,t.language.toUpperCase()),list:n,type:"language"}}));r.unshift({value:-1,checked:!this.captions.toggled,title:$e("disabled",this.config),list:n,type:"language"}),r.forEach(at.createMenuItem.bind(this)),at.updateSetting.call(this,t,n)}}},setSpeedMenu:function(){var e=this;if(Z(this.elements.settings.panels.speed)){var t="speed",n=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var i=!re(this.options.speed)&&this.options.speed.length>1;at.toggleMenuButton.call(this,t,i),ge(n),at.checkMenu.call(this),i&&(this.options.speed.forEach((function(i){at.createMenuItem.call(e,{value:i,list:n,type:t,title:at.getLabel.call(e,"speed",i)})})),at.updateSetting.call(this,t,n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!re(e)&&Object.values(e).some((function(e){return!e.hidden}));ve(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;Z(n)||(n=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var i=n.querySelector('[role^="menuitem"]');Se.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(Z(t)&&Z(n)){var i=t.hidden,a=i;if(X(e))a=e;else if(te(e)&&27===e.which)a=!1;else if(ee(e)){var r=$(e.composedPath)?e.composedPath()[0]:e.target,o=t.contains(r);if(o||!o&&e.target!==n&&a)return}n.setAttribute("aria-expanded",a),ve(t,!a),we(this.elements.container,this.config.classNames.menu.open,a),a&&te(e)?at.focusFirstMenuItem.call(this,null,!0):a||i||Se.call(this,n,te(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 fe(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=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(Z(i)){var a=i.parentNode,r=Array.from(a.children).find((function(e){return!e.hidden}));if(Ne.transitions&&!Ne.reducedMotion){a.style.width="".concat(r.scrollWidth,"px"),a.style.height="".concat(r.scrollHeight,"px");var o=at.getMenuSize.call(this,i),s=function t(n){n.target===a&&["width","height"].includes(n.propertyName)&&(a.style.width="",a.style.height="",Le.call(e,a,oe,t))};Ie.call(this,a,oe,s),a.style.width="".concat(o.width,"px"),a.style.height="".concat(o.height,"px")}ve(r,!0),ve(i,!1),at.focusFirstMenuItem.call(this,i,n)}},setDownloadUrl:function(){var e=this.elements.buttons.download;Z(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=at.bindMenuItemShortcuts,i=at.createButton,a=at.createProgress,r=at.createRange,o=at.createTime,s=at.setQualityMenu,l=at.setSpeedMenu,c=at.showMenuPanel;this.elements.controls=null,J(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));var u=me("div",be(this.config.selectors.controls.wrapper));this.elements.controls=u;var d={class:"plyr__controls__item"};return Ue(J(this.config.controls)?this.config.controls:[]).forEach((function(s){if("restart"===s&&u.appendChild(i.call(t,"restart",d)),"rewind"===s&&u.appendChild(i.call(t,"rewind",d)),"play"===s&&u.appendChild(i.call(t,"play",d)),"fast-forward"===s&&u.appendChild(i.call(t,"fast-forward",d)),"progress"===s){var l=me("div",{class:"".concat(d.class," plyr__progress__container")}),h=me("div",be(t.config.selectors.progress));if(h.appendChild(r.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),h.appendChild(a.call(t,"buffer")),t.config.tooltips.seek){var m=me("span",{class:t.config.classNames.tooltip},"00:00");h.appendChild(m),t.elements.display.seekTooltip=m}t.elements.progress=h,l.appendChild(t.elements.progress),u.appendChild(l)}if("current-time"===s&&u.appendChild(o.call(t,"currentTime",d)),"duration"===s&&u.appendChild(o.call(t,"duration",d)),"mute"===s||"volume"===s){var p=t.elements.volume;if(Z(p)&&u.contains(p)||(p=me("div",ue({},d,{class:"".concat(d.class," plyr__volume").trim()})),t.elements.volume=p,u.appendChild(p)),"mute"===s&&p.appendChild(i.call(t,"mute")),"volume"===s&&!le.isIos){var f={max:1,step:.05,value:t.config.volume};p.appendChild(r.call(t,"volume",ue(f,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===s&&u.appendChild(i.call(t,"captions",d)),"settings"===s&&!re(t.config.settings)){var g=me("div",ue({},d,{class:"".concat(d.class," plyr__menu").trim(),hidden:""}));g.appendChild(i.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var y=me("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),b=me("div"),v=me("div",{id:"plyr-settings-".concat(e.id,"-home")}),w=me("div",{role:"menu"});v.appendChild(w),b.appendChild(v),t.elements.settings.panels.home=v,t.config.settings.forEach((function(i){var a=me("button",ue(be(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:""}));n.call(t,a,i),Ie.call(t,a,"click",(function(){c.call(t,i,!1)}));var r=me("span",null,$e(i,t.config)),o=me("span",{class:t.config.classNames.menu.value});o.innerHTML=e[i],r.appendChild(o),a.appendChild(r),w.appendChild(a);var s=me("div",{id:"plyr-settings-".concat(e.id,"-").concat(i),hidden:""}),l=me("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});l.appendChild(me("span",{"aria-hidden":!0},$e(i,t.config))),l.appendChild(me("span",{class:t.config.classNames.hidden},$e("menuBack",t.config))),Ie.call(t,s,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),c.call(t,"home",!0))}),!1),Ie.call(t,l,"click",(function(){c.call(t,"home",!1)})),s.appendChild(l),s.appendChild(me("div",{role:"menu"})),b.appendChild(s),t.elements.settings.buttons[i]=a,t.elements.settings.panels[i]=s})),y.appendChild(b),g.appendChild(y),u.appendChild(g),t.elements.settings.popup=y,t.elements.settings.menu=g}if("pip"===s&&Ne.pip&&u.appendChild(i.call(t,"pip",d)),"airplay"===s&&Ne.airplay&&u.appendChild(i.call(t,"airplay",d)),"download"===s){var k=ue({},d,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(k.download="");var T=t.config.urls.download;!ae(T)&&t.isEmbed&&ue(k,{icon:"logo-".concat(t.provider),label:t.provider}),u.appendChild(i.call(t,"download",k))}"fullscreen"===s&&u.appendChild(i.call(t,"fullscreen",d))})),this.isHTML5&&s.call(this,Be.getQualityOptions.call(this)),l.call(this),u},inject:function(){var e=this;if(this.config.loadSprite){var t=at.getIconUrl.call(this);t.cors&&Ze(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},a=!0;$(this.config.controls)&&(this.config.controls=this.config.controls.call(this,i)),this.config.controls||(this.config.controls=[]),Z(this.config.controls)||Q(this.config.controls)?n=this.config.controls:(n=at.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:st.getLabel.call(this)}),a=!1);var r,o;if(a&&Q(this.config.controls)&&(r=n,Object.entries(i).forEach((function(e){var t=l(e,2),n=t[0],i=t[1];r=ze(r,"{".concat(n,"}"),i)})),n=r),Q(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),Z(o)||(o=this.elements.container),o[Z(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),Z(this.elements.controls)||at.findElements.call(this),!re(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return ke(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];we(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){J(e)||G(e)?Array.from(e).filter(Boolean).forEach(s):s(e)}))}if(le.isEdge&&se(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),m=Ce.call(this,h);Array.from(m).forEach((function(t){we(t,e.config.classNames.hidden,!1),we(t,e.config.classNames.tooltip,!0)}))}}};function rt(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=e;if(t){var i=document.createElement("a");i.href=n,n=i.href}try{return new URL(n)}catch(e){return null}}function ot(e){var t=new URLSearchParams;return K(e)&&Object.entries(e).forEach((function(e){var n=l(e,2),i=n[0],a=n[1];t.set(i,a)})),t}var st={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!Ne.textTracks)J(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&at.setCaptionsMenu.call(this);else{if(Z(this.elements.captions)||(this.elements.captions=me("div",be(this.config.selectors.captions)),function(e,t){Z(e)&&Z(t)&&t.parentNode.insertBefore(e,t.nextSibling)}(this.elements.captions,this.elements.wrapper)),le.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),n=rt(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&Ge(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){fe(e)}))}))}var t=Ue((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=l(t,1)[0];var i=this.storage.get("captions");if(X(i)||(i=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:i,language:n,languages:t}),this.isHTML5){var a=this.config.captions.update?"addtrack removetrack":"removetrack";Ie.call(this,this.media.textTracks,a,st.update.bind(this))}setTimeout(st.update.bind(this),0)}},update:function(){var e=this,t=st.getTracks.call(this,!0),n=this.captions,i=n.active,a=n.language,r=n.meta,o=n.currentTrackNode,s=Boolean(t.find((function(e){return e.language===a})));this.isHTML5&&this.isVideo&&t.filter((function(e){return!r.get(e)})).forEach((function(t){e.debug.log("Track added",t),r.set(t,{default:"showing"===t.mode}),"showing"===t.mode&&(t.mode="hidden"),Ie.call(e,t,"cuechange",(function(){return st.updateCues.call(e)}))})),(s&&this.language!==a||!t.includes(o))&&(st.setLanguage.call(this,a),st.toggle.call(this,i&&s)),we(this.elements.container,this.config.classNames.captions.enabled,!re(t)),J(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&at.setCaptionsMenu.call(this)},toggle:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var i=this.captions.toggled,a=this.config.classNames.captions.active,r=z(e)?!i:e;if(r!==i){if(n||(this.captions.active=r,this.storage.set({captions:r})),!this.language&&r&&!n){var o=st.getTracks.call(this),s=st.findTrack.call(this,[this.captions.language].concat(c(this.captions.languages)),!0);return this.captions.language=s.language,void st.set.call(this,o.indexOf(s))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=r),we(this.elements.container,a,r),this.captions.toggled=r,at.updateSetting.call(this,"captions"),_e.call(this,this.media,r?"captionsenabled":"captionsdisabled")}setTimeout((function(){r&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=st.getTracks.call(this);if(-1!==e)if(Y(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],a=i||{},r=a.language;this.captions.currentTrackNode=i,at.updateSetting.call(this,"captions"),t||(this.captions.language=r,this.storage.set({language:r})),this.isVimeo&&this.embed.enableTextTrack(r),_e.call(this,this.media,"languagechange")}st.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&st.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else st.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(Q(e)){var n=e.toLowerCase();this.captions.language=n;var i=st.getTracks.call(this),a=st.findTrack.call(this,[n]);st.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],n=Array.from((this.media||{}).textTracks||[]);return n.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=st.getTracks.call(this),r=function(e){return Number((n.captions.meta.get(e)||{}).default)},o=Array.from(a).sort((function(e,t){return r(t)-r(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 st.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!ne(t)&&Ne.textTracks&&this.captions.toggled&&(t=st.getCurrentTrack.call(this)),ne(t)?re(t.label)?re(t.language)?$e("enabled",this.config):e.language.toUpperCase():t.label:$e("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(Z(this.elements.captions))if(z(e)||Array.isArray(e)){var t=e;if(!t){var n=st.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(Qe)}var i=t.map((function(e){return e.trim()})).join("\n");if(i!==this.elements.captions.innerHTML){ge(this.elements.captions);var a=me("span",be(this.config.selectors.caption));a.innerHTML=i,this.elements.captions.appendChild(a),_e.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},lt={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.4/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},ct="picture-in-picture",ut="inline",dt={html5:"html5",youtube:"youtube",vimeo:"vimeo"},ht="audio",mt="video";var pt=function(){},ft=function(){function e(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0];t(this,e),this.enabled=window.console&&n,this.enabled&&this.log("Debugging enabled")}return i(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):pt}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):pt}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):pt}}]),e}(),gt=function(){function e(n){var i=this;t(this,e),a(this,"onChange",(function(){if(i.enabled){var e=i.player.elements.buttons.fullscreen;Z(e)&&(e.pressed=i.active);var t=i.target===i.player.media?i.target:i.player.elements.container;_e.call(i.player,t,i.active?"enterfullscreen":"exitfullscreen",!0)}})),a(this,"toggleFallback",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e?i.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(i.scrollPosition.x,i.scrollPosition.y),document.body.style.overflow=e?"hidden":"",we(i.target,i.player.config.classNames.fullscreen.fallback,e),le.isIos){var t=document.head.querySelector('meta[name="viewport"]'),n="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var a=Q(t.content)&&t.content.includes(n);e?(i.cleanupViewport=!a,a||(t.content+=",".concat(n))):i.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==n})).join(","))}i.onChange()})),a(this,"trapFocus",(function(e){if(!le.isIos&&i.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,n=Ce.call(i.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),a=l(n,1)[0],r=n[n.length-1];t!==r||e.shiftKey?t===a&&e.shiftKey&&(r.focus(),e.preventDefault()):(a.focus(),e.preventDefault())}})),a(this,"update",(function(){var t;i.enabled?(t=i.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",i.player.debug.log("".concat(t," fullscreen enabled"))):i.player.debug.log("Fullscreen not supported and fallback disabled");we(i.player.elements.container,i.player.config.classNames.fullscreen.enabled,i.enabled)})),a(this,"enter",(function(){i.enabled&&(le.isIos&&i.player.config.fullscreen.iosNative?i.player.isVimeo?i.player.embed.requestFullscreen():i.target.webkitEnterFullscreen():!e.native||i.forceFallback?i.toggleFallback(!0):i.prefix?re(i.prefix)||i.target["".concat(i.prefix,"Request").concat(i.property)]():i.target.requestFullscreen({navigationUI:"hide"}))})),a(this,"exit",(function(){if(i.enabled)if(le.isIos&&i.player.config.fullscreen.iosNative)i.target.webkitExitFullscreen(),qe(i.player.play());else if(!e.native||i.forceFallback)i.toggleFallback(!1);else if(i.prefix){if(!re(i.prefix)){var t="moz"===i.prefix?"Cancel":"Exit";document["".concat(i.prefix).concat(t).concat(i.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)})),a(this,"toggle",(function(){i.active?i.exit():i.enter()})),this.player=n,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===n.config.fullscreen.fallback,this.player.elements.fullscreen=n.config.fullscreen.container&&function(e,t){return(Element.prototype.closest||function(){var e=this;do{if(Te.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,n.config.fullscreen.container),Ie.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){i.onChange()})),Ie.call(this.player,this.player.elements.container,"dblclick",(function(e){Z(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.player.listeners.proxy(e,i.toggle,"fullscreen")})),Ie.call(this,this.player.elements.container,"keydown",(function(e){return i.trapFocus(e)})),this.update()}return i(e,[{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return ke(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return le.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if($(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!$(document["".concat(t,"ExitFullscreen")])&&!$(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function yt(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise((function(n,i){var a=new Image,r=function(){delete a.onload,delete a.onerror,(a.naturalWidth>=t?n:i)(a)};Object.assign(a,{onload:r,onerror:r,src:e})}))}var bt={addStyleHook:function(){we(this.elements.container,this.config.selectors.container.replace(".",""),!0),we(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 bt.toggleNativeControls.call(this,!0);Z(this.elements.controls)||(at.inject.call(this),this.listeners.controls()),bt.toggleNativeControls.call(this),this.isHTML5&&st.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,at.updateVolume.call(this),at.timeUpdate.call(this),bt.checkPlaying.call(this),we(this.elements.container,this.config.classNames.pip.supported,Ne.pip&&this.isHTML5&&this.isVideo),we(this.elements.container,this.config.classNames.airplay.supported,Ne.airplay&&this.isHTML5),we(this.elements.container,this.config.classNames.isIos,le.isIos),we(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){_e.call(e,e.media,"ready")}),0),bt.setTitle.call(this),this.poster&&bt.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&at.durationUpdate.call(this)},setTitle:function(){var e=$e("play",this.config);if(Q(this.config.title)&&!re(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=Ae.call(this,"iframe");if(!Z(t))return;var n=re(this.config.title)?"video":this.config.title,i=$e("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){we(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),De.call(this).then((function(){return yt(e)})).catch((function(n){throw e===t.poster&&bt.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:""}),bt.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;we(this.elements.container,this.config.classNames.playing,this.playing),we(this.elements.container,this.config.classNames.paused,this.paused),we(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",$e(t.playing?"pause":"play",t.config))})),ee(e)&&"timeupdate"===e.type||bt.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(){we(t.elements.container,t.config.classNames.loading,t.loading),bt.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}},migrateStyles:function(){var e=this;Object.values(o({},this.media.style)).filter((function(e){return!re(e)&&Q(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),re(this.media.style)&&this.media.removeAttribute("style")}},vt=function(){function e(n){var i=this;t(this,e),a(this,"firstTouch",(function(){var e=i.player,t=e.elements;e.touch=!0,we(t.container,e.config.classNames.isTouch,!0)})),a(this,"setTabFocus",(function(e){var t=i.player,n=t.elements;if(clearTimeout(i.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(i.lastKeyDown=e.timeStamp);var a,r=e.timeStamp-i.lastKeyDown<=20;if("focus"!==e.type||r)a=t.config.classNames.tabFocus,we(Ce.call(t,".".concat(a)),a,!1),"focusout"!==e.type&&(i.focusTimer=setTimeout((function(){var e=document.activeElement;n.container.contains(e)&&we(document.activeElement,t.config.classNames.tabFocus,!0)}),10))}})),a(this,"global",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=i.player;t.config.keyboard.global&&xe.call(t,window,"keydown keyup",i.handleKey,e,!1),xe.call(t,document.body,"click",i.toggleMenu,e),Oe.call(t,document.body,"touchstart",i.firstTouch),xe.call(t,document.body,"keydown focus blur focusout",i.setTabFocus,e,!1,!0)})),a(this,"container",(function(){var e=i.player,t=e.config,n=e.elements,a=e.timers;!t.keyboard.global&&t.keyboard.focused&&Ie.call(e,n.container,"keydown keyup",i.handleKey,!1),Ie.call(e,n.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var i=n.controls;i&&"enterfullscreen"===t.type&&(i.pressed=!1,i.hover=!1);var r=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(bt.toggleControls.call(e,!0),r=e.touch?3e3:2e3),clearTimeout(a.controls),a.controls=setTimeout((function(){return bt.toggleControls.call(e,!1)}),r)}));var r=function(t){if(!t)return Ve.call(e);var i=n.container.getBoundingClientRect(),a=i.width,r=i.height;return Ve.call(e,"".concat(a,":").concat(r))},o=function(){clearTimeout(a.resized),a.resized=setTimeout(r,50)};Ie.call(e,n.container,"enterfullscreen exitfullscreen",(function(t){var i=e.fullscreen,a=i.target,s=i.usingNative;if(a===n.container&&(e.isEmbed||!re(e.config.ratio))){var c="enterfullscreen"===t.type,u=r(c);u.padding;!function(t,n,i){if(e.isVimeo&&!e.config.vimeo.premium){var a=e.elements.wrapper.firstChild,r=l(t,2)[1],o=l(Re.call(e),2),s=o[0],c=o[1];a.style.maxWidth=i?"".concat(r/c*s,"px"):null,a.style.margin=i?"0 auto":null}}(u.ratio,0,c),c&&setTimeout((function(){return se(n.container)}),100),s||(c?Ie.call(e,window,"resize",o):Le.call(e,window,"resize",o))}}))})),a(this,"media",(function(){var e=i.player,t=e.elements;if(Ie.call(e,e.media,"timeupdate seeking seeked",(function(t){return at.timeUpdate.call(e,t)})),Ie.call(e,e.media,"durationchange loadeddata loadedmetadata",(function(t){return at.durationUpdate.call(e,t)})),Ie.call(e,e.media,"ended",(function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())})),Ie.call(e,e.media,"progress playing seeking seeked",(function(t){return at.updateProgress.call(e,t)})),Ie.call(e,e.media,"volumechange",(function(t){return at.updateVolume.call(e,t)})),Ie.call(e,e.media,"playing play pause ended emptied timeupdate",(function(t){return bt.checkPlaying.call(e,t)})),Ie.call(e,e.media,"waiting canplay seeked playing",(function(t){return bt.checkLoading.call(e,t)})),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var n=Ae.call(e,".".concat(e.config.classNames.video));if(!Z(n))return;Ie.call(e,t.container,"click",(function(a){([t.container,n].includes(a.target)||n.contains(a.target))&&(e.touch&&e.config.hideControls||(e.ended?(i.proxy(a,e.restart,"restart"),i.proxy(a,(function(){qe(e.play())}),"play")):i.proxy(a,(function(){qe(e.togglePlay())}),"play")))}))}e.supported.ui&&e.config.disableContextMenu&&Ie.call(e,t.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),Ie.call(e,e.media,"volumechange",(function(){e.storage.set({volume:e.volume,muted:e.muted})})),Ie.call(e,e.media,"ratechange",(function(){at.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})})),Ie.call(e,e.media,"qualitychange",(function(t){at.updateSetting.call(e,"quality",null,t.detail.quality)})),Ie.call(e,e.media,"ready qualitychange",(function(){at.setDownloadUrl.call(e)}));var a=e.config.events.concat(["keyup","keydown"]).join(" ");Ie.call(e,e.media,a,(function(n){var i=n.detail,a=void 0===i?{}:i;"error"===n.type&&(a=e.media.error),_e.call(e,t.container,n.type,!0,a)}))})),a(this,"proxy",(function(e,t,n){var a=i.player,r=a.config.listeners[n],o=!0;$(r)&&(o=r.call(a,e)),!1!==o&&$(t)&&t.call(a,e)})),a(this,"bind",(function(e,t,n,a){var r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=i.player,s=o.config.listeners[a],l=$(s);Ie.call(o,e,t,(function(e){return i.proxy(e,n,a)}),r&&!l)})),a(this,"controls",(function(){var e=i.player,t=e.elements,n=le.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach((function(t){i.bind(t,"click",(function(){qe(e.togglePlay())}),"play")})),i.bind(t.buttons.restart,"click",e.restart,"restart"),i.bind(t.buttons.rewind,"click",(function(){e.lastSeekTime=Date.now(),e.rewind()}),"rewind"),i.bind(t.buttons.fastForward,"click",(function(){e.lastSeekTime=Date.now(),e.forward()}),"fastForward"),i.bind(t.buttons.mute,"click",(function(){e.muted=!e.muted}),"mute"),i.bind(t.buttons.captions,"click",(function(){return e.toggleCaptions()})),i.bind(t.buttons.download,"click",(function(){_e.call(e,e.media,"download")}),"download"),i.bind(t.buttons.fullscreen,"click",(function(){e.fullscreen.toggle()}),"fullscreen"),i.bind(t.buttons.pip,"click",(function(){e.pip="toggle"}),"pip"),i.bind(t.buttons.airplay,"click",e.airplay,"airplay"),i.bind(t.buttons.settings,"click",(function(t){t.stopPropagation(),t.preventDefault(),at.toggleMenu.call(e,t)}),null,!1),i.bind(t.buttons.settings,"keyup",(function(t){var n=t.which;[13,32].includes(n)&&(13!==n?(t.preventDefault(),t.stopPropagation(),at.toggleMenu.call(e,t)):at.focusFirstMenuItem.call(e,null,!0))}),null,!1),i.bind(t.settings.menu,"keydown",(function(t){27===t.which&&at.toggleMenu.call(e,t)})),i.bind(t.inputs.seek,"mousedown mousemove",(function(e){var n=t.progress.getBoundingClientRect(),i=100/n.width*(e.pageX-n.left);e.currentTarget.setAttribute("seek-value",i)})),i.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(function(t){var n=t.currentTarget,i=t.keyCode?t.keyCode:t.which,a="play-on-seeked";if(!te(t)||39===i||37===i){e.lastSeekTime=Date.now();var r=n.hasAttribute(a),o=["mouseup","touchend","keyup"].includes(t.type);r&&o?(n.removeAttribute(a),qe(e.play())):!o&&e.playing&&(n.setAttribute(a,""),e.pause())}})),le.isIos){var a=Ce.call(e,'input[type="range"]');Array.from(a).forEach((function(e){return i.bind(e,n,(function(e){return se(e.target)}))}))}i.bind(t.inputs.seek,n,(function(t){var n=t.currentTarget,i=n.getAttribute("seek-value");re(i)&&(i=n.value),n.removeAttribute("seek-value"),e.currentTime=i/n.max*e.duration}),"seek"),i.bind(t.progress,"mouseenter mouseleave mousemove",(function(t){return at.updateSeekTooltip.call(e,t)})),i.bind(t.progress,"mousemove touchmove",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startMove(t)})),i.bind(t.progress,"mouseleave touchend click",(function(){var t=e.previewThumbnails;t&&t.loaded&&t.endMove(!1,!0)})),i.bind(t.progress,"mousedown touchstart",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startScrubbing(t)})),i.bind(t.progress,"mouseup touchend",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.endScrubbing(t)})),le.isWebkit&&Array.from(Ce.call(e,'input[type="range"]')).forEach((function(t){i.bind(t,"input",(function(t){return at.updateRangeFill.call(e,t.target)}))})),e.config.toggleInvert&&!Z(t.display.duration)&&i.bind(t.display.currentTime,"click",(function(){0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,at.timeUpdate.call(e))})),i.bind(t.inputs.volume,n,(function(t){e.volume=t.target.value}),"volume"),i.bind(t.controls,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type})),t.fullscreen&&Array.from(t.fullscreen.children).filter((function(e){return!e.contains(t.container)})).forEach((function(n){i.bind(n,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type}))})),i.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",(function(e){t.controls.pressed=["mousedown","touchstart"].includes(e.type)})),i.bind(t.controls,"focusin",(function(){var n=e.config,a=e.timers;we(t.controls,n.classNames.noTransition,!0),bt.toggleControls.call(e,!0),setTimeout((function(){we(t.controls,n.classNames.noTransition,!1)}),0);var r=i.touch?3e3:4e3;clearTimeout(a.controls),a.controls=setTimeout((function(){return bt.toggleControls.call(e,!1)}),r)})),i.bind(t.inputs.volume,"wheel",(function(t){var n=t.webkitDirectionInvertedFromDevice,i=l([t.deltaX,-t.deltaY].map((function(e){return n?-e:e})),2),a=i[0],r=i[1],o=Math.sign(Math.abs(a)>Math.abs(r)?a:r);e.increaseVolume(o/50);var s=e.media.volume;(1===o&&s<1||-1===o&&s>0)&&t.preventDefault()}),"volume",!1)})),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 i(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,a="keydown"===e.type,r=a&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&Y(i)){if(a){var o=document.activeElement;if(Z(o)){var s=t.config.selectors.editable;if(o!==n.inputs.seek&&Te(o,s))return;if(32===e.which&&Te(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:r||(t.currentTime=t.duration/10*(i-48));break;case 32:case 75:r||qe(t.togglePlay());break;case 38:t.increaseVolume(.1);break;case 40:t.decreaseVolume(.1);break;case 77:r||(t.muted=!t.muted);break;case 39:t.forward();break;case 37:t.rewind();break;case 70:t.fullscreen.toggle();break;case 67:r||t.toggleCaptions();break;case 76:t.loop=!t.loop}27===i&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){at.toggleMenu.call(this.player,e)}}]),e}();"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self&&self;var wt=function(e,t){return e(t={exports:{}},t.exports),t.exports}((function(e,t){e.exports=function(){var e=function(){},t={},n={},i={};function a(e,t){e=e.push?e:[e];var a,r,o,s=[],l=e.length,c=l;for(a=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)r=e[l],(o=n[r])?a(r,o):(i[r]=i[r]||[]).push(a)}function r(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 o(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function s(t,n,i,a){var r,o,l=document,c=i.async,u=(i.numRetries||0)+1,d=i.before||e,h=t.replace(/[\?|#].*$/,""),m=t.replace(/^(css|img)!/,"");a=a||0,/(^css!|\.css$)/.test(h)?((o=l.createElement("link")).rel="stylesheet",o.href=m,(r="hideFocus"in o)&&o.relList&&(r=0,o.rel="preload",o.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(h)?(o=l.createElement("img")).src=m:((o=l.createElement("script")).src=t,o.async=void 0===c||c),o.onload=o.onerror=o.onbeforeload=function(e){var l=e.type[0];if(r)try{o.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l){if((a+=1)<u)return s(t,n,i,a)}else if("preload"==o.rel&&"style"==o.as)return o.rel="stylesheet";n(t,l,e.defaultPrevented)},!1!==d(t,o)&&l.head.appendChild(o)}function l(e,t,n){var i,a,r=(e=e.push?e:[e]).length,o=r,l=[];for(i=function(e,n,i){if("e"==n&&l.push(e),"b"==n){if(!i)return;l.push(e)}--r||t(l)},a=0;a<o;a++)s(e[a],i,n)}function c(e,n,i){var a,s;if(n&&n.trim&&(a=n),s=(a?i:n)||{},a){if(a in t)throw"LoadJS";t[a]=!0}function c(t,n){l(e,(function(e){o(s,e),t&&o({success:t,error:n},e),r(a,e)}),s)}if(s.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return a(e,(function(e){o(t,e)})),c},c.done=function(e){r(e,[])},c.reset=function(){t={},n={},i={}},c.isDefined=function(e){return e in t},c}()}));function kt(e){return new Promise((function(t,n){wt(e,{success:t,error:n})}))}function Tt(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,_e.call(this,this.media,e?"play":"pause"))}var Ct={setup:function(){var e=this;we(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,Ve.call(e),K(window.Vimeo)?Ct.ready.call(e):kt(e.config.urls.vimeo.sdk).then((function(){Ct.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,n=t.config.vimeo,i=n.premium,a=n.referrerPolicy,r=s(n,["premium","referrerPolicy"]);i&&Object.assign(r,{controls:!1,sidedock:!1});var c=ot(o({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},r)),u=t.media.getAttribute("src");re(u)&&(u=t.media.getAttribute(t.config.attributes.embed.id));var d,h=re(d=u)?null:Y(Number(d))?d:d.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:d,m=me("iframe"),p=We(t.config.urls.vimeo.iframe,h,c);if(m.setAttribute("src",p),m.setAttribute("allowfullscreen",""),m.setAttribute("allow",["autoplay","fullscreen","picture-in-picture"].join("; ")),re(a)||m.setAttribute("referrerPolicy",a),i||!n.customControls)m.setAttribute("data-poster",t.poster),t.media=ye(m,t.media);else{var f=me("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});f.appendChild(m),t.media=ye(f,t.media)}n.customControls||Ge(We(t.config.urls.vimeo.api,p)).then((function(e){!re(e)&&e.thumbnail_url&&bt.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(m,{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 Tt.call(t,!0),t.embed.play()},t.media.pause=function(){return Tt.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var g=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return g},set:function(e){var n=t.embed,i=t.media,a=t.paused,r=t.volume,o=a&&!n.hasPlayed;i.seeking=!0,_e.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(r)})).catch((function(){}))}});var y=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return y},set:function(e){t.embed.setPlaybackRate(e).then((function(){y=e,_e.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});var b=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return b},set:function(e){t.embed.setVolume(e).then((function(){b=e,_e.call(t,t.media,"volumechange")}))}});var v=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return v},set:function(e){var n=!!X(e)&&e;t.embed.setVolume(n?0:t.config.volume).then((function(){v=n,_e.call(t,t.media,"volumechange")}))}});var w,k=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return k},set:function(e){var n=X(e)?e:t.config.loop.active;t.embed.setLoop(n).then((function(){k=n}))}}),t.embed.getVideoUrl().then((function(e){w=e,at.setDownloadUrl.call(t)})).catch((function(t){e.debug.warn(t)})),Object.defineProperty(t.media,"currentSrc",{get:function(){return w}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then((function(n){var i=l(n,2),a=i[0],r=i[1];t.embed.ratio=[a,r],Ve.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(n){t.config.title=n,bt.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){g=e,_e.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,_e.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,st.setup.call(t)})),t.embed.on("cuechange",(function(e){var n=e.cues,i=(void 0===n?[]:n).map((function(e){return function(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}(e.text)}));st.updateCues.call(t,i)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){Tt.call(t,!e),e||_e.call(t,t.media,"playing")})),Z(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){_e.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){_e.call(t,t.media,"playing")})),t.embed.on("play",(function(){Tt.call(t,!0),_e.call(t,t.media,"playing")})),t.embed.on("pause",(function(){Tt.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,g=e.seconds,_e.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,_e.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&_e.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,_e.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,_e.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,_e.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,_e.call(t,t.media,"error")})),n.customControls&&setTimeout((function(){return bt.build.call(t)}),0)}};function At(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,_e.call(this,this.media,e?"play":"pause"))}function St(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var Pt={setup:function(){var e=this;if(we(this.elements.wrapper,this.config.classNames.embed,!0),K(window.YT)&&$(window.YT.Player))Pt.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){$(t)&&t(),Pt.ready.call(e)},kt(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;Ge(We(this.config.urls.youtube.api,e)).then((function(e){if(K(e)){var n=e.title,i=e.height,a=e.width;t.config.title=n,bt.setTitle.call(t),t.embed.ratio=[a,i]}Ve.call(t)})).catch((function(){Ve.call(t)}))},ready:function(){var e=this,t=e.config.youtube,n=e.media&&e.media.getAttribute("id");if(re(n)||!n.startsWith("youtube-")){var i=e.media.getAttribute("src");re(i)&&(i=e.media.getAttribute(this.config.attributes.embed.id));var a,r,o=re(a=i)?null:a.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:a,s=me("div",{id:(r=e.provider,"".concat(r,"-").concat(Math.floor(1e4*Math.random()))),"data-poster":t.customControls?e.poster:void 0});if(e.media=ye(s,e.media),t.customControls){var l=function(e){return"https://i.ytimg.com/vi/".concat(o,"/").concat(e,"default.jpg")};yt(l("maxres"),121).catch((function(){return yt(l("sd"),121)})).catch((function(){return yt(l("hq"))})).then((function(t){return bt.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(e.media,{videoId:o,host:St(t),playerVars:ue({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),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},_e.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),_e.call(e,e.media,"ratechange")},onReady:function(n){if(!$(e.media.play)){var i=n.target;Pt.getTitle.call(e,o),e.media.play=function(){At.call(e,!0),i.playVideo()},e.media.pause=function(){At.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,_e.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 a=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return a},set:function(t){a=t,i.setVolume(100*a),_e.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var n=X(t)?t:r;r=n,i[n?"mute":"unMute"](),i.setVolume(100*a),_e.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}});var s=i.getAvailablePlaybackRates();e.options.speed=s.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),_e.call(e,e.media,"timeupdate"),_e.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)&&_e.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),_e.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return bt.build.call(e)}),50)}},onStateChange:function(n){var i=n.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(n.data)&&(e.media.seeking=!1,_e.call(e,e.media,"seeked")),n.data){case-1:_e.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),_e.call(e,e.media,"progress");break;case 0:At.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):_e.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(At.call(e,!0),_e.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){_e.call(e,e.media,"timeupdate")}),50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),_e.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),At.call(e,!1);break;case 3:_e.call(e,e.media,"waiting")}_e.call(e,e.elements.container,"statechange",!1,{code:n.data})}}})}}},Et={setup:function(){this.media?(we(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),we(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&we(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=me("div",{class:this.config.classNames.video}),de(this.media,this.elements.wrapper),this.elements.poster=me("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Be.setup.call(this):this.isYouTube?Pt.setup.call(this):this.isVimeo&&Ct.setup.call(this)):this.debug.warn("No media element found!")}},Nt=function(){function e(n){var i=this;t(this,e),a(this,"load",(function(){i.enabled&&(K(window.google)&&K(window.google.ima)?i.ready():kt(i.player.config.urls.googleIMA.sdk).then((function(){i.ready()})).catch((function(){i.trigger("error",new Error("Google IMA SDK failed to load"))})))})),a(this,"ready",(function(){var e;i.enabled||((e=i).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),i.startSafetyTimer(12e3,"ready()"),i.managerPromise.then((function(){i.clearSafetyTimer("onAdsManagerLoaded()")})),i.listeners(),i.setupIMA()})),a(this,"setupIMA",(function(){i.elements.container=me("div",{class:i.player.config.classNames.ads}),i.player.elements.container.appendChild(i.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(i.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(i.player.config.playsinline),i.elements.displayContainer=new google.ima.AdDisplayContainer(i.elements.container,i.player.media),i.loader=new google.ima.AdsLoader(i.elements.displayContainer),i.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(function(e){return i.onAdsManagerLoaded(e)}),!1),i.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return i.onAdError(e)}),!1),i.requestAds()})),a(this,"requestAds",(function(){var e=i.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=i.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!i.player.muted),i.loader.requestAds(t)}catch(e){i.onAdError(e)}})),a(this,"pollCountdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!e)return clearInterval(i.countdownTimer),void i.elements.container.removeAttribute("data-badge-text");var t=function(){var e=it(Math.max(i.manager.getRemainingTime(),0)),t="".concat($e("advertisement",i.player.config)," - ").concat(e);i.elements.container.setAttribute("data-badge-text",t)};i.countdownTimer=setInterval(t,100)})),a(this,"onAdsManagerLoaded",(function(e){if(i.enabled){var t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,i.manager=e.getAdsManager(i.player,t),i.cuePoints=i.manager.getCuePoints(),i.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return i.onAdError(e)})),Object.keys(google.ima.AdEvent.Type).forEach((function(e){i.manager.addEventListener(google.ima.AdEvent.Type[e],(function(e){return i.onAdEvent(e)}))})),i.trigger("loaded")}})),a(this,"addCuePoints",(function(){re(i.cuePoints)||i.cuePoints.forEach((function(e){if(0!==e&&-1!==e&&e<i.player.duration){var t=i.player.elements.progress;if(Z(t)){var n=100/i.player.duration*e,a=me("span",{class:i.player.config.classNames.cues});a.style.left="".concat(n.toString(),"%"),t.appendChild(a)}}}))})),a(this,"onAdEvent",(function(e){var t=i.player.elements.container,n=e.getAd(),a=e.getAdData();switch(function(e){_e.call(i.player,i.player.media,"ads".concat(e.replace(/_/g,"").toLowerCase()))}(e.type),e.type){case google.ima.AdEvent.Type.LOADED:i.trigger("loaded"),i.pollCountdown(!0),n.isLinear()||(n.width=t.offsetWidth,n.height=t.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:i.manager.setVolume(i.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:i.player.ended?i.loadAds():i.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:i.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:i.pollCountdown(),i.resumeContent();break;case google.ima.AdEvent.Type.LOG:a.adError&&i.player.debug.warn("Non-fatal ad error: ".concat(a.adError.getMessage()))}})),a(this,"onAdError",(function(e){i.cancel(),i.player.debug.warn("Ads error",e)})),a(this,"listeners",(function(){var e,t=i.player.elements.container;i.player.on("canplay",(function(){i.addCuePoints()})),i.player.on("ended",(function(){i.loader.contentComplete()})),i.player.on("timeupdate",(function(){e=i.player.currentTime})),i.player.on("seeked",(function(){var t=i.player.currentTime;re(i.cuePoints)||i.cuePoints.forEach((function(n,a){e<n&&n<t&&(i.manager.discardAdBreak(),i.cuePoints.splice(a,1))}))})),window.addEventListener("resize",(function(){i.manager&&i.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)}))})),a(this,"play",(function(){var e=i.player.elements.container;i.managerPromise||i.resumeContent(),i.managerPromise.then((function(){i.manager.setVolume(i.player.volume),i.elements.displayContainer.initialize();try{i.initialized||(i.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),i.manager.start()),i.initialized=!0}catch(e){i.onAdError(e)}})).catch((function(){}))})),a(this,"resumeContent",(function(){i.elements.container.style.zIndex="",i.playing=!1,qe(i.player.media.play())})),a(this,"pauseContent",(function(){i.elements.container.style.zIndex=3,i.playing=!0,i.player.media.pause()})),a(this,"cancel",(function(){i.initialized&&i.resumeContent(),i.trigger("error"),i.loadAds()})),a(this,"loadAds",(function(){i.managerPromise.then((function(){i.manager&&i.manager.destroy(),i.managerPromise=new Promise((function(e){i.on("loaded",e),i.player.debug.log(i.manager)})),i.initialized=!1,i.requestAds()})).catch((function(){}))})),a(this,"trigger",(function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),a=1;a<t;a++)n[a-1]=arguments[a];var r=i.events[e];J(r)&&r.forEach((function(e){$(e)&&e.apply(i,n)}))})),a(this,"on",(function(e,t){return J(i.events[e])||(i.events[e]=[]),i.events[e].push(t),i})),a(this,"startSafetyTimer",(function(e,t){i.player.debug.log("Safety timer invoked from: ".concat(t)),i.safetyTimer=setTimeout((function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")}),e)})),a(this,"clearSafetyTimer",(function(e){z(i.safetyTimer)||(i.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(i.safetyTimer),i.safetyTimer=null)})),this.player=n,this.config=n.config.ads,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 i(e,[{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!re(e.publisherId)||ae(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(ae(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(ot(t))}}]),e}(),Mt=function(e,t){var n={};return e>t.width/t.height?(n.width=t.width,n.height=1/e*t.width):(n.height=t.height,n.width=e*t.height),n},xt=function(){function e(n){var i=this;t(this,e),a(this,"load",(function(){i.player.elements.display.seekTooltip&&(i.player.elements.display.seekTooltip.hidden=i.enabled),i.enabled&&i.getThumbnails().then((function(){i.enabled&&(i.render(),i.determineContainerAutoSizing(),i.loaded=!0)}))})),a(this,"getThumbnails",(function(){return new Promise((function(e){var t=i.player.config.previewThumbnails.src;if(re(t))throw new Error("Missing previewThumbnails.src config attribute");var n=function(){i.thumbnails.sort((function(e,t){return e.height-t.height})),i.player.debug.log("Preview thumbnails",i.thumbnails),e()};if($(t))t((function(e){i.thumbnails=e,n()}));else{var a=(Q(t)?[t]:t).map((function(e){return i.getThumbnail(e)}));Promise.all(a).then(n)}}))})),a(this,"getThumbnail",(function(e){return new Promise((function(t){Ge(e).then((function(n){var a,r,o={frames:(a=n,r=[],a.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var t={};e.split(/\r\n|\n|\r/).forEach((function(e){if(Y(t.startTime)){if(!re(e.trim())&&re(t.text)){var n=e.trim().split("#xywh="),i=l(n,1);if(t.text=i[0],n[1]){var a=l(n[1].split(","),4);t.x=a[0],t.y=a[1],t.w=a[2],t.h=a[3]}}}else{var r=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);r&&(t.startTime=60*Number(r[1]||0)*60+60*Number(r[2])+Number(r[3])+Number("0.".concat(r[4])),t.endTime=60*Number(r[6]||0)*60+60*Number(r[7])+Number(r[8])+Number("0.".concat(r[9])))}})),t.text&&r.push(t)})),r),height:null,urlPrefix:""};o.frames[0].text.startsWith("/")||o.frames[0].text.startsWith("http://")||o.frames[0].text.startsWith("https://")||(o.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var s=new Image;s.onload=function(){o.height=s.naturalHeight,o.width=s.naturalWidth,i.thumbnails.push(o),t()},s.src=o.urlPrefix+o.frames[0].text}))}))})),a(this,"startMove",(function(e){if(i.loaded&&ee(e)&&["touchmove","mousemove"].includes(e.type)&&i.player.media.duration){if("touchmove"===e.type)i.seekTime=i.player.media.duration*(i.player.elements.inputs.seek.value/100);else{var t=i.player.elements.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);i.seekTime=i.player.media.duration*(n/100),i.seekTime<0&&(i.seekTime=0),i.seekTime>i.player.media.duration-1&&(i.seekTime=i.player.media.duration-1),i.mousePosX=e.pageX,i.elements.thumb.time.innerText=it(i.seekTime)}i.showImageAtCurrentTime()}})),a(this,"endMove",(function(){i.toggleThumbContainer(!1,!0)})),a(this,"startScrubbing",(function(e){(z(e.button)||!1===e.button||0===e.button)&&(i.mouseDown=!0,i.player.media.duration&&(i.toggleScrubbingContainer(!0),i.toggleThumbContainer(!1,!0),i.showImageAtCurrentTime()))})),a(this,"endScrubbing",(function(){i.mouseDown=!1,Math.ceil(i.lastTime)===Math.ceil(i.player.media.currentTime)?i.toggleScrubbingContainer(!1):Oe.call(i.player,i.player.media,"timeupdate",(function(){i.mouseDown||i.toggleScrubbingContainer(!1)}))})),a(this,"listeners",(function(){i.player.on("play",(function(){i.toggleThumbContainer(!1,!0)})),i.player.on("seeked",(function(){i.toggleThumbContainer(!1)})),i.player.on("timeupdate",(function(){i.lastTime=i.player.media.currentTime}))})),a(this,"render",(function(){i.elements.thumb.container=me("div",{class:i.player.config.classNames.previewThumbnails.thumbContainer}),i.elements.thumb.imageContainer=me("div",{class:i.player.config.classNames.previewThumbnails.imageContainer}),i.elements.thumb.container.appendChild(i.elements.thumb.imageContainer);var e=me("div",{class:i.player.config.classNames.previewThumbnails.timeContainer});i.elements.thumb.time=me("span",{},"00:00"),e.appendChild(i.elements.thumb.time),i.elements.thumb.container.appendChild(e),Z(i.player.elements.progress)&&i.player.elements.progress.appendChild(i.elements.thumb.container),i.elements.scrubbing.container=me("div",{class:i.player.config.classNames.previewThumbnails.scrubbingContainer}),i.player.elements.wrapper.appendChild(i.elements.scrubbing.container)})),a(this,"destroy",(function(){i.elements.thumb.container&&i.elements.thumb.container.remove(),i.elements.scrubbing.container&&i.elements.scrubbing.container.remove()})),a(this,"showImageAtCurrentTime",(function(){i.mouseDown?i.setScrubbingContainerSize():i.setThumbContainerSizeAndPos();var e=i.thumbnails[0].frames.findIndex((function(e){return i.seekTime>=e.startTime&&i.seekTime<=e.endTime})),t=e>=0,n=0;i.mouseDown||i.toggleThumbContainer(t),t&&(i.thumbnails.forEach((function(t,a){i.loadedImages.includes(t.frames[e].text)&&(n=a)})),e!==i.showingThumb&&(i.showingThumb=e,i.loadImage(n)))})),a(this,"loadImage",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=i.showingThumb,n=i.thumbnails[e],a=n.urlPrefix,r=n.frames[t],o=n.frames[t].text,s=a+o;if(i.currentImageElement&&i.currentImageElement.dataset.filename===o)i.showImage(i.currentImageElement,r,e,t,o,!1),i.currentImageElement.dataset.index=t,i.removeOldImages(i.currentImageElement);else{i.loadingImage&&i.usingSprites&&(i.loadingImage.onload=null);var l=new Image;l.src=s,l.dataset.index=t,l.dataset.filename=o,i.showingThumbFilename=o,i.player.debug.log("Loading image: ".concat(s)),l.onload=function(){return i.showImage(l,r,e,t,o,!0)},i.loadingImage=l,i.removeOldImages(l)}})),a(this,"showImage",(function(e,t,n,a,r){var o=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];i.player.debug.log("Showing thumb: ".concat(r,". num: ").concat(a,". qual: ").concat(n,". newimg: ").concat(o)),i.setImageSizeAndOffset(e,t),o&&(i.currentImageContainer.appendChild(e),i.currentImageElement=e,i.loadedImages.includes(r)||i.loadedImages.push(r)),i.preloadNearby(a,!0).then(i.preloadNearby(a,!1)).then(i.getHigherQuality(n,e,t,r))})),a(this,"removeOldImages",(function(e){Array.from(i.currentImageContainer.children).forEach((function(t){if("img"===t.tagName.toLowerCase()){var n=i.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;var a=i.currentImageContainer;setTimeout((function(){a.removeChild(t),i.player.debug.log("Removing thumb: ".concat(t.dataset.filename))}),n)}}}))})),a(this,"preloadNearby",(function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(n){setTimeout((function(){var a=i.thumbnails[0].frames[e].text;if(i.showingThumbFilename===a){var r;r=t?i.thumbnails[0].frames.slice(e):i.thumbnails[0].frames.slice(0,e).reverse();var o=!1;r.forEach((function(e){var t=e.text;if(t!==a&&!i.loadedImages.includes(t)){o=!0,i.player.debug.log("Preloading thumb filename: ".concat(t));var r=i.thumbnails[0].urlPrefix+t,s=new Image;s.src=r,s.onload=function(){i.player.debug.log("Preloaded thumb filename: ".concat(t)),i.loadedImages.includes(t)||i.loadedImages.push(t),n()}}})),o||n()}}),300)}))})),a(this,"getHigherQuality",(function(e,t,n,a){if(e<i.thumbnails.length-1){var r=t.naturalHeight;i.usingSprites&&(r=n.h),r<i.thumbContainerHeight&&setTimeout((function(){i.showingThumbFilename===a&&(i.player.debug.log("Showing higher quality thumb for: ".concat(a)),i.loadImage(e+1))}),300)}})),a(this,"toggleThumbContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=i.player.config.classNames.previewThumbnails.thumbContainerShown;i.elements.thumb.container.classList.toggle(n,e),!e&&t&&(i.showingThumb=null,i.showingThumbFilename=null)})),a(this,"toggleScrubbingContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=i.player.config.classNames.previewThumbnails.scrubbingContainerShown;i.elements.scrubbing.container.classList.toggle(t,e),e||(i.showingThumb=null,i.showingThumbFilename=null)})),a(this,"determineContainerAutoSizing",(function(){(i.elements.thumb.imageContainer.clientHeight>20||i.elements.thumb.imageContainer.clientWidth>20)&&(i.sizeSpecifiedInCSS=!0)})),a(this,"setThumbContainerSizeAndPos",(function(){if(i.sizeSpecifiedInCSS){if(i.elements.thumb.imageContainer.clientHeight>20&&i.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(i.elements.thumb.imageContainer.clientHeight*i.thumbAspectRatio);i.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(i.elements.thumb.imageContainer.clientHeight<20&&i.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(i.elements.thumb.imageContainer.clientWidth/i.thumbAspectRatio);i.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var n=Math.floor(i.thumbContainerHeight*i.thumbAspectRatio);i.elements.thumb.imageContainer.style.height="".concat(i.thumbContainerHeight,"px"),i.elements.thumb.imageContainer.style.width="".concat(n,"px")}i.setThumbContainerPos()})),a(this,"setThumbContainerPos",(function(){var e=i.player.elements.progress.getBoundingClientRect(),t=i.player.elements.container.getBoundingClientRect(),n=i.elements.thumb.container,a=t.left-e.left+10,r=t.right-e.left-n.clientWidth-10,o=i.mousePosX-e.left-n.clientWidth/2;o<a&&(o=a),o>r&&(o=r),n.style.left="".concat(o,"px")})),a(this,"setScrubbingContainerSize",(function(){var e=Mt(i.thumbAspectRatio,{width:i.player.media.clientWidth,height:i.player.media.clientHeight}),t=e.width,n=e.height;i.elements.scrubbing.container.style.width="".concat(t,"px"),i.elements.scrubbing.container.style.height="".concat(n,"px")})),a(this,"setImageSizeAndOffset",(function(e,t){if(i.usingSprites){var n=i.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*n,"px"),e.style.width="".concat(e.naturalWidth*n,"px"),e.style.left="-".concat(t.x*n,"px"),e.style.top="-".concat(t.y*n,"px")}})),this.player=n,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return i(e,[{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?Mt(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),It={insertElements:function(e,t){var n=this;Q(t)?pe(e,this.media,{src:t}):J(t)&&t.forEach((function(t){pe(e,n.media,t)}))},change:function(e){var t=this;ce(e,"sources.length")?(Be.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],fe(t.media),t.media=null,Z(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,a=l(n,1)[0],r=a.provider,o=void 0===r?dt.html5:r,s=a.src,c="html5"===o?i:"div",u="html5"===o?{}:{src:s};Object.assign(t,{provider:o,type:i,supported:Ne.check(i,o,t.config.playsinline),media:me(c,u)}),t.elements.container.appendChild(t.media),X(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),re(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","")),bt.addStyleHook.call(t),t.isHTML5&&It.insertElements.call(t,"source",n),t.config.title=e.title,Et.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&It.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&bt.build.call(t),t.isHTML5&&t.media.load(),re(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new xt(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};var Lt,Ot=function(){function e(n,i){var r=this;if(t(this,e),a(this,"play",(function(){return $(r.media.play)?(r.ads&&r.ads.enabled&&r.ads.managerPromise.then((function(){return r.ads.play()})).catch((function(){return qe(r.media.play())})),r.media.play()):null})),a(this,"pause",(function(){return r.playing&&$(r.media.pause)?r.media.pause():null})),a(this,"togglePlay",(function(e){return(X(e)?e:!r.playing)?r.play():r.pause()})),a(this,"stop",(function(){r.isHTML5?(r.pause(),r.restart()):$(r.media.stop)&&r.media.stop()})),a(this,"restart",(function(){r.currentTime=0})),a(this,"rewind",(function(e){r.currentTime-=Y(e)?e:r.config.seekTime})),a(this,"forward",(function(e){r.currentTime+=Y(e)?e:r.config.seekTime})),a(this,"increaseVolume",(function(e){var t=r.media.muted?0:r.volume;r.volume=t+(Y(e)?e:0)})),a(this,"decreaseVolume",(function(e){r.increaseVolume(-e)})),a(this,"airplay",(function(){Ne.airplay&&r.media.webkitShowPlaybackTargetPicker()})),a(this,"toggleControls",(function(e){if(r.supported.ui&&!r.isAudio){var t=ke(r.elements.container,r.config.classNames.hideControls),n=void 0===e?void 0:!e,i=we(r.elements.container,r.config.classNames.hideControls,n);if(i&&J(r.config.controls)&&r.config.controls.includes("settings")&&!re(r.config.settings)&&at.toggleMenu.call(r,!1),i!==t){var a=i?"controlshidden":"controlsshown";_e.call(r,r.media,a)}return!i}return!1})),a(this,"on",(function(e,t){Ie.call(r,r.elements.container,e,t)})),a(this,"once",(function(e,t){Oe.call(r,r.elements.container,e,t)})),a(this,"off",(function(e,t){Le(r.elements.container,e,t)})),a(this,"destroy",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(r.ready){var n=function(){document.body.style.overflow="",r.embed=null,t?(Object.keys(r.elements).length&&(fe(r.elements.buttons.play),fe(r.elements.captions),fe(r.elements.controls),fe(r.elements.wrapper),r.elements.buttons.play=null,r.elements.captions=null,r.elements.controls=null,r.elements.wrapper=null),$(e)&&e()):(je.call(r),Be.cancelRequests.call(r),ye(r.elements.original,r.elements.container),_e.call(r,r.elements.original,"destroyed",!0),$(e)&&e.call(r.elements.original),r.ready=!1,setTimeout((function(){r.elements=null,r.media=null}),200))};r.stop(),clearTimeout(r.timers.loading),clearTimeout(r.timers.controls),clearTimeout(r.timers.resized),r.isHTML5?(bt.toggleNativeControls.call(r,!0),n()):r.isYouTube?(clearInterval(r.timers.buffering),clearInterval(r.timers.playing),null!==r.embed&&$(r.embed.destroy)&&r.embed.destroy(),n()):r.isVimeo&&(null!==r.embed&&r.embed.unload().then(n),setTimeout(n,200))}})),a(this,"supports",(function(e){return Ne.mime.call(r,e)})),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=Ne.touch,this.media=n,Q(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||G(this.media)||J(this.media))&&(this.media=this.media[0]),this.config=ue({},lt,e.defaults,i||{},function(){try{return JSON.parse(r.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 ft(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",Ne),!z(this.media)&&Z(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(Ne.check().api){var o=this.media.cloneNode(!0);o.autoplay=!1,this.elements.original=o;var s=this.media.tagName.toLowerCase(),l=null,c=null;switch(s){case"div":if(l=this.media.querySelector("iframe"),Z(l)){if(c=rt(l.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?dt.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?dt.vimeo:null}(c.toString()),this.elements.container=this.media,this.media=l,this.elements.container.className="",c.search.length){var u=["1","true"];u.includes(c.searchParams.get("autoplay"))&&(this.config.autoplay=!0),u.includes(c.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=u.includes(c.searchParams.get("playsinline")),this.config.youtube.hl=c.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(re(this.provider)||!Object.values(dt).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=mt;break;case"video":case"audio":this.type=s,this.provider=dt.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=Ne.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new vt(this),this.storage=new Je(this),this.media.plyr=this,Z(this.elements.container)||(this.elements.container=me("div",{tabindex:0}),de(this.media,this.elements.container)),bt.migrateStyles.call(this),bt.addStyleHook.call(this),Et.setup.call(this),this.config.debug&&Ie.call(this,this.elements.container,this.config.events.join(" "),(function(e){r.debug.log("event: ".concat(e.type))})),this.fullscreen=new gt(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&bt.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Nt(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return qe(r.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new xt(this))):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 i(e,[{key:"toggleCaptions",value:function(e){st.toggle.call(this,e,!1)}},{key:"isHTML5",get:function(){return this.provider===dt.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===dt.youtube}},{key:"isVimeo",get:function(){return this.provider===dt.vimeo}},{key:"isVideo",get:function(){return this.type===mt}},{key:"isAudio",get:function(){return this.type===ht}},{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=Y(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 Y(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=Y(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;Q(t)&&(t=Number(t)),Y(t)||(t=this.storage.get("volume")),Y(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!re(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;X(t)||(t=this.storage.get("muted")),X(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=this,n=null;Y(e)&&(n=e),Y(n)||(n=this.storage.get("speed")),Y(n)||(n=this.config.speed.selected);var i=this.minimumSpeed,a=this.maximumSpeed;n=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),n)}(n,i,a),this.config.speed.selected=n,setTimeout((function(){t.media.playbackRate=n}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,c(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,c(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!re(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(Y),a=!0;if(!n.includes(i)){var r=function(e,t){return J(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,a=!1}t.selected=i,this.media.quality=i,a&&this.storage.set({quality:i})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=X(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){It.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return ae(e)?e:this.source},set:function(e){ae(e)&&(this.config.urls.download=e,at.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?bt.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=Fe(Re.call(this));return J(e)?e.join(":"):e},set:function(e){this.isVideo?Q(e)&&He(e)?(this.config.ratio=e,Ve.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=X(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){st.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){st.setLanguage.call(this,e,!1)},get:function(){return(st.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(Ne.pip){var t=X(e)?e:!this.pip;$(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?ct:ut),$(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return Ne.pip?re(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===ct:null}}],[{key:"supported",value:function(e,t,n){return Ne.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return Ze(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return Q(t)?i=Array.from(document.querySelectorAll(t)):G(t)?i=Array.from(t):J(t)&&(i=t.filter(Z)),re(i)?null:i.map((function(t){return new e(t,n)}))}}]),e}();return Ot.defaults=(Lt=lt,JSON.parse(JSON.stringify(Lt))),Ot}));
//# sourceMappingURL=plyr.min.js.map
diff --git a/dist/plyr.min.js.map b/dist/plyr.min.js.map
index 78187f14..55fd43c4 100644
--- a/dist/plyr.min.js.map
+++ b/dist/plyr.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["plyr.js","node_modules/rangetouch/dist/rangetouch.mjs","src/js/utils/animation.js","src/js/utils/is.js","src/js/utils/browser.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/load-sprite.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/load-image.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js","src/js/utils/numbers.js"],"names":["navigator","global","factory","exports","module","define","amd","globalThis","self","Plyr","this","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","prototype","_defineProperty","obj","value","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","source","forEach","getOwnPropertyDescriptors","defineProperties","_objectWithoutProperties","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","sourceSymbolKeys","propertyIsEnumerable","call","_slicedToArray","arr","Array","isArray","_arrayWithHoles","Symbol","iterator","_arr","_n","_d","_e","undefined","_s","_i","next","done","err","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","from","_iterableToArray","_nonIterableSpread","o","minLen","n","toString","slice","constructor","name","test","len","arr2","e","t","r","defaults","addCSS","thumbWidth","watch","matches","document","querySelectorAll","includes","getConstructor","instanceOf","isNullOrUndefined","isObject","isString","String","isNodeList","NodeList","is","Element","Event","round","concat","match","Math","max","getDecimalPlaces","parseFloat","toFixed","element","events","type","RangeTouch","querySelector","rangeTouch","config","init","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","set","changedTouches","getAttribute","s","u","c","getBoundingClientRect","a","width","clientX","left","disabled","preventDefault","get","bubbles","dispatchEvent","trigger","MutationObserver","addedNodes","observe","body","childList","subtree","map","documentElement","input","Boolean","isFunction","Function","isEmpty","is$1","Number","isNaN","KeyboardEvent","TextTrack","kind","Promise","then","window","URL","string","startsWith","hostname","transitionEndEvent","createElement","WebkitTransition","MozTransition","OTransition","transition","find","event","repaint","delay","setTimeout","hidden","offsetHeight","browser","isIE","documentMode","isEdge","userAgent","isWebkit","isIPhone","platform","isIos","getDeep","path","split","reduce","extend","_len","sources","_key","shift","assign","wrap","elements","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","_ref","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hide","toggleClass","force","method","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","range","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","options","addEventListener","removeEventListener","toggleListener","callback","_this","toggle","passive","capture","eventListeners","on","off","once","_this2","onceCallback","args","triggerEvent","detail","CustomEvent","plyr","unbindListeners","item","ready","_this3","resolve","silencePromise","validateRatio","every","reduceAspectRatio","ratio","_ratio","height","divider","getDivider","w","h","getAspectRatio","parse","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","_player$media","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","dedupe","array","format","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","getHTML","innerHTML","resources","youtube","i18n","{seektime}","seekTime","{title}","title","k","v","Storage","storage","store","localStorage","getItem","json","JSON","setItem","stringify","removeItem","fetch","url","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","prefix","hasId","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","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","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","toCamelCase","label","labelPressed","iconPressed","some","control","button","createRange","min","step","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","node","bind","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","current","val","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sort","b","sorting","setCaptionsMenu","_this7","tracks","getTracks","track","toggled","language","unshift","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","values","popup","p","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","position","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","size","restore","propertyName","setDownloadUrl","download","create","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","href","urls","isEmbed","inject","_this11","floor","random","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","isYouTube","insertAfter","protocol","blob","createObjectURL","languages","userLanguage","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","has","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","cue","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","noop","Console","console","Fullscreen","property","scrollPosition","x","y","forceFallback","closest","el","parentElement","nodeType","proxy","trapFocus","scrollX","scrollY","scrollTo","overflow","viewport","head","hasProperty","cleanupViewport","part","keyCode","activeElement","first","last","shiftKey","native","webkitEnterFullscreen","toggleFallback","requestFullscreen","navigationUI","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","now","migrateStyles","getPropertyValue","removeProperty","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","firstChild","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","currentTarget","attribute","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","abs","loadjs_umd","fn","createCommonjsModule","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","q","splice","executeCallbacks","success","loadFile","numTries","isLegacyIECss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathname","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","defaultPrevented","loadFiles","paths","loadjs","arg1","arg2","loadFn","returnPromise","deps","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","$2","data-poster","thumbnail_url","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","stripHTML","getPaused","seconds","getHost","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","initialized","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","google","ima","destroy","remove","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this12","handlers","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","fitRatio","outer","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","promises","getThumbnail","vttDataString","processedList","thumbnail","frames","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","ceil","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","right","previewPos","_fitRatio","multiplier","top","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","failed","jQuery","WeakMap","original","getProviderByUrl","search","truthy","searchParams","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","clamp","updateStorage","prev","curr","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());\n}(this, (function () { 'use strict';\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n }\n\n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n }\n\n function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n }\n\n function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n }\n\n function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _classCallCheck$1(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function _defineProperties$1(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n }\n\n function _createClass$1(e, t, n) {\n return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n }\n\n function _defineProperty$1(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n\n function ownKeys$1(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n\n return n;\n }\n\n function _objectSpread2$1(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys$1(Object(n), !0).forEach(function (t) {\n _defineProperty$1(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$1(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n }\n\n var defaults = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n };\n\n function matches(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n }\n\n function trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n }\n\n var getConstructor = function getConstructor(e) {\n return null != e ? e.constructor : null;\n },\n instanceOf = function instanceOf(e, t) {\n return !!(e && t && e instanceof t);\n },\n isNullOrUndefined = function isNullOrUndefined(e) {\n return null == e;\n },\n isObject = function isObject(e) {\n return getConstructor(e) === Object;\n },\n isNumber = function isNumber(e) {\n return getConstructor(e) === Number && !Number.isNaN(e);\n },\n isString = function isString(e) {\n return getConstructor(e) === String;\n },\n isBoolean = function isBoolean(e) {\n return getConstructor(e) === Boolean;\n },\n isFunction = function isFunction(e) {\n return getConstructor(e) === Function;\n },\n isArray = function isArray(e) {\n return Array.isArray(e);\n },\n isNodeList = function isNodeList(e) {\n return instanceOf(e, NodeList);\n },\n isElement = function isElement(e) {\n return instanceOf(e, Element);\n },\n isEvent = function isEvent(e) {\n return instanceOf(e, Event);\n },\n isEmpty = function isEmpty(e) {\n return isNullOrUndefined(e) || (isString(e) || isArray(e) || isNodeList(e)) && !e.length || isObject(e) && !Object.keys(e).length;\n },\n is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n };\n\n function getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n }\n\n function round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n\n return Math.round(e / t) * t;\n }\n\n var RangeTouch = function () {\n function e(t, n) {\n _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());\n }\n\n return _createClass$1(e, [{\n key: \"init\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function value(e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function value(t) {\n if (!e.enabled || !is.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function value(t) {\n e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function value(t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type=\"range\"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\n var i = _objectSpread2$1({}, defaults, {}, n);\n\n if (is.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is.element(n) && matches(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n }();\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n var getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n };\n\n var instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n };\n\n var isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n };\n\n var isObject$1 = function isObject(input) {\n return getConstructor$1(input) === Object;\n };\n\n var isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n };\n\n var isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n };\n\n var isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n };\n\n var isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n };\n\n var isArray$1 = function isArray(input) {\n return Array.isArray(input);\n };\n\n var isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n };\n\n var isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n };\n\n var isElement$1 = function isElement(input) {\n return instanceOf$1(input, Element);\n };\n\n var isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n };\n\n var isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n };\n\n var isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n };\n\n var isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n };\n\n var isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n };\n\n var isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise) && isFunction$1(input.then);\n };\n\n var isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;\n };\n\n var isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n };\n\n var is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n };\n\n // ==========================================================================\n var transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n }(); // Force repaint of element\n\n function repaint(element, delay) {\n setTimeout(function () {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n element.hidden = false;\n } catch (e) {// Do nothing\n }\n }, delay);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n var browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\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\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n } // Get a nested value in an object\n\n function getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n } // Deep extend destination object with N more objects\n\n function extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n }\n\n function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // 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\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n } // Set attributes\n\n function setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n } // Create a DocumentFragment\n\n function createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n } // Inaert an element after another\n\n function insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n } // Insert a DocumentFragment\n\n function insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n } // Remove element(s)\n\n function removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n } // Remove all child elements\n\n function emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n } // Replace element\n\n function replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n } // Get an attribute object from a string selector\n\n 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 if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = extend({}, existingAttributes);\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n\n var _parts = _slicedToArray(parts, 1),\n key = _parts[0];\n\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.string(existing.class)) {\n attributes.class = \"\".concat(existing.class, \" \").concat(className);\n } else {\n attributes.class = className;\n }\n\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 break;\n }\n });\n return extend(existing, attributes);\n } // Toggle hidden\n\n function toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n } // eslint-disable-next-line no-param-reassign\n\n\n element.hidden = hide;\n } // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\n function toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\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 } // Has class name\n\n function hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n } // Element matches selector\n\n function matches$1(element, selector) {\n var _Element = Element,\n prototype = _Element.prototype;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n } // Closest ancestor element matching selector (also tests element itself)\n\n function closest(element, selector) {\n var _Element2 = Element,\n prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n function closestElement() {\n var el = this;\n\n do {\n if (matches$1.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n }\n\n var method = prototype.closest || closestElement;\n return method.call(element, selector);\n } // Find all elements\n\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n } // Find a single element\n\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n } // Set focus and tab focus class\n\n function setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n }\n\n var 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 }; // Check for feature support\n\n var support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\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: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\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 // Detect transitions support\n transitions: transitionEndEvent !== false,\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\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n\n var supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n }(); // Toggle event listener\n\n\n function toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n } // Bind event handler\n\n function on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n } // Unbind event handler\n\n function off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n } // Bind once-only event handler\n\n function once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n } // Trigger event\n\n function triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n } // Unbind all cached event listeners\n\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n } // Run method when / if player is ready\n\n function ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n }\n\n /**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n\n function silencePromise(value) {\n if (is$1.promise(value)) {\n value.then(null, function () {});\n }\n }\n\n function validateRatio(input) {\n if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {\n return false;\n }\n\n var ratio = is$1.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is$1.number);\n }\n function reduceAspectRatio(ratio) {\n if (!is$1.array(ratio) || !ratio.every(is$1.number)) {\n return null;\n }\n\n var _ratio = _slicedToArray(ratio, 2),\n width = _ratio[0],\n height = _ratio[1];\n\n var getDivider = function getDivider(w, h) {\n return h === 0 ? w : getDivider(h, w % h);\n };\n\n var divider = getDivider(width, height);\n return [width / divider, height / divider];\n }\n function getAspectRatio(input) {\n var parse = function parse(ratio) {\n return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n }; // Try provided ratio\n\n\n var ratio = parse(input); // Get from config\n\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n } // Get from embed\n\n\n if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {\n ratio = this.embed.ratio;\n } // Get from HTML5 video\n\n\n if (ratio === null && this.isHTML5) {\n var _this$media = this.media,\n videoWidth = _this$media.videoWidth,\n videoHeight = _this$media.videoHeight;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n } // Set aspect ratio for responsive container\n\n function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n var wrapper = this.elements.wrapper;\n var ratio = getAspectRatio.call(this, input);\n\n var _ref = is$1.array(ratio) ? ratio : [0, 0],\n _ref2 = _slicedToArray(_ref, 2),\n w = _ref2[0],\n h = _ref2[1];\n\n var padding = 100 / w * h;\n wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n var offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n }\n\n // ==========================================================================\n var html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n } // Get sizes from <source> elements\n\n\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('size'));\n }).filter(Boolean);\n },\n setup: function setup() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n if (!is$1.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n } // Quality\n\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (s) {\n return s.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('size'));\n },\n set: function set(input) {\n if (player.quality === input) {\n return;\n } // If we're using an an external handler...\n\n\n if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (s) {\n return Number(s.getAttribute('size')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState,\n playbackRate = _player$media.playbackRate; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.speed = playbackRate;\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n silencePromise(player.play());\n }\n }); // Load new source\n\n player.media.load();\n }\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // 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\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n };\n\n // ==========================================================================\n\n function dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n } // Get the closest value in an array\n\n function closest$1(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n }\n\n // ==========================================================================\n\n function generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n } // Format string\n\n function format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n } // Get percentage\n\n 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 } // Replace all occurances of a string in a string\n\n var replaceAll = function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n }; // Convert to title case\n\n var toTitleCase = function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n }; // Convert string to pascalCase\n\n function toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n } // Convert string to pascalCase\n\n function toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n } // Remove HTML from a string\n\n function stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n } // Like outerHTML, but also works for DocumentFragment\n\n function getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n var resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n var i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n k = _ref2[0],\n v = _ref2[1];\n\n string = replaceAll(string, k, v);\n });\n return string;\n }\n };\n\n var Storage = /*#__PURE__*/function () {\n function Storage(player) {\n _classCallCheck(this, Storage);\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, [{\n key: \"get\",\n value: function get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n }\n }, {\n key: \"set\",\n value: function set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = this.get(); // Default to empty object\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n }], [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // 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\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n }();\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n function fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\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 request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n }\n\n // ==========================================================================\n\n function loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n }\n\n // ==========================================================================\n\n var getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n };\n var getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n };\n var getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n }; // Format time to UI friendly string\n\n function formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n }\n\n var controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\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 }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\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 }; // Display\n\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 }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\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); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // 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\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n\n var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var _this = this;\n\n var attributes = extend({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some(function (c) {\n return c === _this.config.classNames.control;\n })) {\n extend(attributes, {\n class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.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 // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\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 }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type, attrs) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\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: function bindMenuItemShortcuts(menuItem, type) {\n var _this2 = this;\n\n // Navigate through menus via arrow keys and space\n on.call(this, menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this2, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this2, target, true);\n }\n }\n }, false); // 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\n on.call(this, menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this2, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this3 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(check) {\n // Ensure exclusivity\n if (check) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this3.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this3.quality = value;\n break;\n\n case 'speed':\n _this3.speed = parseFloat(value);\n break;\n }\n\n controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this4 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var val = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = val; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = val;\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); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this5 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(show) {\n return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n\n if (is$1.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 } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function 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 } // 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\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(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 // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this6.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this6, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this6.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this6, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this6, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\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 if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this7.captions.toggled && _this7.currentTrack === value,\n title: captions.getLabel.call(_this7, track),\n badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu() {\n var _this8 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n this.options.speed = this.options.speed.filter(function (o) {\n return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this8, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this8, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (p) {\n return !p.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;\n var isMenuItem = popup.contains(target); // 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\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.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$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this9 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function 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 } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this9, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl: function setDownloadUrl() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set attribute\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create: function create(data) {\n var _this10 = this;\n\n var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n createButton = controls.createButton,\n createProgress = controls.createProgress,\n createRange = controls.createRange,\n createTime = controls.createTime,\n setQualityMenu = controls.setQualityMenu,\n setSpeedMenu = controls.setSpeedMenu,\n showMenuPanel = controls.showMenuPanel;\n this.elements.controls = null; // Larger overlaid play button\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n } // Create the container\n\n\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container; // Default item attributes\n\n var defaultAttributes = {\n class: 'plyr__controls__item'\n }; // Loop through controls in order\n\n dedupe(is$1.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n } // Rewind button\n\n\n if (control === 'rewind') {\n container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n } // Play/Pause button\n\n\n if (control === 'play') {\n container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n } // Fast forward button\n\n\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n } // Progress\n\n\n if (control === 'progress') {\n var progressContainer = createElement('div', {\n class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n });\n var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(createRange.call(_this10, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (_this10.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: _this10.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n _this10.elements.display.seekTooltip = tooltip;\n }\n\n _this10.elements.progress = progress;\n progressContainer.appendChild(_this10.elements.progress);\n container.appendChild(progressContainer);\n } // Media current time display\n\n\n if (control === 'current-time') {\n container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n } // Media duration display\n\n\n if (control === 'duration') {\n container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n } // Volume controls\n\n\n if (control === 'mute' || control === 'volume') {\n var volume = _this10.elements.volume; // Create the volume container if needed\n\n if (!is$1.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n }));\n _this10.elements.volume = volume;\n container.appendChild(volume);\n } // Toggle mute button\n\n\n if (control === 'mute') {\n volume.appendChild(createButton.call(_this10, 'mute'));\n } // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: _this10.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n }\n } // Toggle captions button\n\n\n if (control === 'captions') {\n container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n } // Settings button / menu\n\n\n if (control === 'settings' && !is$1.empty(_this10.config.settings)) {\n var wrapper = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(_this10, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n _this10.elements.settings.panels.home = home; // Build the menu items\n\n _this10.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n on.call(_this10, menuItem, 'click', function () {\n showMenuPanel.call(_this10, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this10.config));\n var value = createElement('span', {\n class: _this10.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this10.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this10.config.classNames.hidden\n }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n on.call(_this10, pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n showMenuPanel.call(_this10, 'home', true);\n }, false); // Go back via button click\n\n on.call(_this10, backButton, 'click', function () {\n showMenuPanel.call(_this10, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this10.elements.settings.buttons[type] = menuItem;\n _this10.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n _this10.elements.settings.popup = popup;\n _this10.elements.settings.menu = wrapper;\n } // Picture in picture button\n\n\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n } // Airplay button\n\n\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n } // Download button\n\n\n if (control === 'download') {\n var _attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: _this10.download,\n target: '_blank'\n }); // Set download attribute for HTML5 only\n\n\n if (_this10.isHTML5) {\n _attributes.download = '';\n }\n\n var download = _this10.config.urls.download;\n\n if (!is$1.url(download) && _this10.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(_this10.provider),\n label: _this10.provider\n });\n }\n\n container.appendChild(createButton.call(_this10, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n }\n }); // Set available quality levels\n\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this11 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.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) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this11.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this11.config.classNames.hidden, false);\n toggleClass(label, _this11.config.classNames.tooltip, true);\n });\n }\n }\n };\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 */\n\n function parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var 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 } // Convert object to URLSearchParams\n\n function buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n }\n\n var captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\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\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n } // Add event listener for cue changes\n\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n 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\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n } // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n\n\n setTimeout(function () {\n if (active && _this2.captions.toggled) {\n _this2.captions.currentTrackNode.mode = 'hidden';\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: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.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 var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\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 // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\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: function getTracks() {\n var _this3 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // 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\n return tracks.filter(function (track) {\n return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this4 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this4.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (t) {\n return t.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.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 // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var 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 var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n var defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\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 // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\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 // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 // URLs\n urls: {\n download: null,\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/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\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 download: '[data-plyr=\"download\"]',\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',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\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 tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n var pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n var providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n var types = {\n audio: 'audio',\n video: 'video'\n };\n /**\n * Get provider by URL\n * @param {String} url\n */\n\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n var noop = function noop() {};\n\n var Console = /*#__PURE__*/function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n }();\n\n var Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(player) {\n var _this = this;\n\n _classCallCheck(this, Fullscreen);\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n\n this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n _this.onChange();\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n }); // Tap focus when in fullscreen\n\n on.call(this, this.player.elements.container, 'keydown', function (event) {\n return _this.trapFocus(event);\n }); // Update the UI\n\n this.update();\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"onChange\",\n value: function onChange() {\n if (!this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = this.active;\n } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event\n\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n }, {\n key: \"toggleFallback\",\n value: function toggleFallback() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\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 } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n }\n } // Toggle button and fire events\n\n\n this.onChange();\n } // Trap focus inside container\n\n }, {\n key: \"trapFocus\",\n value: function trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n var _focusable = _slicedToArray(focusable, 1),\n first = _focusable[0];\n\n var last = focusable[focusable.length - 1];\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 } // Update UI\n\n }, {\n key: \"update\",\n value: function update() {\n if (this.enabled) {\n var mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n } // Make an element fullscreen\n\n }, {\n key: \"enter\",\n value: function enter() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is$1.empty(this.prefix)) {\n this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n }\n } // Bail from fullscreen\n\n }, {\n key: \"exit\",\n value: function exit() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(this.prefix)) {\n var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n }\n } // Toggle state\n\n }, {\n key: \"toggle\",\n value: function toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n }, {\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n }();\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 function loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n }\n\n var ui = {\n addStyleHook: function 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 // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset speed\n\n this.speed = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\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\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('data-poster', poster); // Show the poster\n\n this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(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(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\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); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n Object.assign(target, {\n pressed: _this3.playing\n });\n target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controlsElement = this.elements.controls;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles: function migrateStyles() {\n var _this5 = this;\n\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n .filter(function (key) {\n return !is$1.empty(key) && is$1.string(key) && key.startsWith('--plyr');\n }).forEach(function (key) {\n // Set on the container\n _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n _this5.media.style.removeProperty(key);\n }); // Remove attribute if empty\n\n if (is$1.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n };\n\n var Listeners = /*#__PURE__*/function () {\n function Listeners(player) {\n _classCallCheck(this, Listeners);\n\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\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 } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\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 var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n 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)\n\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\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\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\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\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }, {\n key: \"firstTouch\",\n value: function firstTouch() {\n var player = this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n }, {\n key: \"setTabFocus\",\n value: function setTabFocus(event) {\n var player = this.player;\n var elements = player.elements;\n clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n if (event.type !== 'focusout') {\n this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n } // Global window & document listeners\n\n }, {\n key: \"global\",\n value: function global() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);\n } // Container listeners\n\n }, {\n key: \"container\",\n value: function container() {\n var player = this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controlsElement = elements.controls; // Remove button states for fullscreen\n\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio = _slicedToArray(ratio, 2),\n y = _ratio[1];\n\n var _getAspectRatio$call = getAspectRatio.call(player),\n _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n videoX = _getAspectRatio$call2[0],\n videoY = _getAspectRatio$call2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n if (target !== elements.container) {\n return;\n } // If it's not an embed and no ratio specified\n\n\n if (!player.isEmbed && is$1.empty(player.config.ratio)) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n if (isEnter) {\n setTimeout(function () {\n return repaint(elements.container);\n }, 100);\n } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n } // Listen for media events\n\n }, {\n key: \"media\",\n value: function media() {\n var _this = this;\n\n var player = this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n player.pause();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, function () {\n silencePromise(player.play());\n }, 'play');\n } else {\n _this.proxy(event, function () {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadUrl.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n } // Run default and custom handlers\n\n }, {\n key: \"proxy\",\n value: function proxy(event, defaultHandler, customHandlerKey) {\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned !== false && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n } // Trigger custom and default handlers\n\n }, {\n key: \"bind\",\n value: function bind(element, type, defaultHandler, customHandlerKey) {\n var _this2 = this;\n\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this2.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n } // Listen for control events\n\n }, {\n key: \"controls\",\n value: function controls$1() {\n var _this3 = this;\n\n var player = this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this3.bind(button, 'click', function () {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n } // Pause\n\n\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n this.bind(elements.buttons.rewind, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind'); // Rewind\n\n this.bind(elements.buttons.fastForward, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward'); // Mute toggle\n\n this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\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\n this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\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\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this3.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n this.bind(elements.progress, 'mouseleave touchend click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this3.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', function () {\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 } // Volume\n\n\n this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(function (c) {\n return !c.contains(elements.container);\n }).forEach(function (child) {\n _this3.bind(child, 'mouseenter mouseleave', function (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\n\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n }\n }]);\n\n return Listeners;\n }();\n\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\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 */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function 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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; // tag IE9+\n\n isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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]; // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // resolve Promise\n\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n } // publish bundle load event\n\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\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 */\n\n\n loadjs.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 return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n });\n\n // ==========================================================================\n function loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n function parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n var vimeo = {\n setup: function setup() {\n var player = this; // Add embed class for responsive\n\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set intial ratio\n\n setAspectRatio.call(player); // Load the SDK if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(player);\n }).catch(function (error) {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready: function ready() {\n var _this = this;\n\n var player = this;\n var config = player.config.vimeo;\n\n var premium = config.premium,\n referrerPolicy = config.referrerPolicy,\n frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n } // Get Vimeo params for the iframe\n\n\n var params = buildUrlParams(_objectSpread2({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, frameParams)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required\n\n if (!is$1.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n } // Inject the package\n\n\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n var wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n } // Get poster image\n\n\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n if (is$1.empty(response) || !response.thumbnail_url) {\n return;\n } // Set and show poster\n\n\n ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n });\n } // Setup instance\n // https://github.com/vimeo/player.js\n\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function () {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(function (error) {\n _this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = [width, height];\n setAspectRatio.call(_this);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', function () {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', function () {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n }\n };\n\n // ==========================================================================\n\n function parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n function getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n } // Use YouTube's default\n\n\n return undefined;\n }\n\n var youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n // Call global callback if set\n if (is$1.function(callback)) {\n callback();\n }\n\n youtube.ready.call(_this);\n }; // Load the SDK\n\n\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n var url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(function (data) {\n if (is$1.object(data)) {\n var title = data.title,\n height = data.height,\n width = data.width; // Set title\n\n _this2.config.title = title;\n ui.setTitle.call(_this2); // Set aspect ratio\n\n _this2.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(_this2);\n }).catch(function () {\n // Set aspect ratio\n setAspectRatio.call(_this2);\n });\n },\n // API ready\n ready: function ready() {\n var player = this;\n var config = player.config.youtube; // Ignore already setup (race condition)\n\n var currentId = player.media && player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Replace media element\n\n var container = createElement('div', {\n id: id,\n 'data-poster': config.customControls ? player.poster : undefined\n });\n player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n if (config.customControls) {\n var posterSrc = function posterSrc(s) {\n return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (src) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n } // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n\n player.embed = new window.YT.Player(player.media, {\n videoId: videoId,\n host: getHost(config),\n playerVars: extend({}, {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\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 player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function 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 } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n player.options.speed = speeds.filter(function (s) {\n return player.config.speed.options.includes(s);\n }); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui && config.customControls) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n }\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var 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 } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\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 (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // 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\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\n assurePlaybackState$1.call(player, false);\n break;\n\n case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n };\n\n // ==========================================================================\n var media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap(this.media, this.elements.wrapper); // Poster image container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: ''\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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\n var destroy = function destroy(instance) {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n } // Destroy our adsManager\n\n\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n };\n\n var Ads = /*#__PURE__*/function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n this.player = player;\n this.config = player.config.ads;\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; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"load\",\n\n /**\n * Load the IMA SDK\n */\n value: function load() {\n var _this2 = this;\n\n if (!this.enabled) {\n return;\n } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n _this2.ready();\n }).catch(function () {\n // Script failed to load or is blocked\n _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n /**\n * Get the ads instance ready\n */\n\n }, {\n key: \"ready\",\n value: function ready() {\n var _this3 = this;\n\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n } // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n\n\n this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n this.managerPromise.then(function () {\n _this3.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n this.listeners(); // Setup the IMA SDK\n\n this.setupIMA();\n } // Build the tag URL\n\n }, {\n key: \"setupIMA\",\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 value: function setupIMA() {\n var _this4 = this;\n\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); // So we can run VPAID2\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Create ads loader\n\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this4.onAdsManagerLoaded(event);\n }, false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this4.onAdError(error);\n }, false); // Request video ads to be pre-loaded\n\n this.requestAds();\n }\n /**\n * Request advertisements\n */\n\n }, {\n key: \"requestAds\",\n value: function requestAds() {\n var container = this.player.elements.container;\n\n try {\n // Request video ads\n var request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!this.player.muted);\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n\n }, {\n key: \"pollCountdown\",\n value: function pollCountdown() {\n var _this5 = this;\n\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n _this5.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n\n }, {\n key: \"onAdsManagerLoaded\",\n value: function onAdsManagerLoaded(event) {\n var _this6 = this;\n\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // 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\n this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n this.cuePoints = this.manager.getCuePoints(); // Add listeners to the required events\n // Advertisement error events\n\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this6.onAdError(error);\n }); // Advertisement regular events\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n return _this6.onAdEvent(e);\n });\n }); // Resolve our adsManager\n\n this.trigger('loaded');\n }\n }, {\n key: \"addCuePoints\",\n value: function addCuePoints() {\n var _this7 = this;\n\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(this.cuePoints)) {\n this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n var seekElement = _this7.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this7.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this7.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\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\n }, {\n key: \"onAdEvent\",\n value: function onAdEvent(event) {\n var _this8 = this;\n\n var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n triggerEvent.call(_this8.player, _this8.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n }; // Bubble the event\n\n\n dispatchEvent(event.type);\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'); // Start countdown\n\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 } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\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 // 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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 this.pauseContent();\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 this.pollCountdown();\n this.resumeContent();\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n }\n }\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n\n }, {\n key: \"onAdError\",\n value: function onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\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\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this9 = this;\n\n var container = this.player.elements.container;\n var time;\n this.player.on('canplay', function () {\n _this9.addCuePoints();\n });\n this.player.on('ended', function () {\n _this9.loader.contentComplete();\n });\n this.player.on('timeupdate', function () {\n time = _this9.player.currentTime;\n });\n this.player.on('seeked', function () {\n var seekedTime = _this9.player.currentTime;\n\n if (is$1.empty(_this9.cuePoints)) {\n return;\n }\n\n _this9.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this9.manager.discardAdBreak();\n\n _this9.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n window.addEventListener('resize', function () {\n if (_this9.manager) {\n _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n /**\n * Initialize the adsManager and start playing advertisements\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var _this10 = this;\n\n var container = this.player.elements.container;\n\n if (!this.managerPromise) {\n this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n this.managerPromise.then(function () {\n // Set volume to match player\n _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\n _this10.elements.displayContainer.initialize();\n\n try {\n if (!_this10.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // 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\n\n _this10.manager.start();\n }\n\n _this10.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n _this10.onAdError(adError);\n }\n }).catch(function () {});\n }\n /**\n * Resume our video\n */\n\n }, {\n key: \"resumeContent\",\n value: function resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = ''; // Ad is stopped\n\n this.playing = false; // Play video\n\n silencePromise(this.player.media.play());\n }\n /**\n * Pause our video\n */\n\n }, {\n key: \"pauseContent\",\n value: function pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3; // Ad is playing\n\n this.playing = true; // Pause our video.\n\n this.player.media.pause();\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\n }, {\n key: \"cancel\",\n value: function cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n this.trigger('error'); // Re-create our adsManager\n\n this.loadAds();\n }\n /**\n * Re-create our adsManager\n */\n\n }, {\n key: \"loadAds\",\n value: function loadAds() {\n var _this11 = this;\n\n // Tell our adsManager to go bye bye\n this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this11.manager) {\n _this11.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this11.managerPromise = new Promise(function (resolve) {\n _this11.on('loaded', resolve);\n\n _this11.player.debug.log(_this11.manager);\n }); // Now that the manager has been destroyed set it to also be un-initialized\n\n _this11.initialized = false; // Now request some new advertisements\n\n _this11.requestAds();\n }).catch(function () {});\n }\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(event) {\n var _this12 = this;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this12, args);\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\n }, {\n key: \"on\",\n value: function on(event, callback) {\n if (!is$1.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n return this;\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\n }, {\n key: \"startSafetyTimer\",\n value: function startSafetyTimer(time, from) {\n var _this13 = this;\n\n this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n this.safetyTimer = setTimeout(function () {\n _this13.cancel();\n\n _this13.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n\n }, {\n key: \"clearSafetyTimer\",\n value: function clearSafetyTimer(from) {\n if (!is$1.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n }, {\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n }, {\n key: \"tagUrl\",\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var 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: config.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n }\n }]);\n\n return Ads;\n }();\n\n var parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n };\n /**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\n var fitRatio = function fitRatio(ratio, outer) {\n var targetRatio = outer.width / outer.height;\n var result = {};\n\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = 1 / ratio * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n };\n\n var PreviewThumbnails = /*#__PURE__*/function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n _classCallCheck(this, PreviewThumbnails);\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"load\",\n value: function load() {\n var _this = this;\n\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(function () {\n if (!_this.enabled) {\n return;\n } // Render DOM elements\n\n\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n } // Download VTT files and parse them\n\n }, {\n key: \"getThumbnails\",\n value: function getThumbnails() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var src = _this2.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // Resolve promise\n\n\n var sortAndResolve = function sortAndResolve() {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this2.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n resolve();\n }; // Via callback()\n\n\n if (is$1.function(src)) {\n src(function (thumbnails) {\n _this2.thumbnails = thumbnails;\n sortAndResolve();\n });\n } // VTT urls\n else {\n // If string, convert into single-element list\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this2.getThumbnail(u);\n }); // Resolve\n\n Promise.all(promises).then(sortAndResolve);\n }\n });\n } // Process individual VTT file\n\n }, {\n key: \"getThumbnail\",\n value: function getThumbnail(url) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this3.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n }, {\n key: \"startMove\",\n value: function startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = this.player.elements.progress.getBoundingClientRect();\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX; // Set time text inside image container\n\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n } // Download and show image\n\n\n this.showImageAtCurrentTime();\n }\n }, {\n key: \"endMove\",\n value: function endMove() {\n this.toggleThumbContainer(false, true);\n }\n }, {\n key: \"startScrubbing\",\n value: function startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true; // Wait until media has a duration\n\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true); // Download and show image\n\n this.showImageAtCurrentTime();\n }\n }\n }\n }, {\n key: \"endScrubbing\",\n value: function endScrubbing() {\n var _this4 = this;\n\n this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this4.mouseDown) {\n _this4.toggleScrubbingContainer(false);\n }\n });\n }\n }\n /**\n * Setup hooks for Plyr and window events\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this5 = this;\n\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', function () {\n _this5.toggleThumbContainer(false, true);\n });\n this.player.on('seeked', function () {\n _this5.toggleThumbContainer(false);\n });\n this.player.on('timeupdate', function () {\n _this5.lastTime = _this5.player.media.currentTime;\n });\n }\n /**\n * Create HTML elements for image containers\n */\n\n }, {\n key: \"render\",\n value: function render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n var timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer\n });\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n if (is$1.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n } // Create HTML element: plyr__preview-scrubbing-container\n\n\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n }, {\n key: \"showImageAtCurrentTime\",\n value: function showImageAtCurrentTime() {\n var _this6 = this;\n\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n });\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n } // No matching thumb found\n\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n this.thumbnails.forEach(function (thumbnail, index) {\n if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n } // Show the image that's currently specified in this.showingThumb\n\n }, {\n key: \"loadImage\",\n value: function loadImage() {\n var _this7 = this;\n\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = this.showingThumb;\n var thumbnail = this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n previewImage.onload = function () {\n return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n }, {\n key: \"showImage\",\n value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n } // Remove all preview images that aren't the designated current image\n\n }, {\n key: \"removeOldImages\",\n value: function removeOldImages(currentImage) {\n var _this8 = this;\n\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this8.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n\n }, {\n key: \"preloadNearby\",\n value: function preloadNearby(thumbNum) {\n var _this9 = this;\n\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n if (_this9.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this9.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this9.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n } // If user has been hovering current image for half a second, look for a higher quality one\n\n }, {\n key: \"getHigherQuality\",\n value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n var _this10 = this;\n\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this10.showingThumbFilename === thumbFilename) {\n _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this10.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n }, {\n key: \"toggleThumbContainer\",\n value: function toggleThumbContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"toggleScrubbingContainer\",\n value: function toggleScrubbingContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"determineContainerAutoSizing\",\n value: function determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n }, {\n key: \"setThumbContainerSizeAndPos\",\n value: function setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {\n var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n\n this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {\n var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n }\n\n this.setThumbContainerPos();\n }\n }, {\n key: \"setThumbContainerPos\",\n value: function setThumbContainerPos() {\n var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n var plyrRect = this.player.elements.container.getBoundingClientRect();\n var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n }, {\n key: \"setScrubbingContainerSize\",\n value: function setScrubbingContainerSize() {\n var _fitRatio = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n width = _fitRatio.width,\n height = _fitRatio.height;\n\n this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n } // Sprites need to be offset to the correct location\n\n }, {\n key: \"setImageSizeAndOffset\",\n value: function setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n height = _fitRatio2.height;\n\n return height;\n } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n }();\n\n var source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Update previewThumbnails config & reload plugin\n\n\n if (!is$1.empty(input.previewThumbnails)) {\n Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n _this2.previewThumbnails.destroy();\n\n _this2.previewThumbnails = null;\n } // Create new instance if it is still enabled\n\n\n if (_this2.config.previewThumbnails.enabled) {\n _this2.previewThumbnails = new PreviewThumbnails(_this2);\n }\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n };\n\n /**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\n function clamp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n return Math.min(Math.max(input, min), max);\n }\n\n // TODO: Use a WeakMap for private globals\n // const globals = new WeakMap();\n // Plyr instance\n\n var Plyr = /*#__PURE__*/function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n fullscreen: 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 }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var type = this.media.tagName.toLowerCase(); // Embed properties\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.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); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\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 } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap(this.media, this.elements.container);\n } // Migrate custom properties from media to container (so they work 😉)\n\n\n ui.migrateStyles.call(this); // Add style hook\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup fullscreen\n\n\n this.fullscreen = new Fullscreen(this); // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', function () {\n return silencePromise(_this.play());\n });\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"play\",\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n value: function play() {\n var _this2 = this;\n\n if (!is$1.function(this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(function () {\n return _this2.ads.play();\n }).catch(function () {\n return silencePromise(_this2.media.play());\n });\n } // Return the promise (for HTML5)\n\n\n return this.media.play();\n }\n /**\n * Pause the media\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing || !is$1.function(this.media.pause)) {\n return null;\n }\n\n return this.media.pause();\n }\n /**\n * Get playing state\n */\n\n }, {\n key: \"togglePlay\",\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n value: function togglePlay(input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n return this.play();\n }\n\n return this.pause();\n }\n /**\n * Stop playback\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is$1.function(this.media.stop)) {\n this.media.stop();\n }\n }\n /**\n * Restart playback\n */\n\n }, {\n key: \"restart\",\n value: function restart() {\n this.currentTime = 0;\n }\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"rewind\",\n value: function rewind(seekTime) {\n this.currentTime -= is$1.number(seekTime) ? seekTime : this.config.seekTime;\n }\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"forward\",\n value: function forward(seekTime) {\n this.currentTime += is$1.number(seekTime) ? seekTime : this.config.seekTime;\n }\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n\n }, {\n key: \"increaseVolume\",\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n value: function increaseVolume(step) {\n var volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is$1.number(step) ? step : 0);\n }\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"decreaseVolume\",\n value: function decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n\n }, {\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"airplay\",\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n value: function airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n\n }, {\n key: \"toggleControls\",\n value: function 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 var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && is$1.array(this.config.controls) && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"on\",\n value: function on$1(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"once\",\n value: function once$1(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"off\",\n value: function off$1(event, callback) {\n off(this.elements.container, event, callback);\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\n }, {\n key: \"destroy\",\n value: function destroy(callback) {\n var _this3 = this;\n\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n if (soft) {\n if (Object.keys(_this3.elements).length) {\n // Remove elements\n removeElement(_this3.elements.buttons.play);\n removeElement(_this3.elements.captions);\n removeElement(_this3.elements.controls);\n removeElement(_this3.elements.wrapper); // Clear for GC\n\n _this3.elements.buttons.play = null;\n _this3.elements.captions = null;\n _this3.elements.controls = null;\n _this3.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this3); // Cancel current network requests\n\n html5.cancelRequests.call(_this3); // Replace the container with the original element provided\n\n replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this3.elements.original);\n } // Reset state\n\n\n _this3.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this3.elements = null;\n _this3.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n this.stop(); // Clear timeouts\n\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized); // Provider specific stuff\n\n if (this.isHTML5) {\n // Restore native video controls\n ui.toggleNativeControls.call(this, true); // Clean up\n\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing); // Destroy YouTube API\n\n if (this.embed !== null && is$1.function(this.embed.destroy)) {\n this.embed.destroy();\n } // Clean up\n\n\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 } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n }\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n\n }, {\n key: \"supports\",\n value: function supports(type) {\n return support.mime.call(this, type);\n }\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return this.provider === providers.html5;\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return this.isYouTube || this.isVimeo;\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return this.provider === providers.youtube;\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return this.provider === providers.vimeo;\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return this.type === types.video;\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return this.type === types.audio;\n }\n }, {\n key: \"playing\",\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n }, {\n key: \"currentTime\",\n set: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\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\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n }, {\n key: \"muted\",\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\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 } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var _this4 = this;\n\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Clamp to min/max\n\n\n var min = this.minimumSpeed,\n max = this.maximumSpeed;\n speed = clamp(speed, min, max); // Update config\n\n this.config.speed.selected = speed; // Set media speed\n\n setTimeout(function () {\n _this4.media.playbackRate = speed;\n }, 0);\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Get the minimum allowed speed\n */\n\n }, {\n key: \"minimumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 0.0625;\n }\n /**\n * Get the maximum allowed speed\n */\n\n }, {\n key: \"maximumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 16;\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest$1(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\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\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\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 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 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 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 default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the download URL\n */\n ,\n set: function set(input) {\n if (!is$1.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n controls.setDownloadUrl.call(this);\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(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(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n }\n /**\n * Get the current aspect ratio in use\n */\n\n }, {\n key: \"ratio\",\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n var ratio = reduceAspectRatio(getAspectRatio.call(this));\n return is$1.array(ratio) ? ratio.join(':') : ratio;\n }\n /**\n * Set video aspect ratio\n */\n ,\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is$1.string(input) || !validateRatio(input)) {\n this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n return;\n }\n\n this.config.ratio = input;\n setAspectRatio.call(this);\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\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\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\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\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n }], [{\n key: \"supported\",\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\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\n }, {\n key: \"loadSprite\",\n value: function loadSprite$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n }();\n\n Plyr.defaults = cloneDeep(defaults$1);\n\n return Plyr;\n\n})));\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\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 isEdge: window.navigator.userAgent.includes('Edge'),\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// 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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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// 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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.3/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n\n 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\n // Toggle button and fire events\n this.onChange();\n }\n\n // Trap focus inside container\n trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', 'autoplay,fullscreen,picture-in-picture');\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready() {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\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.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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 {Boolean} 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 * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n"]} \ No newline at end of file
+{"version":3,"sources":["plyr.js","node_modules/rangetouch/dist/rangetouch.mjs","src/js/utils/animation.js","src/js/utils/is.js","src/js/utils/browser.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/load-sprite.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/load-image.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js","src/js/utils/numbers.js"],"names":["navigator","global","factory","exports","module","define","amd","globalThis","self","Plyr","this","_typeof","obj","Symbol","iterator","constructor","prototype","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","_defineProperty","value","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","source","forEach","getOwnPropertyDescriptors","defineProperties","_objectWithoutProperties","excluded","sourceKeys","indexOf","_objectWithoutPropertiesLoose","sourceSymbolKeys","propertyIsEnumerable","call","_slicedToArray","arr","Array","isArray","_arrayWithHoles","_arr","_n","_d","_e","undefined","_s","_i","next","done","err","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","from","_iterableToArray","_nonIterableSpread","o","minLen","n","toString","slice","name","test","len","arr2","e","t","r","defaults","addCSS","thumbWidth","watch","matches","document","querySelectorAll","includes","getConstructor","instanceOf","isNullOrUndefined","isObject","isString","String","isNodeList","NodeList","is","Element","Event","round","concat","match","Math","max","getDecimalPlaces","parseFloat","toFixed","element","events","type","RangeTouch","querySelector","rangeTouch","config","init","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","set","changedTouches","getAttribute","s","u","c","getBoundingClientRect","a","width","clientX","left","disabled","preventDefault","get","bubbles","dispatchEvent","trigger","MutationObserver","addedNodes","observe","body","childList","subtree","map","documentElement","input","Boolean","isFunction","Function","isEmpty","is$1","Number","isNaN","nodeType","ownerDocument","KeyboardEvent","TextTrack","kind","Promise","then","window","URL","string","startsWith","hostname","transitionEndEvent","createElement","WebkitTransition","MozTransition","OTransition","transition","find","event","repaint","delay","setTimeout","hidden","offsetHeight","browser","isIE","documentMode","isEdge","userAgent","isWebkit","isIPhone","platform","isIos","getDeep","path","split","reduce","extend","_len","sources","_key","shift","assign","wrap","elements","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","_ref","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hide","toggleClass","force","method","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","range","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","options","addEventListener","removeEventListener","toggleListener","callback","_this","toggle","passive","capture","eventListeners","on","off","once","_this2","onceCallback","args","triggerEvent","detail","CustomEvent","plyr","unbindListeners","item","ready","_this3","resolve","silencePromise","validateRatio","every","reduceAspectRatio","ratio","_ratio","height","divider","getDivider","w","h","getAspectRatio","parse","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","_player$media","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","dedupe","array","format","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","getHTML","innerHTML","resources","youtube","i18n","{seektime}","seekTime","{title}","title","k","v","Storage","store","localStorage","getItem","json","JSON","storage","setItem","stringify","removeItem","fetch","url","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","prefix","hasId","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","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","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","toCamelCase","label","labelPressed","iconPressed","some","control","button","createRange","min","step","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","node","bind","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","current","val","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sort","b","sorting","setCaptionsMenu","_this7","tracks","getTracks","track","toggled","language","unshift","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","values","popup","p","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","position","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","size","restore","propertyName","setDownloadUrl","download","create","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","href","urls","isEmbed","inject","_this11","floor","random","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","isYouTube","insertAfter","protocol","blob","createObjectURL","languages","userLanguage","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","has","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","cue","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","noop","Console","console","Fullscreen","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","keyCode","activeElement","first","last","shiftKey","forceFallback","native","requestFullscreen","webkitEnterFullscreen","toggleFallback","navigationUI","webkitExitFullscreen","action","cancelFullScreen","exit","enter","closest","el","parentElement","proxy","trapFocus","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","now","migrateStyles","getPropertyValue","removeProperty","Listeners","focusTimer","lastKeyDown","timeStamp","wasKeyDown","handleKey","firstTouch","setTabFocus","setPlayerSize","measure","rect","resized","_player$fullscreen","usingNative","isEnter","_setPlayerSize","firstChild","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","togglePlay","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","code","currentTarget","attribute","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","abs","increaseVolume","lastKey","repeat","altKey","ctrlKey","metaKey","decreaseVolume","loadjs_umd","fn","createCommonjsModule","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","q","splice","executeCallbacks","success","loadFile","numTries","isLegacyIECss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathname","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","defaultPrevented","loadFiles","paths","loadjs","arg1","arg2","loadFn","returnPromise","deps","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","$2","data-poster","thumbnail_url","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","fragment","createDocumentFragment","stripHTML","getPaused","seconds","getHost","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","google","ima","manager","destroy","displayContainer","remove","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","handlers","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","vttDataString","processedList","thumbnail","frames","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","thumb","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","ceil","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","right","previewPos","_fitRatio","multiplier","top","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","WeakMap","getProviderByUrl","search","truthy","searchParams","tabindex","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","clamp","updateStorage","prev","curr","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());\n}(this, (function () { 'use strict';\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n }\n\n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n }\n\n function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n }\n\n function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n }\n\n function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _classCallCheck$1(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function _defineProperties$1(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n }\n\n function _createClass$1(e, t, n) {\n return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n }\n\n function _defineProperty$1(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n\n function ownKeys$1(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n\n return n;\n }\n\n function _objectSpread2$1(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys$1(Object(n), !0).forEach(function (t) {\n _defineProperty$1(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$1(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n }\n\n var defaults = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n };\n\n function matches(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n }\n\n function trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n }\n\n var getConstructor = function getConstructor(e) {\n return null != e ? e.constructor : null;\n },\n instanceOf = function instanceOf(e, t) {\n return !!(e && t && e instanceof t);\n },\n isNullOrUndefined = function isNullOrUndefined(e) {\n return null == e;\n },\n isObject = function isObject(e) {\n return getConstructor(e) === Object;\n },\n isNumber = function isNumber(e) {\n return getConstructor(e) === Number && !Number.isNaN(e);\n },\n isString = function isString(e) {\n return getConstructor(e) === String;\n },\n isBoolean = function isBoolean(e) {\n return getConstructor(e) === Boolean;\n },\n isFunction = function isFunction(e) {\n return getConstructor(e) === Function;\n },\n isArray = function isArray(e) {\n return Array.isArray(e);\n },\n isNodeList = function isNodeList(e) {\n return instanceOf(e, NodeList);\n },\n isElement = function isElement(e) {\n return instanceOf(e, Element);\n },\n isEvent = function isEvent(e) {\n return instanceOf(e, Event);\n },\n isEmpty = function isEmpty(e) {\n return isNullOrUndefined(e) || (isString(e) || isArray(e) || isNodeList(e)) && !e.length || isObject(e) && !Object.keys(e).length;\n },\n is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n };\n\n function getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n }\n\n function round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n\n return Math.round(e / t) * t;\n }\n\n var RangeTouch = function () {\n function e(t, n) {\n _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());\n }\n\n return _createClass$1(e, [{\n key: \"init\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function value(e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function value(t) {\n if (!e.enabled || !is.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function value(t) {\n e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function value(t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type=\"range\"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\n var i = _objectSpread2$1({}, defaults, {}, n);\n\n if (is.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is.element(n) && matches(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n }();\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n var getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n };\n\n var instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n };\n\n var isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n };\n\n var isObject$1 = function isObject(input) {\n return getConstructor$1(input) === Object;\n };\n\n var isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n };\n\n var isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n };\n\n var isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n };\n\n var isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n };\n\n var isArray$1 = function isArray(input) {\n return Array.isArray(input);\n };\n\n var isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n };\n\n var isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n };\n\n var isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n };\n\n var isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n };\n\n var isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n };\n\n var isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n };\n\n var isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n };\n\n var isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise) && isFunction$1(input.then);\n };\n\n var isElement$1 = function isElement(input) {\n return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';\n };\n\n var isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;\n };\n\n var isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n };\n\n var is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n };\n\n // ==========================================================================\n var transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n }(); // Force repaint of element\n\n function repaint(element, delay) {\n setTimeout(function () {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n element.hidden = false;\n } catch (e) {// Do nothing\n }\n }, delay);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n var browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\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\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n } // Get a nested value in an object\n\n function getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n } // Deep extend destination object with N more objects\n\n function extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n }\n\n function wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // 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\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n } // Set attributes\n\n function setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n } // Create a DocumentFragment\n\n function createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n } // Inaert an element after another\n\n function insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n } // Insert a DocumentFragment\n\n function insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n } // Remove element(s)\n\n function removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n } // Remove all child elements\n\n function emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n } // Replace element\n\n function replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n } // Get an attribute object from a string selector\n\n 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 if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = extend({}, existingAttributes);\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n\n var _parts = _slicedToArray(parts, 1),\n key = _parts[0];\n\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.string(existing.class)) {\n attributes.class = \"\".concat(existing.class, \" \").concat(className);\n } else {\n attributes.class = className;\n }\n\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 break;\n }\n });\n return extend(existing, attributes);\n } // Toggle hidden\n\n function toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n } // eslint-disable-next-line no-param-reassign\n\n\n element.hidden = hide;\n } // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\n function toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\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 } // Has class name\n\n function hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n } // Element matches selector\n\n function matches$1(element, selector) {\n var _Element = Element,\n prototype = _Element.prototype;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n } // Closest ancestor element matching selector (also tests element itself)\n\n function closest(element, selector) {\n var _Element2 = Element,\n prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n function closestElement() {\n var el = this;\n\n do {\n if (matches$1.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n }\n\n var method = prototype.closest || closestElement;\n return method.call(element, selector);\n } // Find all elements\n\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n } // Find a single element\n\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n } // Set focus and tab focus class\n\n function setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n }\n\n var 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 }; // Check for feature support\n\n var support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\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: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\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 // Detect transitions support\n transitions: transitionEndEvent !== false,\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\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n\n var supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n }(); // Toggle event listener\n\n\n function toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n } // Bind event handler\n\n function on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n } // Unbind event handler\n\n function off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n } // Bind once-only event handler\n\n function once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n } // Trigger event\n\n function triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n } // Unbind all cached event listeners\n\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n } // Run method when / if player is ready\n\n function ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n }\n\n /**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n\n function silencePromise(value) {\n if (is$1.promise(value)) {\n value.then(null, function () {});\n }\n }\n\n function validateRatio(input) {\n if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {\n return false;\n }\n\n var ratio = is$1.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is$1.number);\n }\n function reduceAspectRatio(ratio) {\n if (!is$1.array(ratio) || !ratio.every(is$1.number)) {\n return null;\n }\n\n var _ratio = _slicedToArray(ratio, 2),\n width = _ratio[0],\n height = _ratio[1];\n\n var getDivider = function getDivider(w, h) {\n return h === 0 ? w : getDivider(h, w % h);\n };\n\n var divider = getDivider(width, height);\n return [width / divider, height / divider];\n }\n function getAspectRatio(input) {\n var parse = function parse(ratio) {\n return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n }; // Try provided ratio\n\n\n var ratio = parse(input); // Get from config\n\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n } // Get from embed\n\n\n if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {\n ratio = this.embed.ratio;\n } // Get from HTML5 video\n\n\n if (ratio === null && this.isHTML5) {\n var _this$media = this.media,\n videoWidth = _this$media.videoWidth,\n videoHeight = _this$media.videoHeight;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n } // Set aspect ratio for responsive container\n\n function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n var wrapper = this.elements.wrapper;\n var ratio = getAspectRatio.call(this, input);\n\n var _ref = is$1.array(ratio) ? ratio : [0, 0],\n _ref2 = _slicedToArray(_ref, 2),\n w = _ref2[0],\n h = _ref2[1];\n\n var padding = 100 / w * h;\n wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n var offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n }\n\n // ==========================================================================\n var html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n } // Get sizes from <source> elements\n\n\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('size'));\n }).filter(Boolean);\n },\n setup: function setup() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n if (!is$1.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n } // Quality\n\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (s) {\n return s.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('size'));\n },\n set: function set(input) {\n if (player.quality === input) {\n return;\n } // If we're using an an external handler...\n\n\n if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (s) {\n return Number(s.getAttribute('size')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState,\n playbackRate = _player$media.playbackRate; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.speed = playbackRate;\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n silencePromise(player.play());\n }\n }); // Load new source\n\n player.media.load();\n }\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // 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\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n };\n\n // ==========================================================================\n\n function dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n } // Get the closest value in an array\n\n function closest$1(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n }\n\n // ==========================================================================\n\n function generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n } // Format string\n\n function format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n } // Get percentage\n\n 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 } // Replace all occurances of a string in a string\n\n var replaceAll = function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n }; // Convert to title case\n\n var toTitleCase = function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n }; // Convert string to pascalCase\n\n function toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n } // Convert string to pascalCase\n\n function toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n } // Remove HTML from a string\n\n function stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n } // Like outerHTML, but also works for DocumentFragment\n\n function getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n var resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n var i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n k = _ref2[0],\n v = _ref2[1];\n\n string = replaceAll(string, k, v);\n });\n return string;\n }\n };\n\n var Storage = /*#__PURE__*/function () {\n function Storage(player) {\n var _this = this;\n\n _classCallCheck(this, Storage);\n\n _defineProperty(this, \"get\", function (key) {\n if (!Storage.supported || !_this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(_this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n });\n\n _defineProperty(this, \"set\", function (object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !_this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = _this.get(); // Default to empty object\n\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(_this.key, JSON.stringify(storage));\n });\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, null, [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // 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\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n }();\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n function fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\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 request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n }\n\n // ==========================================================================\n\n function loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n }\n\n // ==========================================================================\n\n var getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n };\n var getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n };\n var getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n }; // Format time to UI friendly string\n\n function formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n }\n\n var controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\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 }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\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 }; // Display\n\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 }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\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); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // 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\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n\n var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var _this = this;\n\n var attributes = extend({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some(function (c) {\n return c === _this.config.classNames.control;\n })) {\n extend(attributes, {\n class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.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 // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\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 }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type, attrs) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\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: function bindMenuItemShortcuts(menuItem, type) {\n var _this2 = this;\n\n // Navigate through menus via arrow keys and space\n on.call(this, menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this2, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this2, target, true);\n }\n }\n }, false); // 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\n on.call(this, menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this2, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this3 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(check) {\n // Ensure exclusivity\n if (check) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this3.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this3.quality = value;\n break;\n\n case 'speed':\n _this3.speed = parseFloat(value);\n break;\n }\n\n controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this4 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var val = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = val; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = val;\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); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this5 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(show) {\n return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n\n if (is$1.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 } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function 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 } // 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\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(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 // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this6.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this6, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this6.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this6, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this6, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\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 if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this7.captions.toggled && _this7.currentTrack === value,\n title: captions.getLabel.call(_this7, track),\n badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu() {\n var _this8 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n this.options.speed = this.options.speed.filter(function (o) {\n return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this8, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this8, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (p) {\n return !p.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;\n var isMenuItem = popup.contains(target); // 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\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.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$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this9 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function 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 } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this9, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl: function setDownloadUrl() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set attribute\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create: function create(data) {\n var _this10 = this;\n\n var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n createButton = controls.createButton,\n createProgress = controls.createProgress,\n createRange = controls.createRange,\n createTime = controls.createTime,\n setQualityMenu = controls.setQualityMenu,\n setSpeedMenu = controls.setSpeedMenu,\n showMenuPanel = controls.showMenuPanel;\n this.elements.controls = null; // Larger overlaid play button\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n } // Create the container\n\n\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container; // Default item attributes\n\n var defaultAttributes = {\n class: 'plyr__controls__item'\n }; // Loop through controls in order\n\n dedupe(is$1.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n } // Rewind button\n\n\n if (control === 'rewind') {\n container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n } // Play/Pause button\n\n\n if (control === 'play') {\n container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n } // Fast forward button\n\n\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n } // Progress\n\n\n if (control === 'progress') {\n var progressContainer = createElement('div', {\n class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n });\n var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(createRange.call(_this10, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (_this10.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: _this10.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n _this10.elements.display.seekTooltip = tooltip;\n }\n\n _this10.elements.progress = progress;\n progressContainer.appendChild(_this10.elements.progress);\n container.appendChild(progressContainer);\n } // Media current time display\n\n\n if (control === 'current-time') {\n container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n } // Media duration display\n\n\n if (control === 'duration') {\n container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n } // Volume controls\n\n\n if (control === 'mute' || control === 'volume') {\n var volume = _this10.elements.volume; // Create the volume container if needed\n\n if (!is$1.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n }));\n _this10.elements.volume = volume;\n container.appendChild(volume);\n } // Toggle mute button\n\n\n if (control === 'mute') {\n volume.appendChild(createButton.call(_this10, 'mute'));\n } // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: _this10.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n }\n } // Toggle captions button\n\n\n if (control === 'captions') {\n container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n } // Settings button / menu\n\n\n if (control === 'settings' && !is$1.empty(_this10.config.settings)) {\n var wrapper = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(_this10, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n _this10.elements.settings.panels.home = home; // Build the menu items\n\n _this10.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n on.call(_this10, menuItem, 'click', function () {\n showMenuPanel.call(_this10, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this10.config));\n var value = createElement('span', {\n class: _this10.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this10.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this10.config.classNames.hidden\n }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n on.call(_this10, pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n showMenuPanel.call(_this10, 'home', true);\n }, false); // Go back via button click\n\n on.call(_this10, backButton, 'click', function () {\n showMenuPanel.call(_this10, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this10.elements.settings.buttons[type] = menuItem;\n _this10.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n _this10.elements.settings.popup = popup;\n _this10.elements.settings.menu = wrapper;\n } // Picture in picture button\n\n\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n } // Airplay button\n\n\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n } // Download button\n\n\n if (control === 'download') {\n var _attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: _this10.download,\n target: '_blank'\n }); // Set download attribute for HTML5 only\n\n\n if (_this10.isHTML5) {\n _attributes.download = '';\n }\n\n var download = _this10.config.urls.download;\n\n if (!is$1.url(download) && _this10.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(_this10.provider),\n label: _this10.provider\n });\n }\n\n container.appendChild(createButton.call(_this10, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n }\n }); // Set available quality levels\n\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this11 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.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) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this11.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this11.config.classNames.hidden, false);\n toggleClass(label, _this11.config.classNames.tooltip, true);\n });\n }\n }\n };\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 */\n\n function parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var 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 } // Convert object to URLSearchParams\n\n function buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n }\n\n var captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\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\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n } // Add event listener for cue changes\n\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n 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\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n } // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n\n\n setTimeout(function () {\n if (active && _this2.captions.toggled) {\n _this2.captions.currentTrackNode.mode = 'hidden';\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: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.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 var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\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 // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\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: function getTracks() {\n var _this3 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // 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\n return tracks.filter(function (track) {\n return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this4 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this4.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (t) {\n return t.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.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 // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var 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 var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n var defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\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 // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\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 // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 // URLs\n urls: {\n download: null,\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/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\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 download: '[data-plyr=\"download\"]',\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',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\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 tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n var pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n var providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n var types = {\n audio: 'audio',\n video: 'video'\n };\n /**\n * Get provider by URL\n * @param {String} url\n */\n\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n var noop = function noop() {};\n\n var Console = /*#__PURE__*/function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n }();\n\n var Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(player) {\n var _this = this;\n\n _classCallCheck(this, Fullscreen);\n\n _defineProperty(this, \"onChange\", function () {\n if (!_this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = _this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = _this.active;\n } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event\n\n triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n });\n\n _defineProperty(this, \"toggleFallback\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\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 } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n _this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (_this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n }\n } // Toggle button and fire events\n\n\n _this.onChange();\n });\n\n _defineProperty(this, \"trapFocus\", function (event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n var _focusable = _slicedToArray(focusable, 1),\n first = _focusable[0];\n\n var last = focusable[focusable.length - 1];\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 _defineProperty(this, \"update\", function () {\n if (_this.enabled) {\n var mode;\n\n if (_this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n _this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n _this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);\n });\n\n _defineProperty(this, \"enter\", function () {\n if (!_this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n if (_this.player.isVimeo) {\n _this.player.embed.requestFullscreen();\n } else {\n _this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || _this.forceFallback) {\n _this.toggleFallback(true);\n } else if (!_this.prefix) {\n _this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is$1.empty(_this.prefix)) {\n _this.target[\"\".concat(_this.prefix, \"Request\").concat(_this.property)]();\n }\n });\n\n _defineProperty(this, \"exit\", function () {\n if (!_this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n _this.target.webkitExitFullscreen();\n\n silencePromise(_this.player.play());\n } else if (!Fullscreen.native || _this.forceFallback) {\n _this.toggleFallback(false);\n } else if (!_this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(_this.prefix)) {\n var action = _this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(_this.prefix).concat(action).concat(_this.property)]();\n }\n });\n\n _defineProperty(this, \"toggle\", function () {\n if (!_this.active) {\n _this.enter();\n } else {\n _this.exit();\n }\n });\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n\n this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n _this.onChange();\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n }); // Tap focus when in fullscreen\n\n on.call(this, this.player.elements.container, 'keydown', function (event) {\n return _this.trapFocus(event);\n }); // Update the UI\n\n this.update(); // this.toggle = this.toggle.bind(this);\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n }();\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 function loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n }\n\n var ui = {\n addStyleHook: function 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 // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset speed\n\n this.speed = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\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\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('data-poster', poster); // Show the poster\n\n this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(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(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\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); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n Object.assign(target, {\n pressed: _this3.playing\n });\n target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controlsElement = this.elements.controls;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles: function migrateStyles() {\n var _this5 = this;\n\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n .filter(function (key) {\n return !is$1.empty(key) && is$1.string(key) && key.startsWith('--plyr');\n }).forEach(function (key) {\n // Set on the container\n _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n _this5.media.style.removeProperty(key);\n }); // Remove attribute if empty\n\n if (is$1.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n };\n\n var Listeners = /*#__PURE__*/function () {\n function Listeners(_player) {\n var _this = this;\n\n _classCallCheck(this, Listeners);\n\n _defineProperty(this, \"firstTouch\", function () {\n var player = _this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n });\n\n _defineProperty(this, \"setTabFocus\", function (event) {\n var player = _this.player;\n var elements = player.elements;\n clearTimeout(_this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n _this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n if (event.type !== 'focusout') {\n _this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n });\n\n _defineProperty(this, \"global\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = _this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', _this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);\n });\n\n _defineProperty(this, \"container\", function () {\n var player = _this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controlsElement = elements.controls; // Remove button states for fullscreen\n\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio = _slicedToArray(ratio, 2),\n y = _ratio[1];\n\n var _getAspectRatio$call = getAspectRatio.call(player),\n _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n videoX = _getAspectRatio$call2[0],\n videoY = _getAspectRatio$call2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n if (target !== elements.container) {\n return;\n } // If it's not an embed and no ratio specified\n\n\n if (!player.isEmbed && is$1.empty(player.config.ratio)) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n if (isEnter) {\n setTimeout(function () {\n return repaint(elements.container);\n }, 100);\n } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n });\n\n _defineProperty(this, \"media\", function () {\n var player = _this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n player.pause();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, function () {\n silencePromise(player.play());\n }, 'play');\n } else {\n _this.proxy(event, function () {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadUrl.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\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 _defineProperty(this, \"proxy\", function (event, defaultHandler, customHandlerKey) {\n var player = _this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned !== false && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n });\n\n _defineProperty(this, \"bind\", function (element, type, defaultHandler, customHandlerKey) {\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = _this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n });\n\n _defineProperty(this, \"controls\", function () {\n var player = _this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this.bind(button, 'click', function () {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n } // Pause\n\n\n _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n\n _this.bind(elements.buttons.rewind, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind'); // Rewind\n\n\n _this.bind(elements.buttons.fastForward, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward'); // Mute toggle\n\n\n _this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n\n _this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n\n _this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n\n _this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n\n _this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n\n _this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n\n _this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\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\n\n _this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n\n _this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n\n _this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n\n _this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\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\n\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n _this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n\n _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n\n _this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n\n _this.bind(elements.progress, 'mouseleave touchend click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n\n _this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n _this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n _this.bind(elements.display.currentTime, 'click', function () {\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 controls.timeUpdate.call(player);\n });\n } // Volume\n\n\n _this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n\n _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(function (c) {\n return !c.contains(elements.container);\n }).forEach(function (child) {\n _this.bind(child, 'mouseenter mouseleave', function (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\n\n _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n\n _this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n\n _this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n });\n\n this.player = _player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\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 } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\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 var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n 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)\n\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\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\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\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\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }]);\n\n return Listeners;\n }();\n\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\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 */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function 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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; // tag IE9+\n\n isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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]; // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // resolve Promise\n\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n } // publish bundle load event\n\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\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 */\n\n\n loadjs.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 return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n });\n\n // ==========================================================================\n function loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n function parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n var vimeo = {\n setup: function setup() {\n var player = this; // Add embed class for responsive\n\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set intial ratio\n\n setAspectRatio.call(player); // Load the SDK if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(player);\n }).catch(function (error) {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready: function ready() {\n var _this = this;\n\n var player = this;\n var config = player.config.vimeo;\n\n var premium = config.premium,\n referrerPolicy = config.referrerPolicy,\n frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n } // Get Vimeo params for the iframe\n\n\n var params = buildUrlParams(_objectSpread2({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, frameParams)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required\n\n if (!is$1.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n } // Inject the package\n\n\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n var wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n } // Get poster image\n\n\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n if (is$1.empty(response) || !response.thumbnail_url) {\n return;\n } // Set and show poster\n\n\n ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n });\n } // Setup instance\n // https://github.com/vimeo/player.js\n\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function () {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(function (error) {\n _this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = [width, height];\n setAspectRatio.call(_this);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', function () {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', function () {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n }\n };\n\n // ==========================================================================\n\n function parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n function getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n } // Use YouTube's default\n\n\n return undefined;\n }\n\n var youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n // Call global callback if set\n if (is$1.function(callback)) {\n callback();\n }\n\n youtube.ready.call(_this);\n }; // Load the SDK\n\n\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n var url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(function (data) {\n if (is$1.object(data)) {\n var title = data.title,\n height = data.height,\n width = data.width; // Set title\n\n _this2.config.title = title;\n ui.setTitle.call(_this2); // Set aspect ratio\n\n _this2.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(_this2);\n }).catch(function () {\n // Set aspect ratio\n setAspectRatio.call(_this2);\n });\n },\n // API ready\n ready: function ready() {\n var player = this;\n var config = player.config.youtube; // Ignore already setup (race condition)\n\n var currentId = player.media && player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Replace media element\n\n var container = createElement('div', {\n id: id,\n 'data-poster': config.customControls ? player.poster : undefined\n });\n player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n if (config.customControls) {\n var posterSrc = function posterSrc(s) {\n return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (src) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n } // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n\n player.embed = new window.YT.Player(player.media, {\n videoId: videoId,\n host: getHost(config),\n playerVars: extend({}, {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\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 player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function 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 } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n player.options.speed = speeds.filter(function (s) {\n return player.config.speed.options.includes(s);\n }); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui && config.customControls) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n }\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var 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 } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\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 (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // 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\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\n assurePlaybackState$1.call(player, false);\n break;\n\n case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n };\n\n // ==========================================================================\n var media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap(this.media, this.elements.wrapper); // Poster image container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: ''\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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\n var destroy = function destroy(instance) {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n } // Destroy our adsManager\n\n\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n };\n\n var Ads = /*#__PURE__*/function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n _defineProperty(this, \"load\", function () {\n if (!_this.enabled) {\n return;\n } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {\n _this.ready();\n }).catch(function () {\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 _defineProperty(this, \"ready\", function () {\n // Double check we're enabled\n if (!_this.enabled) {\n destroy(_this);\n } // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n\n\n _this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n\n _this.managerPromise.then(function () {\n _this.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n\n _this.listeners(); // Setup the IMA SDK\n\n\n _this.setupIMA();\n });\n\n _defineProperty(this, \"setupIMA\", function () {\n // Create the container for our advertisements\n _this.elements.container = createElement('div', {\n class: _this.player.config.classNames.ads\n });\n\n _this.player.elements.container.appendChild(_this.elements.container); // So we can run VPAID2\n\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader\n\n _this.loader = new google.ima.AdsLoader(_this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this.onAdsManagerLoaded(event);\n }, false);\n\n _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this.onAdError(error);\n }, false); // Request video ads to be pre-loaded\n\n\n _this.requestAds();\n });\n\n _defineProperty(this, \"requestAds\", function () {\n var container = _this.player.elements.container;\n\n try {\n // Request video ads\n var request = new google.ima.AdsRequest();\n request.adTagUrl = _this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!_this.player.muted);\n\n _this.loader.requestAds(request);\n } catch (e) {\n _this.onAdError(e);\n }\n });\n\n _defineProperty(this, \"pollCountdown\", function () {\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(_this.countdownTimer);\n\n _this.elements.container.removeAttribute('data-badge-text');\n\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this.player.config), \" - \").concat(time);\n\n _this.elements.container.setAttribute('data-badge-text', label);\n };\n\n _this.countdownTimer = setInterval(update, 100);\n });\n\n _defineProperty(this, \"onAdsManagerLoaded\", function (event) {\n // Load could occur after a source change (race condition)\n if (!_this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // 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\n _this.manager = event.getAdsManager(_this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events\n // Advertisement error events\n\n _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this.onAdError(error);\n }); // Advertisement regular events\n\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n return _this.onAdEvent(e);\n });\n }); // Resolve our adsManager\n\n _this.trigger('loaded');\n });\n\n _defineProperty(this, \"addCuePoints\", function () {\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(_this.cuePoints)) {\n _this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {\n var seekElement = _this.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\n }\n });\n\n _defineProperty(this, \"onAdEvent\", function (event) {\n var container = _this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n triggerEvent.call(_this.player, _this.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n }; // Bubble the event\n\n\n dispatchEvent(event.type);\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'); // Start countdown\n\n\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 } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n _this.manager.setVolume(_this.player.volume);\n\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 // 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 // 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 if (_this.player.ended) {\n _this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n _this.loader.contentComplete();\n }\n\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 _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 _this.pollCountdown();\n\n _this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n _this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n }\n });\n\n _defineProperty(this, \"onAdError\", function (event) {\n _this.cancel();\n\n _this.player.debug.warn('Ads error', event);\n });\n\n _defineProperty(this, \"listeners\", function () {\n var container = _this.player.elements.container;\n var time;\n\n _this.player.on('canplay', function () {\n _this.addCuePoints();\n });\n\n _this.player.on('ended', function () {\n _this.loader.contentComplete();\n });\n\n _this.player.on('timeupdate', function () {\n time = _this.player.currentTime;\n });\n\n _this.player.on('seeked', function () {\n var seekedTime = _this.player.currentTime;\n\n if (is$1.empty(_this.cuePoints)) {\n return;\n }\n\n _this.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this.manager.discardAdBreak();\n\n _this.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n\n window.addEventListener('resize', function () {\n if (_this.manager) {\n _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n });\n\n _defineProperty(this, \"play\", function () {\n var container = _this.player.elements.container;\n\n if (!_this.managerPromise) {\n _this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n _this.managerPromise.then(function () {\n // Set volume to match player\n _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\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); // 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\n\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 }).catch(function () {});\n });\n\n _defineProperty(this, \"resumeContent\", function () {\n // Hide the advertisement container\n _this.elements.container.style.zIndex = ''; // Ad is stopped\n\n _this.playing = false; // Play video\n\n silencePromise(_this.player.media.play());\n });\n\n _defineProperty(this, \"pauseContent\", function () {\n // Show the advertisement container\n _this.elements.container.style.zIndex = 3; // Ad is playing\n\n _this.playing = true; // Pause our video.\n\n _this.player.media.pause();\n });\n\n _defineProperty(this, \"cancel\", function () {\n // Pause our video\n if (_this.initialized) {\n _this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n _this.trigger('error'); // Re-create our adsManager\n\n\n _this.loadAds();\n });\n\n _defineProperty(this, \"loadAds\", function () {\n // Tell our adsManager to go bye bye\n _this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this.manager) {\n _this.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this.managerPromise = new Promise(function (resolve) {\n _this.on('loaded', resolve);\n\n _this.player.debug.log(_this.manager);\n }); // Now that the manager has been destroyed set it to also be un-initialized\n\n _this.initialized = false; // Now request some new advertisements\n\n _this.requestAds();\n }).catch(function () {});\n });\n\n _defineProperty(this, \"trigger\", function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = _this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this, args);\n }\n });\n }\n });\n\n _defineProperty(this, \"on\", function (event, callback) {\n if (!is$1.array(_this.events[event])) {\n _this.events[event] = [];\n }\n\n _this.events[event].push(callback);\n\n return _this;\n });\n\n _defineProperty(this, \"startSafetyTimer\", function (time, from) {\n _this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n\n _this.safetyTimer = setTimeout(function () {\n _this.cancel();\n\n _this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n });\n\n _defineProperty(this, \"clearSafetyTimer\", function (from) {\n if (!is$1.nullOrUndefined(_this.safetyTimer)) {\n _this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n\n clearTimeout(_this.safetyTimer);\n _this.safetyTimer = null;\n }\n });\n\n this.player = player;\n this.config = player.config.ads;\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; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n /**\n * Load the IMA SDK\n */\n\n }, {\n key: \"tagUrl\",\n // Build the tag URL\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var 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: config.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\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\n }]);\n\n return Ads;\n }();\n\n var parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n };\n /**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\n var fitRatio = function fitRatio(ratio, outer) {\n var targetRatio = outer.width / outer.height;\n var result = {};\n\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = 1 / ratio * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n };\n\n var PreviewThumbnails = /*#__PURE__*/function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n var _this = this;\n\n _classCallCheck(this, PreviewThumbnails);\n\n _defineProperty(this, \"load\", function () {\n // Toggle the regular seek tooltip\n if (_this.player.elements.display.seekTooltip) {\n _this.player.elements.display.seekTooltip.hidden = _this.enabled;\n }\n\n if (!_this.enabled) {\n return;\n }\n\n _this.getThumbnails().then(function () {\n if (!_this.enabled) {\n return;\n } // Render DOM elements\n\n\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n });\n\n _defineProperty(this, \"getThumbnails\", function () {\n return new Promise(function (resolve) {\n var src = _this.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // Resolve promise\n\n\n var sortAndResolve = function sortAndResolve() {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this.player.debug.log('Preview thumbnails', _this.thumbnails);\n\n resolve();\n }; // Via callback()\n\n\n if (is$1.function(src)) {\n src(function (thumbnails) {\n _this.thumbnails = thumbnails;\n sortAndResolve();\n });\n } // VTT urls\n else {\n // If string, convert into single-element list\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this.getThumbnail(u);\n }); // Resolve\n\n Promise.all(promises).then(sortAndResolve);\n }\n });\n });\n\n _defineProperty(this, \"getThumbnail\", function (url) {\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n });\n\n _defineProperty(this, \"startMove\", function (event) {\n if (!_this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!_this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = _this.player.elements.progress.getBoundingClientRect();\n\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n _this.seekTime = _this.player.media.duration * (percentage / 100);\n\n if (_this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n _this.seekTime = 0;\n }\n\n if (_this.seekTime > _this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n _this.seekTime = _this.player.media.duration - 1;\n }\n\n _this.mousePosX = event.pageX; // Set time text inside image container\n\n _this.elements.thumb.time.innerText = formatTime(_this.seekTime);\n } // Download and show image\n\n\n _this.showImageAtCurrentTime();\n });\n\n _defineProperty(this, \"endMove\", function () {\n _this.toggleThumbContainer(false, true);\n });\n\n _defineProperty(this, \"startScrubbing\", function (event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n _this.mouseDown = true; // Wait until media has a duration\n\n if (_this.player.media.duration) {\n _this.toggleScrubbingContainer(true);\n\n _this.toggleThumbContainer(false, true); // Download and show image\n\n\n _this.showImageAtCurrentTime();\n }\n }\n });\n\n _defineProperty(this, \"endScrubbing\", function () {\n _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n _this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(_this.player, _this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this.mouseDown) {\n _this.toggleScrubbingContainer(false);\n }\n });\n }\n });\n\n _defineProperty(this, \"listeners\", function () {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n _this.player.on('play', function () {\n _this.toggleThumbContainer(false, true);\n });\n\n _this.player.on('seeked', function () {\n _this.toggleThumbContainer(false);\n });\n\n _this.player.on('timeupdate', function () {\n _this.lastTime = _this.player.media.currentTime;\n });\n });\n\n _defineProperty(this, \"render\", function () {\n // Create HTML element: plyr__preview-thumbnail-container\n _this.elements.thumb.container = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n _this.elements.thumb.imageContainer = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.imageContainer\n });\n\n _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n\n var timeContainer = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.timeContainer\n });\n _this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(_this.elements.thumb.time);\n\n _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n\n if (is$1.element(_this.player.elements.progress)) {\n _this.player.elements.progress.appendChild(_this.elements.thumb.container);\n } // Create HTML element: plyr__preview-scrubbing-container\n\n\n _this.elements.scrubbing.container = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n\n _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);\n });\n\n _defineProperty(this, \"destroy\", function () {\n if (_this.elements.thumb.container) {\n _this.elements.thumb.container.remove();\n }\n\n if (_this.elements.scrubbing.container) {\n _this.elements.scrubbing.container.remove();\n }\n });\n\n _defineProperty(this, \"showImageAtCurrentTime\", function () {\n if (_this.mouseDown) {\n _this.setScrubbingContainerSize();\n } else {\n _this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {\n return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;\n });\n\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n if (!_this.mouseDown) {\n _this.toggleThumbContainer(hasThumb);\n } // No matching thumb found\n\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n _this.thumbnails.forEach(function (thumbnail, index) {\n if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n\n if (thumbNum !== _this.showingThumb) {\n _this.showingThumb = thumbNum;\n\n _this.loadImage(qualityIndex);\n }\n });\n\n _defineProperty(this, \"loadImage\", function () {\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = _this.showingThumb;\n var thumbnail = _this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (_this.loadingImage && _this.usingSprites) {\n _this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n _this.showingThumbFilename = thumbFilename;\n\n _this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n\n previewImage.onload = function () {\n return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n _this.loadingImage = previewImage;\n\n _this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n\n _this.currentImageElement.dataset.index = thumbNum;\n\n _this.removeOldImages(_this.currentImageElement);\n }\n });\n\n _defineProperty(this, \"showImage\", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n _this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n\n _this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n _this.currentImageContainer.appendChild(previewImage);\n\n _this.currentImageElement = previewImage;\n\n if (!_this.loadedImages.includes(thumbFilename)) {\n _this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n });\n\n _defineProperty(this, \"removeOldImages\", function (currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(_this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n });\n\n _defineProperty(this, \"preloadNearby\", function (thumbNum) {\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;\n\n if (_this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n });\n\n _defineProperty(this, \"getHigherQuality\", function (currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < _this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (_this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < _this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this.showingThumbFilename === thumbFilename) {\n _this.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n });\n\n _defineProperty(this, \"toggleThumbContainer\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;\n\n _this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n _this.showingThumb = null;\n _this.showingThumbFilename = null;\n }\n });\n\n _defineProperty(this, \"toggleScrubbingContainer\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n\n _this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n _this.showingThumb = null;\n _this.showingThumbFilename = null;\n }\n });\n\n _defineProperty(this, \"determineContainerAutoSizing\", function () {\n if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n _this.sizeSpecifiedInCSS = true;\n }\n });\n\n _defineProperty(this, \"setThumbContainerSizeAndPos\", function () {\n if (!_this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);\n _this.elements.thumb.imageContainer.style.height = \"\".concat(_this.thumbContainerHeight, \"px\");\n _this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {\n var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);\n\n _this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {\n var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);\n _this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n }\n\n _this.setThumbContainerPos();\n });\n\n _defineProperty(this, \"setThumbContainerPos\", function () {\n var seekbarRect = _this.player.elements.progress.getBoundingClientRect();\n\n var plyrRect = _this.player.elements.container.getBoundingClientRect();\n\n var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n });\n\n _defineProperty(this, \"setScrubbingContainerSize\", function () {\n var _fitRatio = fitRatio(_this.thumbAspectRatio, {\n width: _this.player.media.clientWidth,\n height: _this.player.media.clientHeight\n }),\n width = _fitRatio.width,\n height = _fitRatio.height;\n\n _this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n _this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n });\n\n _defineProperty(this, \"setImageSizeAndOffset\", function (previewImage, frame) {\n if (!_this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n });\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n height = _fitRatio2.height;\n\n return height;\n } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n }();\n\n var source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Update previewThumbnails config & reload plugin\n\n\n if (!is$1.empty(input.previewThumbnails)) {\n Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n _this2.previewThumbnails.destroy();\n\n _this2.previewThumbnails = null;\n } // Create new instance if it is still enabled\n\n\n if (_this2.config.previewThumbnails.enabled) {\n _this2.previewThumbnails = new PreviewThumbnails(_this2);\n }\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n };\n\n /**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\n function clamp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n return Math.min(Math.max(input, min), max);\n }\n\n // TODO: Use a WeakMap for private globals\n // const globals = new WeakMap();\n // Plyr instance\n\n var Plyr = /*#__PURE__*/function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n _defineProperty(this, \"play\", function () {\n if (!is$1.function(_this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (_this.ads && _this.ads.enabled) {\n _this.ads.managerPromise.then(function () {\n return _this.ads.play();\n }).catch(function () {\n return silencePromise(_this.media.play());\n });\n } // Return the promise (for HTML5)\n\n\n return _this.media.play();\n });\n\n _defineProperty(this, \"pause\", function () {\n if (!_this.playing || !is$1.function(_this.media.pause)) {\n return null;\n }\n\n return _this.media.pause();\n });\n\n _defineProperty(this, \"togglePlay\", function (input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !_this.playing;\n\n if (toggle) {\n return _this.play();\n }\n\n return _this.pause();\n });\n\n _defineProperty(this, \"stop\", function () {\n if (_this.isHTML5) {\n _this.pause();\n\n _this.restart();\n } else if (is$1.function(_this.media.stop)) {\n _this.media.stop();\n }\n });\n\n _defineProperty(this, \"restart\", function () {\n _this.currentTime = 0;\n });\n\n _defineProperty(this, \"rewind\", function (seekTime) {\n _this.currentTime -= is$1.number(seekTime) ? seekTime : _this.config.seekTime;\n });\n\n _defineProperty(this, \"forward\", function (seekTime) {\n _this.currentTime += is$1.number(seekTime) ? seekTime : _this.config.seekTime;\n });\n\n _defineProperty(this, \"increaseVolume\", function (step) {\n var volume = _this.media.muted ? 0 : _this.volume;\n _this.volume = volume + (is$1.number(step) ? step : 0);\n });\n\n _defineProperty(this, \"decreaseVolume\", function (step) {\n _this.increaseVolume(-step);\n });\n\n _defineProperty(this, \"airplay\", function () {\n // Show dialog if supported\n if (support.airplay) {\n _this.media.webkitShowPlaybackTargetPicker();\n }\n });\n\n _defineProperty(this, \"toggleControls\", function (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 var isHidden = hasClass(_this.elements.container, _this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(_this.elements.container, _this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && is$1.array(_this.config.controls) && _this.config.controls.includes('settings') && !is$1.empty(_this.config.settings)) {\n controls.toggleMenu.call(_this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(_this, _this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n });\n\n _defineProperty(this, \"on\", function (event, callback) {\n on.call(_this, _this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"once\", function (event, callback) {\n once.call(_this, _this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"off\", function (event, callback) {\n off(_this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"destroy\", function (callback) {\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!_this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this.embed = null; // If it's a soft destroy, make minimal changes\n\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); // Clear for GC\n\n _this.elements.buttons.play = null;\n _this.elements.captions = null;\n _this.elements.controls = null;\n _this.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this); // Cancel current network requests\n\n html5.cancelRequests.call(_this); // Replace the container with the original element provided\n\n replaceElement(_this.elements.original, _this.elements.container); // Event\n\n triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this.elements.original);\n } // Reset state\n\n\n _this.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this.elements = null;\n _this.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n _this.stop(); // Clear timeouts\n\n\n clearTimeout(_this.timers.loading);\n clearTimeout(_this.timers.controls);\n clearTimeout(_this.timers.resized); // Provider specific stuff\n\n if (_this.isHTML5) {\n // Restore native video controls\n ui.toggleNativeControls.call(_this, true); // Clean up\n\n done();\n } else if (_this.isYouTube) {\n // Clear timers\n clearInterval(_this.timers.buffering);\n clearInterval(_this.timers.playing); // Destroy YouTube API\n\n if (_this.embed !== null && is$1.function(_this.embed.destroy)) {\n _this.embed.destroy();\n } // Clean up\n\n\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 } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n });\n\n _defineProperty(this, \"supports\", function (type) {\n return support.mime.call(_this, type);\n });\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n fullscreen: 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 }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var _type = this.media.tagName.toLowerCase(); // Embed properties\n\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (_type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.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); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.values(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = _type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\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 } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap(this.media, this.elements.container);\n } // Migrate custom properties from media to container (so they work 😉)\n\n\n ui.migrateStyles.call(this); // Add style hook\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup fullscreen\n\n\n this.fullscreen = new Fullscreen(this); // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', function () {\n return silencePromise(_this.play());\n });\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return this.provider === providers.html5;\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return this.isYouTube || this.isVimeo;\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return this.provider === providers.youtube;\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return this.provider === providers.vimeo;\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return this.type === types.video;\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return this.type === types.audio;\n }\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n\n }, {\n key: \"playing\",\n\n /**\n * Get playing state\n */\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n\n }, {\n key: \"currentTime\",\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: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\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\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"muted\",\n\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\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 } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var _this2 = this;\n\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Clamp to min/max\n\n\n var min = this.minimumSpeed,\n max = this.maximumSpeed;\n speed = clamp(speed, min, max); // Update config\n\n this.config.speed.selected = speed; // Set media speed\n\n setTimeout(function () {\n _this2.media.playbackRate = speed;\n }, 0);\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Get the minimum allowed speed\n */\n\n }, {\n key: \"minimumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 0.0625;\n }\n /**\n * Get the maximum allowed speed\n */\n\n }, {\n key: \"maximumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 16;\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest$1(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\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\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\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 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 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 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 default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the download URL\n */\n ,\n set: function set(input) {\n if (!is$1.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n controls.setDownloadUrl.call(this);\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(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(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n }\n /**\n * Get the current aspect ratio in use\n */\n\n }, {\n key: \"ratio\",\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n var ratio = reduceAspectRatio(getAspectRatio.call(this));\n return is$1.array(ratio) ? ratio.join(':') : ratio;\n }\n /**\n * Set video aspect ratio\n */\n ,\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is$1.string(input) || !validateRatio(input)) {\n this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n return;\n }\n\n this.config.ratio = input;\n setAspectRatio.call(this);\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\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\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\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\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n\n }], [{\n key: \"supported\",\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\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\n }, {\n key: \"loadSprite\",\n value: function loadSprite$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n }();\n\n Plyr.defaults = cloneDeep(defaults$1);\n\n return Plyr;\n\n})));\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\n\nconst isElement = (input) =>\n input !== null &&\n typeof input === 'object' &&\n input.nodeType === 1 &&\n typeof input.style === 'object' &&\n typeof input.ownerDocument === 'object';\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\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 isEdge: window.navigator.userAgent.includes('Edge'),\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// 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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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// 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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.4/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\n\n // Update the UI\n this.update();\n\n // this.toggle = this.toggle.bind(this);\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n };\n\n 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\n // Toggle button and fire events\n this.onChange();\n };\n\n // Trap focus inside container\n trapFocus = (event) => {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update = () => {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n };\n\n // Container listeners\n container = () => {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load = () => {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready = () => {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n };\n\n addCuePoints = () => {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load = () => {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n };\n\n // Download VTT files and parse them\n getThumbnails = () => {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n };\n\n // Process individual VTT file\n getThumbnail = (url) => {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n };\n\n startMove = (event) => {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n };\n\n endMove = () => {\n this.toggleThumbContainer(false, true);\n };\n\n startScrubbing = (event) => {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n };\n\n endScrubbing = () => {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n };\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners = () => {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n };\n\n /**\n * Create HTML elements for image containers\n */\n render = () => {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n };\n\n destroy = () => {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n };\n\n showImageAtCurrentTime = () => {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n };\n\n // Show the image that's currently specified in this.showingThumb\n loadImage = (qualityIndex = 0) => {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n };\n\n showImage = (previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) => {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n };\n\n // Remove all preview images that aren't the designated current image\n removeOldImages = (currentImage) => {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n };\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby = (thumbNum, forward = true) => {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n };\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality = (currentQualityIndex, previewImage, frame, thumbFilename) => {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n };\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer = (toggle = false, clearShowing = false) => {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n toggleScrubbingContainer = (toggle = false) => {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n determineContainerAutoSizing = () => {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n };\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos = () => {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n };\n\n setThumbContainerPos = () => {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n };\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize = () => {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n };\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset = (previewImage, frame) => {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n };\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\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.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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.values(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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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) => support.mime.call(this, type);\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} 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 * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n"]} \ No newline at end of file
diff --git a/dist/plyr.min.mjs b/dist/plyr.min.mjs
index c075547b..5df43022 100644
--- a/dist/plyr.min.mjs
+++ b/dist/plyr.min.mjs
@@ -1,3 +1,3 @@
-function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(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)}}function _createClass(e,t,i){return t&&_defineProperties(e.prototype,t),i&&_defineProperties(e,i),e}function _defineProperty(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function ownKeys(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(i),!0).forEach((function(t){_defineProperty(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):ownKeys(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}function _objectWithoutPropertiesLoose(e,t){if(null==e)return{};var i,n,s={},a=Object.keys(e);for(n=0;n<a.length;n++)i=a[n],t.indexOf(i)>=0||(s[i]=e[i]);return s}function _objectWithoutProperties(e,t){if(null==e)return{};var i,n,s=_objectWithoutPropertiesLoose(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(n=0;n<a.length;n++)i=a[n],t.indexOf(i)>=0||Object.prototype.propertyIsEnumerable.call(e,i)&&(s[i]=e[i])}return s}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArray(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}function _iterableToArrayLimit(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var i=[],n=!0,s=!1,a=void 0;try{for(var r,o=e[Symbol.iterator]();!(n=(r=o.next()).done)&&(i.push(r.value),!t||i.length!==t);n=!0);}catch(e){s=!0,a=e}finally{try{n||null==o.return||o.return()}finally{if(s)throw a}}return i}}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var i=Object.prototype.toString.call(e).slice(8,-1);return"Object"===i&&e.constructor&&(i=e.constructor.name),"Map"===i||"Set"===i?Array.from(e):"Arguments"===i||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(i)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var i=0,n=new Array(t);i<t;i++)n[i]=e[i];return n}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _classCallCheck$1(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties$1(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)}}function _createClass$1(e,t,i){return t&&_defineProperties$1(e.prototype,t),i&&_defineProperties$1(e,i),e}function _defineProperty$1(e,t,i){return t in e?Object.defineProperty(e,t,{value:i,enumerable:!0,configurable:!0,writable:!0}):e[t]=i,e}function ownKeys$1(e,t){var i=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),i.push.apply(i,n)}return i}function _objectSpread2$1(e){for(var t=1;t<arguments.length;t++){var i=null!=arguments[t]?arguments[t]:{};t%2?ownKeys$1(Object(i),!0).forEach((function(t){_defineProperty$1(e,t,i[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(i)):ownKeys$1(Object(i)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(i,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var i=new Event(t,{bubbles:!0});e.dispatchEvent(i)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var i=getDecimalPlaces(t);return parseFloat(e.toFixed(i))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,i){_classCallCheck$1(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2$1({},defaults,{},i),this.init())}return _createClass$1(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,i=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[i](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!is.event(t))return null;var i,n=t.target,s=t.changedTouches[0],a=parseFloat(n.getAttribute("min"))||0,r=parseFloat(n.getAttribute("max"))||100,o=parseFloat(n.getAttribute("step"))||1,l=n.getBoundingClientRect(),c=100/l.width*(this.config.thumbWidth/2)/100;return 0>(i=100/l.width*(s.clientX-l.left))?i=0:100<i&&(i=100),50>i?i-=(100-2*i)*c:50<i&&(i+=2*(i-50)*c),a+round(i/100*(r-a),o)}},{key:"set",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var i=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},n=null;if(is.empty(t)||is.string(t)?n=Array.from(document.querySelectorAll(is.string(t)?t:'input[type="range"]')):is.element(t)?n=[t]:is.nodeList(t)?n=Array.from(t):is.array(t)&&(n=t.filter(is.element)),is.empty(n))return null;var s=_objectSpread2$1({},defaults,{},i);if(is.string(t)&&s.watch){var a=new MutationObserver((function(i){Array.from(i).forEach((function(i){Array.from(i.addedNodes).forEach((function(i){is.element(i)&&matches(i,t)&&new e(i,s)}))}))}));a.observe(document.body,{childList:!0,subtree:!0})}return n.map((function(t){return new e(t,i)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),getConstructor$1=function(e){return null!=e?e.constructor:null},instanceOf$1=function(e,t){return Boolean(e&&t&&e instanceof t)},isNullOrUndefined$1=function(e){return null==e},isObject$1=function(e){return getConstructor$1(e)===Object},isNumber$1=function(e){return getConstructor$1(e)===Number&&!Number.isNaN(e)},isString$1=function(e){return getConstructor$1(e)===String},isBoolean$1=function(e){return getConstructor$1(e)===Boolean},isFunction$1=function(e){return getConstructor$1(e)===Function},isArray$1=function(e){return Array.isArray(e)},isWeakMap=function(e){return instanceOf$1(e,WeakMap)},isNodeList$1=function(e){return instanceOf$1(e,NodeList)},isElement$1=function(e){return instanceOf$1(e,Element)},isTextNode=function(e){return getConstructor$1(e)===Text},isEvent$1=function(e){return instanceOf$1(e,Event)},isKeyboardEvent=function(e){return instanceOf$1(e,KeyboardEvent)},isCue=function(e){return instanceOf$1(e,window.TextTrackCue)||instanceOf$1(e,window.VTTCue)},isTrack=function(e){return instanceOf$1(e,TextTrack)||!isNullOrUndefined$1(e)&&isString$1(e.kind)},isPromise=function(e){return instanceOf$1(e,Promise)&&isFunction$1(e.then)},isEmpty$1=function(e){return isNullOrUndefined$1(e)||(isString$1(e)||isArray$1(e)||isNodeList$1(e))&&!e.length||isObject$1(e)&&!Object.keys(e).length},isUrl=function(e){if(instanceOf$1(e,window.URL))return!0;if(!isString$1(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!isEmpty$1(new URL(t).hostname)}catch(e){return!1}},is$1={nullOrUndefined:isNullOrUndefined$1,object:isObject$1,number:isNumber$1,string:isString$1,boolean:isBoolean$1,function:isFunction$1,array:isArray$1,weakMap:isWeakMap,nodeList:isNodeList$1,element:isElement$1,textNode:isTextNode,event:isEvent$1,keyboardEvent:isKeyboardEvent,cue:isCue,track:isTrack,promise:isPromise,url:isUrl,empty:isEmpty$1},transitionEndEvent=function(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},i=Object.keys(t).find((function(t){return void 0!==e.style[t]}));return!!is$1.string(i)&&t[i]}();function repaint(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var browser={isIE:
+function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(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 _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function _objectWithoutPropertiesLoose(e,t){if(null==e)return{};var n,i,r={},s=Object.keys(e);for(i=0;i<s.length;i++)n=s[i],t.indexOf(n)>=0||(r[n]=e[n]);return r}function _objectWithoutProperties(e,t){if(null==e)return{};var n,i,r=_objectWithoutPropertiesLoose(e,t);if(Object.getOwnPropertySymbols){var s=Object.getOwnPropertySymbols(e);for(i=0;i<s.length;i++)n=s[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArray(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}function _iterableToArrayLimit(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],i=!0,r=!1,s=void 0;try{for(var o,a=e[Symbol.iterator]();!(i=(o=a.next()).done)&&(n.push(o.value),!t||n.length!==t);i=!0);}catch(e){r=!0,s=e}finally{try{i||null==a.return||a.return()}finally{if(r)throw s}}return n}}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n<t;n++)i[n]=e[n];return i}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _classCallCheck$1(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties$1(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 _createClass$1(e,t,n){return t&&_defineProperties$1(e.prototype,t),n&&_defineProperties$1(e,n),e}function _defineProperty$1(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys$1(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function _objectSpread2$1(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys$1(Object(n),!0).forEach((function(t){_defineProperty$1(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys$1(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck$1(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2$1({},defaults,{},n),this.init())}return _createClass$1(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!is.event(t))return null;var n,i=t.target,r=t.changedTouches[0],s=parseFloat(i.getAttribute("min"))||0,o=parseFloat(i.getAttribute("max"))||100,a=parseFloat(i.getAttribute("step"))||1,l=i.getBoundingClientRect(),c=100/l.width*(this.config.thumbWidth/2)/100;return 0>(n=100/l.width*(r.clientX-l.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*c:50<n&&(n+=2*(n-50)*c),s+round(n/100*(o-s),a)}},{key:"set",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},i=null;if(is.empty(t)||is.string(t)?i=Array.from(document.querySelectorAll(is.string(t)?t:'input[type="range"]')):is.element(t)?i=[t]:is.nodeList(t)?i=Array.from(t):is.array(t)&&(i=t.filter(is.element)),is.empty(i))return null;var r=_objectSpread2$1({},defaults,{},n);if(is.string(t)&&r.watch){var s=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,r)}))}))}));s.observe(document.body,{childList:!0,subtree:!0})}return i.map((function(t){return new e(t,n)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),getConstructor$1=function(e){return null!=e?e.constructor:null},instanceOf$1=function(e,t){return Boolean(e&&t&&e instanceof t)},isNullOrUndefined$1=function(e){return null==e},isObject$1=function(e){return getConstructor$1(e)===Object},isNumber$1=function(e){return getConstructor$1(e)===Number&&!Number.isNaN(e)},isString$1=function(e){return getConstructor$1(e)===String},isBoolean$1=function(e){return getConstructor$1(e)===Boolean},isFunction$1=function(e){return getConstructor$1(e)===Function},isArray$1=function(e){return Array.isArray(e)},isWeakMap=function(e){return instanceOf$1(e,WeakMap)},isNodeList$1=function(e){return instanceOf$1(e,NodeList)},isTextNode=function(e){return getConstructor$1(e)===Text},isEvent$1=function(e){return instanceOf$1(e,Event)},isKeyboardEvent=function(e){return instanceOf$1(e,KeyboardEvent)},isCue=function(e){return instanceOf$1(e,window.TextTrackCue)||instanceOf$1(e,window.VTTCue)},isTrack=function(e){return instanceOf$1(e,TextTrack)||!isNullOrUndefined$1(e)&&isString$1(e.kind)},isPromise=function(e){return instanceOf$1(e,Promise)&&isFunction$1(e.then)},isElement$1=function(e){return null!==e&&"object"===_typeof(e)&&1===e.nodeType&&"object"===_typeof(e.style)&&"object"===_typeof(e.ownerDocument)},isEmpty$1=function(e){return isNullOrUndefined$1(e)||(isString$1(e)||isArray$1(e)||isNodeList$1(e))&&!e.length||isObject$1(e)&&!Object.keys(e).length},isUrl=function(e){if(instanceOf$1(e,window.URL))return!0;if(!isString$1(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!isEmpty$1(new URL(t).hostname)}catch(e){return!1}},is$1={nullOrUndefined:isNullOrUndefined$1,object:isObject$1,number:isNumber$1,string:isString$1,boolean:isBoolean$1,function:isFunction$1,array:isArray$1,weakMap:isWeakMap,nodeList:isNodeList$1,element:isElement$1,textNode:isTextNode,event:isEvent$1,keyboardEvent:isKeyboardEvent,cue:isCue,track:isTrack,promise:isPromise,url:isUrl,empty:isEmpty$1},transitionEndEvent=function(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n=Object.keys(t).find((function(t){return void 0!==e.style[t]}));return!!is$1.string(n)&&t[n]}();function repaint(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var browser={isIE:
/* @cc_on!@ */
-!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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 cloneDeep(e){return JSON.parse(JSON.stringify(e))}function getDeep(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function extend(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,i=new 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 is$1.object(s)?(Object.keys(s).forEach((function(t){is$1.object(s[t])?(Object.keys(e).includes(t)||Object.assign(e,_defineProperty({},t,{})),extend(e[t],s[t])):Object.assign(e,_defineProperty({},t,s[t]))})),extend.apply(void 0,[e].concat(i))):e}function wrap(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 setAttributes(e,t){is$1.element(e)&&!is$1.empty(t)&&Object.entries(t).filter((function(e){var t=_slicedToArray(e,2)[1];return!is$1.nullOrUndefined(t)})).forEach((function(t){var i=_slicedToArray(t,2),n=i[0],s=i[1];return e.setAttribute(n,s)}))}function createElement(e,t,i){var n=document.createElement(e);return is$1.object(t)&&setAttributes(n,t),is$1.string(i)&&(n.innerText=i),n}function insertAfter(e,t){is$1.element(e)&&is$1.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)}function insertElement(e,t,i,n){is$1.element(t)&&t.appendChild(createElement(e,i,n))}function removeElement(e){is$1.nodeList(e)||is$1.array(e)?Array.from(e).forEach(removeElement):is$1.element(e)&&is$1.element(e.parentNode)&&e.parentNode.removeChild(e)}function emptyElement(e){if(is$1.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function replaceElement(e,t){return is$1.element(t)&&is$1.element(t.parentNode)&&is$1.element(e)?(t.parentNode.replaceChild(e,t),e):null}function getAttributesFromSelector(e,t){if(!is$1.string(e)||is$1.empty(e))return{};var i={},n=extend({},t);return e.split(",").forEach((function(e){var t=e.trim(),s=t.replace(".",""),a=t.replace(/[[\]]/g,"").split("="),r=_slicedToArray(a,1)[0],o=a.length>1?a[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":is$1.string(n.class)?i.class="".concat(n.class," ").concat(s):i.class=s;break;case"#":i.id=t.replace("#","");break;case"[":i[r]=o}})),extend(n,i)}function toggleHidden(e,t){if(is$1.element(e)){var i=t;is$1.boolean(i)||(i=!e.hidden),e.hidden=i}}function toggleClass(e,t,i){if(is$1.nodeList(e))return Array.from(e).map((function(e){return toggleClass(e,t,i)}));if(is$1.element(e)){var n="toggle";return void 0!==i&&(n=i?"add":"remove"),e.classList[n](t),e.classList.contains(t)}return!1}function hasClass(e,t){return is$1.element(e)&&e.classList.contains(t)}function matches$1(e,t){var i=Element.prototype;return(i.matches||i.webkitMatchesSelector||i.mozMatchesSelector||i.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function closest(e,t){return(Element.prototype.closest||function(){var e=this;do{if(matches$1.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}function getElements(e){return this.elements.container.querySelectorAll(e)}function getElement(e){return this.elements.container.querySelector(e)}function setFocus(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];is$1.element(e)&&(e.focus({preventScroll:!0}),t&&toggleClass(e,this.config.classNames.tabFocus))}var defaultCodecs={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},support={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,i){var n=browser.isIPhone&&i&&support.playsinline,s=support[e]||"html5"!==t;return{api:s,ui:s&&support.rangeInput&&("video"!==e||!browser.isIPhone||n)}},pip:!(browser.isIPhone||!is$1.function(createElement("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||createElement("video").disablePictureInPicture)),airplay:is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(is$1.empty(e))return!1;var t=_slicedToArray(e.split("/"),1)[0],i=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(defaultCodecs).includes(i)&&(i+='; codecs="'.concat(defaultCodecs[e],'"'));try{return Boolean(i&&this.media.canPlayType(i).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:function(){var e=document.createElement("input");return e.type="range","range"===e.type}(),touch:"ontouchstart"in document.documentElement,transitions:!1!==transitionEndEvent,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},supportsPassiveListeners=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 toggleListener(e,t,i){var n=this,s=arguments.length>3&&void 0!==arguments[3]&&arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],r=arguments.length>5&&void 0!==arguments[5]&&arguments[5];if(e&&"addEventListener"in e&&!is$1.empty(t)&&is$1.function(i)){var o=t.split(" "),l=r;supportsPassiveListeners&&(l={passive:a,capture:r}),o.forEach((function(t){n&&n.eventListeners&&s&&n.eventListeners.push({element:e,type:t,callback:i,options:l}),e[s?"addEventListener":"removeEventListener"](t,i,l)}))}}function on(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,i,!0,n,s)}function off(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,n=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,i,!1,n,s)}function once(e){var t=this,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,s=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=arguments.length>4&&void 0!==arguments[4]&&arguments[4],r=function r(){off(e,i,r,s,a);for(var o=arguments.length,l=new Array(o),c=0;c<o;c++)l[c]=arguments[c];n.apply(t,l)};toggleListener.call(this,e,i,r,!0,s,a)}function triggerEvent(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(is$1.element(e)&&!is$1.empty(t)){var s=new CustomEvent(t,{bubbles:i,detail:_objectSpread2(_objectSpread2({},n),{},{plyr:this})});e.dispatchEvent(s)}}function unbindListeners(){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=[])}function ready(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):on.call(e,e.elements.container,"ready",t)})).then((function(){}))}function silencePromise(e){is$1.promise(e)&&e.then(null,(function(){}))}function validateRatio(e){return!!(is$1.array(e)||is$1.string(e)&&e.includes(":"))&&(is$1.array(e)?e:e.split(":")).map(Number).every(is$1.number)}function reduceAspectRatio(e){if(!is$1.array(e)||!e.every(is$1.number))return null;var t=_slicedToArray(e,2),i=t[0],n=t[1],s=function e(t,i){return 0===i?t:e(i,t%i)}(i,n);return[i/s,n/s]}function getAspectRatio(e){var t=function(e){return validateRatio(e)?e.split(":").map(Number):null},i=t(e);if(null===i&&(i=t(this.config.ratio)),null===i&&!is$1.empty(this.embed)&&is$1.array(this.embed.ratio)&&(i=this.embed.ratio),null===i&&this.isHTML5){var n=this.media;i=reduceAspectRatio([n.videoWidth,n.videoHeight])}return i}function setAspectRatio(e){if(!this.isVideo)return{};var t=this.elements.wrapper,i=getAspectRatio.call(this,e),n=_slicedToArray(is$1.array(i)?i:[0,0],2),s=100/n[0]*n[1];if(t.style.paddingBottom="".concat(s,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var a=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),r=(a-s)/(a/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(r,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==i);return{padding:s,ratio:i}}var html5={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var i=t.getAttribute("type");return!!is$1.empty(i)||support.mime.call(e,i)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:html5.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,is$1.empty(this.config.ratio)||setAspectRatio.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=html5.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&is$1.function(e.config.quality.onChange))e.config.quality.onChange(t);else{var i=html5.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!i)return;var n=e.media,s=n.currentTime,a=n.paused,r=n.preload,o=n.readyState,l=n.playbackRate;e.media.src=i.getAttribute("src"),("none"!==r||o)&&(e.once("loadedmetadata",(function(){e.speed=l,e.currentTime=s,a||silencePromise(e.play())})),e.media.load())}triggerEvent.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(removeElement(html5.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function dedupe(e){return is$1.array(e)?e.filter((function(t,i){return e.indexOf(t)===i})):e}function closest$1(e,t){return is$1.array(e)&&e.length?e.reduce((function(e,i){return Math.abs(i-t)<Math.abs(e-t)?i:e})):null}function generateId(e){return"".concat(e,"-").concat(Math.floor(1e4*Math.random()))}function format(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];return is$1.empty(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return i[t].toString()}))}function getPercentage(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}var replaceAll=function(){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())},toTitleCase=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function toPascalCase(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=replaceAll(t,"-"," "),t=replaceAll(t,"_"," "),t=toTitleCase(t),replaceAll(t," ","")}function toCamelCase(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return(t=toPascalCase(t)).charAt(0).toLowerCase()+t.slice(1)}function stripHTML(e){var t=document.createDocumentFragment(),i=document.createElement("div");return t.appendChild(i),i.innerHTML=e,t.firstChild.innerText}function getHTML(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var resources={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},i18n={get:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(is$1.empty(e)||is$1.empty(t))return"";var i=getDeep(t.i18n,e);if(is$1.empty(i))return Object.keys(resources).includes(e)?resources[e]:"";var n={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(n).forEach((function(e){var t=_slicedToArray(e,2),n=t[0],s=t[1];i=replaceAll(i,n,s)})),i}},Storage=function(){function e(t){_classCallCheck(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return _createClass(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var i=window.localStorage.getItem(this.key);if(is$1.empty(i))return null;var n=JSON.parse(i);return is$1.string(t)&&t.length?n[t]:n}},{key:"set",value:function(t){if(e.supported&&this.enabled&&is$1.object(t)){var i=this.get();is$1.empty(i)&&(i={}),extend(i,t),window.localStorage.setItem(this.key,JSON.stringify(i))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function fetch(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 loadSprite(e,t){if(is$1.string(e)){var i="cache",n=is$1.string(t),s=function(){return null!==document.getElementById(t)},a=function(e,t){e.innerHTML=t,n&&s()||document.body.insertAdjacentElement("afterbegin",e)};if(!n||!s()){var r=Storage.supported,o=document.createElement("div");if(o.setAttribute("hidden",""),n&&o.setAttribute("id",t),r){var l=window.localStorage.getItem("".concat(i,"-").concat(t));if(null!==l){var c=JSON.parse(l);a(o,c.content)}}fetch(e).then((function(e){is$1.empty(e)||(r&&window.localStorage.setItem("".concat(i,"-").concat(t),JSON.stringify({content:e})),a(o,e))})).catch((function(){}))}}}var getHours=function(e){return Math.trunc(e/60/60%60,10)},getMinutes=function(e){return Math.trunc(e/60%60,10)},getSeconds=function(e){return Math.trunc(e%60,10)};function formatTime(){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(!is$1.number(e))return formatTime(void 0,t,i);var n=function(e){return"0".concat(e).slice(-2)},s=getHours(e),a=getMinutes(e),r=getSeconds(e);return s=t||s>0?"".concat(s,":"):"","".concat(i&&e>0?"-":"").concat(s).concat(n(a),":").concat(n(r))}var controls={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||browser.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=getElement.call(this,this.config.selectors.controls.wrapper),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)},this.elements.progress=getElement.call(this,this.config.selectors.progress),this.elements.inputs={seek:getElement.call(this,this.config.selectors.inputs.seek),volume:getElement.call(this,this.config.selectors.inputs.volume)},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)},is$1.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 i="http://www.w3.org/2000/svg",n=controls.getIconUrl.call(this),s="".concat(n.cors?"":n.url,"#").concat(this.config.iconPrefix),a=document.createElementNS(i,"svg");setAttributes(a,extend(t,{"aria-hidden":"true",focusable:"false"}));var r=document.createElementNS(i,"use"),o="".concat(s,"-").concat(e);return"href"in r&&r.setAttributeNS("http://www.w3.org/1999/xlink","href",o),r.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",o),a.appendChild(r),a},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=i18n.get(e,this.config),n=_objectSpread2(_objectSpread2({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return createElement("span",n,i)},createBadge:function(e){if(is$1.empty(e))return null;var t=createElement("span",{class:this.config.classNames.menu.value});return t.appendChild(createElement("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var i=this,n=extend({},t),s=toCamelCase(e),a={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(n).includes(e)&&(a[e]=n[e],delete n[e])})),"button"!==a.element||Object.keys(n).includes("type")||(n.type="button"),Object.keys(n).includes("class")?n.class.split(" ").some((function(e){return e===i.config.classNames.control}))||extend(n,{class:"".concat(n.class," ").concat(this.config.classNames.control)}):n.class=this.config.classNames.control,e){case"play":a.toggle=!0,a.label="play",a.labelPressed="pause",a.icon="play",a.iconPressed="pause";break;case"mute":a.toggle=!0,a.label="mute",a.labelPressed="unmute",a.icon="volume",a.iconPressed="muted";break;case"captions":a.toggle=!0,a.label="enableCaptions",a.labelPressed="disableCaptions",a.icon="captions-off",a.iconPressed="captions-on";break;case"fullscreen":a.toggle=!0,a.label="enterFullscreen",a.labelPressed="exitFullscreen",a.icon="enter-fullscreen",a.iconPressed="exit-fullscreen";break;case"play-large":n.class+=" ".concat(this.config.classNames.control,"--overlaid"),s="play",a.label="play",a.icon="play";break;default:is$1.empty(a.label)&&(a.label=s),is$1.empty(a.icon)&&(a.icon=e)}var r=createElement(a.element);return a.toggle?(r.appendChild(controls.createIcon.call(this,a.iconPressed,{class:"icon--pressed"})),r.appendChild(controls.createIcon.call(this,a.icon,{class:"icon--not-pressed"})),r.appendChild(controls.createLabel.call(this,a.labelPressed,{class:"label--pressed"})),r.appendChild(controls.createLabel.call(this,a.label,{class:"label--not-pressed"}))):(r.appendChild(controls.createIcon.call(this,a.icon)),r.appendChild(controls.createLabel.call(this,a.label))),extend(n,getAttributesFromSelector(this.config.selectors.buttons[s],n)),setAttributes(r,n),"play"===s?(is$1.array(this.elements.buttons[s])||(this.elements.buttons[s]=[]),this.elements.buttons[s].push(r)):this.elements.buttons[s]=r,r},createRange:function(e,t){var i=createElement("input",extend(getAttributesFromSelector(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":i18n.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=i,controls.updateRangeFill.call(this,i),RangeTouch.setup(i),i},createProgress:function(e,t){var i=createElement("progress",extend(getAttributesFromSelector(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){i.appendChild(createElement("span",null,"0"));var n={played:"played",buffer:"buffered"}[e],s=n?i18n.get(n,this.config):"";i.innerText="% ".concat(s.toLowerCase())}return this.elements.display[e]=i,i},createTime:function(e,t){var i=getAttributesFromSelector(this.config.selectors.display[e],t),n=createElement("div",extend(i,{class:"".concat(i.class?i.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":i18n.get(e,this.config)}),"00:00");return this.elements.display[e]=n,n},bindMenuItemShortcuts:function(e,t){var i=this;on.call(this,e,"keydown keyup",(function(n){if([32,38,39,40].includes(n.which)&&(n.preventDefault(),n.stopPropagation(),"keydown"!==n.type)){var s,a=matches$1(e,'[role="menuitemradio"]');if(!a&&[32,39].includes(n.which))controls.showMenuPanel.call(i,t,!0);else 32!==n.which&&(40===n.which||a&&39===n.which?(s=e.nextElementSibling,is$1.element(s)||(s=e.parentNode.firstElementChild)):(s=e.previousElementSibling,is$1.element(s)||(s=e.parentNode.lastElementChild)),setFocus.call(i,s,!0))}}),!1),on.call(this,e,"keyup",(function(e){13===e.which&&controls.focusFirstMenuItem.call(i,null,!0)}))},createMenuItem:function(e){var t=this,i=e.value,n=e.list,s=e.type,a=e.title,r=e.badge,o=void 0===r?null:r,l=e.checked,c=void 0!==l&&l,u=getAttributesFromSelector(this.config.selectors.inputs[s]),d=createElement("button",extend(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:i})),h=createElement("span");h.innerHTML=a,is$1.element(o)&&h.appendChild(o),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 matches$1(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(!is$1.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,s){case"language":t.currentTrack=Number(i);break;case"quality":t.quality=i;break;case"speed":t.speed=parseFloat(i)}controls.showMenuPanel.call(t,"home",is$1.keyboardEvent(e))}}),s,!1),controls.bindMenuItemShortcuts.call(this,d,s),n.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];if(!is$1.number(e))return e;var i=getHours(this.duration)>0;return formatTime(e,i,t)},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];is$1.element(e)&&is$1.number(t)&&(e.innerText=controls.formatTime(t,i))},updateVolume:function(){this.supported.ui&&(is$1.element(this.elements.inputs.volume)&&controls.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),is$1.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;is$1.element(e)&&(e.value=t,controls.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&is$1.event(e)){var i=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":i=getPercentage(this.currentTime,this.duration),"timeupdate"===e.type&&controls.setRange.call(this,this.elements.inputs.seek,i);break;case"playing":case"progress":!function(e,i){var n=is$1.number(i)?i:0,s=is$1.element(e)?e:t.elements.display.buffer;if(is$1.element(s)){s.value=n;var a=s.getElementsByTagName("span")[0];is$1.element(a)&&(a.childNodes[0].nodeValue=n)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=is$1.event(e)?e.target:e;if(is$1.element(t)&&"range"===t.getAttribute("type")){if(matches$1(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var i=controls.formatTime(this.currentTime),n=controls.formatTime(this.duration),s=i18n.get("seekLabel",this.config);t.setAttribute("aria-valuetext",s.replace("{currentTime}",i).replace("{duration}",n))}else if(matches$1(t,this.config.selectors.inputs.volume)){var a=100*t.value;t.setAttribute("aria-valuenow",a),t.setAttribute("aria-valuetext","".concat(a.toFixed(1),"%"))}else t.setAttribute("aria-valuenow",t.value);browser.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&is$1.element(this.elements.inputs.seek)&&is$1.element(this.elements.display.seekTooltip)&&0!==this.duration){var i="".concat(this.config.classNames.tooltip,"--visible"),n=function(e){return toggleClass(t.elements.display.seekTooltip,i,e)};if(this.touch)n(!1);else{var s=0,a=this.elements.progress.getBoundingClientRect();if(is$1.event(e))s=100/a.width*(e.pageX-a.left);else{if(!hasClass(this.elements.display.seekTooltip,i))return;s=parseFloat(this.elements.display.seekTooltip.style.left,10)}s<0?s=0:s>100&&(s=100),controls.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*s),this.elements.display.seekTooltip.style.left="".concat(s,"%"),is$1.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&n("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!is$1.element(this.elements.display.duration)&&this.config.invertTime;controls.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||controls.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return toggleHidden(this.elements.display.currentTime,!0),void toggleHidden(this.elements.progress,!0);is$1.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=is$1.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&controls.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&controls.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),controls.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){toggleHidden(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=is$1.empty(i)?this[e]:i,is$1.empty(s)&&(s=this.config[e].default),!is$1.empty(this.options[e])&&!this.options[e].includes(s))return void this.debug.warn("Unsupported value of '".concat(s,"' for ").concat(e));if(!this.config[e].options.includes(s))return void this.debug.warn("Disabled value of '".concat(s,"' for ").concat(e))}if(is$1.element(a)||(a=n&&n.querySelector('[role="menu"]')),is$1.element(a)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=controls.getLabel.call(this,e,s);var r=a&&a.querySelector('[value="'.concat(s,'"]'));is$1.element(r)&&(r.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?i18n.get("normal",this.config):"".concat(t,"&times;");case"quality":if(is$1.number(t)){var i=i18n.get("qualityLabel.".concat(t),this.config);return i.length?i:"".concat(t,"p")}return toTitleCase(t);case"captions":return captions.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(is$1.element(this.elements.settings.panels.quality)){var i="quality",n=this.elements.settings.panels.quality.querySelector('[role="menu"]');is$1.array(e)&&(this.options.quality=dedupe(e).filter((function(e){return t.config.quality.options.includes(e)})));var s=!is$1.empty(this.options.quality)&&this.options.quality.length>1;if(controls.toggleMenuButton.call(this,i,s),emptyElement(n),controls.checkMenu.call(this),s){var a=function(e){var i=i18n.get("qualityBadge.".concat(e),t.config);return i.length?controls.createBadge.call(t,i):null};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){controls.createMenuItem.call(t,{value:e,list:n,type:i,title:controls.getLabel.call(t,"quality",e),badge:a(e)})})),controls.updateSetting.call(this,i,n)}}},setCaptionsMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.captions)){var t="captions",i=this.elements.settings.panels.captions.querySelector('[role="menu"]'),n=captions.getTracks.call(this),s=Boolean(n.length);if(controls.toggleMenuButton.call(this,t,s),emptyElement(i),controls.checkMenu.call(this),s){var a=n.map((function(t,n){return{value:n,checked:e.captions.toggled&&e.currentTrack===n,title:captions.getLabel.call(e,t),badge:t.language&&controls.createBadge.call(e,t.language.toUpperCase()),list:i,type:"language"}}));a.unshift({value:-1,checked:!this.captions.toggled,title:i18n.get("disabled",this.config),list:i,type:"language"}),a.forEach(controls.createMenuItem.bind(this)),controls.updateSetting.call(this,t,i)}}},setSpeedMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.speed)){var t="speed",i=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var n=!is$1.empty(this.options.speed)&&this.options.speed.length>1;controls.toggleMenuButton.call(this,t,n),emptyElement(i),controls.checkMenu.call(this),n&&(this.options.speed.forEach((function(n){controls.createMenuItem.call(e,{value:n,list:i,type:t,title:controls.getLabel.call(e,"speed",n)})})),controls.updateSetting.call(this,t,i))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!is$1.empty(e)&&Object.values(e).some((function(e){return!e.hidden}));toggleHidden(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;is$1.element(i)||(i=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var n=i.querySelector('[role^="menuitem"]');setFocus.call(this,n,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,i=this.elements.buttons.settings;if(is$1.element(t)&&is$1.element(i)){var n=t.hidden,s=n;if(is$1.boolean(e))s=e;else if(is$1.keyboardEvent(e)&&27===e.which)s=!1;else if(is$1.event(e)){var a=is$1.function(e.composedPath)?e.composedPath()[0]:e.target,r=t.contains(a);if(r||!r&&e.target!==i&&s)return}i.setAttribute("aria-expanded",s),toggleHidden(t,!s),toggleClass(this.elements.container,this.config.classNames.menu.open,s),s&&is$1.keyboardEvent(e)?controls.focusFirstMenuItem.call(this,null,!0):s||n||setFocus.call(this,i,is$1.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 removeElement(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=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(is$1.element(n)){var s=n.parentNode,a=Array.from(s.children).find((function(e){return!e.hidden}));if(support.transitions&&!support.reducedMotion){s.style.width="".concat(a.scrollWidth,"px"),s.style.height="".concat(a.scrollHeight,"px");var r=controls.getMenuSize.call(this,n),o=function t(i){i.target===s&&["width","height"].includes(i.propertyName)&&(s.style.width="",s.style.height="",off.call(e,s,transitionEndEvent,t))};on.call(this,s,transitionEndEvent,o),s.style.width="".concat(r.width,"px"),s.style.height="".concat(r.height,"px")}toggleHidden(a,!0),toggleHidden(n,!1),controls.focusFirstMenuItem.call(this,n,i)}},setDownloadUrl:function(){var e=this.elements.buttons.download;is$1.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,i=controls.bindMenuItemShortcuts,n=controls.createButton,s=controls.createProgress,a=controls.createRange,r=controls.createTime,o=controls.setQualityMenu,l=controls.setSpeedMenu,c=controls.showMenuPanel;this.elements.controls=null,is$1.array(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(n.call(this,"play-large"));var u=createElement("div",getAttributesFromSelector(this.config.selectors.controls.wrapper));this.elements.controls=u;var d={class:"plyr__controls__item"};return dedupe(is$1.array(this.config.controls)?this.config.controls:[]).forEach((function(o){if("restart"===o&&u.appendChild(n.call(t,"restart",d)),"rewind"===o&&u.appendChild(n.call(t,"rewind",d)),"play"===o&&u.appendChild(n.call(t,"play",d)),"fast-forward"===o&&u.appendChild(n.call(t,"fast-forward",d)),"progress"===o){var l=createElement("div",{class:"".concat(d.class," plyr__progress__container")}),h=createElement("div",getAttributesFromSelector(t.config.selectors.progress));if(h.appendChild(a.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),h.appendChild(s.call(t,"buffer")),t.config.tooltips.seek){var m=createElement("span",{class:t.config.classNames.tooltip},"00:00");h.appendChild(m),t.elements.display.seekTooltip=m}t.elements.progress=h,l.appendChild(t.elements.progress),u.appendChild(l)}if("current-time"===o&&u.appendChild(r.call(t,"currentTime",d)),"duration"===o&&u.appendChild(r.call(t,"duration",d)),"mute"===o||"volume"===o){var p=t.elements.volume;if(is$1.element(p)&&u.contains(p)||(p=createElement("div",extend({},d,{class:"".concat(d.class," plyr__volume").trim()})),t.elements.volume=p,u.appendChild(p)),"mute"===o&&p.appendChild(n.call(t,"mute")),"volume"===o&&!browser.isIos){var g={max:1,step:.05,value:t.config.volume};p.appendChild(a.call(t,"volume",extend(g,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===o&&u.appendChild(n.call(t,"captions",d)),"settings"===o&&!is$1.empty(t.config.settings)){var f=createElement("div",extend({},d,{class:"".concat(d.class," plyr__menu").trim(),hidden:""}));f.appendChild(n.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var y=createElement("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),v=createElement("div"),b=createElement("div",{id:"plyr-settings-".concat(e.id,"-home")}),w=createElement("div",{role:"menu"});b.appendChild(w),v.appendChild(b),t.elements.settings.panels.home=b,t.config.settings.forEach((function(n){var s=createElement("button",extend(getAttributesFromSelector(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:""}));i.call(t,s,n),on.call(t,s,"click",(function(){c.call(t,n,!1)}));var a=createElement("span",null,i18n.get(n,t.config)),r=createElement("span",{class:t.config.classNames.menu.value});r.innerHTML=e[n],a.appendChild(r),s.appendChild(a),w.appendChild(s);var o=createElement("div",{id:"plyr-settings-".concat(e.id,"-").concat(n),hidden:""}),l=createElement("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});l.appendChild(createElement("span",{"aria-hidden":!0},i18n.get(n,t.config))),l.appendChild(createElement("span",{class:t.config.classNames.hidden},i18n.get("menuBack",t.config))),on.call(t,o,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),c.call(t,"home",!0))}),!1),on.call(t,l,"click",(function(){c.call(t,"home",!1)})),o.appendChild(l),o.appendChild(createElement("div",{role:"menu"})),v.appendChild(o),t.elements.settings.buttons[n]=s,t.elements.settings.panels[n]=o})),y.appendChild(v),f.appendChild(y),u.appendChild(f),t.elements.settings.popup=y,t.elements.settings.menu=f}if("pip"===o&&support.pip&&u.appendChild(n.call(t,"pip",d)),"airplay"===o&&support.airplay&&u.appendChild(n.call(t,"airplay",d)),"download"===o){var k=extend({},d,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(k.download="");var T=t.config.urls.download;!is$1.url(T)&&t.isEmbed&&extend(k,{icon:"logo-".concat(t.provider),label:t.provider}),u.appendChild(n.call(t,"download",k))}"fullscreen"===o&&u.appendChild(n.call(t,"fullscreen",d))})),this.isHTML5&&o.call(this,html5.getQualityOptions.call(this)),l.call(this),u},inject:function(){var e=this;if(this.config.loadSprite){var t=controls.getIconUrl.call(this);t.cors&&loadSprite(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;is$1.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,n)),this.config.controls||(this.config.controls=[]),is$1.element(this.config.controls)||is$1.string(this.config.controls)?i=this.config.controls:(i=controls.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:captions.getLabel.call(this)}),s=!1);var a,r;if(s&&is$1.string(this.config.controls)&&(a=i,Object.entries(n).forEach((function(e){var t=_slicedToArray(e,2),i=t[0],n=t[1];a=replaceAll(a,"{".concat(i,"}"),n)})),i=a),is$1.string(this.config.selectors.controls.container)&&(r=document.querySelector(this.config.selectors.controls.container)),is$1.element(r)||(r=this.elements.container),r[is$1.element(i)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",i),is$1.element(this.elements.controls)||controls.findElements.call(this),!is$1.empty(this.elements.buttons)){var o=function(t){var i=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return hasClass(t,i)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];toggleClass(t,i,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){is$1.array(e)||is$1.nodeList(e)?Array.from(e).filter(Boolean).forEach(o):o(e)}))}if(browser.isEdge&&repaint(r),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=getElements.call(this,d);Array.from(h).forEach((function(t){toggleClass(t,e.config.classNames.hidden,!1),toggleClass(t,e.config.classNames.tooltip,!0)}))}}};function parseUrl(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=e;if(t){var n=document.createElement("a");n.href=i,i=n.href}try{return new URL(i)}catch(e){return null}}function buildUrlParams(e){var t=new URLSearchParams;return is$1.object(e)&&Object.entries(e).forEach((function(e){var i=_slicedToArray(e,2),n=i[0],s=i[1];t.set(n,s)})),t}var captions={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!support.textTracks)is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this);else{if(is$1.element(this.elements.captions)||(this.elements.captions=createElement("div",getAttributesFromSelector(this.config.selectors.captions)),insertAfter(this.elements.captions,this.elements.wrapper)),browser.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),i=parseUrl(t);null!==i&&i.hostname!==window.location.href.hostname&&["http:","https:"].includes(i.protocol)&&fetch(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){removeElement(e)}))}))}var t=dedupe((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),i=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===i)i=_slicedToArray(t,1)[0];var n=this.storage.get("captions");if(is$1.boolean(n)||(n=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:n,language:i,languages:t}),this.isHTML5){var s=this.config.captions.update?"addtrack removetrack":"removetrack";on.call(this,this.media.textTracks,s,captions.update.bind(this))}setTimeout(captions.update.bind(this),0)}},update:function(){var e=this,t=captions.getTracks.call(this,!0),i=this.captions,n=i.active,s=i.language,a=i.meta,r=i.currentTrackNode,o=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}),"showing"===t.mode&&(t.mode="hidden"),on.call(e,t,"cuechange",(function(){return captions.updateCues.call(e)}))})),(o&&this.language!==s||!t.includes(r))&&(captions.setLanguage.call(this,s),captions.toggle.call(this,n&&o)),toggleClass(this.elements.container,this.config.classNames.captions.enabled,!is$1.empty(t)),is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this)},toggle:function(e){var t=this,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var n=this.captions.toggled,s=this.config.classNames.captions.active,a=is$1.nullOrUndefined(e)?!n:e;if(a!==n){if(i||(this.captions.active=a,this.storage.set({captions:a})),!this.language&&a&&!i){var r=captions.getTracks.call(this),o=captions.findTrack.call(this,[this.captions.language].concat(_toConsumableArray(this.captions.languages)),!0);return this.captions.language=o.language,void captions.set.call(this,r.indexOf(o))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=a),toggleClass(this.elements.container,s,a),this.captions.toggled=a,controls.updateSetting.call(this,"captions"),triggerEvent.call(this,this.media,a?"captionsenabled":"captionsdisabled")}setTimeout((function(){a&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=captions.getTracks.call(this);if(-1!==e)if(is$1.number(e))if(e in i){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var n=i[e],s=n||{},a=s.language;this.captions.currentTrackNode=n,controls.updateSetting.call(this,"captions"),t||(this.captions.language=a,this.storage.set({language:a})),this.isVimeo&&this.embed.enableTextTrack(a),triggerEvent.call(this,this.media,"languagechange")}captions.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&captions.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else captions.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(is$1.string(e)){var i=e.toLowerCase();this.captions.language=i;var n=captions.getTracks.call(this),s=captions.findTrack.call(this,[i]);captions.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],i=Array.from((this.media||{}).textTracks||[]);return i.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,i=this,n=arguments.length>1&&void 0!==arguments[1]&&arguments[1],s=captions.getTracks.call(this),a=function(e){return Number((i.captions.meta.get(e)||{}).default)},r=Array.from(s).sort((function(e,t){return a(t)-a(e)}));return e.every((function(e){return!(t=r.find((function(t){return t.language===e})))})),t||(n?r[0]:void 0)},getCurrentTrack:function(){return captions.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!is$1.track(t)&&support.textTracks&&this.captions.toggled&&(t=captions.getCurrentTrack.call(this)),is$1.track(t)?is$1.empty(t.label)?is$1.empty(t.language)?i18n.get("enabled",this.config):e.language.toUpperCase():t.label:i18n.get("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(is$1.element(this.elements.captions))if(is$1.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var i=captions.getCurrentTrack.call(this);t=Array.from((i||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(getHTML)}var n=t.map((function(e){return e.trim()})).join("\n");if(n!==this.elements.captions.innerHTML){emptyElement(this.elements.captions);var s=createElement("span",getAttributesFromSelector(this.config.selectors.caption));s.innerHTML=n,this.elements.captions.appendChild(s),triggerEvent.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},defaults$1={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.3/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},pip={active:"picture-in-picture",inactive:"inline"},providers={html5:"html5",youtube:"youtube",vimeo:"vimeo"},types={audio:"audio",video:"video"};function getProviderByUrl(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?providers.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?providers.vimeo:null}var noop=function(){},Console=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];_classCallCheck(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return _createClass(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):noop}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):noop}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):noop}}]),e}(),Fullscreen=function(){function e(t){var i=this;_classCallCheck(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&closest(this.player.elements.container,t.config.fullscreen.container),on.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){i.onChange()})),on.call(this.player,this.player.elements.container,"dblclick",(function(e){is$1.element(i.player.elements.controls)&&i.player.elements.controls.contains(e.target)||i.player.listeners.proxy(e,i.toggle,"fullscreen")})),on.call(this,this.player.elements.container,"keydown",(function(e){return i.trapFocus(e)})),this.update()}return _createClass(e,[{key:"onChange",value:function(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;is$1.element(e)&&(e.pressed=this.active);var t=this.target===this.player.media?this.target:this.player.elements.container;triggerEvent.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)}}},{key:"toggleFallback",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(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":"",toggleClass(this.target,this.player.config.classNames.fullscreen.fallback,e),browser.isIos){var t=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var n=is$1.string(t.content)&&t.content.includes(i);e?(this.cleanupViewport=!n,n||(t.content+=",".concat(i))):this.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==i})).join(","))}this.onChange()}},{key:"trapFocus",value:function(e){if(!browser.isIos&&this.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,i=getElements.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),n=_slicedToArray(i,1)[0],s=i[i.length-1];t!==s||e.shiftKey?t===n&&e.shiftKey&&(s.focus(),e.preventDefault()):(n.focus(),e.preventDefault())}}},{key:"update",value:function(){var t;this.enabled?(t=this.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",this.player.debug.log("".concat(t," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");toggleClass(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(browser.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!e.native||this.forceFallback?this.toggleFallback(!0):this.prefix?is$1.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen({navigationUI:"hide"}))}},{key:"exit",value:function(){if(this.enabled)if(browser.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),silencePromise(this.player.play());else if(!e.native||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!is$1.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)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return hasClass(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return browser.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(is$1.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!is$1.function(document["".concat(t,"ExitFullscreen")])&&!is$1.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function loadImage(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 ui={addStyleHook:function(){toggleClass(this.elements.container,this.config.selectors.container.replace(".",""),!0),toggleClass(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 ui.toggleNativeControls.call(this,!0);is$1.element(this.elements.controls)||(controls.inject.call(this),this.listeners.controls()),ui.toggleNativeControls.call(this),this.isHTML5&&captions.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,controls.updateVolume.call(this),controls.timeUpdate.call(this),ui.checkPlaying.call(this),toggleClass(this.elements.container,this.config.classNames.pip.supported,support.pip&&this.isHTML5&&this.isVideo),toggleClass(this.elements.container,this.config.classNames.airplay.supported,support.airplay&&this.isHTML5),toggleClass(this.elements.container,this.config.classNames.isIos,browser.isIos),toggleClass(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){triggerEvent.call(e,e.media,"ready")}),0),ui.setTitle.call(this),this.poster&&ui.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&controls.durationUpdate.call(this)},setTitle:function(){var e=i18n.get("play",this.config);if(is$1.string(this.config.title)&&!is$1.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=getElement.call(this,"iframe");if(!is$1.element(t))return;var i=is$1.empty(this.config.title)?"video":this.config.title,n=i18n.get("frameTitle",this.config);t.setAttribute("title",n.replace("{title}",i))}},togglePoster:function(e){toggleClass(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return i&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),ready.call(this).then((function(){return loadImage(e)})).catch((function(i){throw e===t.poster&&ui.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('".concat(e,"')"),backgroundSize:""}),ui.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;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),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",i18n.get(t.playing?"pause":"play",t.config))})),is$1.event(e)&&"timeupdate"===e.type||ui.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(){toggleClass(t.elements.container,t.config.classNames.loading,t.loading),ui.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var i=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||i))}},migrateStyles:function(){var e=this;Object.values(_objectSpread2({},this.media.style)).filter((function(e){return!is$1.empty(e)&&is$1.string(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),is$1.empty(this.media.style)&&this.media.removeAttribute("style")}},Listeners=function(){function e(t){_classCallCheck(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 _createClass(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)&&is$1.number(n)){if(s){var r=document.activeElement;if(is$1.element(r)){var o=t.config.selectors.editable;if(r!==i.inputs.seek&&matches$1(r,o))return;if(32===e.which&&matches$1(r,'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||silencePromise(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}27===n&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=n}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){controls.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,toggleClass(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,toggleClass(getElements.call(t,".".concat(n)),n,!1),"focusout"!==e.type&&(this.focusTimer=setTimeout((function(){var e=document.activeElement;i.container.contains(e)&&toggleClass(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&&toggleListener.call(t,window,"keydown keyup",this.handleKey,e,!1),toggleListener.call(t,document.body,"click",this.toggleMenu,e),once.call(t,document.body,"touchstart",this.firstTouch),toggleListener.call(t,document.body,"keydown focus blur focusout",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,i=e.elements,n=e.timers;!t.keyboard.global&&t.keyboard.focused&&on.call(e,i.container,"keydown keyup",this.handleKey,!1),on.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var s=i.controls;s&&"enterfullscreen"===t.type&&(s.pressed=!1,s.hover=!1);var a=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(ui.toggleControls.call(e,!0),a=e.touch?3e3:2e3),clearTimeout(n.controls),n.controls=setTimeout((function(){return ui.toggleControls.call(e,!1)}),a)}));var s=function(t){if(!t)return setAspectRatio.call(e);var n=i.container.getBoundingClientRect(),s=n.width,a=n.height;return setAspectRatio.call(e,"".concat(s,":").concat(a))},a=function(){clearTimeout(n.resized),n.resized=setTimeout(s,50)};on.call(e,i.container,"enterfullscreen exitfullscreen",(function(t){var n=e.fullscreen,r=n.target,o=n.usingNative;if(r===i.container&&(e.isEmbed||!is$1.empty(e.config.ratio))){var l="enterfullscreen"===t.type,c=s(l);c.padding;!function(t,i,n){if(e.isVimeo&&!e.config.vimeo.premium){var s=e.elements.wrapper.firstChild,a=_slicedToArray(t,2)[1],r=_slicedToArray(getAspectRatio.call(e),2),o=r[0],l=r[1];s.style.maxWidth=n?"".concat(a/l*o,"px"):null,s.style.margin=n?"0 auto":null}}(c.ratio,0,l),l&&setTimeout((function(){return repaint(i.container)}),100),o||(l?on.call(e,window,"resize",a):off.call(e,window,"resize",a))}}))}},{key:"media",value:function(){var e=this,t=this.player,i=t.elements;if(on.call(t,t.media,"timeupdate seeking seeked",(function(e){return controls.timeUpdate.call(t,e)})),on.call(t,t.media,"durationchange loadeddata loadedmetadata",(function(e){return controls.durationUpdate.call(t,e)})),on.call(t,t.media,"ended",(function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&(t.restart(),t.pause())})),on.call(t,t.media,"progress playing seeking seeked",(function(e){return controls.updateProgress.call(t,e)})),on.call(t,t.media,"volumechange",(function(e){return controls.updateVolume.call(t,e)})),on.call(t,t.media,"playing play pause ended emptied timeupdate",(function(e){return ui.checkPlaying.call(t,e)})),on.call(t,t.media,"waiting canplay seeked playing",(function(e){return ui.checkLoading.call(t,e)})),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var n=getElement.call(t,".".concat(t.config.classNames.video));if(!is$1.element(n))return;on.call(t,i.container,"click",(function(s){([i.container,n].includes(s.target)||n.contains(s.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(s,t.restart,"restart"),e.proxy(s,(function(){silencePromise(t.play())}),"play")):e.proxy(s,(function(){silencePromise(t.togglePlay())}),"play")))}))}t.supported.ui&&t.config.disableContextMenu&&on.call(t,i.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),on.call(t,t.media,"volumechange",(function(){t.storage.set({volume:t.volume,muted:t.muted})})),on.call(t,t.media,"ratechange",(function(){controls.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})})),on.call(t,t.media,"qualitychange",(function(e){controls.updateSetting.call(t,"quality",null,e.detail.quality)})),on.call(t,t.media,"ready qualitychange",(function(){controls.setDownloadUrl.call(t)}));var s=t.config.events.concat(["keyup","keydown"]).join(" ");on.call(t,t.media,s,(function(e){var n=e.detail,s=void 0===n?{}:n;"error"===e.type&&(s=t.media.error),triggerEvent.call(t,i.container,e.type,!0,s)}))}},{key:"proxy",value:function(e,t,i){var n=this.player,s=n.config.listeners[i],a=!0;is$1.function(s)&&(a=s.call(n,e)),!1!==a&&is$1.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],r=this.player,o=r.config.listeners[n],l=is$1.function(o);on.call(r,e,t,(function(e){return s.proxy(e,i,n)}),a&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,i=t.elements,n=browser.isIE?"change":"input";if(i.buttons.play&&Array.from(i.buttons.play).forEach((function(i){e.bind(i,"click",(function(){silencePromise(t.togglePlay())}),"play")})),this.bind(i.buttons.restart,"click",t.restart,"restart"),this.bind(i.buttons.rewind,"click",(function(){t.lastSeekTime=Date.now(),t.rewind()}),"rewind"),this.bind(i.buttons.fastForward,"click",(function(){t.lastSeekTime=Date.now(),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.download,"click",(function(){triggerEvent.call(t,t.media,"download")}),"download"),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(),e.preventDefault(),controls.toggleMenu.call(t,e)}),null,!1),this.bind(i.buttons.settings,"keyup",(function(e){var i=e.which;[13,32].includes(i)&&(13!==i?(e.preventDefault(),e.stopPropagation(),controls.toggleMenu.call(t,e)):controls.focusFirstMenuItem.call(t,null,!0))}),null,!1),this.bind(i.settings.menu,"keydown",(function(e){27===e.which&&controls.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,s="play-on-seeked";if(!is$1.keyboardEvent(e)||39===n||37===n){t.lastSeekTime=Date.now();var a=i.hasAttribute(s),r=["mouseup","touchend","keyup"].includes(e.type);a&&r?(i.removeAttribute(s),silencePromise(t.play())):!r&&t.playing&&(i.setAttribute(s,""),t.pause())}})),browser.isIos){var s=getElements.call(t,'input[type="range"]');Array.from(s).forEach((function(t){return e.bind(t,n,(function(e){return repaint(e.target)}))}))}this.bind(i.inputs.seek,n,(function(e){var i=e.currentTarget,n=i.getAttribute("seek-value");is$1.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 controls.updateSeekTooltip.call(t,e)})),this.bind(i.progress,"mousemove touchmove",(function(e){var i=t.previewThumbnails;i&&i.loaded&&i.startMove(e)})),this.bind(i.progress,"mouseleave touchend click",(function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)})),this.bind(i.progress,"mousedown touchstart",(function(e){var i=t.previewThumbnails;i&&i.loaded&&i.startScrubbing(e)})),this.bind(i.progress,"mouseup touchend",(function(e){var i=t.previewThumbnails;i&&i.loaded&&i.endScrubbing(e)})),browser.isWebkit&&Array.from(getElements.call(t,'input[type="range"]')).forEach((function(i){e.bind(i,"input",(function(e){return controls.updateRangeFill.call(t,e.target)}))})),t.config.toggleInvert&&!is$1.element(i.display.duration)&&this.bind(i.display.currentTime,"click",(function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,controls.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})),i.fullscreen&&Array.from(i.fullscreen.children).filter((function(e){return!e.contains(i.container)})).forEach((function(n){e.bind(n,"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",(function(){var n=t.config,s=t.timers;toggleClass(i.controls,n.classNames.noTransition,!0),ui.toggleControls.call(t,!0),setTimeout((function(){toggleClass(i.controls,n.classNames.noTransition,!1)}),0);var a=e.touch?3e3:4e3;clearTimeout(s.controls),s.controls=setTimeout((function(){return ui.toggleControls.call(t,!1)}),a)})),this.bind(i.inputs.volume,"wheel",(function(e){var i=e.webkitDirectionInvertedFromDevice,n=_slicedToArray([e.deltaX,-e.deltaY].map((function(e){return i?-e:e})),2),s=n[0],a=n[1],r=Math.sign(Math.abs(s)>Math.abs(a)?s:a);t.increaseVolume(r/50);var o=t.media.volume;(1===r&&o<1||-1===r&&o>0)&&e.preventDefault()}),"volume",!1)}}]),e}(),commonjsGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var loadjs_umd=createCommonjsModule((function(e,t){e.exports=function(){var e=function(){},t={},i={},n={};function s(e,t){e=e.push?e:[e];var s,a,r,o=[],l=e.length,c=l;for(s=function(e,i){i.length&&o.push(e),--c||t(o)};l--;)a=e[l],(r=i[a])?s(a,r):(n[a]=n[a]||[]).push(s)}function a(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 r(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(/[\?|#].*$/,""),m=t.replace(/^(css|img)!/,"");s=s||0,/(^css!|\.css$)/.test(h)?((r=l.createElement("link")).rel="stylesheet",r.href=m,(a="hideFocus"in r)&&r.relList&&(a=0,r.rel="preload",r.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(h)?(r=l.createElement("img")).src=m:((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)try{r.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l){if((s+=1)<u)return o(t,i,n,s)}else if("preload"==r.rel&&"style"==r.as)return r.rel="stylesheet";i(t,l,e.defaultPrevented)},!1!==d(t,r)&&l.head.appendChild(r)}function l(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)}function c(e,i,n){var s,o;if(i&&i.trim&&(s=i),o=(s?n:i)||{},s){if(s in t)throw"LoadJS";t[s]=!0}function c(t,i){l(e,(function(e){r(o,e),t&&r({success:t,error:i},e),a(s,e)}),o)}if(o.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return s(e,(function(e){r(t,e)})),c},c.done=function(e){a(e,[])},c.reset=function(){t={},i={},n={}},c.isDefined=function(e){return e in t},c}()}));function loadScript(e){return new Promise((function(t,i){loadjs_umd(e,{success:t,error:i})}))}function parseId(e){if(is$1.empty(e))return null;if(is$1.number(Number(e)))return e;return e.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:e}function assurePlaybackState(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}var vimeo={setup:function(){var e=this;toggleClass(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,setAspectRatio.call(e),is$1.object(window.Vimeo)?vimeo.ready.call(e):loadScript(e.config.urls.vimeo.sdk).then((function(){vimeo.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,i=t.config.vimeo,n=i.premium,s=i.referrerPolicy,a=_objectWithoutProperties(i,["premium","referrerPolicy"]);n&&Object.assign(a,{controls:!1,sidedock:!1});var r=buildUrlParams(_objectSpread2({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},a)),o=t.media.getAttribute("src");is$1.empty(o)&&(o=t.media.getAttribute(t.config.attributes.embed.id));var l=parseId(o),c=createElement("iframe"),u=format(t.config.urls.vimeo.iframe,l,r);if(c.setAttribute("src",u),c.setAttribute("allowfullscreen",""),c.setAttribute("allow","autoplay,fullscreen,picture-in-picture"),is$1.empty(s)||c.setAttribute("referrerPolicy",s),n||!i.customControls)c.setAttribute("data-poster",t.poster),t.media=replaceElement(c,t.media);else{var d=createElement("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});d.appendChild(c),t.media=replaceElement(d,t.media)}i.customControls||fetch(format(t.config.urls.vimeo.api,u)).then((function(e){!is$1.empty(e)&&e.thumbnail_url&&ui.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(c,{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 assurePlaybackState.call(t,!0),t.embed.play()},t.media.pause=function(){return assurePlaybackState.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var h=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return h},set:function(e){var i=t.embed,n=t.media,s=t.paused,a=t.volume,r=s&&!i.hasPlayed;n.seeking=!0,triggerEvent.call(t,n,"seeking"),Promise.resolve(r&&i.setVolume(0)).then((function(){return i.setCurrentTime(e)})).then((function(){return r&&i.pause()})).then((function(){return r&&i.setVolume(a)})).catch((function(){}))}});var m=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return m},set:function(e){t.embed.setPlaybackRate(e).then((function(){m=e,triggerEvent.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});var p=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return p},set:function(e){t.embed.setVolume(e).then((function(){p=e,triggerEvent.call(t,t.media,"volumechange")}))}});var g=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return g},set:function(e){var i=!!is$1.boolean(e)&&e;t.embed.setVolume(i?0:t.config.volume).then((function(){g=i,triggerEvent.call(t,t.media,"volumechange")}))}});var f,y=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return y},set:function(e){var i=is$1.boolean(e)?e:t.config.loop.active;t.embed.setLoop(i).then((function(){y=i}))}}),t.embed.getVideoUrl().then((function(e){f=e,controls.setDownloadUrl.call(t)})).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(i){var n=_slicedToArray(i,2),s=n[0],a=n[1];t.embed.ratio=[s,a],setAspectRatio.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(i){t.config.title=i,ui.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){h=e,triggerEvent.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,triggerEvent.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,captions.setup.call(t)})),t.embed.on("cuechange",(function(e){var i=e.cues,n=(void 0===i?[]:i).map((function(e){return stripHTML(e.text)}));captions.updateCues.call(t,n)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){assurePlaybackState.call(t,!e),e||triggerEvent.call(t,t.media,"playing")})),is$1.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){triggerEvent.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){triggerEvent.call(t,t.media,"playing")})),t.embed.on("play",(function(){assurePlaybackState.call(t,!0),triggerEvent.call(t,t.media,"playing")})),t.embed.on("pause",(function(){assurePlaybackState.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,h=e.seconds,triggerEvent.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,triggerEvent.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&triggerEvent.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,triggerEvent.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,triggerEvent.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,triggerEvent.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,triggerEvent.call(t,t.media,"error")})),i.customControls&&setTimeout((function(){return ui.build.call(t)}),0)}};function parseId$1(e){if(is$1.empty(e))return null;return e.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:e}function assurePlaybackState$1(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}function getHost(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var youtube={setup:function(){var e=this;if(toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),is$1.object(window.YT)&&is$1.function(window.YT.Player))youtube.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){is$1.function(t)&&t(),youtube.ready.call(e)},loadScript(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;fetch(format(this.config.urls.youtube.api,e)).then((function(e){if(is$1.object(e)){var i=e.title,n=e.height,s=e.width;t.config.title=i,ui.setTitle.call(t),t.embed.ratio=[s,n]}setAspectRatio.call(t)})).catch((function(){setAspectRatio.call(t)}))},ready:function(){var e=this,t=e.config.youtube,i=e.media&&e.media.getAttribute("id");if(is$1.empty(i)||!i.startsWith("youtube-")){var n=e.media.getAttribute("src");is$1.empty(n)&&(n=e.media.getAttribute(this.config.attributes.embed.id));var s=parseId$1(n),a=createElement("div",{id:generateId(e.provider),"data-poster":t.customControls?e.poster:void 0});if(e.media=replaceElement(a,e.media),t.customControls){var r=function(e){return"https://i.ytimg.com/vi/".concat(s,"/").concat(e,"default.jpg")};loadImage(r("maxres"),121).catch((function(){return loadImage(r("sd"),121)})).catch((function(){return loadImage(r("hq"))})).then((function(t){return ui.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(e.media,{videoId:s,host:getHost(t),playerVars:extend({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),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},triggerEvent.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var i=t.target;e.media.playbackRate=i.getPlaybackRate(),triggerEvent.call(e,e.media,"ratechange")},onReady:function(i){if(!is$1.function(e.media.play)){var n=i.target;youtube.getTitle.call(e,s),e.media.play=function(){assurePlaybackState$1.call(e,!0),n.playVideo()},e.media.pause=function(){assurePlaybackState$1.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,triggerEvent.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 a=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return a},set:function(t){a=t,n.setVolume(100*a),triggerEvent.call(e,e.media,"volumechange")}});var r=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return r},set:function(t){var i=is$1.boolean(t)?t:r;r=i,n[i?"mute":"unMute"](),n.setVolume(100*a),triggerEvent.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}});var o=n.getAvailablePlaybackRates();e.options.speed=o.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),triggerEvent.call(e,e.media,"timeupdate"),triggerEvent.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)&&triggerEvent.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),triggerEvent.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return ui.build.call(e)}),50)}},onStateChange:function(i){var n=i.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(i.data)&&(e.media.seeking=!1,triggerEvent.call(e,e.media,"seeked")),i.data){case-1:triggerEvent.call(e,e.media,"timeupdate"),e.media.buffered=n.getVideoLoadedFraction(),triggerEvent.call(e,e.media,"progress");break;case 0:assurePlaybackState$1.call(e,!1),e.media.loop?(n.stopVideo(),n.playVideo()):triggerEvent.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(assurePlaybackState$1.call(e,!0),triggerEvent.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){triggerEvent.call(e,e.media,"timeupdate")}),50),e.media.duration!==n.getDuration()&&(e.media.duration=n.getDuration(),triggerEvent.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),assurePlaybackState$1.call(e,!1);break;case 3:triggerEvent.call(e,e.media,"waiting")}triggerEvent.call(e,e.elements.container,"statechange",!1,{code:i.data})}}})}}},media={setup:function(){this.media?(toggleClass(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),toggleClass(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&toggleClass(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=createElement("div",{class:this.config.classNames.video}),wrap(this.media,this.elements.wrapper),this.elements.poster=createElement("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?html5.setup.call(this):this.isYouTube?youtube.setup.call(this):this.isVimeo&&vimeo.setup.call(this)):this.debug.warn("No media element found!")}},destroy=function(e){e.manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()},Ads=function(){function e(t){var i=this;_classCallCheck(this,e),this.player=t,this.config=t.config.ads,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 _createClass(e,[{key:"load",value:function(){var e=this;this.enabled&&(is$1.object(window.google)&&is$1.object(window.google.ima)?this.ready():loadScript(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.enabled||destroy(this),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then((function(){e.clearSafetyTimer("onAdsManagerLoaded()")})),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){var e=this;this.elements.container=createElement("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),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),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),this.requestAds()}},{key:"requestAds",value:function(){var e=this.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!t)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");var i=function(){var t=formatTime(Math.max(e.manager.getRemainingTime(),0)),i="".concat(i18n.get("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",i)};this.countdownTimer=setInterval(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(),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:"addCuePoints",value:function(){var e=this;is$1.empty(this.cuePoints)||this.cuePoints.forEach((function(t){if(0!==t&&-1!==t&&t<e.player.duration){var i=e.player.elements.progress;if(is$1.element(i)){var n=100/e.player.duration*t,s=createElement("span",{class:e.player.config.classNames.cues});s.style.left="".concat(n.toString(),"%"),i.appendChild(s)}}}))}},{key:"onAdEvent",value:function(e){var t,i=this,n=this.player.elements.container,s=e.getAd(),a=e.getAdData();switch(t=e.type,triggerEvent.call(i.player,i.player.media,"ads".concat(t.replace(/_/g,"").toLowerCase())),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),s.isLinear()||(s.width=n.offsetWidth,s.height=n.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:a.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(a.adError.getMessage()))}}},{key:"onAdError",value:function(e){this.cancel(),this.player.debug.warn("Ads error",e)}},{key:"listeners",value:function(){var e,t=this,i=this.player.elements.container;this.player.on("canplay",(function(){t.addCuePoints()})),this.player.on("ended",(function(){t.loader.contentComplete()})),this.player.on("timeupdate",(function(){e=t.player.currentTime})),this.player.on("seeked",(function(){var i=t.player.currentTime;is$1.empty(t.cuePoints)||t.cuePoints.forEach((function(n,s){e<n&&n<i&&(t.manager.discardAdBreak(),t.cuePoints.splice(s,1))}))})),window.addEventListener("resize",(function(){t.manager&&t.manager.resize(i.offsetWidth,i.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.manager.setVolume(e.player.volume),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,silencePromise(this.player.media.play())}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.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.initialized=!1,e.requestAds()})).catch((function(){}))}},{key:"trigger",value:function(e){for(var t=this,i=arguments.length,n=new Array(i>1?i-1:0),s=1;s<i;s++)n[s-1]=arguments[s];var a=this.events[e];is$1.array(a)&&a.forEach((function(e){is$1.function(e)&&e.apply(t,n)}))}},{key:"on",value:function(e,t){return is$1.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: ".concat(t)),this.safetyTimer=setTimeout((function(){i.cancel(),i.clearSafetyTimer("startSafetyTimer()")}),e)}},{key:"clearSafetyTimer",value:function(e){is$1.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!is$1.empty(e.publisherId)||is$1.url(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(is$1.url(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(buildUrlParams(t))}}]),e}(),parseVtt=function(e){var t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var i={};e.split(/\r\n|\n|\r/).forEach((function(e){if(is$1.number(i.startTime)){if(!is$1.empty(e.trim())&&is$1.empty(i.text)){var t=e.trim().split("#xywh="),n=_slicedToArray(t,1);if(i.text=n[0],t[1]){var s=_slicedToArray(t[1].split(","),4);i.x=s[0],i.y=s[1],i.w=s[2],i.h=s[3]}}}else{var a=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);a&&(i.startTime=60*Number(a[1]||0)*60+60*Number(a[2])+Number(a[3])+Number("0.".concat(a[4])),i.endTime=60*Number(a[6]||0)*60+60*Number(a[7])+Number(a[8])+Number("0.".concat(a[9])))}})),i.text&&t.push(i)})),t},fitRatio=function(e,t){var i={};return e>t.width/t.height?(i.width=t.width,i.height=1/e*t.width):(i.height=t.height,i.width=e*t.height),i},PreviewThumbnails=function(){function e(t){_classCallCheck(this,e),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return _createClass(e,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then((function(){e.enabled&&(e.render(),e.determineContainerAutoSizing(),e.loaded=!0)}))}},{key:"getThumbnails",value:function(){var e=this;return new Promise((function(t){var i=e.player.config.previewThumbnails.src;if(is$1.empty(i))throw new Error("Missing previewThumbnails.src config attribute");var n=function(){e.thumbnails.sort((function(e,t){return e.height-t.height})),e.player.debug.log("Preview thumbnails",e.thumbnails),t()};if(is$1.function(i))i((function(t){e.thumbnails=t,n()}));else{var s=(is$1.string(i)?[i]:i).map((function(t){return e.getThumbnail(t)}));Promise.all(s).then(n)}}))}},{key:"getThumbnail",value:function(e){var t=this;return new Promise((function(i){fetch(e).then((function(n){var s={frames:parseVtt(n),height:null,urlPrefix:""};s.frames[0].text.startsWith("/")||s.frames[0].text.startsWith("http://")||s.frames[0].text.startsWith("https://")||(s.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var a=new Image;a.onload=function(){s.height=a.naturalHeight,s.width=a.naturalWidth,t.thumbnails.push(s),i()},a.src=s.urlPrefix+s.frames[0].text}))}))}},{key:"startMove",value:function(e){if(this.loaded&&is$1.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(i/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=formatTime(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){(is$1.nullOrUndefined(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):once.call(this.player,this.player.media,"timeupdate",(function(){e.mouseDown||e.toggleScrubbingContainer(!1)}))}},{key:"listeners",value:function(){var e=this;this.player.on("play",(function(){e.toggleThumbContainer(!1,!0)})),this.player.on("seeked",(function(){e.toggleThumbContainer(!1)})),this.player.on("timeupdate",(function(){e.lastTime=e.player.media.currentTime}))}},{key:"render",value:function(){this.elements.thumb.container=createElement("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=createElement("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=createElement("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=createElement("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),is$1.element(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=createElement("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"destroy",value:function(){this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();var t=this.thumbnails[0].frames.findIndex((function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime})),i=t>=0,n=0;this.mouseDown||this.toggleThumbContainer(i),i&&(this.thumbnails.forEach((function(i,s){e.loadedImages.includes(i.frames[t].text)&&(n=s)})),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(n)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,i=this.showingThumb,n=this.thumbnails[t],s=n.urlPrefix,a=n.frames[i],r=n.frames[i].text,o=s+r;if(this.currentImageElement&&this.currentImageElement.dataset.filename===r)this.showImage(this.currentImageElement,a,t,i,r,!1),this.currentImageElement.dataset.index=i,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var l=new Image;l.src=o,l.dataset.index=i,l.dataset.filename=r,this.showingThumbFilename=r,this.player.debug.log("Loading image: ".concat(o)),l.onload=function(){return e.showImage(l,a,t,i,r,!0)},this.loadingImage=l,this.removeOldImages(l)}}},{key:"showImage",value:function(e,t,i,n,s){var a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(s,". num: ").concat(n,". qual: ").concat(i,". newimg: ").concat(a)),this.setImageSizeAndOffset(e,t),a&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(s)||this.loadedImages.push(s)),this.preloadNearby(n,!0).then(this.preloadNearby(n,!1)).then(this.getHigherQuality(i,e,t,s))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach((function(i){if("img"===i.tagName.toLowerCase()){var n=t.usingSprites?500:1e3;if(i.dataset.index!==e.dataset.index&&!i.dataset.deleting){i.dataset.deleting=!0;var s=t.currentImageContainer;setTimeout((function(){s.removeChild(i),t.player.debug.log("Removing thumb: ".concat(i.dataset.filename))}),n)}}}))}},{key:"preloadNearby",value:function(e){var t=this,i=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(n){setTimeout((function(){var s=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===s){var a;a=i?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var r=!1;a.forEach((function(e){var i=e.text;if(i!==s&&!t.loadedImages.includes(i)){r=!0,t.player.debug.log("Preloading thumb filename: ".concat(i));var a=t.thumbnails[0].urlPrefix+i,o=new Image;o.src=a,o.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(i)),t.loadedImages.includes(i)||t.loadedImages.push(i),n()}}})),r||n()}}),300)}))}},{key:"getHigherQuality",value:function(e,t,i,n){var s=this;if(e<this.thumbnails.length-1){var a=t.naturalHeight;this.usingSprites&&(a=i.h),a<this.thumbContainerHeight&&setTimeout((function(){s.showingThumbFilename===n&&(s.player.debug.log("Showing higher quality thumb for: ".concat(n)),s.loadImage(e+1))}),300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(i,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(this.sizeSpecifiedInCSS){if(this.elements.thumb.imageContainer.clientHeight>20&&this.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(this.elements.thumb.imageContainer.clientHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(this.elements.thumb.imageContainer.clientHeight<20&&this.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(this.elements.thumb.imageContainer.clientWidth/this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var i=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(i,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),i=this.elements.thumb.container,n=t.left-e.left+10,s=t.right-e.left-i.clientWidth-10,a=this.mousePosX-e.left-i.clientWidth/2;a<n&&(a=n),a>s&&(a=s),i.style.left="".concat(a,"px")}},{key:"setScrubbingContainerSize",value:function(){var e=fitRatio(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}),t=e.width,i=e.height;this.elements.scrubbing.container.style.width="".concat(t,"px"),this.elements.scrubbing.container.style.height="".concat(i,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var i=this.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*i,"px"),e.style.width="".concat(e.naturalWidth*i,"px"),e.style.left="-".concat(t.x*i,"px"),e.style.top="-".concat(t.y*i,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?fitRatio(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),source={insertElements:function(e,t){var i=this;is$1.string(t)?insertElement(e,this.media,{src:t}):is$1.array(t)&&t.forEach((function(t){insertElement(e,i.media,t)}))},change:function(e){var t=this;getDeep(e,"sources.length")?(html5.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],removeElement(t.media),t.media=null,is$1.element(t.elements.container)&&t.elements.container.removeAttribute("class");var i=e.sources,n=e.type,s=_slicedToArray(i,1)[0],a=s.provider,r=void 0===a?providers.html5:a,o=s.src,l="html5"===r?n:"div",c="html5"===r?{}:{src:o};Object.assign(t,{provider:r,type:n,supported:support.check(n,r,t.config.playsinline),media:createElement(l,c)}),t.elements.container.appendChild(t.media),is$1.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),is$1.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","")),ui.addStyleHook.call(t),t.isHTML5&&source.insertElements.call(t,"source",i),t.config.title=e.title,media.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&source.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&ui.build.call(t),t.isHTML5&&t.media.load(),is$1.empty(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new PreviewThumbnails(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};function clamp(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),i)}var Plyr=function(){function e(t,i){var n=this;if(_classCallCheck(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=support.touch,this.media=t,is$1.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||is$1.nodeList(this.media)||is$1.array(this.media))&&(this.media=this.media[0]),this.config=extend({},defaults$1,e.defaults,i||{},function(){try{return JSON.parse(n.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 Console(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",support),!is$1.nullOrUndefined(this.media)&&is$1.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(support.check().api){var s=this.media.cloneNode(!0);s.autoplay=!1,this.elements.original=s;var a=this.media.tagName.toLowerCase(),r=null,o=null;switch(a){case"div":if(r=this.media.querySelector("iframe"),is$1.element(r)){if(o=parseUrl(r.getAttribute("src")),this.provider=getProviderByUrl(o.toString()),this.elements.container=this.media,this.media=r,this.elements.container.className="",o.search.length){var l=["1","true"];l.includes(o.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(o.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=l.includes(o.searchParams.get("playsinline")),this.config.youtube.hl=o.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(is$1.empty(this.provider)||!Object.keys(providers).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=types.video;break;case"video":case"audio":this.type=a,this.provider=providers.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=support.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Listeners(this),this.storage=new Storage(this),this.media.plyr=this,is$1.element(this.elements.container)||(this.elements.container=createElement("div",{tabindex:0}),wrap(this.media,this.elements.container)),ui.migrateStyles.call(this),ui.addStyleHook.call(this),media.setup.call(this),this.config.debug&&on.call(this,this.elements.container,this.config.events.join(" "),(function(e){n.debug.log("event: ".concat(e.type))})),this.fullscreen=new Fullscreen(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&ui.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Ads(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return silencePromise(n.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new PreviewThumbnails(this))):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 _createClass(e,[{key:"play",value:function(){var e=this;return is$1.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then((function(){return e.ads.play()})).catch((function(){return silencePromise(e.media.play())})),this.media.play()):null}},{key:"pause",value:function(){return this.playing&&is$1.function(this.media.pause)?this.media.pause():null}},{key:"togglePlay",value:function(e){return(is$1.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):is$1.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime-=is$1.number(e)?e:this.config.seekTime}},{key:"forward",value:function(e){this.currentTime+=is$1.number(e)?e:this.config.seekTime}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(is$1.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){captions.toggle.call(this,e,!1)}},{key:"airplay",value:function(){support.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=hasClass(this.elements.container,this.config.classNames.hideControls),i=void 0===e?void 0:!e,n=toggleClass(this.elements.container,this.config.classNames.hideControls,i);if(n&&is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&!is$1.empty(this.config.settings)&&controls.toggleMenu.call(this,!1),n!==t){var s=n?"controlshidden":"controlsshown";triggerEvent.call(this,this.media,s)}return!n}return!1}},{key:"on",value:function(e,t){on.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){once.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){off(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&&(removeElement(t.elements.buttons.play),removeElement(t.elements.captions),removeElement(t.elements.controls),removeElement(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),is$1.function(e)&&e()):(unbindListeners.call(t),html5.cancelRequests.call(t),replaceElement(t.elements.original,t.elements.container),triggerEvent.call(t,t.elements.original,"destroyed",!0),is$1.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout((function(){t.elements=null,t.media=null}),200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(ui.toggleNativeControls.call(this,!0),n()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&is$1.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 support.mime.call(this,e)}},{key:"isHTML5",get:function(){return this.provider===providers.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===providers.youtube}},{key:"isVimeo",get:function(){return this.provider===providers.vimeo}},{key:"isVideo",get:function(){return this.type===types.video}},{key:"isAudio",get:function(){return this.type===types.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=is$1.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 is$1.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=is$1.number(t)&&t!==1/0?t:0;return e||i}},{key:"volume",set:function(e){var t=e;is$1.string(t)&&(t=Number(t)),is$1.number(t)||(t=this.storage.get("volume")),is$1.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!is$1.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;is$1.boolean(t)||(t=this.storage.get("muted")),is$1.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=this,i=null;is$1.number(e)&&(i=e),is$1.number(i)||(i=this.storage.get("speed")),is$1.number(i)||(i=this.config.speed.selected);var n=this.minimumSpeed,s=this.maximumSpeed;i=clamp(i,n,s),this.config.speed.selected=i,setTimeout((function(){t.media.playbackRate=i}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,_toConsumableArray(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,_toConsumableArray(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,i=this.options.quality;if(i.length){var n=[!is$1.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(is$1.number),s=!0;if(!i.includes(n)){var a=closest$1(i,n);this.debug.warn("Unsupported quality option: ".concat(n,", using ").concat(a," instead")),n=a,s=!1}t.selected=n,this.media.quality=n,s&&this.storage.set({quality:n})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=is$1.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){source.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return is$1.url(e)?e:this.source},set:function(e){is$1.url(e)&&(this.config.urls.download=e,controls.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?ui.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=reduceAspectRatio(getAspectRatio.call(this));return is$1.array(e)?e.join(":"):e},set:function(e){this.isVideo?is$1.string(e)&&validateRatio(e)?(this.config.ratio=e,setAspectRatio.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=is$1.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){captions.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){captions.setLanguage.call(this,e,!1)},get:function(){return(captions.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(support.pip){var t=is$1.boolean(e)?e:!this.pip;is$1.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?pip.active:pip.inactive),is$1.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return support.pip?is$1.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===pip.active:null}}],[{key:"supported",value:function(e,t,i){return support.check(e,t,i)}},{key:"loadSprite",value:function(e,t){return loadSprite(e,t)}},{key:"setup",value:function(t){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null;return is$1.string(t)?n=Array.from(document.querySelectorAll(t)):is$1.nodeList(t)?n=Array.from(t):is$1.array(t)&&(n=t.filter(is$1.element)),is$1.empty(n)?null:n.map((function(t){return new e(t,i)}))}}]),e}();Plyr.defaults=cloneDeep(defaults$1);export default Plyr; \ No newline at end of file
+!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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 cloneDeep(e){return JSON.parse(JSON.stringify(e))}function getDeep(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function extend(){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 is$1.object(r)?(Object.keys(r).forEach((function(t){is$1.object(r[t])?(Object.keys(e).includes(t)||Object.assign(e,_defineProperty({},t,{})),extend(e[t],r[t])):Object.assign(e,_defineProperty({},t,r[t]))})),extend.apply(void 0,[e].concat(n))):e}function wrap(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,s=e.nextSibling;i.appendChild(e),s?r.insertBefore(i,s):r.appendChild(i)}))}function setAttributes(e,t){is$1.element(e)&&!is$1.empty(t)&&Object.entries(t).filter((function(e){var t=_slicedToArray(e,2)[1];return!is$1.nullOrUndefined(t)})).forEach((function(t){var n=_slicedToArray(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)}))}function createElement(e,t,n){var i=document.createElement(e);return is$1.object(t)&&setAttributes(i,t),is$1.string(n)&&(i.innerText=n),i}function insertAfter(e,t){is$1.element(e)&&is$1.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)}function insertElement(e,t,n,i){is$1.element(t)&&t.appendChild(createElement(e,n,i))}function removeElement(e){is$1.nodeList(e)||is$1.array(e)?Array.from(e).forEach(removeElement):is$1.element(e)&&is$1.element(e.parentNode)&&e.parentNode.removeChild(e)}function emptyElement(e){if(is$1.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function replaceElement(e,t){return is$1.element(t)&&is$1.element(t.parentNode)&&is$1.element(e)?(t.parentNode.replaceChild(e,t),e):null}function getAttributesFromSelector(e,t){if(!is$1.string(e)||is$1.empty(e))return{};var n={},i=extend({},t);return e.split(",").forEach((function(e){var t=e.trim(),r=t.replace(".",""),s=t.replace(/[[\]]/g,"").split("="),o=_slicedToArray(s,1)[0],a=s.length>1?s[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":is$1.string(i.class)?n.class="".concat(i.class," ").concat(r):n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[o]=a}})),extend(i,n)}function toggleHidden(e,t){if(is$1.element(e)){var n=t;is$1.boolean(n)||(n=!e.hidden),e.hidden=n}}function toggleClass(e,t,n){if(is$1.nodeList(e))return Array.from(e).map((function(e){return toggleClass(e,t,n)}));if(is$1.element(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function hasClass(e,t){return is$1.element(e)&&e.classList.contains(t)}function matches$1(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function closest(e,t){return(Element.prototype.closest||function(){var e=this;do{if(matches$1.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}function getElements(e){return this.elements.container.querySelectorAll(e)}function getElement(e){return this.elements.container.querySelector(e)}function setFocus(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];is$1.element(e)&&(e.focus({preventScroll:!0}),t&&toggleClass(e,this.config.classNames.tabFocus))}var defaultCodecs={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},support={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=browser.isIPhone&&n&&support.playsinline,r=support[e]||"html5"!==t;return{api:r,ui:r&&support.rangeInput&&("video"!==e||!browser.isIPhone||i)}},pip:!(browser.isIPhone||!is$1.function(createElement("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||createElement("video").disablePictureInPicture)),airplay:is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(is$1.empty(e))return!1;var t=_slicedToArray(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(defaultCodecs).includes(n)&&(n+='; codecs="'.concat(defaultCodecs[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:function(){var e=document.createElement("input");return e.type="range","range"===e.type}(),touch:"ontouchstart"in document.documentElement,transitions:!1!==transitionEndEvent,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},supportsPassiveListeners=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 toggleListener(e,t,n){var i=this,r=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&&!is$1.empty(t)&&is$1.function(n)){var a=t.split(" "),l=o;supportsPassiveListeners&&(l={passive:s,capture:o}),a.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 on(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];toggleListener.call(this,e,t,n,!0,i,r)}function off(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];toggleListener.call(this,e,t,n,!1,i,r)}function once(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],s=arguments.length>4&&void 0!==arguments[4]&&arguments[4],o=function o(){off(e,n,o,r,s);for(var a=arguments.length,l=new Array(a),c=0;c<a;c++)l[c]=arguments[c];i.apply(t,l)};toggleListener.call(this,e,n,o,!0,r,s)}function triggerEvent(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(is$1.element(e)&&!is$1.empty(t)){var r=new CustomEvent(t,{bubbles:n,detail:_objectSpread2(_objectSpread2({},i),{},{plyr:this})});e.dispatchEvent(r)}}function unbindListeners(){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=[])}function ready(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):on.call(e,e.elements.container,"ready",t)})).then((function(){}))}function silencePromise(e){is$1.promise(e)&&e.then(null,(function(){}))}function validateRatio(e){return!!(is$1.array(e)||is$1.string(e)&&e.includes(":"))&&(is$1.array(e)?e:e.split(":")).map(Number).every(is$1.number)}function reduceAspectRatio(e){if(!is$1.array(e)||!e.every(is$1.number))return null;var t=_slicedToArray(e,2),n=t[0],i=t[1],r=function e(t,n){return 0===n?t:e(n,t%n)}(n,i);return[n/r,i/r]}function getAspectRatio(e){var t=function(e){return validateRatio(e)?e.split(":").map(Number):null},n=t(e);if(null===n&&(n=t(this.config.ratio)),null===n&&!is$1.empty(this.embed)&&is$1.array(this.embed.ratio)&&(n=this.embed.ratio),null===n&&this.isHTML5){var i=this.media;n=reduceAspectRatio([i.videoWidth,i.videoHeight])}return n}function setAspectRatio(e){if(!this.isVideo)return{};var t=this.elements.wrapper,n=getAspectRatio.call(this,e),i=_slicedToArray(is$1.array(n)?n:[0,0],2),r=100/i[0]*i[1];if(t.style.paddingBottom="".concat(r,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var s=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),o=(s-r)/(s/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(o,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==n);return{padding:r,ratio:n}}var html5={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var n=t.getAttribute("type");return!!is$1.empty(n)||support.mime.call(e,n)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:html5.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,is$1.empty(this.config.ratio)||setAspectRatio.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=html5.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&is$1.function(e.config.quality.onChange))e.config.quality.onChange(t);else{var n=html5.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!n)return;var i=e.media,r=i.currentTime,s=i.paused,o=i.preload,a=i.readyState,l=i.playbackRate;e.media.src=n.getAttribute("src"),("none"!==o||a)&&(e.once("loadedmetadata",(function(){e.speed=l,e.currentTime=r,s||silencePromise(e.play())})),e.media.load())}triggerEvent.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(removeElement(html5.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function dedupe(e){return is$1.array(e)?e.filter((function(t,n){return e.indexOf(t)===n})):e}function closest$1(e,t){return is$1.array(e)&&e.length?e.reduce((function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e})):null}function generateId(e){return"".concat(e,"-").concat(Math.floor(1e4*Math.random()))}function format(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 is$1.empty(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return n[t].toString()}))}function getPercentage(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}var replaceAll=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())},toTitleCase=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function toPascalCase(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=replaceAll(t,"-"," "),t=replaceAll(t,"_"," "),t=toTitleCase(t),replaceAll(t," ","")}function toCamelCase(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return(t=toPascalCase(t)).charAt(0).toLowerCase()+t.slice(1)}function stripHTML(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}function getHTML(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var resources={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},i18n={get:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(is$1.empty(e)||is$1.empty(t))return"";var n=getDeep(t.i18n,e);if(is$1.empty(n))return Object.keys(resources).includes(e)?resources[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach((function(e){var t=_slicedToArray(e,2),i=t[0],r=t[1];n=replaceAll(n,i,r)})),n}},Storage=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"get",(function(t){if(!e.supported||!n.enabled)return null;var i=window.localStorage.getItem(n.key);if(is$1.empty(i))return null;var r=JSON.parse(i);return is$1.string(t)&&t.length?r[t]:r})),_defineProperty(this,"set",(function(t){if(e.supported&&n.enabled&&is$1.object(t)){var i=n.get();is$1.empty(i)&&(i={}),extend(i,t),window.localStorage.setItem(n.key,JSON.stringify(i))}})),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return _createClass(e,null,[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function fetch(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 loadSprite(e,t){if(is$1.string(e)){var n="cache",i=is$1.string(t),r=function(){return null!==document.getElementById(t)},s=function(e,t){e.innerHTML=t,i&&r()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!r()){var o=Storage.supported,a=document.createElement("div");if(a.setAttribute("hidden",""),i&&a.setAttribute("id",t),o){var l=window.localStorage.getItem("".concat(n,"-").concat(t));if(null!==l){var c=JSON.parse(l);s(a,c.content)}}fetch(e).then((function(e){is$1.empty(e)||(o&&window.localStorage.setItem("".concat(n,"-").concat(t),JSON.stringify({content:e})),s(a,e))})).catch((function(){}))}}}var getHours=function(e){return Math.trunc(e/60/60%60,10)},getMinutes=function(e){return Math.trunc(e/60%60,10)},getSeconds=function(e){return Math.trunc(e%60,10)};function formatTime(){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(!is$1.number(e))return formatTime(void 0,t,n);var i=function(e){return"0".concat(e).slice(-2)},r=getHours(e),s=getMinutes(e),o=getSeconds(e);return r=t||r>0?"".concat(r,":"):"","".concat(n&&e>0?"-":"").concat(r).concat(i(s),":").concat(i(o))}var controls={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||browser.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=getElement.call(this,this.config.selectors.controls.wrapper),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)},this.elements.progress=getElement.call(this,this.config.selectors.progress),this.elements.inputs={seek:getElement.call(this,this.config.selectors.inputs.seek),volume:getElement.call(this,this.config.selectors.inputs.volume)},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)},is$1.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="http://www.w3.org/2000/svg",i=controls.getIconUrl.call(this),r="".concat(i.cors?"":i.url,"#").concat(this.config.iconPrefix),s=document.createElementNS(n,"svg");setAttributes(s,extend(t,{"aria-hidden":"true",focusable:"false"}));var o=document.createElementNS(n,"use"),a="".concat(r,"-").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),s.appendChild(o),s},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i18n.get(e,this.config),i=_objectSpread2(_objectSpread2({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return createElement("span",i,n)},createBadge:function(e){if(is$1.empty(e))return null;var t=createElement("span",{class:this.config.classNames.menu.value});return t.appendChild(createElement("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=this,i=extend({},t),r=toCamelCase(e),s={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(i).includes(e)&&(s[e]=i[e],delete i[e])})),"button"!==s.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").some((function(e){return e===n.config.classNames.control}))||extend(i,{class:"".concat(i.class," ").concat(this.config.classNames.control)}):i.class=this.config.classNames.control,e){case"play":s.toggle=!0,s.label="play",s.labelPressed="pause",s.icon="play",s.iconPressed="pause";break;case"mute":s.toggle=!0,s.label="mute",s.labelPressed="unmute",s.icon="volume",s.iconPressed="muted";break;case"captions":s.toggle=!0,s.label="enableCaptions",s.labelPressed="disableCaptions",s.icon="captions-off",s.iconPressed="captions-on";break;case"fullscreen":s.toggle=!0,s.label="enterFullscreen",s.labelPressed="exitFullscreen",s.icon="enter-fullscreen",s.iconPressed="exit-fullscreen";break;case"play-large":i.class+=" ".concat(this.config.classNames.control,"--overlaid"),r="play",s.label="play",s.icon="play";break;default:is$1.empty(s.label)&&(s.label=r),is$1.empty(s.icon)&&(s.icon=e)}var o=createElement(s.element);return s.toggle?(o.appendChild(controls.createIcon.call(this,s.iconPressed,{class:"icon--pressed"})),o.appendChild(controls.createIcon.call(this,s.icon,{class:"icon--not-pressed"})),o.appendChild(controls.createLabel.call(this,s.labelPressed,{class:"label--pressed"})),o.appendChild(controls.createLabel.call(this,s.label,{class:"label--not-pressed"}))):(o.appendChild(controls.createIcon.call(this,s.icon)),o.appendChild(controls.createLabel.call(this,s.label))),extend(i,getAttributesFromSelector(this.config.selectors.buttons[r],i)),setAttributes(o,i),"play"===r?(is$1.array(this.elements.buttons[r])||(this.elements.buttons[r]=[]),this.elements.buttons[r].push(o)):this.elements.buttons[r]=o,o},createRange:function(e,t){var n=createElement("input",extend(getAttributesFromSelector(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":i18n.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,controls.updateRangeFill.call(this,n),RangeTouch.setup(n),n},createProgress:function(e,t){var n=createElement("progress",extend(getAttributesFromSelector(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(createElement("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?i18n.get(i,this.config):"";n.innerText="% ".concat(r.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e,t){var n=getAttributesFromSelector(this.config.selectors.display[e],t),i=createElement("div",extend(n,{class:"".concat(n.class?n.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":i18n.get(e,this.config)}),"00:00");return this.elements.display[e]=i,i},bindMenuItemShortcuts:function(e,t){var n=this;on.call(this,e,"keydown keyup",(function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r,s=matches$1(e,'[role="menuitemradio"]');if(!s&&[32,39].includes(i.which))controls.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||s&&39===i.which?(r=e.nextElementSibling,is$1.element(r)||(r=e.parentNode.firstElementChild)):(r=e.previousElementSibling,is$1.element(r)||(r=e.parentNode.lastElementChild)),setFocus.call(n,r,!0))}}),!1),on.call(this,e,"keyup",(function(e){13===e.which&&controls.focusFirstMenuItem.call(n,null,!0)}))},createMenuItem:function(e){var t=this,n=e.value,i=e.list,r=e.type,s=e.title,o=e.badge,a=void 0===o?null:o,l=e.checked,c=void 0!==l&&l,u=getAttributesFromSelector(this.config.selectors.inputs[r]),d=createElement("button",extend(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),m=createElement("span");m.innerHTML=s,is$1.element(a)&&m.appendChild(a),d.appendChild(m),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 matches$1(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(!is$1.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)}controls.showMenuPanel.call(t,"home",is$1.keyboardEvent(e))}}),r,!1),controls.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];if(!is$1.number(e))return e;var n=getHours(this.duration)>0;return formatTime(e,n,t)},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];is$1.element(e)&&is$1.number(t)&&(e.innerText=controls.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(is$1.element(this.elements.inputs.volume)&&controls.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),is$1.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;is$1.element(e)&&(e.value=t,controls.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&is$1.event(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=getPercentage(this.currentTime,this.duration),"timeupdate"===e.type&&controls.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var i=is$1.number(n)?n:0,r=is$1.element(e)?e:t.elements.display.buffer;if(is$1.element(r)){r.value=i;var s=r.getElementsByTagName("span")[0];is$1.element(s)&&(s.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=is$1.event(e)?e.target:e;if(is$1.element(t)&&"range"===t.getAttribute("type")){if(matches$1(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=controls.formatTime(this.currentTime),i=controls.formatTime(this.duration),r=i18n.get("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(matches$1(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);browser.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&is$1.element(this.elements.inputs.seek)&&is$1.element(this.elements.display.seekTooltip)&&0!==this.duration){var n="".concat(this.config.classNames.tooltip,"--visible"),i=function(e){return toggleClass(t.elements.display.seekTooltip,n,e)};if(this.touch)i(!1);else{var r=0,s=this.elements.progress.getBoundingClientRect();if(is$1.event(e))r=100/s.width*(e.pageX-s.left);else{if(!hasClass(this.elements.display.seekTooltip,n))return;r=parseFloat(this.elements.display.seekTooltip.style.left,10)}r<0?r=0:r>100&&(r=100),controls.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*r),this.elements.display.seekTooltip.style.left="".concat(r,"%"),is$1.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&i("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!is$1.element(this.elements.display.duration)&&this.config.invertTime;controls.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||controls.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return toggleHidden(this.elements.display.currentTime,!0),void toggleHidden(this.elements.progress,!0);is$1.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=is$1.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&controls.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&controls.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),controls.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){toggleHidden(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var i=this.elements.settings.panels[e],r=null,s=t;if("captions"===e)r=this.currentTrack;else{if(r=is$1.empty(n)?this[e]:n,is$1.empty(r)&&(r=this.config[e].default),!is$1.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(is$1.element(s)||(s=i&&i.querySelector('[role="menu"]')),is$1.element(s)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=controls.getLabel.call(this,e,r);var o=s&&s.querySelector('[value="'.concat(r,'"]'));is$1.element(o)&&(o.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?i18n.get("normal",this.config):"".concat(t,"&times;");case"quality":if(is$1.number(t)){var n=i18n.get("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return toTitleCase(t);case"captions":return captions.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(is$1.element(this.elements.settings.panels.quality)){var n="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');is$1.array(e)&&(this.options.quality=dedupe(e).filter((function(e){return t.config.quality.options.includes(e)})));var r=!is$1.empty(this.options.quality)&&this.options.quality.length>1;if(controls.toggleMenuButton.call(this,n,r),emptyElement(i),controls.checkMenu.call(this),r){var s=function(e){var n=i18n.get("qualityBadge.".concat(e),t.config);return n.length?controls.createBadge.call(t,n):null};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){controls.createMenuItem.call(t,{value:e,list:i,type:n,title:controls.getLabel.call(t,"quality",e),badge:s(e)})})),controls.updateSetting.call(this,n,i)}}},setCaptionsMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.captions)){var t="captions",n=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=captions.getTracks.call(this),r=Boolean(i.length);if(controls.toggleMenuButton.call(this,t,r),emptyElement(n),controls.checkMenu.call(this),r){var s=i.map((function(t,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:captions.getLabel.call(e,t),badge:t.language&&controls.createBadge.call(e,t.language.toUpperCase()),list:n,type:"language"}}));s.unshift({value:-1,checked:!this.captions.toggled,title:i18n.get("disabled",this.config),list:n,type:"language"}),s.forEach(controls.createMenuItem.bind(this)),controls.updateSetting.call(this,t,n)}}},setSpeedMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.speed)){var t="speed",n=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var i=!is$1.empty(this.options.speed)&&this.options.speed.length>1;controls.toggleMenuButton.call(this,t,i),emptyElement(n),controls.checkMenu.call(this),i&&(this.options.speed.forEach((function(i){controls.createMenuItem.call(e,{value:i,list:n,type:t,title:controls.getLabel.call(e,"speed",i)})})),controls.updateSetting.call(this,t,n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!is$1.empty(e)&&Object.values(e).some((function(e){return!e.hidden}));toggleHidden(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;is$1.element(n)||(n=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var i=n.querySelector('[role^="menuitem"]');setFocus.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(is$1.element(t)&&is$1.element(n)){var i=t.hidden,r=i;if(is$1.boolean(e))r=e;else if(is$1.keyboardEvent(e)&&27===e.which)r=!1;else if(is$1.event(e)){var s=is$1.function(e.composedPath)?e.composedPath()[0]:e.target,o=t.contains(s);if(o||!o&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),toggleHidden(t,!r),toggleClass(this.elements.container,this.config.classNames.menu.open,r),r&&is$1.keyboardEvent(e)?controls.focusFirstMenuItem.call(this,null,!0):r||i||setFocus.call(this,n,is$1.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 removeElement(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=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(is$1.element(i)){var r=i.parentNode,s=Array.from(r.children).find((function(e){return!e.hidden}));if(support.transitions&&!support.reducedMotion){r.style.width="".concat(s.scrollWidth,"px"),r.style.height="".concat(s.scrollHeight,"px");var o=controls.getMenuSize.call(this,i),a=function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",off.call(e,r,transitionEndEvent,t))};on.call(this,r,transitionEndEvent,a),r.style.width="".concat(o.width,"px"),r.style.height="".concat(o.height,"px")}toggleHidden(s,!0),toggleHidden(i,!1),controls.focusFirstMenuItem.call(this,i,n)}},setDownloadUrl:function(){var e=this.elements.buttons.download;is$1.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=controls.bindMenuItemShortcuts,i=controls.createButton,r=controls.createProgress,s=controls.createRange,o=controls.createTime,a=controls.setQualityMenu,l=controls.setSpeedMenu,c=controls.showMenuPanel;this.elements.controls=null,is$1.array(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));var u=createElement("div",getAttributesFromSelector(this.config.selectors.controls.wrapper));this.elements.controls=u;var d={class:"plyr__controls__item"};return dedupe(is$1.array(this.config.controls)?this.config.controls:[]).forEach((function(a){if("restart"===a&&u.appendChild(i.call(t,"restart",d)),"rewind"===a&&u.appendChild(i.call(t,"rewind",d)),"play"===a&&u.appendChild(i.call(t,"play",d)),"fast-forward"===a&&u.appendChild(i.call(t,"fast-forward",d)),"progress"===a){var l=createElement("div",{class:"".concat(d.class," plyr__progress__container")}),m=createElement("div",getAttributesFromSelector(t.config.selectors.progress));if(m.appendChild(s.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),m.appendChild(r.call(t,"buffer")),t.config.tooltips.seek){var p=createElement("span",{class:t.config.classNames.tooltip},"00:00");m.appendChild(p),t.elements.display.seekTooltip=p}t.elements.progress=m,l.appendChild(t.elements.progress),u.appendChild(l)}if("current-time"===a&&u.appendChild(o.call(t,"currentTime",d)),"duration"===a&&u.appendChild(o.call(t,"duration",d)),"mute"===a||"volume"===a){var h=t.elements.volume;if(is$1.element(h)&&u.contains(h)||(h=createElement("div",extend({},d,{class:"".concat(d.class," plyr__volume").trim()})),t.elements.volume=h,u.appendChild(h)),"mute"===a&&h.appendChild(i.call(t,"mute")),"volume"===a&&!browser.isIos){var f={max:1,step:.05,value:t.config.volume};h.appendChild(s.call(t,"volume",extend(f,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===a&&u.appendChild(i.call(t,"captions",d)),"settings"===a&&!is$1.empty(t.config.settings)){var g=createElement("div",extend({},d,{class:"".concat(d.class," plyr__menu").trim(),hidden:""}));g.appendChild(i.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var y=createElement("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),b=createElement("div"),v=createElement("div",{id:"plyr-settings-".concat(e.id,"-home")}),w=createElement("div",{role:"menu"});v.appendChild(w),b.appendChild(v),t.elements.settings.panels.home=v,t.config.settings.forEach((function(i){var r=createElement("button",extend(getAttributesFromSelector(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:""}));n.call(t,r,i),on.call(t,r,"click",(function(){c.call(t,i,!1)}));var s=createElement("span",null,i18n.get(i,t.config)),o=createElement("span",{class:t.config.classNames.menu.value});o.innerHTML=e[i],s.appendChild(o),r.appendChild(s),w.appendChild(r);var a=createElement("div",{id:"plyr-settings-".concat(e.id,"-").concat(i),hidden:""}),l=createElement("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});l.appendChild(createElement("span",{"aria-hidden":!0},i18n.get(i,t.config))),l.appendChild(createElement("span",{class:t.config.classNames.hidden},i18n.get("menuBack",t.config))),on.call(t,a,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),c.call(t,"home",!0))}),!1),on.call(t,l,"click",(function(){c.call(t,"home",!1)})),a.appendChild(l),a.appendChild(createElement("div",{role:"menu"})),b.appendChild(a),t.elements.settings.buttons[i]=r,t.elements.settings.panels[i]=a})),y.appendChild(b),g.appendChild(y),u.appendChild(g),t.elements.settings.popup=y,t.elements.settings.menu=g}if("pip"===a&&support.pip&&u.appendChild(i.call(t,"pip",d)),"airplay"===a&&support.airplay&&u.appendChild(i.call(t,"airplay",d)),"download"===a){var k=extend({},d,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(k.download="");var T=t.config.urls.download;!is$1.url(T)&&t.isEmbed&&extend(k,{icon:"logo-".concat(t.provider),label:t.provider}),u.appendChild(i.call(t,"download",k))}"fullscreen"===a&&u.appendChild(i.call(t,"fullscreen",d))})),this.isHTML5&&a.call(this,html5.getQualityOptions.call(this)),l.call(this),u},inject:function(){var e=this;if(this.config.loadSprite){var t=controls.getIconUrl.call(this);t.cors&&loadSprite(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;is$1.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,i)),this.config.controls||(this.config.controls=[]),is$1.element(this.config.controls)||is$1.string(this.config.controls)?n=this.config.controls:(n=controls.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:captions.getLabel.call(this)}),r=!1);var s,o;if(r&&is$1.string(this.config.controls)&&(s=n,Object.entries(i).forEach((function(e){var t=_slicedToArray(e,2),n=t[0],i=t[1];s=replaceAll(s,"{".concat(n,"}"),i)})),n=s),is$1.string(this.config.selectors.controls.container)&&(o=document.querySelector(this.config.selectors.controls.container)),is$1.element(o)||(o=this.elements.container),o[is$1.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),is$1.element(this.elements.controls)||controls.findElements.call(this),!is$1.empty(this.elements.buttons)){var a=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return hasClass(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];toggleClass(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){is$1.array(e)||is$1.nodeList(e)?Array.from(e).filter(Boolean).forEach(a):a(e)}))}if(browser.isEdge&&repaint(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),m=getElements.call(this,d);Array.from(m).forEach((function(t){toggleClass(t,e.config.classNames.hidden,!1),toggleClass(t,e.config.classNames.tooltip,!0)}))}}};function parseUrl(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=e;if(t){var i=document.createElement("a");i.href=n,n=i.href}try{return new URL(n)}catch(e){return null}}function buildUrlParams(e){var t=new URLSearchParams;return is$1.object(e)&&Object.entries(e).forEach((function(e){var n=_slicedToArray(e,2),i=n[0],r=n[1];t.set(i,r)})),t}var captions={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!support.textTracks)is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this);else{if(is$1.element(this.elements.captions)||(this.elements.captions=createElement("div",getAttributesFromSelector(this.config.selectors.captions)),insertAfter(this.elements.captions,this.elements.wrapper)),browser.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),n=parseUrl(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&fetch(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){removeElement(e)}))}))}var t=dedupe((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=_slicedToArray(t,1)[0];var i=this.storage.get("captions");if(is$1.boolean(i)||(i=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:i,language:n,languages:t}),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";on.call(this,this.media.textTracks,r,captions.update.bind(this))}setTimeout(captions.update.bind(this),0)}},update:function(){var e=this,t=captions.getTracks.call(this,!0),n=this.captions,i=n.active,r=n.language,s=n.meta,o=n.currentTrackNode,a=Boolean(t.find((function(e){return e.language===r})));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}),"showing"===t.mode&&(t.mode="hidden"),on.call(e,t,"cuechange",(function(){return captions.updateCues.call(e)}))})),(a&&this.language!==r||!t.includes(o))&&(captions.setLanguage.call(this,r),captions.toggle.call(this,i&&a)),toggleClass(this.elements.container,this.config.classNames.captions.enabled,!is$1.empty(t)),is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this)},toggle:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var i=this.captions.toggled,r=this.config.classNames.captions.active,s=is$1.nullOrUndefined(e)?!i:e;if(s!==i){if(n||(this.captions.active=s,this.storage.set({captions:s})),!this.language&&s&&!n){var o=captions.getTracks.call(this),a=captions.findTrack.call(this,[this.captions.language].concat(_toConsumableArray(this.captions.languages)),!0);return this.captions.language=a.language,void captions.set.call(this,o.indexOf(a))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=s),toggleClass(this.elements.container,r,s),this.captions.toggled=s,controls.updateSetting.call(this,"captions"),triggerEvent.call(this,this.media,s?"captionsenabled":"captionsdisabled")}setTimeout((function(){s&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=captions.getTracks.call(this);if(-1!==e)if(is$1.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=i||{},s=r.language;this.captions.currentTrackNode=i,controls.updateSetting.call(this,"captions"),t||(this.captions.language=s,this.storage.set({language:s})),this.isVimeo&&this.embed.enableTextTrack(s),triggerEvent.call(this,this.media,"languagechange")}captions.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&captions.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else captions.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(is$1.string(e)){var n=e.toLowerCase();this.captions.language=n;var i=captions.getTracks.call(this),r=captions.findTrack.call(this,[n]);captions.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],n=Array.from((this.media||{}).textTracks||[]);return n.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=captions.getTracks.call(this),s=function(e){return Number((n.captions.meta.get(e)||{}).default)},o=Array.from(r).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 captions.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!is$1.track(t)&&support.textTracks&&this.captions.toggled&&(t=captions.getCurrentTrack.call(this)),is$1.track(t)?is$1.empty(t.label)?is$1.empty(t.language)?i18n.get("enabled",this.config):e.language.toUpperCase():t.label:i18n.get("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(is$1.element(this.elements.captions))if(is$1.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=captions.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(getHTML)}var i=t.map((function(e){return e.trim()})).join("\n");if(i!==this.elements.captions.innerHTML){emptyElement(this.elements.captions);var r=createElement("span",getAttributesFromSelector(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),triggerEvent.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},defaults$1={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.4/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},pip={active:"picture-in-picture",inactive:"inline"},providers={html5:"html5",youtube:"youtube",vimeo:"vimeo"},types={audio:"audio",video:"video"};function getProviderByUrl(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?providers.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?providers.vimeo:null}var noop=function(){},Console=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];_classCallCheck(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return _createClass(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):noop}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):noop}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):noop}}]),e}(),Fullscreen=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"onChange",(function(){if(n.enabled){var e=n.player.elements.buttons.fullscreen;is$1.element(e)&&(e.pressed=n.active);var t=n.target===n.player.media?n.target:n.player.elements.container;triggerEvent.call(n.player,t,n.active?"enterfullscreen":"exitfullscreen",!0)}})),_defineProperty(this,"toggleFallback",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e?n.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(n.scrollPosition.x,n.scrollPosition.y),document.body.style.overflow=e?"hidden":"",toggleClass(n.target,n.player.config.classNames.fullscreen.fallback,e),browser.isIos){var t=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var r=is$1.string(t.content)&&t.content.includes(i);e?(n.cleanupViewport=!r,r||(t.content+=",".concat(i))):n.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==i})).join(","))}n.onChange()})),_defineProperty(this,"trapFocus",(function(e){if(!browser.isIos&&n.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,i=getElements.call(n.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),r=_slicedToArray(i,1)[0],s=i[i.length-1];t!==s||e.shiftKey?t===r&&e.shiftKey&&(s.focus(),e.preventDefault()):(r.focus(),e.preventDefault())}})),_defineProperty(this,"update",(function(){var t;n.enabled?(t=n.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",n.player.debug.log("".concat(t," fullscreen enabled"))):n.player.debug.log("Fullscreen not supported and fallback disabled");toggleClass(n.player.elements.container,n.player.config.classNames.fullscreen.enabled,n.enabled)})),_defineProperty(this,"enter",(function(){n.enabled&&(browser.isIos&&n.player.config.fullscreen.iosNative?n.player.isVimeo?n.player.embed.requestFullscreen():n.target.webkitEnterFullscreen():!e.native||n.forceFallback?n.toggleFallback(!0):n.prefix?is$1.empty(n.prefix)||n.target["".concat(n.prefix,"Request").concat(n.property)]():n.target.requestFullscreen({navigationUI:"hide"}))})),_defineProperty(this,"exit",(function(){if(n.enabled)if(browser.isIos&&n.player.config.fullscreen.iosNative)n.target.webkitExitFullscreen(),silencePromise(n.player.play());else if(!e.native||n.forceFallback)n.toggleFallback(!1);else if(n.prefix){if(!is$1.empty(n.prefix)){var t="moz"===n.prefix?"Cancel":"Exit";document["".concat(n.prefix).concat(t).concat(n.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)})),_defineProperty(this,"toggle",(function(){n.active?n.exit():n.enter()})),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&closest(this.player.elements.container,t.config.fullscreen.container),on.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){n.onChange()})),on.call(this.player,this.player.elements.container,"dblclick",(function(e){is$1.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.player.listeners.proxy(e,n.toggle,"fullscreen")})),on.call(this,this.player.elements.container,"keydown",(function(e){return n.trapFocus(e)})),this.update()}return _createClass(e,[{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return hasClass(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return browser.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(is$1.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!is$1.function(document["".concat(t,"ExitFullscreen")])&&!is$1.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}();function loadImage(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise((function(n,i){var r=new Image,s=function(){delete r.onload,delete r.onerror,(r.naturalWidth>=t?n:i)(r)};Object.assign(r,{onload:s,onerror:s,src:e})}))}var ui={addStyleHook:function(){toggleClass(this.elements.container,this.config.selectors.container.replace(".",""),!0),toggleClass(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 ui.toggleNativeControls.call(this,!0);is$1.element(this.elements.controls)||(controls.inject.call(this),this.listeners.controls()),ui.toggleNativeControls.call(this),this.isHTML5&&captions.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,controls.updateVolume.call(this),controls.timeUpdate.call(this),ui.checkPlaying.call(this),toggleClass(this.elements.container,this.config.classNames.pip.supported,support.pip&&this.isHTML5&&this.isVideo),toggleClass(this.elements.container,this.config.classNames.airplay.supported,support.airplay&&this.isHTML5),toggleClass(this.elements.container,this.config.classNames.isIos,browser.isIos),toggleClass(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){triggerEvent.call(e,e.media,"ready")}),0),ui.setTitle.call(this),this.poster&&ui.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&controls.durationUpdate.call(this)},setTitle:function(){var e=i18n.get("play",this.config);if(is$1.string(this.config.title)&&!is$1.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=getElement.call(this,"iframe");if(!is$1.element(t))return;var n=is$1.empty(this.config.title)?"video":this.config.title,i=i18n.get("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){toggleClass(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),ready.call(this).then((function(){return loadImage(e)})).catch((function(n){throw e===t.poster&&ui.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:""}),ui.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;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),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",i18n.get(t.playing?"pause":"play",t.config))})),is$1.event(e)&&"timeupdate"===e.type||ui.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(){toggleClass(t.elements.container,t.config.classNames.loading,t.loading),ui.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}},migrateStyles:function(){var e=this;Object.values(_objectSpread2({},this.media.style)).filter((function(e){return!is$1.empty(e)&&is$1.string(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),is$1.empty(this.media.style)&&this.media.removeAttribute("style")}},Listeners=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"firstTouch",(function(){var e=n.player,t=e.elements;e.touch=!0,toggleClass(t.container,e.config.classNames.isTouch,!0)})),_defineProperty(this,"setTabFocus",(function(e){var t=n.player,i=t.elements;if(clearTimeout(n.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(n.lastKeyDown=e.timeStamp);var r,s=e.timeStamp-n.lastKeyDown<=20;if("focus"!==e.type||s)r=t.config.classNames.tabFocus,toggleClass(getElements.call(t,".".concat(r)),r,!1),"focusout"!==e.type&&(n.focusTimer=setTimeout((function(){var e=document.activeElement;i.container.contains(e)&&toggleClass(document.activeElement,t.config.classNames.tabFocus,!0)}),10))}})),_defineProperty(this,"global",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=n.player;t.config.keyboard.global&&toggleListener.call(t,window,"keydown keyup",n.handleKey,e,!1),toggleListener.call(t,document.body,"click",n.toggleMenu,e),once.call(t,document.body,"touchstart",n.firstTouch),toggleListener.call(t,document.body,"keydown focus blur focusout",n.setTabFocus,e,!1,!0)})),_defineProperty(this,"container",(function(){var e=n.player,t=e.config,i=e.elements,r=e.timers;!t.keyboard.global&&t.keyboard.focused&&on.call(e,i.container,"keydown keyup",n.handleKey,!1),on.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var n=i.controls;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);var s=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(ui.toggleControls.call(e,!0),s=e.touch?3e3:2e3),clearTimeout(r.controls),r.controls=setTimeout((function(){return ui.toggleControls.call(e,!1)}),s)}));var s=function(t){if(!t)return setAspectRatio.call(e);var n=i.container.getBoundingClientRect(),r=n.width,s=n.height;return setAspectRatio.call(e,"".concat(r,":").concat(s))},o=function(){clearTimeout(r.resized),r.resized=setTimeout(s,50)};on.call(e,i.container,"enterfullscreen exitfullscreen",(function(t){var n=e.fullscreen,r=n.target,a=n.usingNative;if(r===i.container&&(e.isEmbed||!is$1.empty(e.config.ratio))){var l="enterfullscreen"===t.type,c=s(l);c.padding;!function(t,n,i){if(e.isVimeo&&!e.config.vimeo.premium){var r=e.elements.wrapper.firstChild,s=_slicedToArray(t,2)[1],o=_slicedToArray(getAspectRatio.call(e),2),a=o[0],l=o[1];r.style.maxWidth=i?"".concat(s/l*a,"px"):null,r.style.margin=i?"0 auto":null}}(c.ratio,0,l),l&&setTimeout((function(){return repaint(i.container)}),100),a||(l?on.call(e,window,"resize",o):off.call(e,window,"resize",o))}}))})),_defineProperty(this,"media",(function(){var e=n.player,t=e.elements;if(on.call(e,e.media,"timeupdate seeking seeked",(function(t){return controls.timeUpdate.call(e,t)})),on.call(e,e.media,"durationchange loadeddata loadedmetadata",(function(t){return controls.durationUpdate.call(e,t)})),on.call(e,e.media,"ended",(function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())})),on.call(e,e.media,"progress playing seeking seeked",(function(t){return controls.updateProgress.call(e,t)})),on.call(e,e.media,"volumechange",(function(t){return controls.updateVolume.call(e,t)})),on.call(e,e.media,"playing play pause ended emptied timeupdate",(function(t){return ui.checkPlaying.call(e,t)})),on.call(e,e.media,"waiting canplay seeked playing",(function(t){return ui.checkLoading.call(e,t)})),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var i=getElement.call(e,".".concat(e.config.classNames.video));if(!is$1.element(i))return;on.call(e,t.container,"click",(function(r){([t.container,i].includes(r.target)||i.contains(r.target))&&(e.touch&&e.config.hideControls||(e.ended?(n.proxy(r,e.restart,"restart"),n.proxy(r,(function(){silencePromise(e.play())}),"play")):n.proxy(r,(function(){silencePromise(e.togglePlay())}),"play")))}))}e.supported.ui&&e.config.disableContextMenu&&on.call(e,t.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),on.call(e,e.media,"volumechange",(function(){e.storage.set({volume:e.volume,muted:e.muted})})),on.call(e,e.media,"ratechange",(function(){controls.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})})),on.call(e,e.media,"qualitychange",(function(t){controls.updateSetting.call(e,"quality",null,t.detail.quality)})),on.call(e,e.media,"ready qualitychange",(function(){controls.setDownloadUrl.call(e)}));var r=e.config.events.concat(["keyup","keydown"]).join(" ");on.call(e,e.media,r,(function(n){var i=n.detail,r=void 0===i?{}:i;"error"===n.type&&(r=e.media.error),triggerEvent.call(e,t.container,n.type,!0,r)}))})),_defineProperty(this,"proxy",(function(e,t,i){var r=n.player,s=r.config.listeners[i],o=!0;is$1.function(s)&&(o=s.call(r,e)),!1!==o&&is$1.function(t)&&t.call(r,e)})),_defineProperty(this,"bind",(function(e,t,i,r){var s=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],o=n.player,a=o.config.listeners[r],l=is$1.function(a);on.call(o,e,t,(function(e){return n.proxy(e,i,r)}),s&&!l)})),_defineProperty(this,"controls",(function(){var e=n.player,t=e.elements,i=browser.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach((function(t){n.bind(t,"click",(function(){silencePromise(e.togglePlay())}),"play")})),n.bind(t.buttons.restart,"click",e.restart,"restart"),n.bind(t.buttons.rewind,"click",(function(){e.lastSeekTime=Date.now(),e.rewind()}),"rewind"),n.bind(t.buttons.fastForward,"click",(function(){e.lastSeekTime=Date.now(),e.forward()}),"fastForward"),n.bind(t.buttons.mute,"click",(function(){e.muted=!e.muted}),"mute"),n.bind(t.buttons.captions,"click",(function(){return e.toggleCaptions()})),n.bind(t.buttons.download,"click",(function(){triggerEvent.call(e,e.media,"download")}),"download"),n.bind(t.buttons.fullscreen,"click",(function(){e.fullscreen.toggle()}),"fullscreen"),n.bind(t.buttons.pip,"click",(function(){e.pip="toggle"}),"pip"),n.bind(t.buttons.airplay,"click",e.airplay,"airplay"),n.bind(t.buttons.settings,"click",(function(t){t.stopPropagation(),t.preventDefault(),controls.toggleMenu.call(e,t)}),null,!1),n.bind(t.buttons.settings,"keyup",(function(t){var n=t.which;[13,32].includes(n)&&(13!==n?(t.preventDefault(),t.stopPropagation(),controls.toggleMenu.call(e,t)):controls.focusFirstMenuItem.call(e,null,!0))}),null,!1),n.bind(t.settings.menu,"keydown",(function(t){27===t.which&&controls.toggleMenu.call(e,t)})),n.bind(t.inputs.seek,"mousedown mousemove",(function(e){var n=t.progress.getBoundingClientRect(),i=100/n.width*(e.pageX-n.left);e.currentTarget.setAttribute("seek-value",i)})),n.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(function(t){var n=t.currentTarget,i=t.keyCode?t.keyCode:t.which,r="play-on-seeked";if(!is$1.keyboardEvent(t)||39===i||37===i){e.lastSeekTime=Date.now();var s=n.hasAttribute(r),o=["mouseup","touchend","keyup"].includes(t.type);s&&o?(n.removeAttribute(r),silencePromise(e.play())):!o&&e.playing&&(n.setAttribute(r,""),e.pause())}})),browser.isIos){var r=getElements.call(e,'input[type="range"]');Array.from(r).forEach((function(e){return n.bind(e,i,(function(e){return repaint(e.target)}))}))}n.bind(t.inputs.seek,i,(function(t){var n=t.currentTarget,i=n.getAttribute("seek-value");is$1.empty(i)&&(i=n.value),n.removeAttribute("seek-value"),e.currentTime=i/n.max*e.duration}),"seek"),n.bind(t.progress,"mouseenter mouseleave mousemove",(function(t){return controls.updateSeekTooltip.call(e,t)})),n.bind(t.progress,"mousemove touchmove",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startMove(t)})),n.bind(t.progress,"mouseleave touchend click",(function(){var t=e.previewThumbnails;t&&t.loaded&&t.endMove(!1,!0)})),n.bind(t.progress,"mousedown touchstart",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startScrubbing(t)})),n.bind(t.progress,"mouseup touchend",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.endScrubbing(t)})),browser.isWebkit&&Array.from(getElements.call(e,'input[type="range"]')).forEach((function(t){n.bind(t,"input",(function(t){return controls.updateRangeFill.call(e,t.target)}))})),e.config.toggleInvert&&!is$1.element(t.display.duration)&&n.bind(t.display.currentTime,"click",(function(){0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,controls.timeUpdate.call(e))})),n.bind(t.inputs.volume,i,(function(t){e.volume=t.target.value}),"volume"),n.bind(t.controls,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type})),t.fullscreen&&Array.from(t.fullscreen.children).filter((function(e){return!e.contains(t.container)})).forEach((function(i){n.bind(i,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type}))})),n.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",(function(e){t.controls.pressed=["mousedown","touchstart"].includes(e.type)})),n.bind(t.controls,"focusin",(function(){var i=e.config,r=e.timers;toggleClass(t.controls,i.classNames.noTransition,!0),ui.toggleControls.call(e,!0),setTimeout((function(){toggleClass(t.controls,i.classNames.noTransition,!1)}),0);var s=n.touch?3e3:4e3;clearTimeout(r.controls),r.controls=setTimeout((function(){return ui.toggleControls.call(e,!1)}),s)})),n.bind(t.inputs.volume,"wheel",(function(t){var n=t.webkitDirectionInvertedFromDevice,i=_slicedToArray([t.deltaX,-t.deltaY].map((function(e){return n?-e:e})),2),r=i[0],s=i[1],o=Math.sign(Math.abs(r)>Math.abs(s)?r:s);e.increaseVolume(o/50);var a=e.media.volume;(1===o&&a<1||-1===o&&a>0)&&t.preventDefault()}),"volume",!1)})),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 _createClass(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,i=e.keyCode?e.keyCode:e.which,r="keydown"===e.type,s=r&&i===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&is$1.number(i)){if(r){var o=document.activeElement;if(is$1.element(o)){var a=t.config.selectors.editable;if(o!==n.inputs.seek&&matches$1(o,a))return;if(32===e.which&&matches$1(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||silencePromise(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}27===i&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){controls.toggleMenu.call(this.player,e)}}]),e}(),commonjsGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var loadjs_umd=createCommonjsModule((function(e,t){e.exports=function(){var e=function(){},t={},n={},i={};function r(e,t){e=e.push?e:[e];var r,s,o,a=[],l=e.length,c=l;for(r=function(e,n){n.length&&a.push(e),--c||t(a)};l--;)s=e[l],(o=n[s])?r(s,o):(i[s]=i[s]||[]).push(r)}function s(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 s,o,l=document,c=i.async,u=(i.numRetries||0)+1,d=i.before||e,m=t.replace(/[\?|#].*$/,""),p=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(m)?((o=l.createElement("link")).rel="stylesheet",o.href=p,(s="hideFocus"in o)&&o.relList&&(s=0,o.rel="preload",o.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(m)?(o=l.createElement("img")).src=p:((o=l.createElement("script")).src=t,o.async=void 0===c||c),o.onload=o.onerror=o.onbeforeload=function(e){var l=e.type[0];if(s)try{o.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l){if((r+=1)<u)return a(t,n,i,r)}else if("preload"==o.rel&&"style"==o.as)return o.rel="stylesheet";n(t,l,e.defaultPrevented)},!1!==d(t,o)&&l.head.appendChild(o)}function l(e,t,n){var i,r,s=(e=e.push?e:[e]).length,o=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)},r=0;r<o;r++)a(e[r],i,n)}function c(e,n,i){var r,a;if(n&&n.trim&&(r=n),a=(r?i:n)||{},r){if(r in t)throw"LoadJS";t[r]=!0}function c(t,n){l(e,(function(e){o(a,e),t&&o({success:t,error:n},e),s(r,e)}),a)}if(a.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return r(e,(function(e){o(t,e)})),c},c.done=function(e){s(e,[])},c.reset=function(){t={},n={},i={}},c.isDefined=function(e){return e in t},c}()}));function loadScript(e){return new Promise((function(t,n){loadjs_umd(e,{success:t,error:n})}))}function parseId(e){if(is$1.empty(e))return null;if(is$1.number(Number(e)))return e;return e.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:e}function assurePlaybackState(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}var vimeo={setup:function(){var e=this;toggleClass(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,setAspectRatio.call(e),is$1.object(window.Vimeo)?vimeo.ready.call(e):loadScript(e.config.urls.vimeo.sdk).then((function(){vimeo.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,n=t.config.vimeo,i=n.premium,r=n.referrerPolicy,s=_objectWithoutProperties(n,["premium","referrerPolicy"]);i&&Object.assign(s,{controls:!1,sidedock:!1});var o=buildUrlParams(_objectSpread2({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},s)),a=t.media.getAttribute("src");is$1.empty(a)&&(a=t.media.getAttribute(t.config.attributes.embed.id));var l=parseId(a),c=createElement("iframe"),u=format(t.config.urls.vimeo.iframe,l,o);if(c.setAttribute("src",u),c.setAttribute("allowfullscreen",""),c.setAttribute("allow",["autoplay","fullscreen","picture-in-picture"].join("; ")),is$1.empty(r)||c.setAttribute("referrerPolicy",r),i||!n.customControls)c.setAttribute("data-poster",t.poster),t.media=replaceElement(c,t.media);else{var d=createElement("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});d.appendChild(c),t.media=replaceElement(d,t.media)}n.customControls||fetch(format(t.config.urls.vimeo.api,u)).then((function(e){!is$1.empty(e)&&e.thumbnail_url&&ui.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(c,{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 assurePlaybackState.call(t,!0),t.embed.play()},t.media.pause=function(){return assurePlaybackState.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var m=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return m},set:function(e){var n=t.embed,i=t.media,r=t.paused,s=t.volume,o=r&&!n.hasPlayed;i.seeking=!0,triggerEvent.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 p=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return p},set:function(e){t.embed.setPlaybackRate(e).then((function(){p=e,triggerEvent.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});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,triggerEvent.call(t,t.media,"volumechange")}))}});var f=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return f},set:function(e){var n=!!is$1.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then((function(){f=n,triggerEvent.call(t,t.media,"volumechange")}))}});var g,y=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return y},set:function(e){var n=is$1.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then((function(){y=n}))}}),t.embed.getVideoUrl().then((function(e){g=e,controls.setDownloadUrl.call(t)})).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(n){var i=_slicedToArray(n,2),r=i[0],s=i[1];t.embed.ratio=[r,s],setAspectRatio.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(n){t.config.title=n,ui.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){m=e,triggerEvent.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,triggerEvent.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,captions.setup.call(t)})),t.embed.on("cuechange",(function(e){var n=e.cues,i=(void 0===n?[]:n).map((function(e){return stripHTML(e.text)}));captions.updateCues.call(t,i)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){assurePlaybackState.call(t,!e),e||triggerEvent.call(t,t.media,"playing")})),is$1.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){triggerEvent.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){triggerEvent.call(t,t.media,"playing")})),t.embed.on("play",(function(){assurePlaybackState.call(t,!0),triggerEvent.call(t,t.media,"playing")})),t.embed.on("pause",(function(){assurePlaybackState.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,m=e.seconds,triggerEvent.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,triggerEvent.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&triggerEvent.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,triggerEvent.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,triggerEvent.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,triggerEvent.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,triggerEvent.call(t,t.media,"error")})),n.customControls&&setTimeout((function(){return ui.build.call(t)}),0)}};function parseId$1(e){if(is$1.empty(e))return null;return e.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:e}function assurePlaybackState$1(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}function getHost(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var youtube={setup:function(){var e=this;if(toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),is$1.object(window.YT)&&is$1.function(window.YT.Player))youtube.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){is$1.function(t)&&t(),youtube.ready.call(e)},loadScript(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;fetch(format(this.config.urls.youtube.api,e)).then((function(e){if(is$1.object(e)){var n=e.title,i=e.height,r=e.width;t.config.title=n,ui.setTitle.call(t),t.embed.ratio=[r,i]}setAspectRatio.call(t)})).catch((function(){setAspectRatio.call(t)}))},ready:function(){var e=this,t=e.config.youtube,n=e.media&&e.media.getAttribute("id");if(is$1.empty(n)||!n.startsWith("youtube-")){var i=e.media.getAttribute("src");is$1.empty(i)&&(i=e.media.getAttribute(this.config.attributes.embed.id));var r=parseId$1(i),s=createElement("div",{id:generateId(e.provider),"data-poster":t.customControls?e.poster:void 0});if(e.media=replaceElement(s,e.media),t.customControls){var o=function(e){return"https://i.ytimg.com/vi/".concat(r,"/").concat(e,"default.jpg")};loadImage(o("maxres"),121).catch((function(){return loadImage(o("sd"),121)})).catch((function(){return loadImage(o("hq"))})).then((function(t){return ui.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(e.media,{videoId:r,host:getHost(t),playerVars:extend({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),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},triggerEvent.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),triggerEvent.call(e,e.media,"ratechange")},onReady:function(n){if(!is$1.function(e.media.play)){var i=n.target;youtube.getTitle.call(e,r),e.media.play=function(){assurePlaybackState$1.call(e,!0),i.playVideo()},e.media.pause=function(){assurePlaybackState$1.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,triggerEvent.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 s=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return s},set:function(t){s=t,i.setVolume(100*s),triggerEvent.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var n=is$1.boolean(t)?t:o;o=n,i[n?"mute":"unMute"](),i.setVolume(100*s),triggerEvent.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}});var a=i.getAvailablePlaybackRates();e.options.speed=a.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),triggerEvent.call(e,e.media,"timeupdate"),triggerEvent.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)&&triggerEvent.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),triggerEvent.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return ui.build.call(e)}),50)}},onStateChange:function(n){var i=n.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(n.data)&&(e.media.seeking=!1,triggerEvent.call(e,e.media,"seeked")),n.data){case-1:triggerEvent.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),triggerEvent.call(e,e.media,"progress");break;case 0:assurePlaybackState$1.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):triggerEvent.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(assurePlaybackState$1.call(e,!0),triggerEvent.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){triggerEvent.call(e,e.media,"timeupdate")}),50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),triggerEvent.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),assurePlaybackState$1.call(e,!1);break;case 3:triggerEvent.call(e,e.media,"waiting")}triggerEvent.call(e,e.elements.container,"statechange",!1,{code:n.data})}}})}}},media={setup:function(){this.media?(toggleClass(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),toggleClass(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&toggleClass(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=createElement("div",{class:this.config.classNames.video}),wrap(this.media,this.elements.wrapper),this.elements.poster=createElement("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?html5.setup.call(this):this.isYouTube?youtube.setup.call(this):this.isVimeo&&vimeo.setup.call(this)):this.debug.warn("No media element found!")}},destroy=function(e){e.manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()},Ads=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"load",(function(){n.enabled&&(is$1.object(window.google)&&is$1.object(window.google.ima)?n.ready():loadScript(n.player.config.urls.googleIMA.sdk).then((function(){n.ready()})).catch((function(){n.trigger("error",new Error("Google IMA SDK failed to load"))})))})),_defineProperty(this,"ready",(function(){n.enabled||destroy(n),n.startSafetyTimer(12e3,"ready()"),n.managerPromise.then((function(){n.clearSafetyTimer("onAdsManagerLoaded()")})),n.listeners(),n.setupIMA()})),_defineProperty(this,"setupIMA",(function(){n.elements.container=createElement("div",{class:n.player.config.classNames.ads}),n.player.elements.container.appendChild(n.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(n.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(n.player.config.playsinline),n.elements.displayContainer=new google.ima.AdDisplayContainer(n.elements.container,n.player.media),n.loader=new google.ima.AdsLoader(n.elements.displayContainer),n.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(function(e){return n.onAdsManagerLoaded(e)}),!1),n.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return n.onAdError(e)}),!1),n.requestAds()})),_defineProperty(this,"requestAds",(function(){var e=n.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=n.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!n.player.muted),n.loader.requestAds(t)}catch(e){n.onAdError(e)}})),_defineProperty(this,"pollCountdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!e)return clearInterval(n.countdownTimer),void n.elements.container.removeAttribute("data-badge-text");var t=function(){var e=formatTime(Math.max(n.manager.getRemainingTime(),0)),t="".concat(i18n.get("advertisement",n.player.config)," - ").concat(e);n.elements.container.setAttribute("data-badge-text",t)};n.countdownTimer=setInterval(t,100)})),_defineProperty(this,"onAdsManagerLoaded",(function(e){if(n.enabled){var t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,n.manager=e.getAdsManager(n.player,t),n.cuePoints=n.manager.getCuePoints(),n.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return n.onAdError(e)})),Object.keys(google.ima.AdEvent.Type).forEach((function(e){n.manager.addEventListener(google.ima.AdEvent.Type[e],(function(e){return n.onAdEvent(e)}))})),n.trigger("loaded")}})),_defineProperty(this,"addCuePoints",(function(){is$1.empty(n.cuePoints)||n.cuePoints.forEach((function(e){if(0!==e&&-1!==e&&e<n.player.duration){var t=n.player.elements.progress;if(is$1.element(t)){var i=100/n.player.duration*e,r=createElement("span",{class:n.player.config.classNames.cues});r.style.left="".concat(i.toString(),"%"),t.appendChild(r)}}}))})),_defineProperty(this,"onAdEvent",(function(e){var t,i=n.player.elements.container,r=e.getAd(),s=e.getAdData();switch(t=e.type,triggerEvent.call(n.player,n.player.media,"ads".concat(t.replace(/_/g,"").toLowerCase())),e.type){case google.ima.AdEvent.Type.LOADED:n.trigger("loaded"),n.pollCountdown(!0),r.isLinear()||(r.width=i.offsetWidth,r.height=i.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:n.manager.setVolume(n.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:n.player.ended?n.loadAds():n.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:n.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:n.pollCountdown(),n.resumeContent();break;case google.ima.AdEvent.Type.LOG:s.adError&&n.player.debug.warn("Non-fatal ad error: ".concat(s.adError.getMessage()))}})),_defineProperty(this,"onAdError",(function(e){n.cancel(),n.player.debug.warn("Ads error",e)})),_defineProperty(this,"listeners",(function(){var e,t=n.player.elements.container;n.player.on("canplay",(function(){n.addCuePoints()})),n.player.on("ended",(function(){n.loader.contentComplete()})),n.player.on("timeupdate",(function(){e=n.player.currentTime})),n.player.on("seeked",(function(){var t=n.player.currentTime;is$1.empty(n.cuePoints)||n.cuePoints.forEach((function(i,r){e<i&&i<t&&(n.manager.discardAdBreak(),n.cuePoints.splice(r,1))}))})),window.addEventListener("resize",(function(){n.manager&&n.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)}))})),_defineProperty(this,"play",(function(){var e=n.player.elements.container;n.managerPromise||n.resumeContent(),n.managerPromise.then((function(){n.manager.setVolume(n.player.volume),n.elements.displayContainer.initialize();try{n.initialized||(n.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),n.manager.start()),n.initialized=!0}catch(e){n.onAdError(e)}})).catch((function(){}))})),_defineProperty(this,"resumeContent",(function(){n.elements.container.style.zIndex="",n.playing=!1,silencePromise(n.player.media.play())})),_defineProperty(this,"pauseContent",(function(){n.elements.container.style.zIndex=3,n.playing=!0,n.player.media.pause()})),_defineProperty(this,"cancel",(function(){n.initialized&&n.resumeContent(),n.trigger("error"),n.loadAds()})),_defineProperty(this,"loadAds",(function(){n.managerPromise.then((function(){n.manager&&n.manager.destroy(),n.managerPromise=new Promise((function(e){n.on("loaded",e),n.player.debug.log(n.manager)})),n.initialized=!1,n.requestAds()})).catch((function(){}))})),_defineProperty(this,"trigger",(function(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),r=1;r<t;r++)i[r-1]=arguments[r];var s=n.events[e];is$1.array(s)&&s.forEach((function(e){is$1.function(e)&&e.apply(n,i)}))})),_defineProperty(this,"on",(function(e,t){return is$1.array(n.events[e])||(n.events[e]=[]),n.events[e].push(t),n})),_defineProperty(this,"startSafetyTimer",(function(e,t){n.player.debug.log("Safety timer invoked from: ".concat(t)),n.safetyTimer=setTimeout((function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")}),e)})),_defineProperty(this,"clearSafetyTimer",(function(e){is$1.nullOrUndefined(n.safetyTimer)||(n.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(n.safetyTimer),n.safetyTimer=null)})),this.player=t,this.config=t.config.ads,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 _createClass(e,[{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!is$1.empty(e.publisherId)||is$1.url(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(is$1.url(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(buildUrlParams(t))}}]),e}(),parseVtt=function(e){var t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var n={};e.split(/\r\n|\n|\r/).forEach((function(e){if(is$1.number(n.startTime)){if(!is$1.empty(e.trim())&&is$1.empty(n.text)){var t=e.trim().split("#xywh="),i=_slicedToArray(t,1);if(n.text=i[0],t[1]){var r=_slicedToArray(t[1].split(","),4);n.x=r[0],n.y=r[1],n.w=r[2],n.h=r[3]}}}else{var s=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);s&&(n.startTime=60*Number(s[1]||0)*60+60*Number(s[2])+Number(s[3])+Number("0.".concat(s[4])),n.endTime=60*Number(s[6]||0)*60+60*Number(s[7])+Number(s[8])+Number("0.".concat(s[9])))}})),n.text&&t.push(n)})),t},fitRatio=function(e,t){var n={};return e>t.width/t.height?(n.width=t.width,n.height=1/e*t.width):(n.height=t.height,n.width=e*t.height),n},PreviewThumbnails=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"load",(function(){n.player.elements.display.seekTooltip&&(n.player.elements.display.seekTooltip.hidden=n.enabled),n.enabled&&n.getThumbnails().then((function(){n.enabled&&(n.render(),n.determineContainerAutoSizing(),n.loaded=!0)}))})),_defineProperty(this,"getThumbnails",(function(){return new Promise((function(e){var t=n.player.config.previewThumbnails.src;if(is$1.empty(t))throw new Error("Missing previewThumbnails.src config attribute");var i=function(){n.thumbnails.sort((function(e,t){return e.height-t.height})),n.player.debug.log("Preview thumbnails",n.thumbnails),e()};if(is$1.function(t))t((function(e){n.thumbnails=e,i()}));else{var r=(is$1.string(t)?[t]:t).map((function(e){return n.getThumbnail(e)}));Promise.all(r).then(i)}}))})),_defineProperty(this,"getThumbnail",(function(e){return new Promise((function(t){fetch(e).then((function(i){var r={frames:parseVtt(i),height:null,urlPrefix:""};r.frames[0].text.startsWith("/")||r.frames[0].text.startsWith("http://")||r.frames[0].text.startsWith("https://")||(r.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var s=new Image;s.onload=function(){r.height=s.naturalHeight,r.width=s.naturalWidth,n.thumbnails.push(r),t()},s.src=r.urlPrefix+r.frames[0].text}))}))})),_defineProperty(this,"startMove",(function(e){if(n.loaded&&is$1.event(e)&&["touchmove","mousemove"].includes(e.type)&&n.player.media.duration){if("touchmove"===e.type)n.seekTime=n.player.media.duration*(n.player.elements.inputs.seek.value/100);else{var t=n.player.elements.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);n.seekTime=n.player.media.duration*(i/100),n.seekTime<0&&(n.seekTime=0),n.seekTime>n.player.media.duration-1&&(n.seekTime=n.player.media.duration-1),n.mousePosX=e.pageX,n.elements.thumb.time.innerText=formatTime(n.seekTime)}n.showImageAtCurrentTime()}})),_defineProperty(this,"endMove",(function(){n.toggleThumbContainer(!1,!0)})),_defineProperty(this,"startScrubbing",(function(e){(is$1.nullOrUndefined(e.button)||!1===e.button||0===e.button)&&(n.mouseDown=!0,n.player.media.duration&&(n.toggleScrubbingContainer(!0),n.toggleThumbContainer(!1,!0),n.showImageAtCurrentTime()))})),_defineProperty(this,"endScrubbing",(function(){n.mouseDown=!1,Math.ceil(n.lastTime)===Math.ceil(n.player.media.currentTime)?n.toggleScrubbingContainer(!1):once.call(n.player,n.player.media,"timeupdate",(function(){n.mouseDown||n.toggleScrubbingContainer(!1)}))})),_defineProperty(this,"listeners",(function(){n.player.on("play",(function(){n.toggleThumbContainer(!1,!0)})),n.player.on("seeked",(function(){n.toggleThumbContainer(!1)})),n.player.on("timeupdate",(function(){n.lastTime=n.player.media.currentTime}))})),_defineProperty(this,"render",(function(){n.elements.thumb.container=createElement("div",{class:n.player.config.classNames.previewThumbnails.thumbContainer}),n.elements.thumb.imageContainer=createElement("div",{class:n.player.config.classNames.previewThumbnails.imageContainer}),n.elements.thumb.container.appendChild(n.elements.thumb.imageContainer);var e=createElement("div",{class:n.player.config.classNames.previewThumbnails.timeContainer});n.elements.thumb.time=createElement("span",{},"00:00"),e.appendChild(n.elements.thumb.time),n.elements.thumb.container.appendChild(e),is$1.element(n.player.elements.progress)&&n.player.elements.progress.appendChild(n.elements.thumb.container),n.elements.scrubbing.container=createElement("div",{class:n.player.config.classNames.previewThumbnails.scrubbingContainer}),n.player.elements.wrapper.appendChild(n.elements.scrubbing.container)})),_defineProperty(this,"destroy",(function(){n.elements.thumb.container&&n.elements.thumb.container.remove(),n.elements.scrubbing.container&&n.elements.scrubbing.container.remove()})),_defineProperty(this,"showImageAtCurrentTime",(function(){n.mouseDown?n.setScrubbingContainerSize():n.setThumbContainerSizeAndPos();var e=n.thumbnails[0].frames.findIndex((function(e){return n.seekTime>=e.startTime&&n.seekTime<=e.endTime})),t=e>=0,i=0;n.mouseDown||n.toggleThumbContainer(t),t&&(n.thumbnails.forEach((function(t,r){n.loadedImages.includes(t.frames[e].text)&&(i=r)})),e!==n.showingThumb&&(n.showingThumb=e,n.loadImage(i)))})),_defineProperty(this,"loadImage",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=n.showingThumb,i=n.thumbnails[e],r=i.urlPrefix,s=i.frames[t],o=i.frames[t].text,a=r+o;if(n.currentImageElement&&n.currentImageElement.dataset.filename===o)n.showImage(n.currentImageElement,s,e,t,o,!1),n.currentImageElement.dataset.index=t,n.removeOldImages(n.currentImageElement);else{n.loadingImage&&n.usingSprites&&(n.loadingImage.onload=null);var l=new Image;l.src=a,l.dataset.index=t,l.dataset.filename=o,n.showingThumbFilename=o,n.player.debug.log("Loading image: ".concat(a)),l.onload=function(){return n.showImage(l,s,e,t,o,!0)},n.loadingImage=l,n.removeOldImages(l)}})),_defineProperty(this,"showImage",(function(e,t,i,r,s){var o=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];n.player.debug.log("Showing thumb: ".concat(s,". num: ").concat(r,". qual: ").concat(i,". newimg: ").concat(o)),n.setImageSizeAndOffset(e,t),o&&(n.currentImageContainer.appendChild(e),n.currentImageElement=e,n.loadedImages.includes(s)||n.loadedImages.push(s)),n.preloadNearby(r,!0).then(n.preloadNearby(r,!1)).then(n.getHigherQuality(i,e,t,s))})),_defineProperty(this,"removeOldImages",(function(e){Array.from(n.currentImageContainer.children).forEach((function(t){if("img"===t.tagName.toLowerCase()){var i=n.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;var r=n.currentImageContainer;setTimeout((function(){r.removeChild(t),n.player.debug.log("Removing thumb: ".concat(t.dataset.filename))}),i)}}}))})),_defineProperty(this,"preloadNearby",(function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(i){setTimeout((function(){var r=n.thumbnails[0].frames[e].text;if(n.showingThumbFilename===r){var s;s=t?n.thumbnails[0].frames.slice(e):n.thumbnails[0].frames.slice(0,e).reverse();var o=!1;s.forEach((function(e){var t=e.text;if(t!==r&&!n.loadedImages.includes(t)){o=!0,n.player.debug.log("Preloading thumb filename: ".concat(t));var s=n.thumbnails[0].urlPrefix+t,a=new Image;a.src=s,a.onload=function(){n.player.debug.log("Preloaded thumb filename: ".concat(t)),n.loadedImages.includes(t)||n.loadedImages.push(t),i()}}})),o||i()}}),300)}))})),_defineProperty(this,"getHigherQuality",(function(e,t,i,r){if(e<n.thumbnails.length-1){var s=t.naturalHeight;n.usingSprites&&(s=i.h),s<n.thumbContainerHeight&&setTimeout((function(){n.showingThumbFilename===r&&(n.player.debug.log("Showing higher quality thumb for: ".concat(r)),n.loadImage(e+1))}),300)}})),_defineProperty(this,"toggleThumbContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=n.player.config.classNames.previewThumbnails.thumbContainerShown;n.elements.thumb.container.classList.toggle(i,e),!e&&t&&(n.showingThumb=null,n.showingThumbFilename=null)})),_defineProperty(this,"toggleScrubbingContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=n.player.config.classNames.previewThumbnails.scrubbingContainerShown;n.elements.scrubbing.container.classList.toggle(t,e),e||(n.showingThumb=null,n.showingThumbFilename=null)})),_defineProperty(this,"determineContainerAutoSizing",(function(){(n.elements.thumb.imageContainer.clientHeight>20||n.elements.thumb.imageContainer.clientWidth>20)&&(n.sizeSpecifiedInCSS=!0)})),_defineProperty(this,"setThumbContainerSizeAndPos",(function(){if(n.sizeSpecifiedInCSS){if(n.elements.thumb.imageContainer.clientHeight>20&&n.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(n.elements.thumb.imageContainer.clientHeight*n.thumbAspectRatio);n.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(n.elements.thumb.imageContainer.clientHeight<20&&n.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(n.elements.thumb.imageContainer.clientWidth/n.thumbAspectRatio);n.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var i=Math.floor(n.thumbContainerHeight*n.thumbAspectRatio);n.elements.thumb.imageContainer.style.height="".concat(n.thumbContainerHeight,"px"),n.elements.thumb.imageContainer.style.width="".concat(i,"px")}n.setThumbContainerPos()})),_defineProperty(this,"setThumbContainerPos",(function(){var e=n.player.elements.progress.getBoundingClientRect(),t=n.player.elements.container.getBoundingClientRect(),i=n.elements.thumb.container,r=t.left-e.left+10,s=t.right-e.left-i.clientWidth-10,o=n.mousePosX-e.left-i.clientWidth/2;o<r&&(o=r),o>s&&(o=s),i.style.left="".concat(o,"px")})),_defineProperty(this,"setScrubbingContainerSize",(function(){var e=fitRatio(n.thumbAspectRatio,{width:n.player.media.clientWidth,height:n.player.media.clientHeight}),t=e.width,i=e.height;n.elements.scrubbing.container.style.width="".concat(t,"px"),n.elements.scrubbing.container.style.height="".concat(i,"px")})),_defineProperty(this,"setImageSizeAndOffset",(function(e,t){if(n.usingSprites){var i=n.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*i,"px"),e.style.width="".concat(e.naturalWidth*i,"px"),e.style.left="-".concat(t.x*i,"px"),e.style.top="-".concat(t.y*i,"px")}})),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return _createClass(e,[{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?fitRatio(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),source={insertElements:function(e,t){var n=this;is$1.string(t)?insertElement(e,this.media,{src:t}):is$1.array(t)&&t.forEach((function(t){insertElement(e,n.media,t)}))},change:function(e){var t=this;getDeep(e,"sources.length")?(html5.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],removeElement(t.media),t.media=null,is$1.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=_slicedToArray(n,1)[0],s=r.provider,o=void 0===s?providers.html5:s,a=r.src,l="html5"===o?i:"div",c="html5"===o?{}:{src:a};Object.assign(t,{provider:o,type:i,supported:support.check(i,o,t.config.playsinline),media:createElement(l,c)}),t.elements.container.appendChild(t.media),is$1.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),is$1.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","")),ui.addStyleHook.call(t),t.isHTML5&&source.insertElements.call(t,"source",n),t.config.title=e.title,media.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&source.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&ui.build.call(t),t.isHTML5&&t.media.load(),is$1.empty(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new PreviewThumbnails(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};function clamp(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),n)}var Plyr=function(){function e(t,n){var i=this;if(_classCallCheck(this,e),_defineProperty(this,"play",(function(){return is$1.function(i.media.play)?(i.ads&&i.ads.enabled&&i.ads.managerPromise.then((function(){return i.ads.play()})).catch((function(){return silencePromise(i.media.play())})),i.media.play()):null})),_defineProperty(this,"pause",(function(){return i.playing&&is$1.function(i.media.pause)?i.media.pause():null})),_defineProperty(this,"togglePlay",(function(e){return(is$1.boolean(e)?e:!i.playing)?i.play():i.pause()})),_defineProperty(this,"stop",(function(){i.isHTML5?(i.pause(),i.restart()):is$1.function(i.media.stop)&&i.media.stop()})),_defineProperty(this,"restart",(function(){i.currentTime=0})),_defineProperty(this,"rewind",(function(e){i.currentTime-=is$1.number(e)?e:i.config.seekTime})),_defineProperty(this,"forward",(function(e){i.currentTime+=is$1.number(e)?e:i.config.seekTime})),_defineProperty(this,"increaseVolume",(function(e){var t=i.media.muted?0:i.volume;i.volume=t+(is$1.number(e)?e:0)})),_defineProperty(this,"decreaseVolume",(function(e){i.increaseVolume(-e)})),_defineProperty(this,"airplay",(function(){support.airplay&&i.media.webkitShowPlaybackTargetPicker()})),_defineProperty(this,"toggleControls",(function(e){if(i.supported.ui&&!i.isAudio){var t=hasClass(i.elements.container,i.config.classNames.hideControls),n=void 0===e?void 0:!e,r=toggleClass(i.elements.container,i.config.classNames.hideControls,n);if(r&&is$1.array(i.config.controls)&&i.config.controls.includes("settings")&&!is$1.empty(i.config.settings)&&controls.toggleMenu.call(i,!1),r!==t){var s=r?"controlshidden":"controlsshown";triggerEvent.call(i,i.media,s)}return!r}return!1})),_defineProperty(this,"on",(function(e,t){on.call(i,i.elements.container,e,t)})),_defineProperty(this,"once",(function(e,t){once.call(i,i.elements.container,e,t)})),_defineProperty(this,"off",(function(e,t){off(i.elements.container,e,t)})),_defineProperty(this,"destroy",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(i.ready){var n=function(){document.body.style.overflow="",i.embed=null,t?(Object.keys(i.elements).length&&(removeElement(i.elements.buttons.play),removeElement(i.elements.captions),removeElement(i.elements.controls),removeElement(i.elements.wrapper),i.elements.buttons.play=null,i.elements.captions=null,i.elements.controls=null,i.elements.wrapper=null),is$1.function(e)&&e()):(unbindListeners.call(i),html5.cancelRequests.call(i),replaceElement(i.elements.original,i.elements.container),triggerEvent.call(i,i.elements.original,"destroyed",!0),is$1.function(e)&&e.call(i.elements.original),i.ready=!1,setTimeout((function(){i.elements=null,i.media=null}),200))};i.stop(),clearTimeout(i.timers.loading),clearTimeout(i.timers.controls),clearTimeout(i.timers.resized),i.isHTML5?(ui.toggleNativeControls.call(i,!0),n()):i.isYouTube?(clearInterval(i.timers.buffering),clearInterval(i.timers.playing),null!==i.embed&&is$1.function(i.embed.destroy)&&i.embed.destroy(),n()):i.isVimeo&&(null!==i.embed&&i.embed.unload().then(n),setTimeout(n,200))}})),_defineProperty(this,"supports",(function(e){return support.mime.call(i,e)})),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=support.touch,this.media=t,is$1.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||is$1.nodeList(this.media)||is$1.array(this.media))&&(this.media=this.media[0]),this.config=extend({},defaults$1,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 Console(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",support),!is$1.nullOrUndefined(this.media)&&is$1.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(support.check().api){var r=this.media.cloneNode(!0);r.autoplay=!1,this.elements.original=r;var s=this.media.tagName.toLowerCase(),o=null,a=null;switch(s){case"div":if(o=this.media.querySelector("iframe"),is$1.element(o)){if(a=parseUrl(o.getAttribute("src")),this.provider=getProviderByUrl(a.toString()),this.elements.container=this.media,this.media=o,this.elements.container.className="",a.search.length){var l=["1","true"];l.includes(a.searchParams.get("autoplay"))&&(this.config.autoplay=!0),l.includes(a.searchParams.get("loop"))&&(this.config.loop.active=!0),this.isYouTube?(this.config.playsinline=l.includes(a.searchParams.get("playsinline")),this.config.youtube.hl=a.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(is$1.empty(this.provider)||!Object.values(providers).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=types.video;break;case"video":case"audio":this.type=s,this.provider=providers.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=support.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Listeners(this),this.storage=new Storage(this),this.media.plyr=this,is$1.element(this.elements.container)||(this.elements.container=createElement("div",{tabindex:0}),wrap(this.media,this.elements.container)),ui.migrateStyles.call(this),ui.addStyleHook.call(this),media.setup.call(this),this.config.debug&&on.call(this,this.elements.container,this.config.events.join(" "),(function(e){i.debug.log("event: ".concat(e.type))})),this.fullscreen=new Fullscreen(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&ui.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Ads(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return silencePromise(i.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new PreviewThumbnails(this))):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 _createClass(e,[{key:"toggleCaptions",value:function(e){captions.toggle.call(this,e,!1)}},{key:"isHTML5",get:function(){return this.provider===providers.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===providers.youtube}},{key:"isVimeo",get:function(){return this.provider===providers.vimeo}},{key:"isVideo",get:function(){return this.type===types.video}},{key:"isAudio",get:function(){return this.type===types.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=is$1.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 is$1.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=is$1.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;is$1.string(t)&&(t=Number(t)),is$1.number(t)||(t=this.storage.get("volume")),is$1.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!is$1.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;is$1.boolean(t)||(t=this.storage.get("muted")),is$1.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=this,n=null;is$1.number(e)&&(n=e),is$1.number(n)||(n=this.storage.get("speed")),is$1.number(n)||(n=this.config.speed.selected);var i=this.minimumSpeed,r=this.maximumSpeed;n=clamp(n,i,r),this.config.speed.selected=n,setTimeout((function(){t.media.playbackRate=n}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,_toConsumableArray(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,_toConsumableArray(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!is$1.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(is$1.number),r=!0;if(!n.includes(i)){var s=closest$1(n,i);this.debug.warn("Unsupported quality option: ".concat(i,", using ").concat(s," instead")),i=s,r=!1}t.selected=i,this.media.quality=i,r&&this.storage.set({quality:i})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=is$1.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){source.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return is$1.url(e)?e:this.source},set:function(e){is$1.url(e)&&(this.config.urls.download=e,controls.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?ui.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=reduceAspectRatio(getAspectRatio.call(this));return is$1.array(e)?e.join(":"):e},set:function(e){this.isVideo?is$1.string(e)&&validateRatio(e)?(this.config.ratio=e,setAspectRatio.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=is$1.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){captions.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){captions.setLanguage.call(this,e,!1)},get:function(){return(captions.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(support.pip){var t=is$1.boolean(e)?e:!this.pip;is$1.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?pip.active:pip.inactive),is$1.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return support.pip?is$1.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===pip.active:null}}],[{key:"supported",value:function(e,t,n){return support.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return loadSprite(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return is$1.string(t)?i=Array.from(document.querySelectorAll(t)):is$1.nodeList(t)?i=Array.from(t):is$1.array(t)&&(i=t.filter(is$1.element)),is$1.empty(i)?null:i.map((function(t){return new e(t,n)}))}}]),e}();Plyr.defaults=cloneDeep(defaults$1);export default Plyr; \ No newline at end of file
diff --git a/dist/plyr.min.mjs.map b/dist/plyr.min.mjs.map
index f388d037..ab5ba876 100644
--- a/dist/plyr.min.mjs.map
+++ b/dist/plyr.min.mjs.map
@@ -1 +1 @@
-{"version":3,"sources":["plyr.mjs","node_modules/rangetouch/dist/rangetouch.mjs","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/load-sprite.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/load-image.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/utils/numbers.js","src/js/plyr.js"],"names":["_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","prototype","_defineProperty","obj","value","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","source","forEach","getOwnPropertyDescriptors","defineProperties","_objectWithoutPropertiesLoose","excluded","sourceKeys","indexOf","_objectWithoutProperties","sourceSymbolKeys","propertyIsEnumerable","call","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","Array","isArray","_arrayLikeToArray","iter","Symbol","iterator","from","_arr","_n","_d","_e","undefined","_s","_i","next","done","err","o","minLen","n","toString","slice","constructor","name","test","len","arr2","e","t","r","defaults","addCSS","thumbWidth","watch","matches","document","querySelectorAll","includes","this","trigger","Event","bubbles","dispatchEvent","getConstructor","instanceOf","isNullOrUndefined","isObject","isNumber","Number","isNaN","isString","String","isBoolean","Boolean","isFunction","Function","isNodeList","NodeList","isElement","Element","isEvent","isEmpty","is","nullOrUndefined","number","string","boolean","function","array","nodeList","element","event","empty","getDecimalPlaces","concat","match","Math","max","round","parseFloat","toFixed","RangeTouch","querySelector","rangeTouch","config","init","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","set","changedTouches","getAttribute","s","u","c","getBoundingClientRect","a","width","clientX","left","disabled","preventDefault","get","type","MutationObserver","addedNodes","observe","body","childList","subtree","map","documentElement","input","isWeakMap","WeakMap","isTextNode","Text","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isPromise","Promise","then","isUrl","URL","startsWith","hostname","is$1","weakMap","textNode","keyboardEvent","cue","track","promise","url","transitionEndEvent","createElement","events","WebkitTransition","MozTransition","OTransition","transition","find","repaint","delay","setTimeout","hidden","offsetHeight","browser","isIE","documentMode","isEdge","navigator","userAgent","isWebkit","isIPhone","platform","isIos","cloneDeep","JSON","parse","stringify","getDeep","path","split","reduce","extend","_len","sources","_key","shift","assign","wrap","elements","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","_ref","_ref3","_ref4","setAttribute","text","innerText","insertAfter","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hide","toggleClass","force","method","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","closest","el","parentElement","nodeType","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","options","addEventListener","removeEventListener","toggleListener","callback","_this","toggle","passive","capture","eventListeners","on","off","once","_this2","onceCallback","args","triggerEvent","detail","CustomEvent","plyr","unbindListeners","item","ready","_this3","resolve","silencePromise","validateRatio","every","reduceAspectRatio","ratio","_ratio","height","divider","getDivider","w","h","getAspectRatio","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","_player$media","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","dedupe","prev","curr","abs","generateId","prefix","floor","random","format","getPercentage","current","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","resources","youtube","i18n","{seektime}","seekTime","{title}","title","k","v","Storage","storage","store","localStorage","getItem","json","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","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","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","some","control","button","createRange","min","step","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","node","bind","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","val","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sort","b","sorting","setCaptionsMenu","_this7","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","values","popup","p","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","position","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","size","restore","propertyName","setDownloadUrl","download","create","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","href","urls","isEmbed","inject","_this11","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","has","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","inactive","providers","types","getProviderByUrl","noop","Console","console","Fullscreen","property","scrollPosition","x","y","forceFallback","proxy","trapFocus","scrollX","scrollY","scrollTo","overflow","viewport","head","hasProperty","cleanupViewport","part","keyCode","activeElement","first","last","shiftKey","native","webkitEnterFullscreen","toggleFallback","requestFullscreen","navigationUI","webkitExitFullscreen","action","cancelFullScreen","exit","enter","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","now","migrateStyles","getPropertyValue","removeProperty","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","code","repeat","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","currentTarget","attribute","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","commonjsGlobal","globalThis","self","createCommonjsModule","fn","module","exports","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","q","splice","executeCallbacks","success","loadFile","numTries","isLegacyIECss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathname","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","defaultPrevented","loadFiles","paths","loadjs","arg1","arg2","loadFn","returnPromise","deps","isDefined","factory","loadScript","parseId","$2","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","data-poster","thumbnail_url","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","getPaused","seconds","getHost","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","destroy","manager","displayContainer","remove","Ads","initialized","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","google","ima","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this12","handlers","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","fitRatio","outer","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","ceil","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","right","previewPos","_fitRatio","multiplier","top","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","clamp","Plyr","failed","jQuery","original","search","truthy","searchParams","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.min.mjs","sourcesContent":["function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _classCallCheck$1(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n}\n\nfunction _defineProperties$1(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n}\n\nfunction _createClass$1(e, t, n) {\n return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n}\n\nfunction _defineProperty$1(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n}\n\nfunction ownKeys$1(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n\n return n;\n}\n\nfunction _objectSpread2$1(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys$1(Object(n), !0).forEach(function (t) {\n _defineProperty$1(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$1(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n}\n\nvar defaults = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n};\n\nfunction matches(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n}\n\nfunction trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n}\n\nvar getConstructor = function getConstructor(e) {\n return null != e ? e.constructor : null;\n},\n instanceOf = function instanceOf(e, t) {\n return !!(e && t && e instanceof t);\n},\n isNullOrUndefined = function isNullOrUndefined(e) {\n return null == e;\n},\n isObject = function isObject(e) {\n return getConstructor(e) === Object;\n},\n isNumber = function isNumber(e) {\n return getConstructor(e) === Number && !Number.isNaN(e);\n},\n isString = function isString(e) {\n return getConstructor(e) === String;\n},\n isBoolean = function isBoolean(e) {\n return getConstructor(e) === Boolean;\n},\n isFunction = function isFunction(e) {\n return getConstructor(e) === Function;\n},\n isArray = function isArray(e) {\n return Array.isArray(e);\n},\n isNodeList = function isNodeList(e) {\n return instanceOf(e, NodeList);\n},\n isElement = function isElement(e) {\n return instanceOf(e, Element);\n},\n isEvent = function isEvent(e) {\n return instanceOf(e, Event);\n},\n isEmpty = function isEmpty(e) {\n return isNullOrUndefined(e) || (isString(e) || isArray(e) || isNodeList(e)) && !e.length || isObject(e) && !Object.keys(e).length;\n},\n is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n};\n\nfunction getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n}\n\nfunction round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n\n return Math.round(e / t) * t;\n}\n\nvar RangeTouch = function () {\n function e(t, n) {\n _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());\n }\n\n return _createClass$1(e, [{\n key: \"init\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function value(e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function value(t) {\n if (!e.enabled || !is.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function value(t) {\n e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function value(t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type=\"range\"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\n var i = _objectSpread2$1({}, defaults, {}, n);\n\n if (is.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is.element(n) && matches(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n}();\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\nvar getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n};\n\nvar instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n};\n\nvar isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n};\n\nvar isObject$1 = function isObject(input) {\n return getConstructor$1(input) === Object;\n};\n\nvar isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n};\n\nvar isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n};\n\nvar isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n};\n\nvar isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n};\n\nvar isArray$1 = function isArray(input) {\n return Array.isArray(input);\n};\n\nvar isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n};\n\nvar isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n};\n\nvar isElement$1 = function isElement(input) {\n return instanceOf$1(input, Element);\n};\n\nvar isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n};\n\nvar isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n};\n\nvar isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n};\n\nvar isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n};\n\nvar isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n};\n\nvar isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise) && isFunction$1(input.then);\n};\n\nvar isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;\n};\n\nvar isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nvar is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n};\n\n// ==========================================================================\nvar transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n}(); // Force repaint of element\n\nfunction repaint(element, delay) {\n setTimeout(function () {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n element.hidden = false;\n } catch (e) {// Do nothing\n }\n }, delay);\n}\n\n// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\nvar browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\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\nfunction cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n} // Get a nested value in an object\n\nfunction getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n} // Deep extend destination object with N more objects\n\nfunction extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n}\n\nfunction wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // 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\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n} // Set attributes\n\nfunction setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n} // Create a DocumentFragment\n\nfunction createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n} // Inaert an element after another\n\nfunction insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n} // Insert a DocumentFragment\n\nfunction insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n} // Remove element(s)\n\nfunction removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n} // Remove all child elements\n\nfunction emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n} // Replace element\n\nfunction replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n} // Get an attribute object from a string selector\n\nfunction 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 if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = extend({}, existingAttributes);\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n\n var _parts = _slicedToArray(parts, 1),\n key = _parts[0];\n\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.string(existing.class)) {\n attributes.class = \"\".concat(existing.class, \" \").concat(className);\n } else {\n attributes.class = className;\n }\n\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 break;\n }\n });\n return extend(existing, attributes);\n} // Toggle hidden\n\nfunction toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n } // eslint-disable-next-line no-param-reassign\n\n\n element.hidden = hide;\n} // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\nfunction toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\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} // Has class name\n\nfunction hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n} // Element matches selector\n\nfunction matches$1(element, selector) {\n var _Element = Element,\n prototype = _Element.prototype;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n} // Closest ancestor element matching selector (also tests element itself)\n\nfunction closest(element, selector) {\n var _Element2 = Element,\n prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n function closestElement() {\n var el = this;\n\n do {\n if (matches$1.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n }\n\n var method = prototype.closest || closestElement;\n return method.call(element, selector);\n} // Find all elements\n\nfunction getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n} // Find a single element\n\nfunction getElement(selector) {\n return this.elements.container.querySelector(selector);\n} // Set focus and tab focus class\n\nfunction setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n\nvar 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}; // Check for feature support\n\nvar support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\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: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\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 // Detect transitions support\n transitions: transitionEndEvent !== false,\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\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\n\nvar supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n}(); // Toggle event listener\n\n\nfunction toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n} // Bind event handler\n\nfunction on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n} // Unbind event handler\n\nfunction off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n} // Bind once-only event handler\n\nfunction once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n} // Trigger event\n\nfunction triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n} // Unbind all cached event listeners\n\nfunction unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n} // Run method when / if player is ready\n\nfunction ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n}\n\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n\nfunction silencePromise(value) {\n if (is$1.promise(value)) {\n value.then(null, function () {});\n }\n}\n\nfunction validateRatio(input) {\n if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {\n return false;\n }\n\n var ratio = is$1.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is$1.number);\n}\nfunction reduceAspectRatio(ratio) {\n if (!is$1.array(ratio) || !ratio.every(is$1.number)) {\n return null;\n }\n\n var _ratio = _slicedToArray(ratio, 2),\n width = _ratio[0],\n height = _ratio[1];\n\n var getDivider = function getDivider(w, h) {\n return h === 0 ? w : getDivider(h, w % h);\n };\n\n var divider = getDivider(width, height);\n return [width / divider, height / divider];\n}\nfunction getAspectRatio(input) {\n var parse = function parse(ratio) {\n return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n }; // Try provided ratio\n\n\n var ratio = parse(input); // Get from config\n\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n } // Get from embed\n\n\n if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {\n ratio = this.embed.ratio;\n } // Get from HTML5 video\n\n\n if (ratio === null && this.isHTML5) {\n var _this$media = this.media,\n videoWidth = _this$media.videoWidth,\n videoHeight = _this$media.videoHeight;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n} // Set aspect ratio for responsive container\n\nfunction setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n var wrapper = this.elements.wrapper;\n var ratio = getAspectRatio.call(this, input);\n\n var _ref = is$1.array(ratio) ? ratio : [0, 0],\n _ref2 = _slicedToArray(_ref, 2),\n w = _ref2[0],\n h = _ref2[1];\n\n var padding = 100 / w * h;\n wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n var offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n}\n\n// ==========================================================================\nvar html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n } // Get sizes from <source> elements\n\n\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('size'));\n }).filter(Boolean);\n },\n setup: function setup() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n if (!is$1.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n } // Quality\n\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (s) {\n return s.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('size'));\n },\n set: function set(input) {\n if (player.quality === input) {\n return;\n } // If we're using an an external handler...\n\n\n if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (s) {\n return Number(s.getAttribute('size')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState,\n playbackRate = _player$media.playbackRate; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.speed = playbackRate;\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n silencePromise(player.play());\n }\n }); // Load new source\n\n player.media.load();\n }\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // 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\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n};\n\n// ==========================================================================\n\nfunction dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n} // Get the closest value in an array\n\nfunction closest$1(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n}\n\n// ==========================================================================\n\nfunction generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n} // Format string\n\nfunction format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n} // Get percentage\n\nfunction 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} // Replace all occurances of a string in a string\n\nvar replaceAll = function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}; // Convert to title case\n\nvar toTitleCase = function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n}; // Convert string to pascalCase\n\nfunction toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n} // Convert string to pascalCase\n\nfunction toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n} // Remove HTML from a string\n\nfunction stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n} // Like outerHTML, but also works for DocumentFragment\n\nfunction getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n\nvar resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n};\nvar i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n k = _ref2[0],\n v = _ref2[1];\n\n string = replaceAll(string, k, v);\n });\n return string;\n }\n};\n\nvar Storage = /*#__PURE__*/function () {\n function Storage(player) {\n _classCallCheck(this, Storage);\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, [{\n key: \"get\",\n value: function get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n }\n }, {\n key: \"set\",\n value: function set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = this.get(); // Default to empty object\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n }], [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // 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\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n}();\n\n// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\nfunction fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\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 request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// ==========================================================================\n\nfunction loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n}\n\n// ==========================================================================\n\nvar getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n};\nvar getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n};\nvar getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n}; // Format time to UI friendly string\n\nfunction formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n}\n\nvar controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\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 }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\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 }; // Display\n\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 }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\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); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // 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\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n\n var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var _this = this;\n\n var attributes = extend({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some(function (c) {\n return c === _this.config.classNames.control;\n })) {\n extend(attributes, {\n class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.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 // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\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 }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type, attrs) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\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: function bindMenuItemShortcuts(menuItem, type) {\n var _this2 = this;\n\n // Navigate through menus via arrow keys and space\n on.call(this, menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this2, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this2, target, true);\n }\n }\n }, false); // 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\n on.call(this, menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this2, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this3 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(check) {\n // Ensure exclusivity\n if (check) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this3.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this3.quality = value;\n break;\n\n case 'speed':\n _this3.speed = parseFloat(value);\n break;\n }\n\n controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this4 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var val = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = val; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = val;\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); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this5 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(show) {\n return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n\n if (is$1.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 } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function 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 } // 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\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(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 // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this6.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this6, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this6.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this6, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this6, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\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 if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this7.captions.toggled && _this7.currentTrack === value,\n title: captions.getLabel.call(_this7, track),\n badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu() {\n var _this8 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n this.options.speed = this.options.speed.filter(function (o) {\n return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this8, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this8, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (p) {\n return !p.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;\n var isMenuItem = popup.contains(target); // 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\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.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$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this9 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function 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 } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this9, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl: function setDownloadUrl() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set attribute\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create: function create(data) {\n var _this10 = this;\n\n var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n createButton = controls.createButton,\n createProgress = controls.createProgress,\n createRange = controls.createRange,\n createTime = controls.createTime,\n setQualityMenu = controls.setQualityMenu,\n setSpeedMenu = controls.setSpeedMenu,\n showMenuPanel = controls.showMenuPanel;\n this.elements.controls = null; // Larger overlaid play button\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n } // Create the container\n\n\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container; // Default item attributes\n\n var defaultAttributes = {\n class: 'plyr__controls__item'\n }; // Loop through controls in order\n\n dedupe(is$1.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n } // Rewind button\n\n\n if (control === 'rewind') {\n container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n } // Play/Pause button\n\n\n if (control === 'play') {\n container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n } // Fast forward button\n\n\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n } // Progress\n\n\n if (control === 'progress') {\n var progressContainer = createElement('div', {\n class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n });\n var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(createRange.call(_this10, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (_this10.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: _this10.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n _this10.elements.display.seekTooltip = tooltip;\n }\n\n _this10.elements.progress = progress;\n progressContainer.appendChild(_this10.elements.progress);\n container.appendChild(progressContainer);\n } // Media current time display\n\n\n if (control === 'current-time') {\n container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n } // Media duration display\n\n\n if (control === 'duration') {\n container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n } // Volume controls\n\n\n if (control === 'mute' || control === 'volume') {\n var volume = _this10.elements.volume; // Create the volume container if needed\n\n if (!is$1.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n }));\n _this10.elements.volume = volume;\n container.appendChild(volume);\n } // Toggle mute button\n\n\n if (control === 'mute') {\n volume.appendChild(createButton.call(_this10, 'mute'));\n } // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: _this10.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n }\n } // Toggle captions button\n\n\n if (control === 'captions') {\n container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n } // Settings button / menu\n\n\n if (control === 'settings' && !is$1.empty(_this10.config.settings)) {\n var wrapper = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(_this10, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n _this10.elements.settings.panels.home = home; // Build the menu items\n\n _this10.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n on.call(_this10, menuItem, 'click', function () {\n showMenuPanel.call(_this10, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this10.config));\n var value = createElement('span', {\n class: _this10.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this10.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this10.config.classNames.hidden\n }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n on.call(_this10, pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n showMenuPanel.call(_this10, 'home', true);\n }, false); // Go back via button click\n\n on.call(_this10, backButton, 'click', function () {\n showMenuPanel.call(_this10, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this10.elements.settings.buttons[type] = menuItem;\n _this10.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n _this10.elements.settings.popup = popup;\n _this10.elements.settings.menu = wrapper;\n } // Picture in picture button\n\n\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n } // Airplay button\n\n\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n } // Download button\n\n\n if (control === 'download') {\n var _attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: _this10.download,\n target: '_blank'\n }); // Set download attribute for HTML5 only\n\n\n if (_this10.isHTML5) {\n _attributes.download = '';\n }\n\n var download = _this10.config.urls.download;\n\n if (!is$1.url(download) && _this10.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(_this10.provider),\n label: _this10.provider\n });\n }\n\n container.appendChild(createButton.call(_this10, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n }\n }); // Set available quality levels\n\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this11 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.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) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this11.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this11.config.classNames.hidden, false);\n toggleClass(label, _this11.config.classNames.tooltip, true);\n });\n }\n }\n};\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 */\n\nfunction parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var 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} // Convert object to URLSearchParams\n\nfunction buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n}\n\nvar captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\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\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n } // Add event listener for cue changes\n\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n 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\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n } // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n\n\n setTimeout(function () {\n if (active && _this2.captions.toggled) {\n _this2.captions.currentTrackNode.mode = 'hidden';\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: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.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 var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\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 // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\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: function getTracks() {\n var _this3 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // 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\n return tracks.filter(function (track) {\n return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this4 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this4.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (t) {\n return t.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.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 // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var 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 var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n};\n\n// ==========================================================================\n// Plyr default config\n// ==========================================================================\nvar defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\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 // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\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 // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 // URLs\n urls: {\n download: null,\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/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\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 download: '[data-plyr=\"download\"]',\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',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\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 tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n }\n};\n\n// ==========================================================================\n// Plyr states\n// ==========================================================================\nvar pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n};\n\n// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\nvar providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n};\nvar types = {\n audio: 'audio',\n video: 'video'\n};\n/**\n * Get provider by URL\n * @param {String} url\n */\n\nfunction getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\n// ==========================================================================\n// Console wrapper\n// ==========================================================================\nvar noop = function noop() {};\n\nvar Console = /*#__PURE__*/function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n}();\n\nvar Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(player) {\n var _this = this;\n\n _classCallCheck(this, Fullscreen);\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n\n this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n _this.onChange();\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n }); // Tap focus when in fullscreen\n\n on.call(this, this.player.elements.container, 'keydown', function (event) {\n return _this.trapFocus(event);\n }); // Update the UI\n\n this.update();\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"onChange\",\n value: function onChange() {\n if (!this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = this.active;\n } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event\n\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n }, {\n key: \"toggleFallback\",\n value: function toggleFallback() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\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 } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n }\n } // Toggle button and fire events\n\n\n this.onChange();\n } // Trap focus inside container\n\n }, {\n key: \"trapFocus\",\n value: function trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n var _focusable = _slicedToArray(focusable, 1),\n first = _focusable[0];\n\n var last = focusable[focusable.length - 1];\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 } // Update UI\n\n }, {\n key: \"update\",\n value: function update() {\n if (this.enabled) {\n var mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n } // Make an element fullscreen\n\n }, {\n key: \"enter\",\n value: function enter() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is$1.empty(this.prefix)) {\n this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n }\n } // Bail from fullscreen\n\n }, {\n key: \"exit\",\n value: function exit() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(this.prefix)) {\n var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n }\n } // Toggle state\n\n }, {\n key: \"toggle\",\n value: function toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n }, {\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n}();\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// ==========================================================================\nfunction loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n}\n\nvar ui = {\n addStyleHook: function 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 // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset speed\n\n this.speed = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\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\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('data-poster', poster); // Show the poster\n\n this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(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(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\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); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n Object.assign(target, {\n pressed: _this3.playing\n });\n target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controlsElement = this.elements.controls;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles: function migrateStyles() {\n var _this5 = this;\n\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n .filter(function (key) {\n return !is$1.empty(key) && is$1.string(key) && key.startsWith('--plyr');\n }).forEach(function (key) {\n // Set on the container\n _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n _this5.media.style.removeProperty(key);\n }); // Remove attribute if empty\n\n if (is$1.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n};\n\nvar Listeners = /*#__PURE__*/function () {\n function Listeners(player) {\n _classCallCheck(this, Listeners);\n\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\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 } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\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 var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n 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)\n\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\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\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\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\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }, {\n key: \"firstTouch\",\n value: function firstTouch() {\n var player = this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n }, {\n key: \"setTabFocus\",\n value: function setTabFocus(event) {\n var player = this.player;\n var elements = player.elements;\n clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n if (event.type !== 'focusout') {\n this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n } // Global window & document listeners\n\n }, {\n key: \"global\",\n value: function global() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);\n } // Container listeners\n\n }, {\n key: \"container\",\n value: function container() {\n var player = this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controlsElement = elements.controls; // Remove button states for fullscreen\n\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio = _slicedToArray(ratio, 2),\n y = _ratio[1];\n\n var _getAspectRatio$call = getAspectRatio.call(player),\n _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n videoX = _getAspectRatio$call2[0],\n videoY = _getAspectRatio$call2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n if (target !== elements.container) {\n return;\n } // If it's not an embed and no ratio specified\n\n\n if (!player.isEmbed && is$1.empty(player.config.ratio)) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n if (isEnter) {\n setTimeout(function () {\n return repaint(elements.container);\n }, 100);\n } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n } // Listen for media events\n\n }, {\n key: \"media\",\n value: function media() {\n var _this = this;\n\n var player = this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n player.pause();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, function () {\n silencePromise(player.play());\n }, 'play');\n } else {\n _this.proxy(event, function () {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadUrl.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n } // Run default and custom handlers\n\n }, {\n key: \"proxy\",\n value: function proxy(event, defaultHandler, customHandlerKey) {\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned !== false && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n } // Trigger custom and default handlers\n\n }, {\n key: \"bind\",\n value: function bind(element, type, defaultHandler, customHandlerKey) {\n var _this2 = this;\n\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this2.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n } // Listen for control events\n\n }, {\n key: \"controls\",\n value: function controls$1() {\n var _this3 = this;\n\n var player = this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this3.bind(button, 'click', function () {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n } // Pause\n\n\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n this.bind(elements.buttons.rewind, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind'); // Rewind\n\n this.bind(elements.buttons.fastForward, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward'); // Mute toggle\n\n this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\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\n this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\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\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this3.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n this.bind(elements.progress, 'mouseleave touchend click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this3.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', function () {\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 } // Volume\n\n\n this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(function (c) {\n return !c.contains(elements.container);\n }).forEach(function (child) {\n _this3.bind(child, 'mouseenter mouseleave', function (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\n\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n }\n }]);\n\n return Listeners;\n}();\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\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 */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function 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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; // tag IE9+\n\n isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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]; // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // resolve Promise\n\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n } // publish bundle load event\n\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\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 */\n\n\n loadjs.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 return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n});\n\n// ==========================================================================\nfunction loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n}\n\nfunction parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nvar vimeo = {\n setup: function setup() {\n var player = this; // Add embed class for responsive\n\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set intial ratio\n\n setAspectRatio.call(player); // Load the SDK if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(player);\n }).catch(function (error) {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready: function ready() {\n var _this = this;\n\n var player = this;\n var config = player.config.vimeo;\n\n var premium = config.premium,\n referrerPolicy = config.referrerPolicy,\n frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n } // Get Vimeo params for the iframe\n\n\n var params = buildUrlParams(_objectSpread2({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, frameParams)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required\n\n if (!is$1.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n } // Inject the package\n\n\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n var wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n } // Get poster image\n\n\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n if (is$1.empty(response) || !response.thumbnail_url) {\n return;\n } // Set and show poster\n\n\n ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n });\n } // Setup instance\n // https://github.com/vimeo/player.js\n\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function () {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(function (error) {\n _this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = [width, height];\n setAspectRatio.call(_this);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', function () {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', function () {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n }\n};\n\n// ==========================================================================\n\nfunction parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n } // Use YouTube's default\n\n\n return undefined;\n}\n\nvar youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n // Call global callback if set\n if (is$1.function(callback)) {\n callback();\n }\n\n youtube.ready.call(_this);\n }; // Load the SDK\n\n\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n var url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(function (data) {\n if (is$1.object(data)) {\n var title = data.title,\n height = data.height,\n width = data.width; // Set title\n\n _this2.config.title = title;\n ui.setTitle.call(_this2); // Set aspect ratio\n\n _this2.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(_this2);\n }).catch(function () {\n // Set aspect ratio\n setAspectRatio.call(_this2);\n });\n },\n // API ready\n ready: function ready() {\n var player = this;\n var config = player.config.youtube; // Ignore already setup (race condition)\n\n var currentId = player.media && player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Replace media element\n\n var container = createElement('div', {\n id: id,\n 'data-poster': config.customControls ? player.poster : undefined\n });\n player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n if (config.customControls) {\n var posterSrc = function posterSrc(s) {\n return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (src) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n } // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n\n player.embed = new window.YT.Player(player.media, {\n videoId: videoId,\n host: getHost(config),\n playerVars: extend({}, {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\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 player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function 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 } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n player.options.speed = speeds.filter(function (s) {\n return player.config.speed.options.includes(s);\n }); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui && config.customControls) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n }\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var 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 } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\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 (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // 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\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\n assurePlaybackState$1.call(player, false);\n break;\n\n case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n};\n\n// ==========================================================================\nvar media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap(this.media, this.elements.wrapper); // Poster image container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: ''\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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\nvar destroy = function destroy(instance) {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n } // Destroy our adsManager\n\n\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nvar Ads = /*#__PURE__*/function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n this.player = player;\n this.config = player.config.ads;\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; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"load\",\n\n /**\n * Load the IMA SDK\n */\n value: function load() {\n var _this2 = this;\n\n if (!this.enabled) {\n return;\n } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n _this2.ready();\n }).catch(function () {\n // Script failed to load or is blocked\n _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n /**\n * Get the ads instance ready\n */\n\n }, {\n key: \"ready\",\n value: function ready() {\n var _this3 = this;\n\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n } // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n\n\n this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n this.managerPromise.then(function () {\n _this3.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n this.listeners(); // Setup the IMA SDK\n\n this.setupIMA();\n } // Build the tag URL\n\n }, {\n key: \"setupIMA\",\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 value: function setupIMA() {\n var _this4 = this;\n\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); // So we can run VPAID2\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Create ads loader\n\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this4.onAdsManagerLoaded(event);\n }, false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this4.onAdError(error);\n }, false); // Request video ads to be pre-loaded\n\n this.requestAds();\n }\n /**\n * Request advertisements\n */\n\n }, {\n key: \"requestAds\",\n value: function requestAds() {\n var container = this.player.elements.container;\n\n try {\n // Request video ads\n var request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!this.player.muted);\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n\n }, {\n key: \"pollCountdown\",\n value: function pollCountdown() {\n var _this5 = this;\n\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n _this5.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n\n }, {\n key: \"onAdsManagerLoaded\",\n value: function onAdsManagerLoaded(event) {\n var _this6 = this;\n\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // 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\n this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n this.cuePoints = this.manager.getCuePoints(); // Add listeners to the required events\n // Advertisement error events\n\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this6.onAdError(error);\n }); // Advertisement regular events\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n return _this6.onAdEvent(e);\n });\n }); // Resolve our adsManager\n\n this.trigger('loaded');\n }\n }, {\n key: \"addCuePoints\",\n value: function addCuePoints() {\n var _this7 = this;\n\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(this.cuePoints)) {\n this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n var seekElement = _this7.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this7.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this7.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\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\n }, {\n key: \"onAdEvent\",\n value: function onAdEvent(event) {\n var _this8 = this;\n\n var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n triggerEvent.call(_this8.player, _this8.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n }; // Bubble the event\n\n\n dispatchEvent(event.type);\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'); // Start countdown\n\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 } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\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 // 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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 this.pauseContent();\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 this.pollCountdown();\n this.resumeContent();\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n }\n }\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n\n }, {\n key: \"onAdError\",\n value: function onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\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\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this9 = this;\n\n var container = this.player.elements.container;\n var time;\n this.player.on('canplay', function () {\n _this9.addCuePoints();\n });\n this.player.on('ended', function () {\n _this9.loader.contentComplete();\n });\n this.player.on('timeupdate', function () {\n time = _this9.player.currentTime;\n });\n this.player.on('seeked', function () {\n var seekedTime = _this9.player.currentTime;\n\n if (is$1.empty(_this9.cuePoints)) {\n return;\n }\n\n _this9.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this9.manager.discardAdBreak();\n\n _this9.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n window.addEventListener('resize', function () {\n if (_this9.manager) {\n _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n /**\n * Initialize the adsManager and start playing advertisements\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var _this10 = this;\n\n var container = this.player.elements.container;\n\n if (!this.managerPromise) {\n this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n this.managerPromise.then(function () {\n // Set volume to match player\n _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\n _this10.elements.displayContainer.initialize();\n\n try {\n if (!_this10.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // 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\n\n _this10.manager.start();\n }\n\n _this10.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n _this10.onAdError(adError);\n }\n }).catch(function () {});\n }\n /**\n * Resume our video\n */\n\n }, {\n key: \"resumeContent\",\n value: function resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = ''; // Ad is stopped\n\n this.playing = false; // Play video\n\n silencePromise(this.player.media.play());\n }\n /**\n * Pause our video\n */\n\n }, {\n key: \"pauseContent\",\n value: function pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3; // Ad is playing\n\n this.playing = true; // Pause our video.\n\n this.player.media.pause();\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\n }, {\n key: \"cancel\",\n value: function cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n this.trigger('error'); // Re-create our adsManager\n\n this.loadAds();\n }\n /**\n * Re-create our adsManager\n */\n\n }, {\n key: \"loadAds\",\n value: function loadAds() {\n var _this11 = this;\n\n // Tell our adsManager to go bye bye\n this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this11.manager) {\n _this11.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this11.managerPromise = new Promise(function (resolve) {\n _this11.on('loaded', resolve);\n\n _this11.player.debug.log(_this11.manager);\n }); // Now that the manager has been destroyed set it to also be un-initialized\n\n _this11.initialized = false; // Now request some new advertisements\n\n _this11.requestAds();\n }).catch(function () {});\n }\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(event) {\n var _this12 = this;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this12, args);\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\n }, {\n key: \"on\",\n value: function on(event, callback) {\n if (!is$1.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n return this;\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\n }, {\n key: \"startSafetyTimer\",\n value: function startSafetyTimer(time, from) {\n var _this13 = this;\n\n this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n this.safetyTimer = setTimeout(function () {\n _this13.cancel();\n\n _this13.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n\n }, {\n key: \"clearSafetyTimer\",\n value: function clearSafetyTimer(from) {\n if (!is$1.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n }, {\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n }, {\n key: \"tagUrl\",\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var 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: config.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n }\n }]);\n\n return Ads;\n}();\n\nvar parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n};\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\nvar fitRatio = function fitRatio(ratio, outer) {\n var targetRatio = outer.width / outer.height;\n var result = {};\n\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = 1 / ratio * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nvar PreviewThumbnails = /*#__PURE__*/function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n _classCallCheck(this, PreviewThumbnails);\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"load\",\n value: function load() {\n var _this = this;\n\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(function () {\n if (!_this.enabled) {\n return;\n } // Render DOM elements\n\n\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n } // Download VTT files and parse them\n\n }, {\n key: \"getThumbnails\",\n value: function getThumbnails() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var src = _this2.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // Resolve promise\n\n\n var sortAndResolve = function sortAndResolve() {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this2.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n resolve();\n }; // Via callback()\n\n\n if (is$1.function(src)) {\n src(function (thumbnails) {\n _this2.thumbnails = thumbnails;\n sortAndResolve();\n });\n } // VTT urls\n else {\n // If string, convert into single-element list\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this2.getThumbnail(u);\n }); // Resolve\n\n Promise.all(promises).then(sortAndResolve);\n }\n });\n } // Process individual VTT file\n\n }, {\n key: \"getThumbnail\",\n value: function getThumbnail(url) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this3.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n }, {\n key: \"startMove\",\n value: function startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = this.player.elements.progress.getBoundingClientRect();\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX; // Set time text inside image container\n\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n } // Download and show image\n\n\n this.showImageAtCurrentTime();\n }\n }, {\n key: \"endMove\",\n value: function endMove() {\n this.toggleThumbContainer(false, true);\n }\n }, {\n key: \"startScrubbing\",\n value: function startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true; // Wait until media has a duration\n\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true); // Download and show image\n\n this.showImageAtCurrentTime();\n }\n }\n }\n }, {\n key: \"endScrubbing\",\n value: function endScrubbing() {\n var _this4 = this;\n\n this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this4.mouseDown) {\n _this4.toggleScrubbingContainer(false);\n }\n });\n }\n }\n /**\n * Setup hooks for Plyr and window events\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this5 = this;\n\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', function () {\n _this5.toggleThumbContainer(false, true);\n });\n this.player.on('seeked', function () {\n _this5.toggleThumbContainer(false);\n });\n this.player.on('timeupdate', function () {\n _this5.lastTime = _this5.player.media.currentTime;\n });\n }\n /**\n * Create HTML elements for image containers\n */\n\n }, {\n key: \"render\",\n value: function render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n var timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer\n });\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n if (is$1.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n } // Create HTML element: plyr__preview-scrubbing-container\n\n\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n }, {\n key: \"showImageAtCurrentTime\",\n value: function showImageAtCurrentTime() {\n var _this6 = this;\n\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n });\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n } // No matching thumb found\n\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n this.thumbnails.forEach(function (thumbnail, index) {\n if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n } // Show the image that's currently specified in this.showingThumb\n\n }, {\n key: \"loadImage\",\n value: function loadImage() {\n var _this7 = this;\n\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = this.showingThumb;\n var thumbnail = this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n previewImage.onload = function () {\n return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n }, {\n key: \"showImage\",\n value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n } // Remove all preview images that aren't the designated current image\n\n }, {\n key: \"removeOldImages\",\n value: function removeOldImages(currentImage) {\n var _this8 = this;\n\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this8.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n\n }, {\n key: \"preloadNearby\",\n value: function preloadNearby(thumbNum) {\n var _this9 = this;\n\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n if (_this9.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this9.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this9.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n } // If user has been hovering current image for half a second, look for a higher quality one\n\n }, {\n key: \"getHigherQuality\",\n value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n var _this10 = this;\n\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this10.showingThumbFilename === thumbFilename) {\n _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this10.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n }, {\n key: \"toggleThumbContainer\",\n value: function toggleThumbContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"toggleScrubbingContainer\",\n value: function toggleScrubbingContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"determineContainerAutoSizing\",\n value: function determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n }, {\n key: \"setThumbContainerSizeAndPos\",\n value: function setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {\n var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n\n this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {\n var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n }\n\n this.setThumbContainerPos();\n }\n }, {\n key: \"setThumbContainerPos\",\n value: function setThumbContainerPos() {\n var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n var plyrRect = this.player.elements.container.getBoundingClientRect();\n var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n }, {\n key: \"setScrubbingContainerSize\",\n value: function setScrubbingContainerSize() {\n var _fitRatio = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n width = _fitRatio.width,\n height = _fitRatio.height;\n\n this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n } // Sprites need to be offset to the correct location\n\n }, {\n key: \"setImageSizeAndOffset\",\n value: function setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n height = _fitRatio2.height;\n\n return height;\n } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n}();\n\nvar source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Update previewThumbnails config & reload plugin\n\n\n if (!is$1.empty(input.previewThumbnails)) {\n Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n _this2.previewThumbnails.destroy();\n\n _this2.previewThumbnails = null;\n } // Create new instance if it is still enabled\n\n\n if (_this2.config.previewThumbnails.enabled) {\n _this2.previewThumbnails = new PreviewThumbnails(_this2);\n }\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n};\n\n/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nfunction clamp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n return Math.min(Math.max(input, min), max);\n}\n\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n// Plyr instance\n\nvar Plyr = /*#__PURE__*/function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n fullscreen: 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 }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var type = this.media.tagName.toLowerCase(); // Embed properties\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.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); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\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 } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap(this.media, this.elements.container);\n } // Migrate custom properties from media to container (so they work 😉)\n\n\n ui.migrateStyles.call(this); // Add style hook\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup fullscreen\n\n\n this.fullscreen = new Fullscreen(this); // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', function () {\n return silencePromise(_this.play());\n });\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"play\",\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n value: function play() {\n var _this2 = this;\n\n if (!is$1.function(this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(function () {\n return _this2.ads.play();\n }).catch(function () {\n return silencePromise(_this2.media.play());\n });\n } // Return the promise (for HTML5)\n\n\n return this.media.play();\n }\n /**\n * Pause the media\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing || !is$1.function(this.media.pause)) {\n return null;\n }\n\n return this.media.pause();\n }\n /**\n * Get playing state\n */\n\n }, {\n key: \"togglePlay\",\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n value: function togglePlay(input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n return this.play();\n }\n\n return this.pause();\n }\n /**\n * Stop playback\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is$1.function(this.media.stop)) {\n this.media.stop();\n }\n }\n /**\n * Restart playback\n */\n\n }, {\n key: \"restart\",\n value: function restart() {\n this.currentTime = 0;\n }\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"rewind\",\n value: function rewind(seekTime) {\n this.currentTime -= is$1.number(seekTime) ? seekTime : this.config.seekTime;\n }\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"forward\",\n value: function forward(seekTime) {\n this.currentTime += is$1.number(seekTime) ? seekTime : this.config.seekTime;\n }\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n\n }, {\n key: \"increaseVolume\",\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n value: function increaseVolume(step) {\n var volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is$1.number(step) ? step : 0);\n }\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"decreaseVolume\",\n value: function decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n\n }, {\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"airplay\",\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n value: function airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n\n }, {\n key: \"toggleControls\",\n value: function 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 var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && is$1.array(this.config.controls) && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"on\",\n value: function on$1(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"once\",\n value: function once$1(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"off\",\n value: function off$1(event, callback) {\n off(this.elements.container, event, callback);\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\n }, {\n key: \"destroy\",\n value: function destroy(callback) {\n var _this3 = this;\n\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n if (soft) {\n if (Object.keys(_this3.elements).length) {\n // Remove elements\n removeElement(_this3.elements.buttons.play);\n removeElement(_this3.elements.captions);\n removeElement(_this3.elements.controls);\n removeElement(_this3.elements.wrapper); // Clear for GC\n\n _this3.elements.buttons.play = null;\n _this3.elements.captions = null;\n _this3.elements.controls = null;\n _this3.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this3); // Cancel current network requests\n\n html5.cancelRequests.call(_this3); // Replace the container with the original element provided\n\n replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this3.elements.original);\n } // Reset state\n\n\n _this3.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this3.elements = null;\n _this3.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n this.stop(); // Clear timeouts\n\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized); // Provider specific stuff\n\n if (this.isHTML5) {\n // Restore native video controls\n ui.toggleNativeControls.call(this, true); // Clean up\n\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing); // Destroy YouTube API\n\n if (this.embed !== null && is$1.function(this.embed.destroy)) {\n this.embed.destroy();\n } // Clean up\n\n\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 } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n }\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n\n }, {\n key: \"supports\",\n value: function supports(type) {\n return support.mime.call(this, type);\n }\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return this.provider === providers.html5;\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return this.isYouTube || this.isVimeo;\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return this.provider === providers.youtube;\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return this.provider === providers.vimeo;\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return this.type === types.video;\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return this.type === types.audio;\n }\n }, {\n key: \"playing\",\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n }, {\n key: \"currentTime\",\n set: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\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\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n }, {\n key: \"muted\",\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\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 } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var _this4 = this;\n\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Clamp to min/max\n\n\n var min = this.minimumSpeed,\n max = this.maximumSpeed;\n speed = clamp(speed, min, max); // Update config\n\n this.config.speed.selected = speed; // Set media speed\n\n setTimeout(function () {\n _this4.media.playbackRate = speed;\n }, 0);\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Get the minimum allowed speed\n */\n\n }, {\n key: \"minimumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 0.0625;\n }\n /**\n * Get the maximum allowed speed\n */\n\n }, {\n key: \"maximumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 16;\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest$1(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\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\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\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 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 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 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 default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the download URL\n */\n ,\n set: function set(input) {\n if (!is$1.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n controls.setDownloadUrl.call(this);\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(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(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n }\n /**\n * Get the current aspect ratio in use\n */\n\n }, {\n key: \"ratio\",\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n var ratio = reduceAspectRatio(getAspectRatio.call(this));\n return is$1.array(ratio) ? ratio.join(':') : ratio;\n }\n /**\n * Set video aspect ratio\n */\n ,\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is$1.string(input) || !validateRatio(input)) {\n this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n return;\n }\n\n this.config.ratio = input;\n setAspectRatio.call(this);\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\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\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\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\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n }], [{\n key: \"supported\",\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\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\n }, {\n key: \"loadSprite\",\n value: function loadSprite$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n}();\n\nPlyr.defaults = cloneDeep(defaults$1);\n\nexport default Plyr;\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","// ==========================================================================\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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 isEdge: window.navigator.userAgent.includes('Edge'),\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// 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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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// 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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.3/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n\n 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\n // Toggle button and fire events\n this.onChange();\n }\n\n // Trap focus inside container\n trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', 'autoplay,fullscreen,picture-in-picture');\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready() {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n","// ==========================================================================\n// Plyr\n// plyr.js v3.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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 {Boolean} 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":["plyr.mjs","node_modules/rangetouch/dist/rangetouch.mjs","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","src/js/utils/strings.js","src/js/utils/i18n.js","src/js/storage.js","src/js/utils/fetch.js","src/js/utils/load-sprite.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","src/js/utils/load-image.js","src/js/ui.js","src/js/listeners.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/utils/numbers.js","src/js/plyr.js"],"names":["_typeof","obj","Symbol","iterator","constructor","prototype","_classCallCheck","instance","Constructor","TypeError","_defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","_createClass","protoProps","staticProps","_defineProperty","value","ownKeys","object","enumerableOnly","keys","getOwnPropertySymbols","symbols","filter","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","arguments","source","forEach","getOwnPropertyDescriptors","defineProperties","_objectWithoutPropertiesLoose","excluded","sourceKeys","indexOf","_objectWithoutProperties","sourceSymbolKeys","propertyIsEnumerable","call","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","Array","isArray","_arrayLikeToArray","iter","from","_arr","_n","_d","_e","undefined","_s","_i","next","done","err","o","minLen","n","toString","slice","name","test","len","arr2","e","t","r","defaults","addCSS","thumbWidth","watch","matches","document","querySelectorAll","includes","this","trigger","Event","bubbles","dispatchEvent","getConstructor","instanceOf","isNullOrUndefined","isObject","isNumber","Number","isNaN","isString","String","isBoolean","Boolean","isFunction","Function","isNodeList","NodeList","isElement","Element","isEvent","isEmpty","is","nullOrUndefined","number","string","boolean","function","array","nodeList","element","event","empty","getDecimalPlaces","concat","match","Math","max","round","parseFloat","toFixed","RangeTouch","querySelector","rangeTouch","config","init","enabled","style","userSelect","webKitUserSelect","touchAction","listeners","set","changedTouches","getAttribute","s","u","c","getBoundingClientRect","a","width","clientX","left","disabled","preventDefault","get","type","MutationObserver","addedNodes","observe","body","childList","subtree","map","documentElement","input","isWeakMap","WeakMap","isTextNode","Text","isKeyboardEvent","KeyboardEvent","isCue","window","TextTrackCue","VTTCue","isTrack","TextTrack","kind","isPromise","Promise","then","nodeType","ownerDocument","isUrl","URL","startsWith","hostname","is$1","weakMap","textNode","keyboardEvent","cue","track","promise","url","transitionEndEvent","createElement","events","WebkitTransition","MozTransition","OTransition","transition","find","repaint","delay","setTimeout","hidden","offsetHeight","browser","isIE","documentMode","isEdge","navigator","userAgent","isWebkit","isIPhone","platform","isIos","cloneDeep","JSON","parse","stringify","getDeep","path","split","reduce","extend","_len","sources","_key","shift","assign","wrap","elements","wrapper","targets","reverse","index","child","cloneNode","parent","parentNode","sibling","nextSibling","appendChild","insertBefore","setAttributes","attributes","entries","_ref","_ref3","_ref4","setAttribute","text","innerText","insertAfter","insertElement","removeElement","removeChild","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","trim","className","replace","parts","charAt","class","id","toggleHidden","hide","toggleClass","force","method","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","closest","el","parentElement","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","check","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","options","addEventListener","removeEventListener","toggleListener","callback","_this","toggle","passive","capture","eventListeners","on","off","once","_this2","onceCallback","args","triggerEvent","detail","CustomEvent","plyr","unbindListeners","item","ready","_this3","resolve","silencePromise","validateRatio","every","reduceAspectRatio","ratio","_ratio","height","divider","getDivider","w","h","getAspectRatio","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","parseInt","getComputedStyle","offset","fullscreen","active","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","forced","setup","player","speed","onChange","_player$media","currentTime","paused","preload","readyState","playbackRate","src","play","load","cancelRequests","blankVideo","debug","log","dedupe","prev","curr","abs","generateId","prefix","floor","random","format","getPercentage","current","replaceAll","RegExp","toTitleCase","toUpperCase","substr","toLowerCase","toPascalCase","toCamelCase","stripHTML","fragment","createDocumentFragment","innerHTML","firstChild","getHTML","resources","youtube","i18n","{seektime}","seekTime","{title}","title","k","v","Storage","store","localStorage","getItem","json","storage","setItem","removeItem","fetch","responseType","reject","request","XMLHttpRequest","responseText","response","Error","status","open","send","loadSprite","hasId","exists","getElementById","update","data","insertAdjacentElement","useStorage","cached","content","result","catch","getHours","trunc","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","progress","inputs","seek","volume","display","buffer","duration","seekTooltip","tooltip","error","warn","toggleNativeControls","createIcon","namespace","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","attr","join","createBadge","badge","menu","createButton","buttonType","label","labelPressed","iconPressed","some","control","button","createRange","min","step","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","node","bind","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","val","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","pow","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sort","b","sorting","setCaptionsMenu","_this7","tracks","getTracks","toggled","language","unshift","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","values","popup","p","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","position","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","size","restore","propertyName","setDownloadUrl","download","create","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","href","urls","isEmbed","inject","_this11","seektime","addProperty","controlPressed","_this$config","labels","parseUrl","safe","parser","buildUrlParams","params","URLSearchParams","isYouTube","protocol","blob","createObjectURL","languages","userLanguage","trackEvents","_this$captions","meta","currentTrackNode","languageExists","mode","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","has","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","global","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","start","end","all","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","iframe","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","stopped","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","inactive","providers","types","getProviderByUrl","noop","Console","console","Fullscreen","scrollPosition","x","scrollX","y","scrollY","scrollTo","overflow","viewport","head","property","hasProperty","cleanupViewport","part","keyCode","activeElement","first","last","shiftKey","forceFallback","native","requestFullscreen","webkitEnterFullscreen","toggleFallback","navigationUI","webkitExitFullscreen","action","cancelFullScreen","exit","enter","proxy","trapFocus","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","loadImage","minWidth","image","Image","handler","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","now","migrateStyles","getPropertyValue","removeProperty","Listeners","focusTimer","lastKeyDown","timeStamp","wasKeyDown","handleKey","firstTouch","setTabFocus","setPlayerSize","measure","rect","resized","_player$fullscreen","usingNative","isEnter","_setPlayerSize","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","togglePlay","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","code","currentTarget","attribute","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","sign","increaseVolume","lastKey","repeat","altKey","ctrlKey","metaKey","decreaseVolume","commonjsGlobal","globalThis","self","createCommonjsModule","fn","module","exports","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","q","splice","executeCallbacks","success","loadFile","numTries","isLegacyIECss","doc","async","maxTries","numRetries","beforeCallbackFn","before","pathname","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","defaultPrevented","loadFiles","paths","loadjs","arg1","arg2","loadFn","returnPromise","deps","isDefined","factory","loadScript","parseId","$2","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","data-poster","thumbnail_url","Player","disableTextTrack","stop","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","state","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","getPaused","seconds","getHost","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","setInterval","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","destroy","manager","displayContainer","remove","Ads","google","ima","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","handlers","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","lastIndexOf","tempImage","naturalHeight","percentage","mousePosX","thumb","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","ceil","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","findIndex","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","right","previewPos","_fitRatio","multiplier","top","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","clamp","Plyr","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","search","truthy","searchParams","tabindex","inputIsValid","fauxDuration","realDuration","Infinity","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.min.mjs","sourcesContent":["function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _classCallCheck$1(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n}\n\nfunction _defineProperties$1(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n}\n\nfunction _createClass$1(e, t, n) {\n return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n}\n\nfunction _defineProperty$1(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n}\n\nfunction ownKeys$1(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n\n return n;\n}\n\nfunction _objectSpread2$1(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys$1(Object(n), !0).forEach(function (t) {\n _defineProperty$1(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$1(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n}\n\nvar defaults = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n};\n\nfunction matches(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n}\n\nfunction trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n}\n\nvar getConstructor = function getConstructor(e) {\n return null != e ? e.constructor : null;\n},\n instanceOf = function instanceOf(e, t) {\n return !!(e && t && e instanceof t);\n},\n isNullOrUndefined = function isNullOrUndefined(e) {\n return null == e;\n},\n isObject = function isObject(e) {\n return getConstructor(e) === Object;\n},\n isNumber = function isNumber(e) {\n return getConstructor(e) === Number && !Number.isNaN(e);\n},\n isString = function isString(e) {\n return getConstructor(e) === String;\n},\n isBoolean = function isBoolean(e) {\n return getConstructor(e) === Boolean;\n},\n isFunction = function isFunction(e) {\n return getConstructor(e) === Function;\n},\n isArray = function isArray(e) {\n return Array.isArray(e);\n},\n isNodeList = function isNodeList(e) {\n return instanceOf(e, NodeList);\n},\n isElement = function isElement(e) {\n return instanceOf(e, Element);\n},\n isEvent = function isEvent(e) {\n return instanceOf(e, Event);\n},\n isEmpty = function isEmpty(e) {\n return isNullOrUndefined(e) || (isString(e) || isArray(e) || isNodeList(e)) && !e.length || isObject(e) && !Object.keys(e).length;\n},\n is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n};\n\nfunction getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n}\n\nfunction round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n\n return Math.round(e / t) * t;\n}\n\nvar RangeTouch = function () {\n function e(t, n) {\n _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());\n }\n\n return _createClass$1(e, [{\n key: \"init\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function value(e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function value(t) {\n if (!e.enabled || !is.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function value(t) {\n e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function value(t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type=\"range\"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\n var i = _objectSpread2$1({}, defaults, {}, n);\n\n if (is.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is.element(n) && matches(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n}();\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\nvar getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n};\n\nvar instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n};\n\nvar isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n};\n\nvar isObject$1 = function isObject(input) {\n return getConstructor$1(input) === Object;\n};\n\nvar isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n};\n\nvar isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n};\n\nvar isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n};\n\nvar isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n};\n\nvar isArray$1 = function isArray(input) {\n return Array.isArray(input);\n};\n\nvar isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n};\n\nvar isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n};\n\nvar isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n};\n\nvar isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n};\n\nvar isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n};\n\nvar isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n};\n\nvar isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n};\n\nvar isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise) && isFunction$1(input.then);\n};\n\nvar isElement$1 = function isElement(input) {\n return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';\n};\n\nvar isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;\n};\n\nvar isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nvar is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$1,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$1,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n};\n\n// ==========================================================================\nvar transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n}(); // Force repaint of element\n\nfunction repaint(element, delay) {\n setTimeout(function () {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n element.hidden = false;\n } catch (e) {// Do nothing\n }\n }, delay);\n}\n\n// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\nvar browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\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\nfunction cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n} // Get a nested value in an object\n\nfunction getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n} // Deep extend destination object with N more objects\n\nfunction extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n}\n\nfunction wrap(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // 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\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n} // Set attributes\n\nfunction setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n} // Create a DocumentFragment\n\nfunction createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n} // Inaert an element after another\n\nfunction insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n} // Insert a DocumentFragment\n\nfunction insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n} // Remove element(s)\n\nfunction removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n} // Remove all child elements\n\nfunction emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n} // Replace element\n\nfunction replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n} // Get an attribute object from a string selector\n\nfunction 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 if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = extend({}, existingAttributes);\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n\n var _parts = _slicedToArray(parts, 1),\n key = _parts[0];\n\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.string(existing.class)) {\n attributes.class = \"\".concat(existing.class, \" \").concat(className);\n } else {\n attributes.class = className;\n }\n\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 break;\n }\n });\n return extend(existing, attributes);\n} // Toggle hidden\n\nfunction toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n } // eslint-disable-next-line no-param-reassign\n\n\n element.hidden = hide;\n} // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\nfunction toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\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} // Has class name\n\nfunction hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n} // Element matches selector\n\nfunction matches$1(element, selector) {\n var _Element = Element,\n prototype = _Element.prototype;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n} // Closest ancestor element matching selector (also tests element itself)\n\nfunction closest(element, selector) {\n var _Element2 = Element,\n prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n function closestElement() {\n var el = this;\n\n do {\n if (matches$1.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n }\n\n var method = prototype.closest || closestElement;\n return method.call(element, selector);\n} // Find all elements\n\nfunction getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n} // Find a single element\n\nfunction getElement(selector) {\n return this.elements.container.querySelector(selector);\n} // Set focus and tab focus class\n\nfunction setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n\nvar 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}; // Check for feature support\n\nvar support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\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: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\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 // Detect transitions support\n transitions: transitionEndEvent !== false,\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\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\n\nvar supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n}(); // Toggle event listener\n\n\nfunction toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n} // Bind event handler\n\nfunction on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n} // Unbind event handler\n\nfunction off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n} // Bind once-only event handler\n\nfunction once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n} // Trigger event\n\nfunction triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n} // Unbind all cached event listeners\n\nfunction unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n} // Run method when / if player is ready\n\nfunction ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n}\n\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n\nfunction silencePromise(value) {\n if (is$1.promise(value)) {\n value.then(null, function () {});\n }\n}\n\nfunction validateRatio(input) {\n if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {\n return false;\n }\n\n var ratio = is$1.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is$1.number);\n}\nfunction reduceAspectRatio(ratio) {\n if (!is$1.array(ratio) || !ratio.every(is$1.number)) {\n return null;\n }\n\n var _ratio = _slicedToArray(ratio, 2),\n width = _ratio[0],\n height = _ratio[1];\n\n var getDivider = function getDivider(w, h) {\n return h === 0 ? w : getDivider(h, w % h);\n };\n\n var divider = getDivider(width, height);\n return [width / divider, height / divider];\n}\nfunction getAspectRatio(input) {\n var parse = function parse(ratio) {\n return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n }; // Try provided ratio\n\n\n var ratio = parse(input); // Get from config\n\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n } // Get from embed\n\n\n if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {\n ratio = this.embed.ratio;\n } // Get from HTML5 video\n\n\n if (ratio === null && this.isHTML5) {\n var _this$media = this.media,\n videoWidth = _this$media.videoWidth,\n videoHeight = _this$media.videoHeight;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n} // Set aspect ratio for responsive container\n\nfunction setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n var wrapper = this.elements.wrapper;\n var ratio = getAspectRatio.call(this, input);\n\n var _ref = is$1.array(ratio) ? ratio : [0, 0],\n _ref2 = _slicedToArray(_ref, 2),\n w = _ref2[0],\n h = _ref2[1];\n\n var padding = 100 / w * h;\n wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n var offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n}\n\n// ==========================================================================\nvar html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n } // Get sizes from <source> elements\n\n\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('size'));\n }).filter(Boolean);\n },\n setup: function setup() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n if (!is$1.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n } // Quality\n\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (s) {\n return s.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('size'));\n },\n set: function set(input) {\n if (player.quality === input) {\n return;\n } // If we're using an an external handler...\n\n\n if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (s) {\n return Number(s.getAttribute('size')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState,\n playbackRate = _player$media.playbackRate; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.speed = playbackRate;\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n silencePromise(player.play());\n }\n }); // Load new source\n\n player.media.load();\n }\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // 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\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n};\n\n// ==========================================================================\n\nfunction dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n} // Get the closest value in an array\n\nfunction closest$1(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n}\n\n// ==========================================================================\n\nfunction generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n} // Format string\n\nfunction format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n} // Get percentage\n\nfunction 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} // Replace all occurances of a string in a string\n\nvar replaceAll = function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}; // Convert to title case\n\nvar toTitleCase = function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n}; // Convert string to pascalCase\n\nfunction toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n} // Convert string to pascalCase\n\nfunction toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n} // Remove HTML from a string\n\nfunction stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n} // Like outerHTML, but also works for DocumentFragment\n\nfunction getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n\nvar resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n};\nvar i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n k = _ref2[0],\n v = _ref2[1];\n\n string = replaceAll(string, k, v);\n });\n return string;\n }\n};\n\nvar Storage = /*#__PURE__*/function () {\n function Storage(player) {\n var _this = this;\n\n _classCallCheck(this, Storage);\n\n _defineProperty(this, \"get\", function (key) {\n if (!Storage.supported || !_this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(_this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n });\n\n _defineProperty(this, \"set\", function (object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !_this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = _this.get(); // Default to empty object\n\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(_this.key, JSON.stringify(storage));\n });\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, null, [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // 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\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n}();\n\n// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\nfunction fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\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 request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// ==========================================================================\n\nfunction loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n}\n\n// ==========================================================================\n\nvar getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n};\nvar getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n};\nvar getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n}; // Format time to UI friendly string\n\nfunction formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n}\n\nvar controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\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 }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\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 }; // Display\n\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 }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\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); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // 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\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n\n var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var _this = this;\n\n var attributes = extend({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some(function (c) {\n return c === _this.config.classNames.control;\n })) {\n extend(attributes, {\n class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.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 // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\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 }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type, attrs) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\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: function bindMenuItemShortcuts(menuItem, type) {\n var _this2 = this;\n\n // Navigate through menus via arrow keys and space\n on.call(this, menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this2, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this2, target, true);\n }\n }\n }, false); // 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\n on.call(this, menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this2, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this3 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(check) {\n // Ensure exclusivity\n if (check) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this3.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this3.quality = value;\n break;\n\n case 'speed':\n _this3.speed = parseFloat(value);\n break;\n }\n\n controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this4 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var val = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = val; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = val;\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); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this5 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(show) {\n return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n\n if (is$1.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 } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function 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 } // 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\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(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 // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this6.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this6, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this6.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this6, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this6, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\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 if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this7.captions.toggled && _this7.currentTrack === value,\n title: captions.getLabel.call(_this7, track),\n badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu() {\n var _this8 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n this.options.speed = this.options.speed.filter(function (o) {\n return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this8, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this8, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (p) {\n return !p.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;\n var isMenuItem = popup.contains(target); // 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\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.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$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this9 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function 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 } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this9, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl: function setDownloadUrl() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set attribute\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create: function create(data) {\n var _this10 = this;\n\n var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n createButton = controls.createButton,\n createProgress = controls.createProgress,\n createRange = controls.createRange,\n createTime = controls.createTime,\n setQualityMenu = controls.setQualityMenu,\n setSpeedMenu = controls.setSpeedMenu,\n showMenuPanel = controls.showMenuPanel;\n this.elements.controls = null; // Larger overlaid play button\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n } // Create the container\n\n\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container; // Default item attributes\n\n var defaultAttributes = {\n class: 'plyr__controls__item'\n }; // Loop through controls in order\n\n dedupe(is$1.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n } // Rewind button\n\n\n if (control === 'rewind') {\n container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n } // Play/Pause button\n\n\n if (control === 'play') {\n container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n } // Fast forward button\n\n\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n } // Progress\n\n\n if (control === 'progress') {\n var progressContainer = createElement('div', {\n class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n });\n var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(createRange.call(_this10, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (_this10.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: _this10.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n _this10.elements.display.seekTooltip = tooltip;\n }\n\n _this10.elements.progress = progress;\n progressContainer.appendChild(_this10.elements.progress);\n container.appendChild(progressContainer);\n } // Media current time display\n\n\n if (control === 'current-time') {\n container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n } // Media duration display\n\n\n if (control === 'duration') {\n container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n } // Volume controls\n\n\n if (control === 'mute' || control === 'volume') {\n var volume = _this10.elements.volume; // Create the volume container if needed\n\n if (!is$1.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n }));\n _this10.elements.volume = volume;\n container.appendChild(volume);\n } // Toggle mute button\n\n\n if (control === 'mute') {\n volume.appendChild(createButton.call(_this10, 'mute'));\n } // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: _this10.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n }\n } // Toggle captions button\n\n\n if (control === 'captions') {\n container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n } // Settings button / menu\n\n\n if (control === 'settings' && !is$1.empty(_this10.config.settings)) {\n var wrapper = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(_this10, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n _this10.elements.settings.panels.home = home; // Build the menu items\n\n _this10.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n on.call(_this10, menuItem, 'click', function () {\n showMenuPanel.call(_this10, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this10.config));\n var value = createElement('span', {\n class: _this10.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this10.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this10.config.classNames.hidden\n }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n on.call(_this10, pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n showMenuPanel.call(_this10, 'home', true);\n }, false); // Go back via button click\n\n on.call(_this10, backButton, 'click', function () {\n showMenuPanel.call(_this10, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this10.elements.settings.buttons[type] = menuItem;\n _this10.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n _this10.elements.settings.popup = popup;\n _this10.elements.settings.menu = wrapper;\n } // Picture in picture button\n\n\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n } // Airplay button\n\n\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n } // Download button\n\n\n if (control === 'download') {\n var _attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: _this10.download,\n target: '_blank'\n }); // Set download attribute for HTML5 only\n\n\n if (_this10.isHTML5) {\n _attributes.download = '';\n }\n\n var download = _this10.config.urls.download;\n\n if (!is$1.url(download) && _this10.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(_this10.provider),\n label: _this10.provider\n });\n }\n\n container.appendChild(createButton.call(_this10, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n }\n }); // Set available quality levels\n\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this11 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.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) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this11.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this11.config.classNames.hidden, false);\n toggleClass(label, _this11.config.classNames.tooltip, true);\n });\n }\n }\n};\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 */\n\nfunction parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var 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} // Convert object to URLSearchParams\n\nfunction buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n}\n\nvar captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\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\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n } // Add event listener for cue changes\n\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n 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\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n } // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n\n\n setTimeout(function () {\n if (active && _this2.captions.toggled) {\n _this2.captions.currentTrackNode.mode = 'hidden';\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: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.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 var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\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 // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\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: function getTracks() {\n var _this3 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // 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\n return tracks.filter(function (track) {\n return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this4 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this4.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (t) {\n return t.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.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 // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var 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 var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n};\n\n// ==========================================================================\n// Plyr default config\n// ==========================================================================\nvar defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\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 // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\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 // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 // URLs\n urls: {\n download: null,\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/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\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 download: '[data-plyr=\"download\"]',\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',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\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 tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n }\n};\n\n// ==========================================================================\n// Plyr states\n// ==========================================================================\nvar pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n};\n\n// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\nvar providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n};\nvar types = {\n audio: 'audio',\n video: 'video'\n};\n/**\n * Get provider by URL\n * @param {String} url\n */\n\nfunction getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\n// ==========================================================================\n// Console wrapper\n// ==========================================================================\nvar noop = function noop() {};\n\nvar Console = /*#__PURE__*/function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n}();\n\nvar Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(player) {\n var _this = this;\n\n _classCallCheck(this, Fullscreen);\n\n _defineProperty(this, \"onChange\", function () {\n if (!_this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = _this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = _this.active;\n } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event\n\n triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n });\n\n _defineProperty(this, \"toggleFallback\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\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 } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n _this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (_this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n }\n } // Toggle button and fire events\n\n\n _this.onChange();\n });\n\n _defineProperty(this, \"trapFocus\", function (event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n var _focusable = _slicedToArray(focusable, 1),\n first = _focusable[0];\n\n var last = focusable[focusable.length - 1];\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 _defineProperty(this, \"update\", function () {\n if (_this.enabled) {\n var mode;\n\n if (_this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n _this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n _this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);\n });\n\n _defineProperty(this, \"enter\", function () {\n if (!_this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n if (_this.player.isVimeo) {\n _this.player.embed.requestFullscreen();\n } else {\n _this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || _this.forceFallback) {\n _this.toggleFallback(true);\n } else if (!_this.prefix) {\n _this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is$1.empty(_this.prefix)) {\n _this.target[\"\".concat(_this.prefix, \"Request\").concat(_this.property)]();\n }\n });\n\n _defineProperty(this, \"exit\", function () {\n if (!_this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n _this.target.webkitExitFullscreen();\n\n silencePromise(_this.player.play());\n } else if (!Fullscreen.native || _this.forceFallback) {\n _this.toggleFallback(false);\n } else if (!_this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(_this.prefix)) {\n var action = _this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(_this.prefix).concat(action).concat(_this.property)]();\n }\n });\n\n _defineProperty(this, \"toggle\", function () {\n if (!_this.active) {\n _this.enter();\n } else {\n _this.exit();\n }\n });\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n\n this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n _this.onChange();\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n }); // Tap focus when in fullscreen\n\n on.call(this, this.player.elements.container, 'keydown', function (event) {\n return _this.trapFocus(event);\n }); // Update the UI\n\n this.update(); // this.toggle = this.toggle.bind(this);\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n}();\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// ==========================================================================\nfunction loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n}\n\nvar ui = {\n addStyleHook: function 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 // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset speed\n\n this.speed = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\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\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('data-poster', poster); // Show the poster\n\n this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(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(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\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); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n Object.assign(target, {\n pressed: _this3.playing\n });\n target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controlsElement = this.elements.controls;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles: function migrateStyles() {\n var _this5 = this;\n\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n .filter(function (key) {\n return !is$1.empty(key) && is$1.string(key) && key.startsWith('--plyr');\n }).forEach(function (key) {\n // Set on the container\n _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n _this5.media.style.removeProperty(key);\n }); // Remove attribute if empty\n\n if (is$1.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n};\n\nvar Listeners = /*#__PURE__*/function () {\n function Listeners(_player) {\n var _this = this;\n\n _classCallCheck(this, Listeners);\n\n _defineProperty(this, \"firstTouch\", function () {\n var player = _this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n });\n\n _defineProperty(this, \"setTabFocus\", function (event) {\n var player = _this.player;\n var elements = player.elements;\n clearTimeout(_this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n _this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n if (event.type !== 'focusout') {\n _this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n });\n\n _defineProperty(this, \"global\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = _this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', _this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);\n });\n\n _defineProperty(this, \"container\", function () {\n var player = _this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controlsElement = elements.controls; // Remove button states for fullscreen\n\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio = _slicedToArray(ratio, 2),\n y = _ratio[1];\n\n var _getAspectRatio$call = getAspectRatio.call(player),\n _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n videoX = _getAspectRatio$call2[0],\n videoY = _getAspectRatio$call2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n if (target !== elements.container) {\n return;\n } // If it's not an embed and no ratio specified\n\n\n if (!player.isEmbed && is$1.empty(player.config.ratio)) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n if (isEnter) {\n setTimeout(function () {\n return repaint(elements.container);\n }, 100);\n } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n });\n\n _defineProperty(this, \"media\", function () {\n var player = _this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n player.pause();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, function () {\n silencePromise(player.play());\n }, 'play');\n } else {\n _this.proxy(event, function () {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadUrl.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\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 _defineProperty(this, \"proxy\", function (event, defaultHandler, customHandlerKey) {\n var player = _this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned !== false && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n });\n\n _defineProperty(this, \"bind\", function (element, type, defaultHandler, customHandlerKey) {\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = _this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n });\n\n _defineProperty(this, \"controls\", function () {\n var player = _this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this.bind(button, 'click', function () {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n } // Pause\n\n\n _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n\n _this.bind(elements.buttons.rewind, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind'); // Rewind\n\n\n _this.bind(elements.buttons.fastForward, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward'); // Mute toggle\n\n\n _this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n\n _this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n\n _this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n\n _this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n\n _this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n\n _this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n\n _this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\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\n\n _this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n\n _this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n\n _this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n\n _this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\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\n\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n _this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n\n _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n\n _this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n\n _this.bind(elements.progress, 'mouseleave touchend click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n\n _this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n _this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n _this.bind(elements.display.currentTime, 'click', function () {\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 controls.timeUpdate.call(player);\n });\n } // Volume\n\n\n _this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n\n _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(function (c) {\n return !c.contains(elements.container);\n }).forEach(function (child) {\n _this.bind(child, 'mouseenter mouseleave', function (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\n\n _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n\n _this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n\n _this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n });\n\n this.player = _player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\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 } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\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 var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n 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)\n\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\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\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\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\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }]);\n\n return Listeners;\n}();\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\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 */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function 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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; // tag IE9+\n\n isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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]; // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // resolve Promise\n\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n } // publish bundle load event\n\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\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 */\n\n\n loadjs.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 return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n});\n\n// ==========================================================================\nfunction loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n}\n\nfunction parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nvar vimeo = {\n setup: function setup() {\n var player = this; // Add embed class for responsive\n\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set intial ratio\n\n setAspectRatio.call(player); // Load the SDK if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(player);\n }).catch(function (error) {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready: function ready() {\n var _this = this;\n\n var player = this;\n var config = player.config.vimeo;\n\n var premium = config.premium,\n referrerPolicy = config.referrerPolicy,\n frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n } // Get Vimeo params for the iframe\n\n\n var params = buildUrlParams(_objectSpread2({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, frameParams)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required\n\n if (!is$1.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n } // Inject the package\n\n\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n var wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n } // Get poster image\n\n\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n if (is$1.empty(response) || !response.thumbnail_url) {\n return;\n } // Set and show poster\n\n\n ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n });\n } // Setup instance\n // https://github.com/vimeo/player.js\n\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function () {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(function (error) {\n _this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = [width, height];\n setAspectRatio.call(_this);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', function () {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', function () {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n }\n};\n\n// ==========================================================================\n\nfunction parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n } // Use YouTube's default\n\n\n return undefined;\n}\n\nvar youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n // Call global callback if set\n if (is$1.function(callback)) {\n callback();\n }\n\n youtube.ready.call(_this);\n }; // Load the SDK\n\n\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n var url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(function (data) {\n if (is$1.object(data)) {\n var title = data.title,\n height = data.height,\n width = data.width; // Set title\n\n _this2.config.title = title;\n ui.setTitle.call(_this2); // Set aspect ratio\n\n _this2.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(_this2);\n }).catch(function () {\n // Set aspect ratio\n setAspectRatio.call(_this2);\n });\n },\n // API ready\n ready: function ready() {\n var player = this;\n var config = player.config.youtube; // Ignore already setup (race condition)\n\n var currentId = player.media && player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Replace media element\n\n var container = createElement('div', {\n id: id,\n 'data-poster': config.customControls ? player.poster : undefined\n });\n player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n if (config.customControls) {\n var posterSrc = function posterSrc(s) {\n return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (src) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n } // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n\n player.embed = new window.YT.Player(player.media, {\n videoId: videoId,\n host: getHost(config),\n playerVars: extend({}, {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\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 player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function 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 } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n player.options.speed = speeds.filter(function (s) {\n return player.config.speed.options.includes(s);\n }); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui && config.customControls) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n }\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var 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 } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\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 (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // 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\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\n assurePlaybackState$1.call(player, false);\n break;\n\n case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n};\n\n// ==========================================================================\nvar media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap(this.media, this.elements.wrapper); // Poster image container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: ''\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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\nvar destroy = function destroy(instance) {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n } // Destroy our adsManager\n\n\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nvar Ads = /*#__PURE__*/function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n _defineProperty(this, \"load\", function () {\n if (!_this.enabled) {\n return;\n } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {\n _this.ready();\n }).catch(function () {\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 _defineProperty(this, \"ready\", function () {\n // Double check we're enabled\n if (!_this.enabled) {\n destroy(_this);\n } // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n\n\n _this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n\n _this.managerPromise.then(function () {\n _this.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n\n _this.listeners(); // Setup the IMA SDK\n\n\n _this.setupIMA();\n });\n\n _defineProperty(this, \"setupIMA\", function () {\n // Create the container for our advertisements\n _this.elements.container = createElement('div', {\n class: _this.player.config.classNames.ads\n });\n\n _this.player.elements.container.appendChild(_this.elements.container); // So we can run VPAID2\n\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader\n\n _this.loader = new google.ima.AdsLoader(_this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this.onAdsManagerLoaded(event);\n }, false);\n\n _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this.onAdError(error);\n }, false); // Request video ads to be pre-loaded\n\n\n _this.requestAds();\n });\n\n _defineProperty(this, \"requestAds\", function () {\n var container = _this.player.elements.container;\n\n try {\n // Request video ads\n var request = new google.ima.AdsRequest();\n request.adTagUrl = _this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!_this.player.muted);\n\n _this.loader.requestAds(request);\n } catch (e) {\n _this.onAdError(e);\n }\n });\n\n _defineProperty(this, \"pollCountdown\", function () {\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(_this.countdownTimer);\n\n _this.elements.container.removeAttribute('data-badge-text');\n\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this.player.config), \" - \").concat(time);\n\n _this.elements.container.setAttribute('data-badge-text', label);\n };\n\n _this.countdownTimer = setInterval(update, 100);\n });\n\n _defineProperty(this, \"onAdsManagerLoaded\", function (event) {\n // Load could occur after a source change (race condition)\n if (!_this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // 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\n _this.manager = event.getAdsManager(_this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events\n // Advertisement error events\n\n _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this.onAdError(error);\n }); // Advertisement regular events\n\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n return _this.onAdEvent(e);\n });\n }); // Resolve our adsManager\n\n _this.trigger('loaded');\n });\n\n _defineProperty(this, \"addCuePoints\", function () {\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(_this.cuePoints)) {\n _this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {\n var seekElement = _this.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\n }\n });\n\n _defineProperty(this, \"onAdEvent\", function (event) {\n var container = _this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n triggerEvent.call(_this.player, _this.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n }; // Bubble the event\n\n\n dispatchEvent(event.type);\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'); // Start countdown\n\n\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 } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n _this.manager.setVolume(_this.player.volume);\n\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 // 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 // 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 if (_this.player.ended) {\n _this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n _this.loader.contentComplete();\n }\n\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 _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 _this.pollCountdown();\n\n _this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n _this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n }\n });\n\n _defineProperty(this, \"onAdError\", function (event) {\n _this.cancel();\n\n _this.player.debug.warn('Ads error', event);\n });\n\n _defineProperty(this, \"listeners\", function () {\n var container = _this.player.elements.container;\n var time;\n\n _this.player.on('canplay', function () {\n _this.addCuePoints();\n });\n\n _this.player.on('ended', function () {\n _this.loader.contentComplete();\n });\n\n _this.player.on('timeupdate', function () {\n time = _this.player.currentTime;\n });\n\n _this.player.on('seeked', function () {\n var seekedTime = _this.player.currentTime;\n\n if (is$1.empty(_this.cuePoints)) {\n return;\n }\n\n _this.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this.manager.discardAdBreak();\n\n _this.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n\n window.addEventListener('resize', function () {\n if (_this.manager) {\n _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n });\n\n _defineProperty(this, \"play\", function () {\n var container = _this.player.elements.container;\n\n if (!_this.managerPromise) {\n _this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n _this.managerPromise.then(function () {\n // Set volume to match player\n _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\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); // 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\n\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 }).catch(function () {});\n });\n\n _defineProperty(this, \"resumeContent\", function () {\n // Hide the advertisement container\n _this.elements.container.style.zIndex = ''; // Ad is stopped\n\n _this.playing = false; // Play video\n\n silencePromise(_this.player.media.play());\n });\n\n _defineProperty(this, \"pauseContent\", function () {\n // Show the advertisement container\n _this.elements.container.style.zIndex = 3; // Ad is playing\n\n _this.playing = true; // Pause our video.\n\n _this.player.media.pause();\n });\n\n _defineProperty(this, \"cancel\", function () {\n // Pause our video\n if (_this.initialized) {\n _this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n _this.trigger('error'); // Re-create our adsManager\n\n\n _this.loadAds();\n });\n\n _defineProperty(this, \"loadAds\", function () {\n // Tell our adsManager to go bye bye\n _this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this.manager) {\n _this.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this.managerPromise = new Promise(function (resolve) {\n _this.on('loaded', resolve);\n\n _this.player.debug.log(_this.manager);\n }); // Now that the manager has been destroyed set it to also be un-initialized\n\n _this.initialized = false; // Now request some new advertisements\n\n _this.requestAds();\n }).catch(function () {});\n });\n\n _defineProperty(this, \"trigger\", function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = _this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this, args);\n }\n });\n }\n });\n\n _defineProperty(this, \"on\", function (event, callback) {\n if (!is$1.array(_this.events[event])) {\n _this.events[event] = [];\n }\n\n _this.events[event].push(callback);\n\n return _this;\n });\n\n _defineProperty(this, \"startSafetyTimer\", function (time, from) {\n _this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n\n _this.safetyTimer = setTimeout(function () {\n _this.cancel();\n\n _this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n });\n\n _defineProperty(this, \"clearSafetyTimer\", function (from) {\n if (!is$1.nullOrUndefined(_this.safetyTimer)) {\n _this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n\n clearTimeout(_this.safetyTimer);\n _this.safetyTimer = null;\n }\n });\n\n this.player = player;\n this.config = player.config.ads;\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; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n /**\n * Load the IMA SDK\n */\n\n }, {\n key: \"tagUrl\",\n // Build the tag URL\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var 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: config.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\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\n }]);\n\n return Ads;\n}();\n\nvar parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n};\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\nvar fitRatio = function fitRatio(ratio, outer) {\n var targetRatio = outer.width / outer.height;\n var result = {};\n\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = 1 / ratio * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nvar PreviewThumbnails = /*#__PURE__*/function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n var _this = this;\n\n _classCallCheck(this, PreviewThumbnails);\n\n _defineProperty(this, \"load\", function () {\n // Toggle the regular seek tooltip\n if (_this.player.elements.display.seekTooltip) {\n _this.player.elements.display.seekTooltip.hidden = _this.enabled;\n }\n\n if (!_this.enabled) {\n return;\n }\n\n _this.getThumbnails().then(function () {\n if (!_this.enabled) {\n return;\n } // Render DOM elements\n\n\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n });\n\n _defineProperty(this, \"getThumbnails\", function () {\n return new Promise(function (resolve) {\n var src = _this.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // Resolve promise\n\n\n var sortAndResolve = function sortAndResolve() {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this.player.debug.log('Preview thumbnails', _this.thumbnails);\n\n resolve();\n }; // Via callback()\n\n\n if (is$1.function(src)) {\n src(function (thumbnails) {\n _this.thumbnails = thumbnails;\n sortAndResolve();\n });\n } // VTT urls\n else {\n // If string, convert into single-element list\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this.getThumbnail(u);\n }); // Resolve\n\n Promise.all(promises).then(sortAndResolve);\n }\n });\n });\n\n _defineProperty(this, \"getThumbnail\", function (url) {\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n });\n\n _defineProperty(this, \"startMove\", function (event) {\n if (!_this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!_this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = _this.player.elements.progress.getBoundingClientRect();\n\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n _this.seekTime = _this.player.media.duration * (percentage / 100);\n\n if (_this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n _this.seekTime = 0;\n }\n\n if (_this.seekTime > _this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n _this.seekTime = _this.player.media.duration - 1;\n }\n\n _this.mousePosX = event.pageX; // Set time text inside image container\n\n _this.elements.thumb.time.innerText = formatTime(_this.seekTime);\n } // Download and show image\n\n\n _this.showImageAtCurrentTime();\n });\n\n _defineProperty(this, \"endMove\", function () {\n _this.toggleThumbContainer(false, true);\n });\n\n _defineProperty(this, \"startScrubbing\", function (event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n _this.mouseDown = true; // Wait until media has a duration\n\n if (_this.player.media.duration) {\n _this.toggleScrubbingContainer(true);\n\n _this.toggleThumbContainer(false, true); // Download and show image\n\n\n _this.showImageAtCurrentTime();\n }\n }\n });\n\n _defineProperty(this, \"endScrubbing\", function () {\n _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n _this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(_this.player, _this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this.mouseDown) {\n _this.toggleScrubbingContainer(false);\n }\n });\n }\n });\n\n _defineProperty(this, \"listeners\", function () {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n _this.player.on('play', function () {\n _this.toggleThumbContainer(false, true);\n });\n\n _this.player.on('seeked', function () {\n _this.toggleThumbContainer(false);\n });\n\n _this.player.on('timeupdate', function () {\n _this.lastTime = _this.player.media.currentTime;\n });\n });\n\n _defineProperty(this, \"render\", function () {\n // Create HTML element: plyr__preview-thumbnail-container\n _this.elements.thumb.container = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n _this.elements.thumb.imageContainer = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.imageContainer\n });\n\n _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n\n var timeContainer = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.timeContainer\n });\n _this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(_this.elements.thumb.time);\n\n _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n\n if (is$1.element(_this.player.elements.progress)) {\n _this.player.elements.progress.appendChild(_this.elements.thumb.container);\n } // Create HTML element: plyr__preview-scrubbing-container\n\n\n _this.elements.scrubbing.container = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n\n _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);\n });\n\n _defineProperty(this, \"destroy\", function () {\n if (_this.elements.thumb.container) {\n _this.elements.thumb.container.remove();\n }\n\n if (_this.elements.scrubbing.container) {\n _this.elements.scrubbing.container.remove();\n }\n });\n\n _defineProperty(this, \"showImageAtCurrentTime\", function () {\n if (_this.mouseDown) {\n _this.setScrubbingContainerSize();\n } else {\n _this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {\n return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;\n });\n\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n if (!_this.mouseDown) {\n _this.toggleThumbContainer(hasThumb);\n } // No matching thumb found\n\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n _this.thumbnails.forEach(function (thumbnail, index) {\n if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n\n if (thumbNum !== _this.showingThumb) {\n _this.showingThumb = thumbNum;\n\n _this.loadImage(qualityIndex);\n }\n });\n\n _defineProperty(this, \"loadImage\", function () {\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = _this.showingThumb;\n var thumbnail = _this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (_this.loadingImage && _this.usingSprites) {\n _this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n _this.showingThumbFilename = thumbFilename;\n\n _this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n\n previewImage.onload = function () {\n return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n _this.loadingImage = previewImage;\n\n _this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n\n _this.currentImageElement.dataset.index = thumbNum;\n\n _this.removeOldImages(_this.currentImageElement);\n }\n });\n\n _defineProperty(this, \"showImage\", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n _this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n\n _this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n _this.currentImageContainer.appendChild(previewImage);\n\n _this.currentImageElement = previewImage;\n\n if (!_this.loadedImages.includes(thumbFilename)) {\n _this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n });\n\n _defineProperty(this, \"removeOldImages\", function (currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(_this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n });\n\n _defineProperty(this, \"preloadNearby\", function (thumbNum) {\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;\n\n if (_this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n });\n\n _defineProperty(this, \"getHigherQuality\", function (currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < _this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (_this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < _this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this.showingThumbFilename === thumbFilename) {\n _this.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n });\n\n _defineProperty(this, \"toggleThumbContainer\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;\n\n _this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n _this.showingThumb = null;\n _this.showingThumbFilename = null;\n }\n });\n\n _defineProperty(this, \"toggleScrubbingContainer\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n\n _this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n _this.showingThumb = null;\n _this.showingThumbFilename = null;\n }\n });\n\n _defineProperty(this, \"determineContainerAutoSizing\", function () {\n if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n _this.sizeSpecifiedInCSS = true;\n }\n });\n\n _defineProperty(this, \"setThumbContainerSizeAndPos\", function () {\n if (!_this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);\n _this.elements.thumb.imageContainer.style.height = \"\".concat(_this.thumbContainerHeight, \"px\");\n _this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {\n var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);\n\n _this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {\n var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);\n _this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n }\n\n _this.setThumbContainerPos();\n });\n\n _defineProperty(this, \"setThumbContainerPos\", function () {\n var seekbarRect = _this.player.elements.progress.getBoundingClientRect();\n\n var plyrRect = _this.player.elements.container.getBoundingClientRect();\n\n var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n });\n\n _defineProperty(this, \"setScrubbingContainerSize\", function () {\n var _fitRatio = fitRatio(_this.thumbAspectRatio, {\n width: _this.player.media.clientWidth,\n height: _this.player.media.clientHeight\n }),\n width = _fitRatio.width,\n height = _fitRatio.height;\n\n _this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n _this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n });\n\n _defineProperty(this, \"setImageSizeAndOffset\", function (previewImage, frame) {\n if (!_this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n });\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n height = _fitRatio2.height;\n\n return height;\n } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n}();\n\nvar source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Update previewThumbnails config & reload plugin\n\n\n if (!is$1.empty(input.previewThumbnails)) {\n Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n _this2.previewThumbnails.destroy();\n\n _this2.previewThumbnails = null;\n } // Create new instance if it is still enabled\n\n\n if (_this2.config.previewThumbnails.enabled) {\n _this2.previewThumbnails = new PreviewThumbnails(_this2);\n }\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n};\n\n/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nfunction clamp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n return Math.min(Math.max(input, min), max);\n}\n\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n// Plyr instance\n\nvar Plyr = /*#__PURE__*/function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n _defineProperty(this, \"play\", function () {\n if (!is$1.function(_this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (_this.ads && _this.ads.enabled) {\n _this.ads.managerPromise.then(function () {\n return _this.ads.play();\n }).catch(function () {\n return silencePromise(_this.media.play());\n });\n } // Return the promise (for HTML5)\n\n\n return _this.media.play();\n });\n\n _defineProperty(this, \"pause\", function () {\n if (!_this.playing || !is$1.function(_this.media.pause)) {\n return null;\n }\n\n return _this.media.pause();\n });\n\n _defineProperty(this, \"togglePlay\", function (input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !_this.playing;\n\n if (toggle) {\n return _this.play();\n }\n\n return _this.pause();\n });\n\n _defineProperty(this, \"stop\", function () {\n if (_this.isHTML5) {\n _this.pause();\n\n _this.restart();\n } else if (is$1.function(_this.media.stop)) {\n _this.media.stop();\n }\n });\n\n _defineProperty(this, \"restart\", function () {\n _this.currentTime = 0;\n });\n\n _defineProperty(this, \"rewind\", function (seekTime) {\n _this.currentTime -= is$1.number(seekTime) ? seekTime : _this.config.seekTime;\n });\n\n _defineProperty(this, \"forward\", function (seekTime) {\n _this.currentTime += is$1.number(seekTime) ? seekTime : _this.config.seekTime;\n });\n\n _defineProperty(this, \"increaseVolume\", function (step) {\n var volume = _this.media.muted ? 0 : _this.volume;\n _this.volume = volume + (is$1.number(step) ? step : 0);\n });\n\n _defineProperty(this, \"decreaseVolume\", function (step) {\n _this.increaseVolume(-step);\n });\n\n _defineProperty(this, \"airplay\", function () {\n // Show dialog if supported\n if (support.airplay) {\n _this.media.webkitShowPlaybackTargetPicker();\n }\n });\n\n _defineProperty(this, \"toggleControls\", function (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 var isHidden = hasClass(_this.elements.container, _this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(_this.elements.container, _this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && is$1.array(_this.config.controls) && _this.config.controls.includes('settings') && !is$1.empty(_this.config.settings)) {\n controls.toggleMenu.call(_this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(_this, _this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n });\n\n _defineProperty(this, \"on\", function (event, callback) {\n on.call(_this, _this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"once\", function (event, callback) {\n once.call(_this, _this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"off\", function (event, callback) {\n off(_this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"destroy\", function (callback) {\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!_this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this.embed = null; // If it's a soft destroy, make minimal changes\n\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); // Clear for GC\n\n _this.elements.buttons.play = null;\n _this.elements.captions = null;\n _this.elements.controls = null;\n _this.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this); // Cancel current network requests\n\n html5.cancelRequests.call(_this); // Replace the container with the original element provided\n\n replaceElement(_this.elements.original, _this.elements.container); // Event\n\n triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this.elements.original);\n } // Reset state\n\n\n _this.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this.elements = null;\n _this.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n _this.stop(); // Clear timeouts\n\n\n clearTimeout(_this.timers.loading);\n clearTimeout(_this.timers.controls);\n clearTimeout(_this.timers.resized); // Provider specific stuff\n\n if (_this.isHTML5) {\n // Restore native video controls\n ui.toggleNativeControls.call(_this, true); // Clean up\n\n done();\n } else if (_this.isYouTube) {\n // Clear timers\n clearInterval(_this.timers.buffering);\n clearInterval(_this.timers.playing); // Destroy YouTube API\n\n if (_this.embed !== null && is$1.function(_this.embed.destroy)) {\n _this.embed.destroy();\n } // Clean up\n\n\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 } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n });\n\n _defineProperty(this, \"supports\", function (type) {\n return support.mime.call(_this, type);\n });\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n fullscreen: 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 }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var _type = this.media.tagName.toLowerCase(); // Embed properties\n\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (_type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.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); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.values(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = _type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\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 } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap(this.media, this.elements.container);\n } // Migrate custom properties from media to container (so they work 😉)\n\n\n ui.migrateStyles.call(this); // Add style hook\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup fullscreen\n\n\n this.fullscreen = new Fullscreen(this); // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', function () {\n return silencePromise(_this.play());\n });\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return this.provider === providers.html5;\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return this.isYouTube || this.isVimeo;\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return this.provider === providers.youtube;\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return this.provider === providers.vimeo;\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return this.type === types.video;\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return this.type === types.audio;\n }\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n\n }, {\n key: \"playing\",\n\n /**\n * Get playing state\n */\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n\n }, {\n key: \"currentTime\",\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: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\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\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"muted\",\n\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\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 } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var _this2 = this;\n\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Clamp to min/max\n\n\n var min = this.minimumSpeed,\n max = this.maximumSpeed;\n speed = clamp(speed, min, max); // Update config\n\n this.config.speed.selected = speed; // Set media speed\n\n setTimeout(function () {\n _this2.media.playbackRate = speed;\n }, 0);\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Get the minimum allowed speed\n */\n\n }, {\n key: \"minimumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 0.0625;\n }\n /**\n * Get the maximum allowed speed\n */\n\n }, {\n key: \"maximumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 16;\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest$1(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\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\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\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 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 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 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 default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the download URL\n */\n ,\n set: function set(input) {\n if (!is$1.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n controls.setDownloadUrl.call(this);\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(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(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n }\n /**\n * Get the current aspect ratio in use\n */\n\n }, {\n key: \"ratio\",\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n var ratio = reduceAspectRatio(getAspectRatio.call(this));\n return is$1.array(ratio) ? ratio.join(':') : ratio;\n }\n /**\n * Set video aspect ratio\n */\n ,\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is$1.string(input) || !validateRatio(input)) {\n this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n return;\n }\n\n this.config.ratio = input;\n setAspectRatio.call(this);\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\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\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\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\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n\n }], [{\n key: \"supported\",\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\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\n }, {\n key: \"loadSprite\",\n value: function loadSprite$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n}();\n\nPlyr.defaults = cloneDeep(defaults$1);\n\nexport default Plyr;\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","// ==========================================================================\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 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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\n\nconst isElement = (input) =>\n input !== null &&\n typeof input === 'object' &&\n input.nodeType === 1 &&\n typeof input.style === 'object' &&\n typeof input.ownerDocument === 'object';\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 isEdge: window.navigator.userAgent.includes('Edge'),\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// 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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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// 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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.4/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\n\n // Update the UI\n this.update();\n\n // this.toggle = this.toggle.bind(this);\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n };\n\n 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\n // Toggle button and fire events\n this.onChange();\n };\n\n // Trap focus inside container\n trapFocus = (event) => {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update = () => {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n };\n\n // Container listeners\n container = () => {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load = () => {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready = () => {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n };\n\n addCuePoints = () => {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load = () => {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n };\n\n // Download VTT files and parse them\n getThumbnails = () => {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n };\n\n // Process individual VTT file\n getThumbnail = (url) => {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n };\n\n startMove = (event) => {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n };\n\n endMove = () => {\n this.toggleThumbContainer(false, true);\n };\n\n startScrubbing = (event) => {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n };\n\n endScrubbing = () => {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n };\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners = () => {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n };\n\n /**\n * Create HTML elements for image containers\n */\n render = () => {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n };\n\n destroy = () => {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n };\n\n showImageAtCurrentTime = () => {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n };\n\n // Show the image that's currently specified in this.showingThumb\n loadImage = (qualityIndex = 0) => {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n };\n\n showImage = (previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) => {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n };\n\n // Remove all preview images that aren't the designated current image\n removeOldImages = (currentImage) => {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n };\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby = (thumbNum, forward = true) => {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n };\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality = (currentQualityIndex, previewImage, frame, thumbFilename) => {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n };\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer = (toggle = false, clearShowing = false) => {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n toggleScrubbingContainer = (toggle = false) => {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n determineContainerAutoSizing = () => {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n };\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos = () => {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n };\n\n setThumbContainerPos = () => {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n };\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize = () => {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n };\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset = (previewImage, frame) => {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n };\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n","// ==========================================================================\n// Plyr\n// plyr.js v3.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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.values(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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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) => support.mime.call(this, type);\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} 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.mjs b/dist/plyr.mjs
index b289dc3a..4630c445 100644
--- a/dist/plyr.mjs
+++ b/dist/plyr.mjs
@@ -1,3 +1,19 @@
+function _typeof(obj) {
+ "@babel/helpers - typeof";
+
+ if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") {
+ _typeof = function (obj) {
+ return typeof obj;
+ };
+ } else {
+ _typeof = function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+ };
+ }
+
+ return _typeof(obj);
+}
+
function _classCallCheck(instance, Constructor) {
if (!(instance instanceof Constructor)) {
throw new TypeError("Cannot call a class as a function");
@@ -442,10 +458,6 @@ var isNodeList$1 = function isNodeList(input) {
return instanceOf$1(input, NodeList);
};
-var isElement$1 = function isElement(input) {
- return instanceOf$1(input, Element);
-};
-
var isTextNode = function isTextNode(input) {
return getConstructor$1(input) === Text;
};
@@ -470,6 +482,10 @@ var isPromise = function isPromise(input) {
return instanceOf$1(input, Promise) && isFunction$1(input.then);
};
+var isElement$1 = function isElement(input) {
+ return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';
+};
+
var isEmpty$1 = function isEmpty(input) {
return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;
};
@@ -1481,21 +1497,16 @@ var i18n = {
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 _this = this;
+ _classCallCheck(this, Storage);
- _createClass(Storage, [{
- key: "get",
- value: function get(key) {
- if (!Storage.supported || !this.enabled) {
+ _defineProperty(this, "get", function (key) {
+ if (!Storage.supported || !_this.enabled) {
return null;
}
- var store = window.localStorage.getItem(this.key);
+ var store = window.localStorage.getItem(_this.key);
if (is$1.empty(store)) {
return null;
@@ -1503,12 +1514,11 @@ var Storage = /*#__PURE__*/function () {
var json = JSON.parse(store);
return is$1.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: "set",
- value: function set(object) {
+ });
+
+ _defineProperty(this, "set", function (object) {
// Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
+ if (!Storage.supported || !_this.enabled) {
return;
} // Can only store objectst
@@ -1518,7 +1528,8 @@ var Storage = /*#__PURE__*/function () {
} // Get current storage
- var storage = this.get(); // Default to empty object
+ var storage = _this.get(); // Default to empty object
+
if (is$1.empty(storage)) {
storage = {};
@@ -1527,9 +1538,15 @@ var Storage = /*#__PURE__*/function () {
extend(storage, object); // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
+ window.localStorage.setItem(_this.key, JSON.stringify(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, null, [{
key: "supported",
get: function get() {
try {
@@ -3653,7 +3670,7 @@ var defaults$1 = {
// Sprite (for icons)
loadSprite: true,
iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',
+ iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',
// Blank video (used to prevent errors on source change)
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
// Quality default
@@ -4052,83 +4069,41 @@ var Fullscreen = /*#__PURE__*/function () {
_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
- }; // Force the use of 'full window/browser' rather than fullscreen
-
- this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
- // Checks container is an ancestor, defaults to null
-
- this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
- _this.onChange();
- }); // 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.player.listeners.proxy(event, _this.toggle, 'fullscreen');
- }); // Tap focus when in fullscreen
-
- on.call(this, this.player.elements.container, 'keydown', function (event) {
- return _this.trapFocus(event);
- }); // Update the UI
-
- this.update();
- } // Determine if native supported
-
-
- _createClass(Fullscreen, [{
- key: "onChange",
- value: function onChange() {
- if (!this.enabled) {
+ _defineProperty(this, "onChange", function () {
+ if (!_this.enabled) {
return;
} // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
+ var button = _this.player.elements.buttons.fullscreen;
if (is$1.element(button)) {
- button.pressed = this.active;
+ button.pressed = _this.active;
} // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up
- var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event
+ var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event
- triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
- }
- }, {
- key: "toggleFallback",
- value: function toggleFallback() {
+ triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);
+ });
+
+ _defineProperty(this, "toggleFallback", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
// Store or restore scroll position
if (toggle) {
- this.scrollPosition = {
+ _this.scrollPosition = {
x: window.scrollX || 0,
y: window.scrollY || 0
};
} else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ 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); // Force full viewport on iPhone X+
+ toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
if (browser.isIos) {
var viewport = document.head.querySelector('meta[name="viewport"]');
@@ -4143,12 +4118,12 @@ var Fullscreen = /*#__PURE__*/function () {
var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);
if (toggle) {
- this.cleanupViewport = !hasProperty;
+ _this.cleanupViewport = !hasProperty;
if (!hasProperty) {
viewport.content += ",".concat(property);
}
- } else if (this.cleanupViewport) {
+ } else if (_this.cleanupViewport) {
viewport.content = viewport.content.split(',').filter(function (part) {
return part.trim() !== property;
}).join(',');
@@ -4156,20 +4131,18 @@ var Fullscreen = /*#__PURE__*/function () {
} // Toggle button and fire events
- this.onChange();
- } // Trap focus inside container
+ _this.onChange();
+ });
- }, {
- key: "trapFocus",
- value: function trapFocus(event) {
+ _defineProperty(this, "trapFocus", function (event) {
// Bail if iOS, not active, not the tab key
- if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {
+ if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {
return;
} // Get the current focused element
var focused = document.activeElement;
- var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
+ var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
var _focusable = _slicedToArray(focusable, 1),
first = _focusable[0];
@@ -4185,15 +4158,13 @@ var Fullscreen = /*#__PURE__*/function () {
last.focus();
event.preventDefault();
}
- } // Update UI
+ });
- }, {
- key: "update",
- value: function update() {
- if (this.enabled) {
+ _defineProperty(this, "update", function () {
+ if (_this.enabled) {
var mode;
- if (this.forceFallback) {
+ if (_this.forceFallback) {
mode = 'Fallback (forced)';
} else if (Fullscreen.native) {
mode = 'Native';
@@ -4201,67 +4172,106 @@ var Fullscreen = /*#__PURE__*/function () {
mode = 'Fallback';
}
- this.player.debug.log("".concat(mode, " fullscreen enabled"));
+ _this.player.debug.log("".concat(mode, " fullscreen enabled"));
} else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
+ _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
+ toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);
+ });
- }, {
- key: "enter",
- value: function enter() {
- if (!this.enabled) {
+ _defineProperty(this, "enter", function () {
+ 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 || this.forceFallback) {
- this.toggleFallback(true);
- } else if (!this.prefix) {
- this.target.requestFullscreen({
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ if (_this.player.isVimeo) {
+ _this.player.embed.requestFullscreen();
+ } else {
+ _this.target.webkitEnterFullscreen();
+ }
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(true);
+ } else if (!_this.prefix) {
+ _this.target.requestFullscreen({
navigationUI: 'hide'
});
- } else if (!is$1.empty(this.prefix)) {
- this.target["".concat(this.prefix, "Request").concat(this.property)]();
+ } 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) {
+ _defineProperty(this, "exit", function () {
+ if (!_this.enabled) {
return;
} // iOS native fullscreen
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- silencePromise(this.player.play());
- } else if (!Fullscreen.native || this.forceFallback) {
- this.toggleFallback(false);
- } else if (!this.prefix) {
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ _this.target.webkitExitFullscreen();
+
+ silencePromise(_this.player.play());
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(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)]();
+ } 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();
+ _defineProperty(this, "toggle", function () {
+ if (!_this.active) {
+ _this.enter();
} else {
- this.exit();
+ _this.exit();
}
- }
- }, {
+ });
+
+ // 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
+ }; // Force the use of 'full window/browser' rather than fullscreen
+
+ this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
+ // Checks container is an ancestor, defaults to null
+
+ this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
+ _this.onChange();
+ }); // 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.player.listeners.proxy(event, _this.toggle, 'fullscreen');
+ }); // Tap focus when in fullscreen
+
+ on.call(this, this.player.elements.container, 'keydown', function (event) {
+ return _this.trapFocus(event);
+ }); // Update the UI
+
+ this.update(); // this.toggle = this.toggle.bind(this);
+ } // Determine if native supported
+
+
+ _createClass(Fullscreen, [{
key: "usingNative",
// If we're actually using native
get: function get() {
@@ -4592,182 +4602,23 @@ var ui = {
};
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$1(focused, editable)) {
- return;
- }
-
- if (event.which === 32 && matches$1(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) {
- silencePromise(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;
- } // Escape is handle natively when in full screen
- // So we only need to worry about non native
-
-
- if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
- player.fullscreen.toggle();
- } // Store last code for next cycle
-
-
- this.lastKey = code;
- } else {
- this.lastKey = null;
- }
- } // Toggle menu
+ function Listeners(_player) {
+ var _this = this;
- }, {
- key: "toggleMenu",
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- } // Device is touch enabled
+ _classCallCheck(this, Listeners);
- }, {
- key: "firstTouch",
- value: function firstTouch() {
- var player = this.player;
+ _defineProperty(this, "firstTouch", function () {
+ 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;
+ });
+
+ _defineProperty(this, "setTabFocus", function (event) {
+ var player = _this.player;
var elements = player.elements;
- clearTimeout(this.focusTimer); // Ignore any key other than tab
+ clearTimeout(_this.focusTimer); // Ignore any key other than tab
if (event.type === 'keydown' && event.which !== 9) {
return;
@@ -4775,7 +4626,7 @@ var Listeners = /*#__PURE__*/function () {
if (event.type === 'keydown') {
- this.lastKeyDown = event.timeStamp;
+ _this.lastKeyDown = event.timeStamp;
} // Remove current classes
@@ -4786,7 +4637,7 @@ var Listeners = /*#__PURE__*/function () {
}; // 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
+ var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
if (event.type === 'focus' && !wasKeyDown) {
return;
@@ -4797,7 +4648,7 @@ var Listeners = /*#__PURE__*/function () {
// This event fires before the focusin event
if (event.type !== 'focusout') {
- this.focusTimer = setTimeout(function () {
+ _this.focusTimer = setTimeout(function () {
var focused = document.activeElement; // Ignore if current focus element isn't inside the player
if (!elements.container.contains(focused)) {
@@ -4807,36 +4658,32 @@ var Listeners = /*#__PURE__*/function () {
toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
}, 10);
}
- } // Global window & document listeners
+ });
- }, {
- key: "global",
- value: function global() {
+ _defineProperty(this, "global", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- var player = this.player; // Keyboard shortcuts
+ var player = _this.player; // Keyboard shortcuts
if (player.config.keyboard.global) {
- toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
+ 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
+ toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events
- once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
+ once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection
- toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);
- } // Container listeners
+ toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);
+ });
- }, {
- key: "container",
- value: function container() {
- var player = this.player;
+ _defineProperty(this, "container", function () {
+ var player = _this.player;
var config = player.config,
elements = player.elements,
timers = player.timers; // Keyboard shortcuts
if (!config.keyboard.global && config.keyboard.focused) {
- on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
+ on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);
} // Toggle controls on mouse events and entering fullscreen
@@ -4941,14 +4788,10 @@ var Listeners = /*#__PURE__*/function () {
}
}
});
- } // Listen for media events
-
- }, {
- key: "media",
- value: function media() {
- var _this = this;
+ });
- var player = this.player;
+ _defineProperty(this, "media", function () {
+ var player = _this.player;
var elements = player.elements; // Time change on media
on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
@@ -5040,7 +4883,6 @@ var Listeners = /*#__PURE__*/function () {
// Update UI
controls.updateSetting.call(player, 'speed'); // Save to storage
-
player.storage.set({
speed: player.speed
});
@@ -5067,12 +4909,10 @@ var Listeners = /*#__PURE__*/function () {
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;
+ _defineProperty(this, "proxy", function (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
@@ -5085,89 +4925,90 @@ var Listeners = /*#__PURE__*/function () {
if (returned !== false && is$1.function(defaultHandler)) {
defaultHandler.call(player, event);
}
- } // Trigger custom and default handlers
-
- }, {
- key: "bind",
- value: function bind(element, type, defaultHandler, customHandlerKey) {
- var _this2 = this;
+ });
+ _defineProperty(this, "bind", function (element, type, defaultHandler, customHandlerKey) {
var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var player = this.player;
+ var player = _this.player;
var customHandler = player.config.listeners[customHandlerKey];
var hasCustomHandler = is$1.function(customHandler);
on.call(player, element, type, function (event) {
- return _this2.proxy(event, defaultHandler, customHandlerKey);
+ return _this.proxy(event, defaultHandler, customHandlerKey);
}, passive && !hasCustomHandler);
- } // Listen for control events
-
- }, {
- key: "controls",
- value: function controls$1() {
- var _this3 = this;
+ });
- var player = this.player;
+ _defineProperty(this, "controls", function () {
+ 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) {
- _this3.bind(button, 'click', function () {
+ _this.bind(button, 'click', function () {
silencePromise(player.togglePlay());
}, 'play');
});
} // Pause
- this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+ _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+
- this.bind(elements.buttons.rewind, 'click', function () {
+ _this.bind(elements.buttons.rewind, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after rewind
player.lastSeekTime = Date.now();
player.rewind();
}, 'rewind'); // Rewind
- this.bind(elements.buttons.fastForward, 'click', function () {
+
+ _this.bind(elements.buttons.fastForward, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after fast forward
player.lastSeekTime = Date.now();
player.forward();
}, 'fastForward'); // Mute toggle
- this.bind(elements.buttons.mute, 'click', function () {
+
+ _this.bind(elements.buttons.mute, 'click', function () {
player.muted = !player.muted;
}, 'mute'); // Captions toggle
- this.bind(elements.buttons.captions, 'click', function () {
+
+ _this.bind(elements.buttons.captions, 'click', function () {
return player.toggleCaptions();
}); // Download
- this.bind(elements.buttons.download, 'click', function () {
+
+ _this.bind(elements.buttons.download, 'click', function () {
triggerEvent.call(player, player.media, 'download');
}, 'download'); // Fullscreen toggle
- this.bind(elements.buttons.fullscreen, 'click', function () {
+
+ _this.bind(elements.buttons.fullscreen, 'click', function () {
player.fullscreen.toggle();
}, 'fullscreen'); // Picture-in-Picture
- this.bind(elements.buttons.pip, 'click', function () {
+
+ _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) {
+ _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();
event.preventDefault();
-
controls.toggleMenu.call(player, event);
}, null, false); // Can't be passive as we're preventing default
// 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) {
+
+ _this.bind(elements.buttons.settings, 'keyup', function (event) {
var code = event.which; // We only care about space and return
if (![13, 32].includes(code)) {
@@ -5177,7 +5018,6 @@ var Listeners = /*#__PURE__*/function () {
if (code === 13) {
controls.focusFirstMenuItem.call(player, null, true);
-
return;
} // Prevent scroll
@@ -5190,19 +5030,22 @@ var Listeners = /*#__PURE__*/function () {
}, null, false // Can't be passive as we're preventing default
); // Escape closes menu
- this.bind(elements.settings.menu, 'keydown', function (event) {
+
+ _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) {
+
+ _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) {
+
+ _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';
@@ -5229,17 +5072,18 @@ var Listeners = /*#__PURE__*/function () {
// 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 _this3.bind(input, inputEvent, function (event) {
+ return _this.bind(input, inputEvent, function (event) {
return repaint(event.target);
});
});
} // Seek
- this.bind(elements.inputs.seek, inputEvent, function (event) {
+ _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');
@@ -5252,12 +5096,14 @@ var Listeners = /*#__PURE__*/function () {
player.currentTime = seekTo / seek.max * player.duration;
}, 'seek'); // Seek tooltip
- this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+
+ _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
return controls.updateSeekTooltip.call(player, event);
}); // Preview thumbnails plugin
// TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this
- this.bind(elements.progress, 'mousemove touchmove', function (event) {
+
+ _this.bind(elements.progress, 'mousemove touchmove', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -5265,7 +5111,8 @@ var Listeners = /*#__PURE__*/function () {
}
}); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
- this.bind(elements.progress, 'mouseleave touchend click', function () {
+
+ _this.bind(elements.progress, 'mouseleave touchend click', function () {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -5273,14 +5120,16 @@ var Listeners = /*#__PURE__*/function () {
}
}); // Show scrubbing preview
- this.bind(elements.progress, 'mousedown touchstart', function (event) {
+
+ _this.bind(elements.progress, 'mousedown touchstart', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
previewThumbnails.startScrubbing(event);
}
});
- this.bind(elements.progress, 'mouseup touchend', function (event) {
+
+ _this.bind(elements.progress, 'mouseup touchend', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -5288,9 +5137,10 @@ var Listeners = /*#__PURE__*/function () {
}
}); // Polyfill for lower fill in <input type="range"> for webkit
+
if (browser.isWebkit) {
Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
- _this3.bind(element, 'input', function (event) {
+ _this.bind(element, 'input', function (event) {
return controls.updateRangeFill.call(player, event.target);
});
});
@@ -5299,43 +5149,45 @@ var Listeners = /*#__PURE__*/function () {
if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
- this.bind(elements.display.currentTime, 'click', function () {
+ _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) {
+ _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) {
+
+ _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
elements.controls.hover = !player.touch && event.type === 'mouseenter';
}); // Also update controls.hover state for any non-player children of fullscreen element (as above)
+
if (elements.fullscreen) {
Array.from(elements.fullscreen.children).filter(function (c) {
return !c.contains(elements.container);
}).forEach(function (child) {
- _this3.bind(child, 'mouseenter mouseleave', function (event) {
+ _this.bind(child, '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) {
+ _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
}); // Show controls when they receive focus (e.g., when using keyboard tab key)
- this.bind(elements.controls, 'focusin', function () {
+
+ _this.bind(elements.controls, 'focusin', function () {
var config = player.config,
timers = player.timers; // Skip transition to prevent focus from scrolling the parent element
@@ -5347,7 +5199,7 @@ var Listeners = /*#__PURE__*/function () {
toggleClass(elements.controls, config.classNames.noTransition, false);
}, 0); // Delay a little more for mouse users
- var delay = _this3.touch ? 3000 : 4000; // Clear timer
+ var delay = _this.touch ? 3000 : 4000; // Clear timer
clearTimeout(timers.controls); // Hide again after delay
@@ -5356,7 +5208,8 @@ var Listeners = /*#__PURE__*/function () {
}, delay);
}); // Mouse wheel for volume
- this.bind(elements.inputs.volume, 'wheel', function (event) {
+
+ _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
@@ -5379,7 +5232,166 @@ var Listeners = /*#__PURE__*/function () {
event.preventDefault();
}
}, 'volume', false);
- }
+ });
+
+ 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$1(focused, editable)) {
+ return;
+ }
+
+ if (event.which === 32 && matches$1(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) {
+ silencePromise(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;
+ } // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+
+
+ if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
+ 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
+
}]);
return Listeners;
@@ -5780,7 +5792,7 @@ var vimeo = {
var src = format(player.config.urls.vimeo.iframe, id, params);
iframe.setAttribute('src', src);
iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required
+ iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required
if (!is$1.empty(referrerPolicy)) {
iframe.setAttribute('referrerPolicy', referrerPolicy);
@@ -6539,135 +6551,84 @@ var Ads = /*#__PURE__*/function () {
_classCallCheck(this, Ads);
- this.player = player;
- this.config = player.config.ads;
- 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) {
+ _defineProperty(this, "load", function () {
+ if (!_this.enabled) {
return;
} // 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();
+ loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {
+ _this.ready();
}).catch(function () {
// Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
+ _this.trigger('error', new Error('Google IMA SDK failed to load'));
});
} else {
- this.ready();
+ _this.ready();
}
- }
- /**
- * Get the ads instance ready
- */
-
- }, {
- key: "ready",
- value: function ready() {
- var _this3 = this;
+ });
+ _defineProperty(this, "ready", function () {
// Double check we're enabled
- if (!this.enabled) {
- destroy(this);
+ if (!_this.enabled) {
+ destroy(_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.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
+
+ _this.managerPromise.then(function () {
+ _this.clearSafetyTimer('onAdsManagerLoaded()');
}); // Set listeners on the Plyr instance
- this.listeners(); // Setup the IMA SDK
- this.setupIMA();
- } // Build the tag URL
+ _this.listeners(); // Setup the IMA SDK
- }, {
- 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() {
- var _this4 = this;
+ _this.setupIMA();
+ });
+ _defineProperty(this, "setupIMA", function () {
// Create the container for our advertisements
- this.elements.container = createElement('div', {
- class: this.player.config.classNames.ads
+ _this.elements.container = createElement('div', {
+ class: _this.player.config.classNames.ads
});
- this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
+
+ _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); // Set playback for iOS10+
+ google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+
- google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
+ google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // 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, this.player.media); // Create ads loader
+ _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
+ _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);
+ _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this.onAdsManagerLoaded(event);
}, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
+
+ _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}, false); // Request video ads to be pre-loaded
- this.requestAds();
- }
- /**
- * Request advertisements
- */
- }, {
- key: "requestAds",
- value: function requestAds() {
- var container = this.player.elements.container;
+ _this.requestAds();
+ });
+
+ _defineProperty(this, "requestAds", function () {
+ var container = _this.player.elements.container;
try {
// Request video ads
var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
+ 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;
@@ -6677,51 +6638,38 @@ var Ads = /*#__PURE__*/function () {
request.forceNonLinearFullSlot = false; // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
- this.loader.requestAds(request);
+ request.setAdWillPlayMuted(!_this.player.muted);
+
+ _this.loader.requestAds(request);
} catch (e) {
- this.onAdError(e);
+ _this.onAdError(e);
}
- }
- /**
- * Update the ad countdown
- * @param {Boolean} start
- */
-
- }, {
- key: "pollCountdown",
- value: function pollCountdown() {
- var _this5 = this;
+ });
+ _defineProperty(this, "pollCountdown", function () {
var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
+ 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);
+ var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));
+ var label = "".concat(i18n.get('advertisement', _this.player.config), " - ").concat(time);
- _this5.elements.container.setAttribute('data-badge-text', label);
+ _this.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;
+ _this.countdownTimer = setInterval(update, 100);
+ });
+ _defineProperty(this, "onAdsManagerLoaded", function (event) {
// Load could occur after a source change (race condition)
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
} // Get the ads manager
@@ -6732,38 +6680,36 @@ var Ads = /*#__PURE__*/function () {
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.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 listeners to the required events
+ _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events
// Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
+ _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}); // Advertisement regular events
+
Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
- return _this6.onAdEvent(e);
+ _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
+ return _this.onAdEvent(e);
});
}); // Resolve our adsManager
- this.trigger('loaded');
- }
- }, {
- key: "addCuePoints",
- value: function addCuePoints() {
- var _this7 = this;
+ _this.trigger('loaded');
+ });
+ _defineProperty(this, "addCuePoints", function () {
// 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 < _this7.player.duration) {
- var seekElement = _this7.player.elements.progress;
+ if (!is$1.empty(_this.cuePoints)) {
+ _this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {
+ var seekElement = _this.player.elements.progress;
if (is$1.element(seekElement)) {
- var cuePercentage = 100 / _this7.player.duration * cuePoint;
+ var cuePercentage = 100 / _this.player.duration * cuePoint;
var cue = createElement('span', {
- class: _this7.player.config.classNames.cues
+ class: _this.player.config.classNames.cues
});
cue.style.left = "".concat(cuePercentage.toString(), "%");
seekElement.appendChild(cue);
@@ -6771,27 +6717,17 @@ var Ads = /*#__PURE__*/function () {
}
});
}
- }
- /**
- * 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 _this8 = this;
+ });
- var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ _defineProperty(this, "onAdEvent", function (event) {
+ 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();
var adData = event.getAdData(); // Proxy event
var dispatchEvent = function dispatchEvent(type) {
- triggerEvent.call(_this8.player, _this8.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
+ triggerEvent.call(_this.player, _this.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
}; // Bubble the event
@@ -6801,9 +6737,10 @@ var Ads = /*#__PURE__*/function () {
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'); // Start countdown
+ _this.trigger('loaded'); // Start countdown
+
- this.pollCountdown(true);
+ _this.pollCountdown(true);
if (!ad.isLinear()) {
// Position AdDisplayContainer correctly for overlay
@@ -6817,7 +6754,8 @@ var Ads = /*#__PURE__*/function () {
case google.ima.AdEvent.Type.STARTED:
// Set volume to match player
- this.manager.setVolume(this.player.volume);
+ _this.manager.setVolume(_this.player.volume);
+
break;
case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
@@ -6844,11 +6782,11 @@ var Ads = /*#__PURE__*/function () {
// };
// 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
- if (this.player.ended) {
- this.loadAds();
+ if (_this.player.ended) {
+ _this.loadAds();
} else {
// The SDK won't allow new ads to be called without receiving a contentComplete()
- this.loader.contentComplete();
+ _this.loader.contentComplete();
}
break;
@@ -6857,7 +6795,8 @@ var Ads = /*#__PURE__*/function () {
// 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
- this.pauseContent();
+ _this.pauseContent();
+
break;
case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
@@ -6865,275 +6804,237 @@ var Ads = /*#__PURE__*/function () {
// 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
- this.pollCountdown();
- this.resumeContent();
+ _this.pollCountdown();
+
+ _this.resumeContent();
+
break;
case google.ima.AdEvent.Type.LOG:
if (adData.adError) {
- this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
+ _this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
}
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
- */
+ _defineProperty(this, "onAdError", function (event) {
+ _this.cancel();
- }, {
- key: "listeners",
- value: function listeners() {
- var _this9 = this;
+ _this.player.debug.warn('Ads error', event);
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "listeners", function () {
+ var container = _this.player.elements.container;
var time;
- this.player.on('canplay', function () {
- _this9.addCuePoints();
+
+ _this.player.on('canplay', function () {
+ _this.addCuePoints();
});
- this.player.on('ended', function () {
- _this9.loader.contentComplete();
+
+ _this.player.on('ended', function () {
+ _this.loader.contentComplete();
});
- this.player.on('timeupdate', function () {
- time = _this9.player.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ time = _this.player.currentTime;
});
- this.player.on('seeked', function () {
- var seekedTime = _this9.player.currentTime;
- if (is$1.empty(_this9.cuePoints)) {
+ _this.player.on('seeked', function () {
+ var seekedTime = _this.player.currentTime;
+
+ if (is$1.empty(_this.cuePoints)) {
return;
}
- _this9.cuePoints.forEach(function (cuePoint, index) {
+ _this.cuePoints.forEach(function (cuePoint, index) {
if (time < cuePoint && cuePoint < seekedTime) {
- _this9.manager.discardAdBreak();
+ _this.manager.discardAdBreak();
- _this9.cuePoints.splice(index, 1);
+ _this.cuePoints.splice(index, 1);
}
});
}); // Listen to the resizing of the window. And resize ad accordingly
// TODO: eventually implement ResizeObserver
+
window.addEventListener('resize', function () {
- if (_this9.manager) {
- _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ if (_this.manager) {
+ _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
}
});
- }
- /**
- * Initialize the adsManager and start playing advertisements
- */
-
- }, {
- key: "play",
- value: function play() {
- var _this10 = this;
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "play", function () {
+ var container = _this.player.elements.container;
- if (!this.managerPromise) {
- this.resumeContent();
+ if (!_this.managerPromise) {
+ _this.resumeContent();
} // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Set volume to match player
- _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices
+ _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices
- _this10.elements.displayContainer.initialize();
+ _this.elements.displayContainer.initialize();
try {
- if (!_this10.initialized) {
+ if (!_this.initialized) {
// Initialize the ads manager. Ad rules playlist will start at this time
- _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
+ _this.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
- _this10.manager.start();
+ _this.manager.start();
}
- _this10.initialized = true;
+ _this.initialized = true;
} catch (adError) {
// An error may be thrown if there was a problem with the
// VAST response
- _this10.onAdError(adError);
+ _this.onAdError(adError);
}
}).catch(function () {});
- }
- /**
- * Resume our video
- */
+ });
- }, {
- key: "resumeContent",
- value: function resumeContent() {
+ _defineProperty(this, "resumeContent", function () {
// Hide the advertisement container
- this.elements.container.style.zIndex = ''; // Ad is stopped
+ _this.elements.container.style.zIndex = ''; // Ad is stopped
- this.playing = false; // Play video
+ _this.playing = false; // Play video
- silencePromise(this.player.media.play());
- }
- /**
- * Pause our video
- */
+ silencePromise(_this.player.media.play());
+ });
- }, {
- key: "pauseContent",
- value: function pauseContent() {
+ _defineProperty(this, "pauseContent", function () {
// Show the advertisement container
- this.elements.container.style.zIndex = 3; // Ad is playing
+ _this.elements.container.style.zIndex = 3; // Ad is playing
- this.playing = true; // Pause our video.
+ _this.playing = true; // Pause our video.
- this.player.media.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
- */
+ _this.player.media.pause();
+ });
- }, {
- key: "cancel",
- value: function cancel() {
+ _defineProperty(this, "cancel", function () {
// Pause our video
- if (this.initialized) {
- this.resumeContent();
+ if (_this.initialized) {
+ _this.resumeContent();
} // Tell our instance that we're done for now
- this.trigger('error'); // Re-create our adsManager
+ _this.trigger('error'); // Re-create our adsManager
- this.loadAds();
- }
- /**
- * Re-create our adsManager
- */
- }, {
- key: "loadAds",
- value: function loadAds() {
- var _this11 = this;
+ _this.loadAds();
+ });
+ _defineProperty(this, "loadAds", function () {
// Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Destroy our adsManager
- if (_this11.manager) {
- _this11.manager.destroy();
+ if (_this.manager) {
+ _this.manager.destroy();
} // Re-set our adsManager promises
- _this11.managerPromise = new Promise(function (resolve) {
- _this11.on('loaded', resolve);
+ _this.managerPromise = new Promise(function (resolve) {
+ _this.on('loaded', resolve);
- _this11.player.debug.log(_this11.manager);
+ _this.player.debug.log(_this.manager);
}); // Now that the manager has been destroyed set it to also be un-initialized
- _this11.initialized = false; // Now request some new advertisements
+ _this.initialized = false; // Now request some new advertisements
- _this11.requestAds();
+ _this.requestAds();
}).catch(function () {});
- }
- /**
- * Handles callbacks after an ad event was invoked
- * @param {String} event - Event type
- */
-
- }, {
- key: "trigger",
- value: function trigger(event) {
- var _this12 = this;
+ });
+ _defineProperty(this, "trigger", function (event) {
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];
+ var handlers = _this.events[event];
if (is$1.array(handlers)) {
handlers.forEach(function (handler) {
if (is$1.function(handler)) {
- handler.apply(_this12, args);
+ handler.apply(_this, args);
}
});
}
- }
- /**
- * Add event listeners
- * @param {String} event - Event type
- * @param {Function} callback - Callback for when event occurs
- * @return {Ads}
- */
+ });
- }, {
- key: "on",
- value: function on(event, callback) {
- if (!is$1.array(this.events[event])) {
- this.events[event] = [];
+ _defineProperty(this, "on", function (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
- */
+ _this.events[event].push(callback);
- }, {
- key: "startSafetyTimer",
- value: function startSafetyTimer(time, from) {
- var _this13 = this;
+ return _this;
+ });
+
+ _defineProperty(this, "startSafetyTimer", function (time, from) {
+ _this.player.debug.log("Safety timer invoked from: ".concat(from));
- this.player.debug.log("Safety timer invoked from: ".concat(from));
- this.safetyTimer = setTimeout(function () {
- _this13.cancel();
+ _this.safetyTimer = setTimeout(function () {
+ _this.cancel();
- _this13.clearSafetyTimer('startSafetyTimer()');
+ _this.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;
+ _defineProperty(this, "clearSafetyTimer", function (from) {
+ if (!is$1.nullOrUndefined(_this.safetyTimer)) {
+ _this.player.debug.log("Safety timer cleared from: ".concat(from));
+
+ clearTimeout(_this.safetyTimer);
+ _this.safetyTimer = null;
}
- }
- }, {
+ });
+
+ this.player = player;
+ this.config = player.config.ads;
+ 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: "enabled",
get: function get() {
var config = this.config;
return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));
}
+ /**
+ * Load the IMA SDK
+ */
+
}, {
key: "tagUrl",
+ // Build the tag URL
get: function get() {
var config = this.config;
@@ -7153,6 +7054,15 @@ var Ads = /*#__PURE__*/function () {
var base = 'https://go.aniview.com/api/adserver6/vast/';
return "".concat(base, "?").concat(buildUrlParams(params));
}
+ /**
+ * 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.
+ */
+
}]);
return Ads;
@@ -7235,36 +7145,21 @@ var PreviewThumbnails = /*#__PURE__*/function () {
* @return {PreviewThumbnails}
*/
function PreviewThumbnails(player) {
- _classCallCheck(this, PreviewThumbnails);
-
- this.player = player;
- this.thumbnails = [];
- this.loaded = false;
- this.lastMouseMoveTime = Date.now();
- this.mouseDown = false;
- this.loadedImages = [];
- this.elements = {
- thumb: {},
- scrubbing: {}
- };
- this.load();
- }
+ var _this = this;
- _createClass(PreviewThumbnails, [{
- key: "load",
- value: function load() {
- var _this = this;
+ _classCallCheck(this, PreviewThumbnails);
+ _defineProperty(this, "load", function () {
// Toggle the regular seek tooltip
- if (this.player.elements.display.seekTooltip) {
- this.player.elements.display.seekTooltip.hidden = this.enabled;
+ if (_this.player.elements.display.seekTooltip) {
+ _this.player.elements.display.seekTooltip.hidden = _this.enabled;
}
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
}
- this.getThumbnails().then(function () {
+ _this.getThumbnails().then(function () {
if (!_this.enabled) {
return;
} // Render DOM elements
@@ -7277,15 +7172,11 @@ var PreviewThumbnails = /*#__PURE__*/function () {
_this.loaded = true;
});
- } // Download VTT files and parse them
-
- }, {
- key: "getThumbnails",
- value: function getThumbnails() {
- var _this2 = this;
+ });
+ _defineProperty(this, "getThumbnails", function () {
return new Promise(function (resolve) {
- var src = _this2.player.config.previewThumbnails.src;
+ var src = _this.player.config.previewThumbnails.src;
if (is$1.empty(src)) {
throw new Error('Missing previewThumbnails.src config attribute');
@@ -7294,11 +7185,11 @@ var PreviewThumbnails = /*#__PURE__*/function () {
var sortAndResolve = function sortAndResolve() {
// Sort smallest to biggest (e.g., [120p, 480p, 1080p])
- _this2.thumbnails.sort(function (x, y) {
+ _this.thumbnails.sort(function (x, y) {
return x.height - y.height;
});
- _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
+ _this.player.debug.log('Preview thumbnails', _this.thumbnails);
resolve();
}; // Via callback()
@@ -7306,7 +7197,7 @@ var PreviewThumbnails = /*#__PURE__*/function () {
if (is$1.function(src)) {
src(function (thumbnails) {
- _this2.thumbnails = thumbnails;
+ _this.thumbnails = thumbnails;
sortAndResolve();
});
} // VTT urls
@@ -7315,19 +7206,15 @@ var PreviewThumbnails = /*#__PURE__*/function () {
var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
var promises = urls.map(function (u) {
- return _this2.getThumbnail(u);
+ return _this.getThumbnail(u);
}); // Resolve
Promise.all(promises).then(sortAndResolve);
}
});
- } // Process individual VTT file
-
- }, {
- key: "getThumbnail",
- value: function getThumbnail(url) {
- var _this3 = this;
+ });
+ _defineProperty(this, "getThumbnail", function (url) {
return new Promise(function (resolve) {
fetch(url).then(function (response) {
var thumbnail = {
@@ -7349,7 +7236,7 @@ var PreviewThumbnails = /*#__PURE__*/function () {
thumbnail.height = tempImage.naturalHeight;
thumbnail.width = tempImage.naturalWidth;
- _this3.thumbnails.push(thumbnail);
+ _this.thumbnails.push(thumbnail);
resolve();
};
@@ -7357,11 +7244,10 @@ var PreviewThumbnails = /*#__PURE__*/function () {
tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;
});
});
- }
- }, {
- key: "startMove",
- value: function startMove(event) {
- if (!this.loaded) {
+ });
+
+ _defineProperty(this, "startMove", function (event) {
+ if (!_this.loaded) {
return;
}
@@ -7370,163 +7256,153 @@ var PreviewThumbnails = /*#__PURE__*/function () {
} // Wait until media has a duration
- if (!this.player.media.duration) {
+ if (!_this.player.media.duration) {
return;
}
if (event.type === 'touchmove') {
// Calculate seek hover position as approx video seconds
- this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
+ _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);
} else {
// Calculate seek hover position as approx video seconds
- var clientRect = this.player.elements.progress.getBoundingClientRect();
+ var clientRect = _this.player.elements.progress.getBoundingClientRect();
+
var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);
- this.seekTime = this.player.media.duration * (percentage / 100);
+ _this.seekTime = _this.player.media.duration * (percentage / 100);
- if (this.seekTime < 0) {
+ if (_this.seekTime < 0) {
// The mousemove fires for 10+px out to the left
- this.seekTime = 0;
+ _this.seekTime = 0;
}
- if (this.seekTime > this.player.media.duration - 1) {
+ if (_this.seekTime > _this.player.media.duration - 1) {
// Took 1 second off the duration for safety, because different players can disagree on the real duration of a video
- this.seekTime = this.player.media.duration - 1;
+ _this.seekTime = _this.player.media.duration - 1;
}
- this.mousePosX = event.pageX; // Set time text inside image container
+ _this.mousePosX = event.pageX; // Set time text inside image container
- this.elements.thumb.time.innerText = formatTime(this.seekTime);
+ _this.elements.thumb.time.innerText = formatTime(_this.seekTime);
} // Download and show image
- this.showImageAtCurrentTime();
- }
- }, {
- key: "endMove",
- value: function endMove() {
- this.toggleThumbContainer(false, true);
- }
- }, {
- key: "startScrubbing",
- value: function startScrubbing(event) {
+ _this.showImageAtCurrentTime();
+ });
+
+ _defineProperty(this, "endMove", function () {
+ _this.toggleThumbContainer(false, true);
+ });
+
+ _defineProperty(this, "startScrubbing", function (event) {
// Only act on left mouse button (0), or touch device (event.button does not exist or is false)
if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {
- this.mouseDown = true; // Wait until media has a duration
+ _this.mouseDown = true; // Wait until media has a duration
+
+ if (_this.player.media.duration) {
+ _this.toggleScrubbingContainer(true);
- if (this.player.media.duration) {
- this.toggleScrubbingContainer(true);
- this.toggleThumbContainer(false, true); // Download and show image
+ _this.toggleThumbContainer(false, true); // Download and show image
- this.showImageAtCurrentTime();
+
+ _this.showImageAtCurrentTime();
}
}
- }
- }, {
- key: "endScrubbing",
- value: function endScrubbing() {
- var _this4 = this;
+ });
- this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
+ _defineProperty(this, "endScrubbing", function () {
+ _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
- if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {
+ if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {
// The video was already seeked/loaded at the chosen time - hide immediately
- this.toggleScrubbingContainer(false);
+ _this.toggleScrubbingContainer(false);
} else {
// The video hasn't seeked yet. Wait for that
- once.call(this.player, this.player.media, 'timeupdate', function () {
+ once.call(_this.player, _this.player.media, 'timeupdate', function () {
// Re-check mousedown - we might have already started scrubbing again
- if (!_this4.mouseDown) {
- _this4.toggleScrubbingContainer(false);
+ if (!_this.mouseDown) {
+ _this.toggleScrubbingContainer(false);
}
});
}
- }
- /**
- * Setup hooks for Plyr and window events
- */
-
- }, {
- key: "listeners",
- value: function listeners() {
- var _this5 = this;
+ });
+ _defineProperty(this, "listeners", function () {
// Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
- this.player.on('play', function () {
- _this5.toggleThumbContainer(false, true);
+ _this.player.on('play', function () {
+ _this.toggleThumbContainer(false, true);
});
- this.player.on('seeked', function () {
- _this5.toggleThumbContainer(false);
+
+ _this.player.on('seeked', function () {
+ _this.toggleThumbContainer(false);
});
- this.player.on('timeupdate', function () {
- _this5.lastTime = _this5.player.media.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ _this.lastTime = _this.player.media.currentTime;
});
- }
- /**
- * Create HTML elements for image containers
- */
+ });
- }, {
- key: "render",
- value: function render() {
+ _defineProperty(this, "render", function () {
// Create HTML element: plyr__preview-thumbnail-container
- this.elements.thumb.container = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.thumbContainer
+ _this.elements.thumb.container = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.thumbContainer
}); // Wrapper for the image for styling
- this.elements.thumb.imageContainer = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.imageContainer
+ _this.elements.thumb.imageContainer = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.imageContainer
});
- this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
+ _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
var timeContainer = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.timeContainer
+ class: _this.player.config.classNames.previewThumbnails.timeContainer
});
- this.elements.thumb.time = createElement('span', {}, '00:00');
- timeContainer.appendChild(this.elements.thumb.time);
- this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+ _this.elements.thumb.time = createElement('span', {}, '00:00');
+ timeContainer.appendChild(_this.elements.thumb.time);
+
+ _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+
- if (is$1.element(this.player.elements.progress)) {
- this.player.elements.progress.appendChild(this.elements.thumb.container);
+ if (is$1.element(_this.player.elements.progress)) {
+ _this.player.elements.progress.appendChild(_this.elements.thumb.container);
} // Create HTML element: plyr__preview-scrubbing-container
- this.elements.scrubbing.container = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.scrubbingContainer
+ _this.elements.scrubbing.container = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.scrubbingContainer
});
- this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
- }
- }, {
- key: "destroy",
- value: function destroy() {
- if (this.elements.thumb.container) {
- this.elements.thumb.container.remove();
+
+ _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);
+ });
+
+ _defineProperty(this, "destroy", function () {
+ if (_this.elements.thumb.container) {
+ _this.elements.thumb.container.remove();
}
- if (this.elements.scrubbing.container) {
- this.elements.scrubbing.container.remove();
+ if (_this.elements.scrubbing.container) {
+ _this.elements.scrubbing.container.remove();
}
- }
- }, {
- key: "showImageAtCurrentTime",
- value: function showImageAtCurrentTime() {
- var _this6 = this;
+ });
- if (this.mouseDown) {
- this.setScrubbingContainerSize();
+ _defineProperty(this, "showImageAtCurrentTime", function () {
+ if (_this.mouseDown) {
+ _this.setScrubbingContainerSize();
} else {
- this.setThumbContainerSizeAndPos();
+ _this.setThumbContainerSizeAndPos();
} // Find the desired thumbnail index
// TODO: Handle a video longer than the thumbs where thumbNum is null
- var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {
- return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;
+ var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {
+ return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;
});
+
var hasThumb = thumbNum >= 0;
var qualityIndex = 0; // Show the thumb container if we're not scrubbing
- if (!this.mouseDown) {
- this.toggleThumbContainer(hasThumb);
+ if (!_this.mouseDown) {
+ _this.toggleThumbContainer(hasThumb);
} // No matching thumb found
@@ -7535,36 +7411,34 @@ var PreviewThumbnails = /*#__PURE__*/function () {
} // Check to see if we've already downloaded higher quality versions of this image
- this.thumbnails.forEach(function (thumbnail, index) {
- if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
+ _this.thumbnails.forEach(function (thumbnail, index) {
+ if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
qualityIndex = index;
}
}); // Only proceed if either thumbnum or thumbfilename has changed
- if (thumbNum !== this.showingThumb) {
- this.showingThumb = thumbNum;
- this.loadImage(qualityIndex);
- }
- } // Show the image that's currently specified in this.showingThumb
- }, {
- key: "loadImage",
- value: function loadImage() {
- var _this7 = this;
+ if (thumbNum !== _this.showingThumb) {
+ _this.showingThumb = thumbNum;
+ _this.loadImage(qualityIndex);
+ }
+ });
+
+ _defineProperty(this, "loadImage", function () {
var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var thumbNum = this.showingThumb;
- var thumbnail = this.thumbnails[qualityIndex];
+ var thumbNum = _this.showingThumb;
+ var thumbnail = _this.thumbnails[qualityIndex];
var urlPrefix = thumbnail.urlPrefix;
var frame = thumbnail.frames[thumbNum];
var thumbFilename = thumbnail.frames[thumbNum].text;
var thumbUrl = urlPrefix + thumbFilename;
- if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {
+ if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {
// If we're already loading a previous image, remove its onload handler - we don't want it to load after this one
// Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort
- if (this.loadingImage && this.usingSprites) {
- this.loadingImage.onload = null;
+ if (_this.loadingImage && _this.usingSprites) {
+ _this.loadingImage.onload = null;
} // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image
// is instead used. But this causes issues with larger images in Firefox and Safari - switching between background
// images causes a flicker. Putting a new image over the top does not
@@ -7574,56 +7448,59 @@ var PreviewThumbnails = /*#__PURE__*/function () {
previewImage.src = thumbUrl;
previewImage.dataset.index = thumbNum;
previewImage.dataset.filename = thumbFilename;
- this.showingThumbFilename = thumbFilename;
- this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+ _this.showingThumbFilename = thumbFilename;
+
+ _this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+
previewImage.onload = function () {
- return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
+ return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
};
- this.loadingImage = previewImage;
- this.removeOldImages(previewImage);
+ _this.loadingImage = previewImage;
+
+ _this.removeOldImages(previewImage);
} else {
// Update the existing image
- this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
- this.currentImageElement.dataset.index = thumbNum;
- this.removeOldImages(this.currentImageElement);
+ _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
+
+ _this.currentImageElement.dataset.index = thumbNum;
+
+ _this.removeOldImages(_this.currentImageElement);
}
- }
- }, {
- key: "showImage",
- value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
+ });
+
+ _defineProperty(this, "showImage", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
- this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
- this.setImageSizeAndOffset(previewImage, frame);
+
+ _this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
+
+ _this.setImageSizeAndOffset(previewImage, frame);
if (newImage) {
- this.currentImageContainer.appendChild(previewImage);
- this.currentImageElement = previewImage;
+ _this.currentImageContainer.appendChild(previewImage);
- if (!this.loadedImages.includes(thumbFilename)) {
- this.loadedImages.push(thumbFilename);
+ _this.currentImageElement = previewImage;
+
+ if (!_this.loadedImages.includes(thumbFilename)) {
+ _this.loadedImages.push(thumbFilename);
}
} // Preload images before and after the current one
// Show higher quality of the same frame
// Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
- this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
- } // Remove all preview images that aren't the designated current image
-
- }, {
- key: "removeOldImages",
- value: function removeOldImages(currentImage) {
- var _this8 = this;
+ _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
+ });
+ _defineProperty(this, "removeOldImages", function (currentImage) {
// Get a list of all images, convert it from a DOM list to an array
- Array.from(this.currentImageContainer.children).forEach(function (image) {
+ Array.from(_this.currentImageContainer.children).forEach(function (image) {
if (image.tagName.toLowerCase() !== 'img') {
return;
}
- var removeDelay = _this8.usingSprites ? 500 : 1000;
+ var removeDelay = _this.usingSprites ? 500 : 1000;
if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {
// Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients
@@ -7631,35 +7508,30 @@ var PreviewThumbnails = /*#__PURE__*/function () {
// eslint-disable-next-line no-param-reassign
image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub
- var currentImageContainer = _this8.currentImageContainer;
+ var currentImageContainer = _this.currentImageContainer;
setTimeout(function () {
currentImageContainer.removeChild(image);
- _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
+ _this.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
}, removeDelay);
}
});
- } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
- // This will only preload the lowest quality
-
- }, {
- key: "preloadNearby",
- value: function preloadNearby(thumbNum) {
- var _this9 = this;
+ });
+ _defineProperty(this, "preloadNearby", function (thumbNum) {
var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return new Promise(function (resolve) {
setTimeout(function () {
- var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;
+ var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;
- if (_this9.showingThumbFilename === oldThumbFilename) {
+ if (_this.showingThumbFilename === oldThumbFilename) {
// Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away
var thumbnailsClone;
if (forward) {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);
+ thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);
} else {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();
+ thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();
}
var foundOne = false;
@@ -7668,20 +7540,20 @@ var PreviewThumbnails = /*#__PURE__*/function () {
if (newThumbFilename !== oldThumbFilename) {
// Found one with a different filename. Make sure it hasn't already been loaded on this page visit
- if (!_this9.loadedImages.includes(newThumbFilename)) {
+ if (!_this.loadedImages.includes(newThumbFilename)) {
foundOne = true;
- _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
- var urlPrefix = _this9.thumbnails[0].urlPrefix;
+ var urlPrefix = _this.thumbnails[0].urlPrefix;
var thumbURL = urlPrefix + newThumbFilename;
var previewImage = new Image();
previewImage.src = thumbURL;
previewImage.onload = function () {
- _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
- if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
+ if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
resolve();
};
@@ -7695,97 +7567,91 @@ var PreviewThumbnails = /*#__PURE__*/function () {
}
}, 300);
});
- } // If user has been hovering current image for half a second, look for a higher quality one
-
- }, {
- key: "getHigherQuality",
- value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {
- var _this10 = this;
+ });
- if (currentQualityIndex < this.thumbnails.length - 1) {
+ _defineProperty(this, "getHigherQuality", function (currentQualityIndex, previewImage, frame, thumbFilename) {
+ if (currentQualityIndex < _this.thumbnails.length - 1) {
// Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
var previewImageHeight = previewImage.naturalHeight;
- if (this.usingSprites) {
+ if (_this.usingSprites) {
previewImageHeight = frame.h;
}
- if (previewImageHeight < this.thumbContainerHeight) {
+ if (previewImageHeight < _this.thumbContainerHeight) {
// Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while
setTimeout(function () {
// Make sure the mouse hasn't already moved on and started hovering at another image
- if (_this10.showingThumbFilename === thumbFilename) {
- _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
+ if (_this.showingThumbFilename === thumbFilename) {
+ _this.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
- _this10.loadImage(currentQualityIndex + 1);
+ _this.loadImage(currentQualityIndex + 1);
}
}, 300);
}
}
- }
- }, {
- key: "toggleThumbContainer",
- value: function toggleThumbContainer() {
+ });
+
+ _defineProperty(this, "toggleThumbContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;
- this.elements.thumb.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;
+
+ _this.elements.thumb.container.classList.toggle(className, toggle);
if (!toggle && clearShowing) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "toggleScrubbingContainer",
- value: function toggleScrubbingContainer() {
+ });
+
+ _defineProperty(this, "toggleScrubbingContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
- this.elements.scrubbing.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
+
+ _this.elements.scrubbing.container.classList.toggle(className, toggle);
if (!toggle) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "determineContainerAutoSizing",
- value: function determineContainerAutoSizing() {
- if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {
+ });
+
+ _defineProperty(this, "determineContainerAutoSizing", function () {
+ if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {
// This will prevent auto sizing in this.setThumbContainerSizeAndPos()
- this.sizeSpecifiedInCSS = true;
+ _this.sizeSpecifiedInCSS = true;
}
- } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
+ });
- }, {
- key: "setThumbContainerSizeAndPos",
- value: function setThumbContainerSizeAndPos() {
- if (!this.sizeSpecifiedInCSS) {
- var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px");
- this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {
- var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);
-
- this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {
- var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
+ _defineProperty(this, "setThumbContainerSizeAndPos", function () {
+ if (!_this.sizeSpecifiedInCSS) {
+ var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(_this.thumbContainerHeight, "px");
+ _this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {
+ var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);
+
+ _this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {
+ var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
}
- this.setThumbContainerPos();
- }
- }, {
- key: "setThumbContainerPos",
- value: function setThumbContainerPos() {
- var seekbarRect = this.player.elements.progress.getBoundingClientRect();
- var plyrRect = this.player.elements.container.getBoundingClientRect();
- var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
+ _this.setThumbContainerPos();
+ });
+
+ _defineProperty(this, "setThumbContainerPos", function () {
+ var seekbarRect = _this.player.elements.progress.getBoundingClientRect();
+
+ var plyrRect = _this.player.elements.container.getBoundingClientRect();
+
+ var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
var minVal = plyrRect.left - seekbarRect.left + 10;
var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth
- var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;
+ var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;
if (previewPos < minVal) {
previewPos = minVal;
@@ -7796,31 +7662,27 @@ var PreviewThumbnails = /*#__PURE__*/function () {
}
container.style.left = "".concat(previewPos, "px");
- } // Can't use 100% width, in case the video is a different aspect ratio to the video container
+ });
- }, {
- key: "setScrubbingContainerSize",
- value: function setScrubbingContainerSize() {
- var _fitRatio = fitRatio(this.thumbAspectRatio, {
- width: this.player.media.clientWidth,
- height: this.player.media.clientHeight
+ _defineProperty(this, "setScrubbingContainerSize", function () {
+ var _fitRatio = fitRatio(_this.thumbAspectRatio, {
+ width: _this.player.media.clientWidth,
+ height: _this.player.media.clientHeight
}),
width = _fitRatio.width,
height = _fitRatio.height;
- this.elements.scrubbing.container.style.width = "".concat(width, "px");
- this.elements.scrubbing.container.style.height = "".concat(height, "px");
- } // Sprites need to be offset to the correct location
+ _this.elements.scrubbing.container.style.width = "".concat(width, "px");
+ _this.elements.scrubbing.container.style.height = "".concat(height, "px");
+ });
- }, {
- key: "setImageSizeAndOffset",
- value: function setImageSizeAndOffset(previewImage, frame) {
- if (!this.usingSprites) {
+ _defineProperty(this, "setImageSizeAndOffset", function (previewImage, frame) {
+ if (!_this.usingSprites) {
return;
} // Find difference between height and preview container height
- var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
+ var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
previewImage.style.height = "".concat(previewImage.naturalHeight * multiplier, "px"); // eslint-disable-next-line no-param-reassign
@@ -7829,8 +7691,22 @@ var PreviewThumbnails = /*#__PURE__*/function () {
previewImage.style.left = "-".concat(frame.x * multiplier, "px"); // eslint-disable-next-line no-param-reassign
previewImage.style.top = "-".concat(frame.y * multiplier, "px");
- }
- }, {
+ });
+
+ this.player = player;
+ this.thumbnails = [];
+ this.loaded = false;
+ this.lastMouseMoveTime = Date.now();
+ this.mouseDown = false;
+ this.loadedImages = [];
+ this.elements = {
+ thumb: {},
+ scrubbing: {}
+ };
+ this.load();
+ }
+
+ _createClass(PreviewThumbnails, [{
key: "enabled",
get: function get() {
return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;
@@ -8076,6 +7952,214 @@ var Plyr = /*#__PURE__*/function () {
_classCallCheck(this, Plyr);
+ _defineProperty(this, "play", function () {
+ if (!is$1.function(_this.media.play)) {
+ return null;
+ } // Intecept play with ads
+
+
+ if (_this.ads && _this.ads.enabled) {
+ _this.ads.managerPromise.then(function () {
+ return _this.ads.play();
+ }).catch(function () {
+ return silencePromise(_this.media.play());
+ });
+ } // Return the promise (for HTML5)
+
+
+ return _this.media.play();
+ });
+
+ _defineProperty(this, "pause", function () {
+ if (!_this.playing || !is$1.function(_this.media.pause)) {
+ return null;
+ }
+
+ return _this.media.pause();
+ });
+
+ _defineProperty(this, "togglePlay", function (input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is$1.boolean(input) ? input : !_this.playing;
+
+ if (toggle) {
+ return _this.play();
+ }
+
+ return _this.pause();
+ });
+
+ _defineProperty(this, "stop", function () {
+ if (_this.isHTML5) {
+ _this.pause();
+
+ _this.restart();
+ } else if (is$1.function(_this.media.stop)) {
+ _this.media.stop();
+ }
+ });
+
+ _defineProperty(this, "restart", function () {
+ _this.currentTime = 0;
+ });
+
+ _defineProperty(this, "rewind", function (seekTime) {
+ _this.currentTime -= is$1.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "forward", function (seekTime) {
+ _this.currentTime += is$1.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "increaseVolume", function (step) {
+ var volume = _this.media.muted ? 0 : _this.volume;
+ _this.volume = volume + (is$1.number(step) ? step : 0);
+ });
+
+ _defineProperty(this, "decreaseVolume", function (step) {
+ _this.increaseVolume(-step);
+ });
+
+ _defineProperty(this, "airplay", function () {
+ // Show dialog if supported
+ if (support.airplay) {
+ _this.media.webkitShowPlaybackTargetPicker();
+ }
+ });
+
+ _defineProperty(this, "toggleControls", function (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 && is$1.array(_this.config.controls) && _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;
+ });
+
+ _defineProperty(this, "on", function (event, callback) {
+ on.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "once", function (event, callback) {
+ once.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "off", function (event, callback) {
+ off(_this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "destroy", function (callback) {
+ 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
+
+ _this.embed = null; // If it's a soft destroy, make minimal changes
+
+ if (soft) {
+ if (Object.keys(_this.elements).length) {
+ // Remove elements
+ removeElement(_this.elements.buttons.play);
+ removeElement(_this.elements.captions);
+ removeElement(_this.elements.controls);
+ removeElement(_this.elements.wrapper); // Clear for GC
+
+ _this.elements.buttons.play = null;
+ _this.elements.captions = null;
+ _this.elements.controls = null;
+ _this.elements.wrapper = null;
+ } // Callback
+
+
+ if (is$1.function(callback)) {
+ callback();
+ }
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this); // Cancel current network requests
+
+ html5.cancelRequests.call(_this); // Replace the container with the original element provided
+
+ replaceElement(_this.elements.original, _this.elements.container); // Event
+
+ triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback
+
+ if (is$1.function(callback)) {
+ callback.call(_this.elements.original);
+ } // Reset state
+
+
+ _this.ready = false; // Clear for garbage collection
+
+ setTimeout(function () {
+ _this.elements = null;
+ _this.media = null;
+ }, 200);
+ }
+ }; // Stop playback
+
+
+ _this.stop(); // Clear timeouts
+
+
+ clearTimeout(_this.timers.loading);
+ clearTimeout(_this.timers.controls);
+ clearTimeout(_this.timers.resized); // Provider specific stuff
+
+ if (_this.isHTML5) {
+ // 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);
+ }
+ });
+
+ _defineProperty(this, "supports", function (type) {
+ return support.mime.call(_this, type);
+ });
+
this.timers = {}; // State
this.ready = false;
@@ -8172,12 +8256,13 @@ var Plyr = /*#__PURE__*/function () {
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 _type = this.media.tagName.toLowerCase(); // Embed properties
+
var iframe = null;
var url = null; // Different setup based on type
- switch (type) {
+ switch (_type) {
case 'div':
// Find the frame
iframe = this.media.querySelector('iframe'); // <iframe> type
@@ -8220,7 +8305,7 @@ var Plyr = /*#__PURE__*/function () {
} // Unsupported or missing provider
- if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ if (is$1.empty(this.provider) || !Object.values(providers).includes(this.provider)) {
this.debug.error('Setup failed: Invalid provider');
return;
} // Audio will come later for external providers
@@ -8231,7 +8316,7 @@ var Plyr = /*#__PURE__*/function () {
case 'video':
case 'audio':
- this.type = type;
+ this.type = _type;
this.provider = providers.html5; // Get config from attributes
if (this.media.hasAttribute('crossorigin')) {
@@ -8337,139 +8422,6 @@ var Plyr = /*#__PURE__*/function () {
_createClass(Plyr, [{
- key: "play",
-
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- var _this2 = this;
-
- if (!is$1.function(this.media.play)) {
- return null;
- } // Intecept play with ads
-
-
- if (this.ads && this.ads.enabled) {
- this.ads.managerPromise.then(function () {
- return _this2.ads.play();
- }).catch(function () {
- return silencePromise(_this2.media.play());
- });
- } // 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 null;
- }
-
- 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) {
- return this.play();
- }
-
- return 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 -= 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 += 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",
/**
@@ -8485,202 +8437,6 @@ var Plyr = /*#__PURE__*/function () {
*/
}, {
- 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 && is$1.array(this.config.controls) && 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 _this3 = 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
-
- _this3.embed = null; // If it's a soft destroy, make minimal changes
-
- if (soft) {
- if (Object.keys(_this3.elements).length) {
- // Remove elements
- removeElement(_this3.elements.buttons.play);
- removeElement(_this3.elements.captions);
- removeElement(_this3.elements.controls);
- removeElement(_this3.elements.wrapper); // Clear for GC
-
- _this3.elements.buttons.play = null;
- _this3.elements.captions = null;
- _this3.elements.controls = null;
- _this3.elements.wrapper = null;
- } // Callback
-
-
- if (is$1.function(callback)) {
- callback();
- }
- } else {
- // Unbind listeners
- unbindListeners.call(_this3); // Cancel current network requests
-
- html5.cancelRequests.call(_this3); // Replace the container with the original element provided
-
- replaceElement(_this3.elements.original, _this3.elements.container); // Event
-
- triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback
-
- if (is$1.function(callback)) {
- callback.call(_this3.elements.original);
- } // Reset state
-
-
- _this3.ready = false; // Clear for garbage collection
-
- setTimeout(function () {
- _this3.elements = null;
- _this3.media = null;
- }, 200);
- }
- }; // Stop playback
-
-
- this.stop(); // Clear timeouts
-
- clearTimeout(this.timers.loading);
- clearTimeout(this.timers.controls);
- clearTimeout(this.timers.resized); // Provider specific stuff
-
- if (this.isHTML5) {
- // 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 {Boolean} inline - Where player has `playsinline` sttribute
- */
-
- }, {
key: "isHTML5",
get: function get() {
return this.provider === providers.html5;
@@ -8710,8 +8466,16 @@ var Plyr = /*#__PURE__*/function () {
get: function get() {
return this.type === types.audio;
}
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+
}, {
key: "playing",
+
+ /**
+ * Get playing state
+ */
get: function get() {
return Boolean(this.ready && !this.paused && !this.ended);
}
@@ -8742,8 +8506,18 @@ var Plyr = /*#__PURE__*/function () {
get: function get() {
return Boolean(this.media.ended);
}
+ /**
+ * Toggle playback based on current status
+ * @param {Boolean} input
+ */
+
}, {
key: "currentTime",
+
+ /**
+ * Seek to a time
+ * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
set: function set(input) {
// Bail if media duration isn't available yet
if (!this.duration) {
@@ -8862,8 +8636,18 @@ var Plyr = /*#__PURE__*/function () {
get: function get() {
return Number(this.media.volume);
}
+ /**
+ * Increase volume
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
+ */
+
}, {
key: "muted",
+
+ /**
+ * Set muted state
+ * @param {Boolean} mute
+ */
set: function set(mute) {
var toggle = mute; // Load muted state from storage
@@ -8915,7 +8699,7 @@ var Plyr = /*#__PURE__*/function () {
}, {
key: "speed",
set: function set(input) {
- var _this4 = this;
+ var _this2 = this;
var speed = null;
@@ -8939,7 +8723,7 @@ var Plyr = /*#__PURE__*/function () {
this.config.speed.selected = speed; // Set media speed
setTimeout(function () {
- _this4.media.playbackRate = speed;
+ _this2.media.playbackRate = speed;
}, 0);
}
/**
@@ -9287,8 +9071,20 @@ var Plyr = /*#__PURE__*/function () {
return this.media === document.pictureInPictureElement;
}
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+
}], [{
key: "supported",
+
+ /**
+ * Check for support
+ * @param {String} type - Player type (audio/video)
+ * @param {String} provider - Provider (html5/youtube/vimeo)
+ * @param {Boolean} inline - Where player has `playsinline` sttribute
+ */
value: function supported(type, provider, inline) {
return support.check(type, provider, inline);
}
diff --git a/dist/plyr.polyfilled.js b/dist/plyr.polyfilled.js
index 69907031..936e3938 100644
--- a/dist/plyr.polyfilled.js
+++ b/dist/plyr.polyfilled.js
@@ -5021,6 +5021,46 @@ typeof navigator === "object" && (function (global, factory) {
}
});
+ var propertyIsEnumerable = objectPropertyIsEnumerable.f;
+
+ // `Object.{ entries, values }` methods implementation
+ var createMethod$4 = function (TO_ENTRIES) {
+ return function (it) {
+ var O = toIndexedObject(it);
+ var keys = objectKeys(O);
+ var length = keys.length;
+ var i = 0;
+ var result = [];
+ var key;
+ while (length > i) {
+ key = keys[i++];
+ if (!descriptors || propertyIsEnumerable.call(O, key)) {
+ result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
+ }
+ }
+ return result;
+ };
+ };
+
+ var objectToArray = {
+ // `Object.entries` method
+ // https://tc39.github.io/ecma262/#sec-object.entries
+ entries: createMethod$4(true),
+ // `Object.values` method
+ // https://tc39.github.io/ecma262/#sec-object.values
+ values: createMethod$4(false)
+ };
+
+ var $values = objectToArray.values;
+
+ // `Object.values` method
+ // https://tc39.github.io/ecma262/#sec-object.values
+ _export({ target: 'Object', stat: true }, {
+ values: function values(O) {
+ return $values(O);
+ }
+ });
+
var notARegexp = function (it) {
if (isRegexp(it)) {
throw TypeError("The method doesn't accept regular expressions");
@@ -5643,36 +5683,6 @@ typeof navigator === "object" && (function (global, factory) {
}
});
- var propertyIsEnumerable = objectPropertyIsEnumerable.f;
-
- // `Object.{ entries, values }` methods implementation
- var createMethod$4 = function (TO_ENTRIES) {
- return function (it) {
- var O = toIndexedObject(it);
- var keys = objectKeys(O);
- var length = keys.length;
- var i = 0;
- var result = [];
- var key;
- while (length > i) {
- key = keys[i++];
- if (!descriptors || propertyIsEnumerable.call(O, key)) {
- result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
- }
- }
- return result;
- };
- };
-
- var objectToArray = {
- // `Object.entries` method
- // https://tc39.github.io/ecma262/#sec-object.entries
- entries: createMethod$4(true),
- // `Object.values` method
- // https://tc39.github.io/ecma262/#sec-object.values
- values: createMethod$4(false)
- };
-
var $entries = objectToArray.entries;
// `Object.entries` method
@@ -5683,16 +5693,6 @@ typeof navigator === "object" && (function (global, factory) {
}
});
- var $values = objectToArray.values;
-
- // `Object.values` method
- // https://tc39.github.io/ecma262/#sec-object.values
- _export({ target: 'Object', stat: true }, {
- values: function values(O) {
- return $values(O);
- }
- });
-
// `Number.isNaN` method
// https://tc39.github.io/ecma262/#sec-number.isnan
_export({ target: 'Number', stat: true }, {
@@ -6672,10 +6672,6 @@ typeof navigator === "object" && (function (global, factory) {
return instanceOf$1(input, NodeList);
};
- var isElement$1 = function isElement(input) {
- return instanceOf$1(input, Element);
- };
-
var isTextNode = function isTextNode(input) {
return getConstructor$1(input) === Text;
};
@@ -6700,6 +6696,10 @@ typeof navigator === "object" && (function (global, factory) {
return instanceOf$1(input, Promise) && isFunction$1(input.then);
};
+ var isElement$1 = function isElement(input) {
+ return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';
+ };
+
var isEmpty$1 = function isEmpty(input) {
return isNullOrUndefined$1(input) || (isString$1(input) || isArray$2(input) || isNodeList$1(input)) && !input.length || isObject$2(input) && !Object.keys(input).length;
};
@@ -7842,21 +7842,16 @@ typeof navigator === "object" && (function (global, factory) {
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 _this = this;
+ _classCallCheck(this, Storage);
- _createClass(Storage, [{
- key: "get",
- value: function get(key) {
- if (!Storage.supported || !this.enabled) {
+ _defineProperty(this, "get", function (key) {
+ if (!Storage.supported || !_this.enabled) {
return null;
}
- var store = window.localStorage.getItem(this.key);
+ var store = window.localStorage.getItem(_this.key);
if (is$1.empty(store)) {
return null;
@@ -7864,12 +7859,11 @@ typeof navigator === "object" && (function (global, factory) {
var json = JSON.parse(store);
return is$1.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: "set",
- value: function set(object) {
+ });
+
+ _defineProperty(this, "set", function (object) {
// Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
+ if (!Storage.supported || !_this.enabled) {
return;
} // Can only store objectst
@@ -7879,7 +7873,8 @@ typeof navigator === "object" && (function (global, factory) {
} // Get current storage
- var storage = this.get(); // Default to empty object
+ var storage = _this.get(); // Default to empty object
+
if (is$1.empty(storage)) {
storage = {};
@@ -7888,9 +7883,15 @@ typeof navigator === "object" && (function (global, factory) {
extend(storage, object); // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
+ window.localStorage.setItem(_this.key, JSON.stringify(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, null, [{
key: "supported",
get: function get() {
try {
@@ -10023,7 +10024,7 @@ typeof navigator === "object" && (function (global, factory) {
// Sprite (for icons)
loadSprite: true,
iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',
+ iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',
// Blank video (used to prevent errors on source change)
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
// Quality default
@@ -10422,83 +10423,41 @@ typeof navigator === "object" && (function (global, factory) {
_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
- }; // Force the use of 'full window/browser' rather than fullscreen
-
- this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
- // Checks container is an ancestor, defaults to null
-
- this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
- _this.onChange();
- }); // 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.player.listeners.proxy(event, _this.toggle, 'fullscreen');
- }); // Tap focus when in fullscreen
-
- on.call(this, this.player.elements.container, 'keydown', function (event) {
- return _this.trapFocus(event);
- }); // Update the UI
-
- this.update();
- } // Determine if native supported
-
-
- _createClass(Fullscreen, [{
- key: "onChange",
- value: function onChange() {
- if (!this.enabled) {
+ _defineProperty(this, "onChange", function () {
+ if (!_this.enabled) {
return;
} // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
+ var button = _this.player.elements.buttons.fullscreen;
if (is$1.element(button)) {
- button.pressed = this.active;
+ button.pressed = _this.active;
} // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up
- var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event
+ var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event
- triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
- }
- }, {
- key: "toggleFallback",
- value: function toggleFallback() {
+ triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);
+ });
+
+ _defineProperty(this, "toggleFallback", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
// Store or restore scroll position
if (toggle) {
- this.scrollPosition = {
+ _this.scrollPosition = {
x: window.scrollX || 0,
y: window.scrollY || 0
};
} else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ 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); // Force full viewport on iPhone X+
+ toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
if (browser.isIos) {
var viewport = document.head.querySelector('meta[name="viewport"]');
@@ -10513,12 +10472,12 @@ typeof navigator === "object" && (function (global, factory) {
var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);
if (toggle) {
- this.cleanupViewport = !hasProperty;
+ _this.cleanupViewport = !hasProperty;
if (!hasProperty) {
viewport.content += ",".concat(property);
}
- } else if (this.cleanupViewport) {
+ } else if (_this.cleanupViewport) {
viewport.content = viewport.content.split(',').filter(function (part) {
return part.trim() !== property;
}).join(',');
@@ -10526,20 +10485,18 @@ typeof navigator === "object" && (function (global, factory) {
} // Toggle button and fire events
- this.onChange();
- } // Trap focus inside container
+ _this.onChange();
+ });
- }, {
- key: "trapFocus",
- value: function trapFocus(event) {
+ _defineProperty(this, "trapFocus", function (event) {
// Bail if iOS, not active, not the tab key
- if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {
+ if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {
return;
} // Get the current focused element
var focused = document.activeElement;
- var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
+ var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
var _focusable = _slicedToArray(focusable, 1),
first = _focusable[0];
@@ -10555,15 +10512,13 @@ typeof navigator === "object" && (function (global, factory) {
last.focus();
event.preventDefault();
}
- } // Update UI
+ });
- }, {
- key: "update",
- value: function update() {
- if (this.enabled) {
+ _defineProperty(this, "update", function () {
+ if (_this.enabled) {
var mode;
- if (this.forceFallback) {
+ if (_this.forceFallback) {
mode = 'Fallback (forced)';
} else if (Fullscreen.native) {
mode = 'Native';
@@ -10571,67 +10526,106 @@ typeof navigator === "object" && (function (global, factory) {
mode = 'Fallback';
}
- this.player.debug.log("".concat(mode, " fullscreen enabled"));
+ _this.player.debug.log("".concat(mode, " fullscreen enabled"));
} else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
+ _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
+ toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);
+ });
- }, {
- key: "enter",
- value: function enter() {
- if (!this.enabled) {
+ _defineProperty(this, "enter", function () {
+ 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 || this.forceFallback) {
- this.toggleFallback(true);
- } else if (!this.prefix) {
- this.target.requestFullscreen({
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ if (_this.player.isVimeo) {
+ _this.player.embed.requestFullscreen();
+ } else {
+ _this.target.webkitEnterFullscreen();
+ }
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(true);
+ } else if (!_this.prefix) {
+ _this.target.requestFullscreen({
navigationUI: 'hide'
});
- } else if (!is$1.empty(this.prefix)) {
- this.target["".concat(this.prefix, "Request").concat(this.property)]();
+ } 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) {
+ _defineProperty(this, "exit", function () {
+ if (!_this.enabled) {
return;
} // iOS native fullscreen
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- silencePromise(this.player.play());
- } else if (!Fullscreen.native || this.forceFallback) {
- this.toggleFallback(false);
- } else if (!this.prefix) {
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ _this.target.webkitExitFullscreen();
+
+ silencePromise(_this.player.play());
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(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)]();
+ } 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();
+ _defineProperty(this, "toggle", function () {
+ if (!_this.active) {
+ _this.enter();
} else {
- this.exit();
+ _this.exit();
}
- }
- }, {
+ });
+
+ // 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
+ }; // Force the use of 'full window/browser' rather than fullscreen
+
+ this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
+ // Checks container is an ancestor, defaults to null
+
+ this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
+ _this.onChange();
+ }); // 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.player.listeners.proxy(event, _this.toggle, 'fullscreen');
+ }); // Tap focus when in fullscreen
+
+ on.call(this, this.player.elements.container, 'keydown', function (event) {
+ return _this.trapFocus(event);
+ }); // Update the UI
+
+ this.update(); // this.toggle = this.toggle.bind(this);
+ } // Determine if native supported
+
+
+ _createClass(Fullscreen, [{
key: "usingNative",
// If we're actually using native
get: function get() {
@@ -10975,182 +10969,23 @@ typeof navigator === "object" && (function (global, factory) {
};
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$1(focused, editable)) {
- return;
- }
-
- if (event.which === 32 && matches$1(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) {
- silencePromise(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;
- } // Escape is handle natively when in full screen
- // So we only need to worry about non native
-
-
- if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
- player.fullscreen.toggle();
- } // Store last code for next cycle
-
-
- this.lastKey = code;
- } else {
- this.lastKey = null;
- }
- } // Toggle menu
+ function Listeners(_player) {
+ var _this = this;
- }, {
- key: "toggleMenu",
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- } // Device is touch enabled
+ _classCallCheck(this, Listeners);
- }, {
- key: "firstTouch",
- value: function firstTouch() {
- var player = this.player;
+ _defineProperty(this, "firstTouch", function () {
+ 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;
+ });
+
+ _defineProperty(this, "setTabFocus", function (event) {
+ var player = _this.player;
var elements = player.elements;
- clearTimeout(this.focusTimer); // Ignore any key other than tab
+ clearTimeout(_this.focusTimer); // Ignore any key other than tab
if (event.type === 'keydown' && event.which !== 9) {
return;
@@ -11158,7 +10993,7 @@ typeof navigator === "object" && (function (global, factory) {
if (event.type === 'keydown') {
- this.lastKeyDown = event.timeStamp;
+ _this.lastKeyDown = event.timeStamp;
} // Remove current classes
@@ -11169,7 +11004,7 @@ typeof navigator === "object" && (function (global, factory) {
}; // 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
+ var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
if (event.type === 'focus' && !wasKeyDown) {
return;
@@ -11180,7 +11015,7 @@ typeof navigator === "object" && (function (global, factory) {
// This event fires before the focusin event
if (event.type !== 'focusout') {
- this.focusTimer = setTimeout(function () {
+ _this.focusTimer = setTimeout(function () {
var focused = document.activeElement; // Ignore if current focus element isn't inside the player
if (!elements.container.contains(focused)) {
@@ -11190,36 +11025,32 @@ typeof navigator === "object" && (function (global, factory) {
toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
}, 10);
}
- } // Global window & document listeners
+ });
- }, {
- key: "global",
- value: function global() {
+ _defineProperty(this, "global", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- var player = this.player; // Keyboard shortcuts
+ var player = _this.player; // Keyboard shortcuts
if (player.config.keyboard.global) {
- toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
+ 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
+ toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events
- once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
+ once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection
- toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);
- } // Container listeners
+ toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);
+ });
- }, {
- key: "container",
- value: function container() {
- var player = this.player;
+ _defineProperty(this, "container", function () {
+ var player = _this.player;
var config = player.config,
elements = player.elements,
timers = player.timers; // Keyboard shortcuts
if (!config.keyboard.global && config.keyboard.focused) {
- on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
+ on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);
} // Toggle controls on mouse events and entering fullscreen
@@ -11324,14 +11155,10 @@ typeof navigator === "object" && (function (global, factory) {
}
}
});
- } // Listen for media events
-
- }, {
- key: "media",
- value: function media() {
- var _this = this;
+ });
- var player = this.player;
+ _defineProperty(this, "media", function () {
+ var player = _this.player;
var elements = player.elements; // Time change on media
on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
@@ -11423,7 +11250,6 @@ typeof navigator === "object" && (function (global, factory) {
// Update UI
controls.updateSetting.call(player, 'speed'); // Save to storage
-
player.storage.set({
speed: player.speed
});
@@ -11450,12 +11276,10 @@ typeof navigator === "object" && (function (global, factory) {
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;
+ _defineProperty(this, "proxy", function (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
@@ -11468,89 +11292,90 @@ typeof navigator === "object" && (function (global, factory) {
if (returned !== false && is$1.function(defaultHandler)) {
defaultHandler.call(player, event);
}
- } // Trigger custom and default handlers
-
- }, {
- key: "bind",
- value: function bind(element, type, defaultHandler, customHandlerKey) {
- var _this2 = this;
+ });
+ _defineProperty(this, "bind", function (element, type, defaultHandler, customHandlerKey) {
var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var player = this.player;
+ var player = _this.player;
var customHandler = player.config.listeners[customHandlerKey];
var hasCustomHandler = is$1.function(customHandler);
on.call(player, element, type, function (event) {
- return _this2.proxy(event, defaultHandler, customHandlerKey);
+ return _this.proxy(event, defaultHandler, customHandlerKey);
}, passive && !hasCustomHandler);
- } // Listen for control events
-
- }, {
- key: "controls",
- value: function controls$1() {
- var _this3 = this;
+ });
- var player = this.player;
+ _defineProperty(this, "controls", function () {
+ 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) {
- _this3.bind(button, 'click', function () {
+ _this.bind(button, 'click', function () {
silencePromise(player.togglePlay());
}, 'play');
});
} // Pause
- this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+ _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+
- this.bind(elements.buttons.rewind, 'click', function () {
+ _this.bind(elements.buttons.rewind, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after rewind
player.lastSeekTime = Date.now();
player.rewind();
}, 'rewind'); // Rewind
- this.bind(elements.buttons.fastForward, 'click', function () {
+
+ _this.bind(elements.buttons.fastForward, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after fast forward
player.lastSeekTime = Date.now();
player.forward();
}, 'fastForward'); // Mute toggle
- this.bind(elements.buttons.mute, 'click', function () {
+
+ _this.bind(elements.buttons.mute, 'click', function () {
player.muted = !player.muted;
}, 'mute'); // Captions toggle
- this.bind(elements.buttons.captions, 'click', function () {
+
+ _this.bind(elements.buttons.captions, 'click', function () {
return player.toggleCaptions();
}); // Download
- this.bind(elements.buttons.download, 'click', function () {
+
+ _this.bind(elements.buttons.download, 'click', function () {
triggerEvent.call(player, player.media, 'download');
}, 'download'); // Fullscreen toggle
- this.bind(elements.buttons.fullscreen, 'click', function () {
+
+ _this.bind(elements.buttons.fullscreen, 'click', function () {
player.fullscreen.toggle();
}, 'fullscreen'); // Picture-in-Picture
- this.bind(elements.buttons.pip, 'click', function () {
+
+ _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) {
+ _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();
event.preventDefault();
-
controls.toggleMenu.call(player, event);
}, null, false); // Can't be passive as we're preventing default
// 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) {
+
+ _this.bind(elements.buttons.settings, 'keyup', function (event) {
var code = event.which; // We only care about space and return
if (![13, 32].includes(code)) {
@@ -11560,7 +11385,6 @@ typeof navigator === "object" && (function (global, factory) {
if (code === 13) {
controls.focusFirstMenuItem.call(player, null, true);
-
return;
} // Prevent scroll
@@ -11573,19 +11397,22 @@ typeof navigator === "object" && (function (global, factory) {
}, null, false // Can't be passive as we're preventing default
); // Escape closes menu
- this.bind(elements.settings.menu, 'keydown', function (event) {
+
+ _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) {
+
+ _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) {
+
+ _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';
@@ -11612,17 +11439,18 @@ typeof navigator === "object" && (function (global, factory) {
// 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 _this3.bind(input, inputEvent, function (event) {
+ return _this.bind(input, inputEvent, function (event) {
return repaint(event.target);
});
});
} // Seek
- this.bind(elements.inputs.seek, inputEvent, function (event) {
+ _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');
@@ -11635,12 +11463,14 @@ typeof navigator === "object" && (function (global, factory) {
player.currentTime = seekTo / seek.max * player.duration;
}, 'seek'); // Seek tooltip
- this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+
+ _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
return controls.updateSeekTooltip.call(player, event);
}); // Preview thumbnails plugin
// TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this
- this.bind(elements.progress, 'mousemove touchmove', function (event) {
+
+ _this.bind(elements.progress, 'mousemove touchmove', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -11648,7 +11478,8 @@ typeof navigator === "object" && (function (global, factory) {
}
}); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
- this.bind(elements.progress, 'mouseleave touchend click', function () {
+
+ _this.bind(elements.progress, 'mouseleave touchend click', function () {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -11656,14 +11487,16 @@ typeof navigator === "object" && (function (global, factory) {
}
}); // Show scrubbing preview
- this.bind(elements.progress, 'mousedown touchstart', function (event) {
+
+ _this.bind(elements.progress, 'mousedown touchstart', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
previewThumbnails.startScrubbing(event);
}
});
- this.bind(elements.progress, 'mouseup touchend', function (event) {
+
+ _this.bind(elements.progress, 'mouseup touchend', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -11671,9 +11504,10 @@ typeof navigator === "object" && (function (global, factory) {
}
}); // Polyfill for lower fill in <input type="range"> for webkit
+
if (browser.isWebkit) {
Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
- _this3.bind(element, 'input', function (event) {
+ _this.bind(element, 'input', function (event) {
return controls.updateRangeFill.call(player, event.target);
});
});
@@ -11682,43 +11516,45 @@ typeof navigator === "object" && (function (global, factory) {
if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
- this.bind(elements.display.currentTime, 'click', function () {
+ _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) {
+ _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) {
+
+ _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
elements.controls.hover = !player.touch && event.type === 'mouseenter';
}); // Also update controls.hover state for any non-player children of fullscreen element (as above)
+
if (elements.fullscreen) {
Array.from(elements.fullscreen.children).filter(function (c) {
return !c.contains(elements.container);
}).forEach(function (child) {
- _this3.bind(child, 'mouseenter mouseleave', function (event) {
+ _this.bind(child, '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) {
+ _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
}); // Show controls when they receive focus (e.g., when using keyboard tab key)
- this.bind(elements.controls, 'focusin', function () {
+
+ _this.bind(elements.controls, 'focusin', function () {
var config = player.config,
timers = player.timers; // Skip transition to prevent focus from scrolling the parent element
@@ -11730,7 +11566,7 @@ typeof navigator === "object" && (function (global, factory) {
toggleClass(elements.controls, config.classNames.noTransition, false);
}, 0); // Delay a little more for mouse users
- var delay = _this3.touch ? 3000 : 4000; // Clear timer
+ var delay = _this.touch ? 3000 : 4000; // Clear timer
clearTimeout(timers.controls); // Hide again after delay
@@ -11739,7 +11575,8 @@ typeof navigator === "object" && (function (global, factory) {
}, delay);
}); // Mouse wheel for volume
- this.bind(elements.inputs.volume, 'wheel', function (event) {
+
+ _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
@@ -11762,7 +11599,166 @@ typeof navigator === "object" && (function (global, factory) {
event.preventDefault();
}
}, 'volume', false);
- }
+ });
+
+ 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$1(focused, editable)) {
+ return;
+ }
+
+ if (event.which === 32 && matches$1(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) {
+ silencePromise(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;
+ } // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+
+
+ if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
+ 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
+
}]);
return Listeners;
@@ -12216,7 +12212,7 @@ typeof navigator === "object" && (function (global, factory) {
var src = format(player.config.urls.vimeo.iframe, id, params);
iframe.setAttribute('src', src);
iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required
+ iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required
if (!is$1.empty(referrerPolicy)) {
iframe.setAttribute('referrerPolicy', referrerPolicy);
@@ -12972,135 +12968,84 @@ typeof navigator === "object" && (function (global, factory) {
_classCallCheck(this, Ads);
- this.player = player;
- this.config = player.config.ads;
- 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) {
+ _defineProperty(this, "load", function () {
+ if (!_this.enabled) {
return;
} // 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();
+ loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {
+ _this.ready();
}).catch(function () {
// Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
+ _this.trigger('error', new Error('Google IMA SDK failed to load'));
});
} else {
- this.ready();
+ _this.ready();
}
- }
- /**
- * Get the ads instance ready
- */
-
- }, {
- key: "ready",
- value: function ready() {
- var _this3 = this;
+ });
+ _defineProperty(this, "ready", function () {
// Double check we're enabled
- if (!this.enabled) {
- destroy(this);
+ if (!_this.enabled) {
+ destroy(_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.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
+
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
+ _this.managerPromise.then(function () {
+ _this.clearSafetyTimer('onAdsManagerLoaded()');
}); // Set listeners on the Plyr instance
- this.listeners(); // Setup the IMA SDK
- this.setupIMA();
- } // Build the tag URL
+ _this.listeners(); // Setup the IMA SDK
- }, {
- 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() {
- var _this4 = this;
+ _this.setupIMA();
+ });
+ _defineProperty(this, "setupIMA", function () {
// Create the container for our advertisements
- this.elements.container = createElement('div', {
- class: this.player.config.classNames.ads
+ _this.elements.container = createElement('div', {
+ class: _this.player.config.classNames.ads
});
- this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
+
+ _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); // Set playback for iOS10+
+ google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+
- google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
+ google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // 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, this.player.media); // Create ads loader
+ _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
+ _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);
+ _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this.onAdsManagerLoaded(event);
}, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
+
+ _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}, false); // Request video ads to be pre-loaded
- this.requestAds();
- }
- /**
- * Request advertisements
- */
- }, {
- key: "requestAds",
- value: function requestAds() {
- var container = this.player.elements.container;
+ _this.requestAds();
+ });
+
+ _defineProperty(this, "requestAds", function () {
+ var container = _this.player.elements.container;
try {
// Request video ads
var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
+ 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;
@@ -13110,51 +13055,38 @@ typeof navigator === "object" && (function (global, factory) {
request.forceNonLinearFullSlot = false; // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
- this.loader.requestAds(request);
+ request.setAdWillPlayMuted(!_this.player.muted);
+
+ _this.loader.requestAds(request);
} catch (e) {
- this.onAdError(e);
+ _this.onAdError(e);
}
- }
- /**
- * Update the ad countdown
- * @param {Boolean} start
- */
-
- }, {
- key: "pollCountdown",
- value: function pollCountdown() {
- var _this5 = this;
+ });
+ _defineProperty(this, "pollCountdown", function () {
var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
+ 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);
+ var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));
+ var label = "".concat(i18n.get('advertisement', _this.player.config), " - ").concat(time);
- _this5.elements.container.setAttribute('data-badge-text', label);
+ _this.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;
+ _this.countdownTimer = setInterval(update, 100);
+ });
+ _defineProperty(this, "onAdsManagerLoaded", function (event) {
// Load could occur after a source change (race condition)
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
} // Get the ads manager
@@ -13165,38 +13097,36 @@ typeof navigator === "object" && (function (global, factory) {
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.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 listeners to the required events
+ _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events
// Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
+ _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}); // Advertisement regular events
+
Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
- return _this6.onAdEvent(e);
+ _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
+ return _this.onAdEvent(e);
});
}); // Resolve our adsManager
- this.trigger('loaded');
- }
- }, {
- key: "addCuePoints",
- value: function addCuePoints() {
- var _this7 = this;
+ _this.trigger('loaded');
+ });
+ _defineProperty(this, "addCuePoints", function () {
// 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 < _this7.player.duration) {
- var seekElement = _this7.player.elements.progress;
+ if (!is$1.empty(_this.cuePoints)) {
+ _this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {
+ var seekElement = _this.player.elements.progress;
if (is$1.element(seekElement)) {
- var cuePercentage = 100 / _this7.player.duration * cuePoint;
+ var cuePercentage = 100 / _this.player.duration * cuePoint;
var cue = createElement('span', {
- class: _this7.player.config.classNames.cues
+ class: _this.player.config.classNames.cues
});
cue.style.left = "".concat(cuePercentage.toString(), "%");
seekElement.appendChild(cue);
@@ -13204,27 +13134,17 @@ typeof navigator === "object" && (function (global, factory) {
}
});
}
- }
- /**
- * 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 _this8 = this;
+ });
- var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ _defineProperty(this, "onAdEvent", function (event) {
+ 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();
var adData = event.getAdData(); // Proxy event
var dispatchEvent = function dispatchEvent(type) {
- triggerEvent.call(_this8.player, _this8.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
+ triggerEvent.call(_this.player, _this.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
}; // Bubble the event
@@ -13234,9 +13154,10 @@ typeof navigator === "object" && (function (global, factory) {
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'); // Start countdown
+ _this.trigger('loaded'); // Start countdown
- this.pollCountdown(true);
+
+ _this.pollCountdown(true);
if (!ad.isLinear()) {
// Position AdDisplayContainer correctly for overlay
@@ -13250,7 +13171,8 @@ typeof navigator === "object" && (function (global, factory) {
case google.ima.AdEvent.Type.STARTED:
// Set volume to match player
- this.manager.setVolume(this.player.volume);
+ _this.manager.setVolume(_this.player.volume);
+
break;
case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
@@ -13277,11 +13199,11 @@ typeof navigator === "object" && (function (global, factory) {
// };
// 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
- if (this.player.ended) {
- this.loadAds();
+ if (_this.player.ended) {
+ _this.loadAds();
} else {
// The SDK won't allow new ads to be called without receiving a contentComplete()
- this.loader.contentComplete();
+ _this.loader.contentComplete();
}
break;
@@ -13290,7 +13212,8 @@ typeof navigator === "object" && (function (global, factory) {
// 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
- this.pauseContent();
+ _this.pauseContent();
+
break;
case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
@@ -13298,275 +13221,237 @@ typeof navigator === "object" && (function (global, factory) {
// 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
- this.pollCountdown();
- this.resumeContent();
+ _this.pollCountdown();
+
+ _this.resumeContent();
+
break;
case google.ima.AdEvent.Type.LOG:
if (adData.adError) {
- this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
+ _this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
}
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
- */
+ _defineProperty(this, "onAdError", function (event) {
+ _this.cancel();
- }, {
- key: "listeners",
- value: function listeners() {
- var _this9 = this;
+ _this.player.debug.warn('Ads error', event);
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "listeners", function () {
+ var container = _this.player.elements.container;
var time;
- this.player.on('canplay', function () {
- _this9.addCuePoints();
+
+ _this.player.on('canplay', function () {
+ _this.addCuePoints();
});
- this.player.on('ended', function () {
- _this9.loader.contentComplete();
+
+ _this.player.on('ended', function () {
+ _this.loader.contentComplete();
});
- this.player.on('timeupdate', function () {
- time = _this9.player.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ time = _this.player.currentTime;
});
- this.player.on('seeked', function () {
- var seekedTime = _this9.player.currentTime;
- if (is$1.empty(_this9.cuePoints)) {
+ _this.player.on('seeked', function () {
+ var seekedTime = _this.player.currentTime;
+
+ if (is$1.empty(_this.cuePoints)) {
return;
}
- _this9.cuePoints.forEach(function (cuePoint, index) {
+ _this.cuePoints.forEach(function (cuePoint, index) {
if (time < cuePoint && cuePoint < seekedTime) {
- _this9.manager.discardAdBreak();
+ _this.manager.discardAdBreak();
- _this9.cuePoints.splice(index, 1);
+ _this.cuePoints.splice(index, 1);
}
});
}); // Listen to the resizing of the window. And resize ad accordingly
// TODO: eventually implement ResizeObserver
+
window.addEventListener('resize', function () {
- if (_this9.manager) {
- _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ if (_this.manager) {
+ _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
}
});
- }
- /**
- * Initialize the adsManager and start playing advertisements
- */
-
- }, {
- key: "play",
- value: function play() {
- var _this10 = this;
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "play", function () {
+ var container = _this.player.elements.container;
- if (!this.managerPromise) {
- this.resumeContent();
+ if (!_this.managerPromise) {
+ _this.resumeContent();
} // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Set volume to match player
- _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices
+ _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices
- _this10.elements.displayContainer.initialize();
+ _this.elements.displayContainer.initialize();
try {
- if (!_this10.initialized) {
+ if (!_this.initialized) {
// Initialize the ads manager. Ad rules playlist will start at this time
- _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
+ _this.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
- _this10.manager.start();
+ _this.manager.start();
}
- _this10.initialized = true;
+ _this.initialized = true;
} catch (adError) {
// An error may be thrown if there was a problem with the
// VAST response
- _this10.onAdError(adError);
+ _this.onAdError(adError);
}
}).catch(function () {});
- }
- /**
- * Resume our video
- */
+ });
- }, {
- key: "resumeContent",
- value: function resumeContent() {
+ _defineProperty(this, "resumeContent", function () {
// Hide the advertisement container
- this.elements.container.style.zIndex = ''; // Ad is stopped
+ _this.elements.container.style.zIndex = ''; // Ad is stopped
- this.playing = false; // Play video
+ _this.playing = false; // Play video
- silencePromise(this.player.media.play());
- }
- /**
- * Pause our video
- */
+ silencePromise(_this.player.media.play());
+ });
- }, {
- key: "pauseContent",
- value: function pauseContent() {
+ _defineProperty(this, "pauseContent", function () {
// Show the advertisement container
- this.elements.container.style.zIndex = 3; // Ad is playing
+ _this.elements.container.style.zIndex = 3; // Ad is playing
- this.playing = true; // Pause our video.
+ _this.playing = true; // Pause our video.
- this.player.media.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
- */
+ _this.player.media.pause();
+ });
- }, {
- key: "cancel",
- value: function cancel() {
+ _defineProperty(this, "cancel", function () {
// Pause our video
- if (this.initialized) {
- this.resumeContent();
+ if (_this.initialized) {
+ _this.resumeContent();
} // Tell our instance that we're done for now
- this.trigger('error'); // Re-create our adsManager
+ _this.trigger('error'); // Re-create our adsManager
- this.loadAds();
- }
- /**
- * Re-create our adsManager
- */
- }, {
- key: "loadAds",
- value: function loadAds() {
- var _this11 = this;
+ _this.loadAds();
+ });
+ _defineProperty(this, "loadAds", function () {
// Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Destroy our adsManager
- if (_this11.manager) {
- _this11.manager.destroy();
+ if (_this.manager) {
+ _this.manager.destroy();
} // Re-set our adsManager promises
- _this11.managerPromise = new Promise(function (resolve) {
- _this11.on('loaded', resolve);
+ _this.managerPromise = new Promise(function (resolve) {
+ _this.on('loaded', resolve);
- _this11.player.debug.log(_this11.manager);
+ _this.player.debug.log(_this.manager);
}); // Now that the manager has been destroyed set it to also be un-initialized
- _this11.initialized = false; // Now request some new advertisements
+ _this.initialized = false; // Now request some new advertisements
- _this11.requestAds();
+ _this.requestAds();
}).catch(function () {});
- }
- /**
- * Handles callbacks after an ad event was invoked
- * @param {String} event - Event type
- */
-
- }, {
- key: "trigger",
- value: function trigger(event) {
- var _this12 = this;
+ });
+ _defineProperty(this, "trigger", function (event) {
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];
+ var handlers = _this.events[event];
if (is$1.array(handlers)) {
handlers.forEach(function (handler) {
if (is$1.function(handler)) {
- handler.apply(_this12, args);
+ handler.apply(_this, args);
}
});
}
- }
- /**
- * Add event listeners
- * @param {String} event - Event type
- * @param {Function} callback - Callback for when event occurs
- * @return {Ads}
- */
+ });
- }, {
- key: "on",
- value: function on(event, callback) {
- if (!is$1.array(this.events[event])) {
- this.events[event] = [];
+ _defineProperty(this, "on", function (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
- */
+ _this.events[event].push(callback);
- }, {
- key: "startSafetyTimer",
- value: function startSafetyTimer(time, from) {
- var _this13 = this;
+ return _this;
+ });
- this.player.debug.log("Safety timer invoked from: ".concat(from));
- this.safetyTimer = setTimeout(function () {
- _this13.cancel();
+ _defineProperty(this, "startSafetyTimer", function (time, from) {
+ _this.player.debug.log("Safety timer invoked from: ".concat(from));
- _this13.clearSafetyTimer('startSafetyTimer()');
+ _this.safetyTimer = setTimeout(function () {
+ _this.cancel();
+
+ _this.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;
+ _defineProperty(this, "clearSafetyTimer", function (from) {
+ if (!is$1.nullOrUndefined(_this.safetyTimer)) {
+ _this.player.debug.log("Safety timer cleared from: ".concat(from));
+
+ clearTimeout(_this.safetyTimer);
+ _this.safetyTimer = null;
}
- }
- }, {
+ });
+
+ this.player = player;
+ this.config = player.config.ads;
+ 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: "enabled",
get: function get() {
var config = this.config;
return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));
}
+ /**
+ * Load the IMA SDK
+ */
+
}, {
key: "tagUrl",
+ // Build the tag URL
get: function get() {
var config = this.config;
@@ -13586,6 +13471,15 @@ typeof navigator === "object" && (function (global, factory) {
var base = 'https://go.aniview.com/api/adserver6/vast/';
return "".concat(base, "?").concat(buildUrlParams(params));
}
+ /**
+ * 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.
+ */
+
}]);
return Ads;
@@ -13719,36 +13613,21 @@ typeof navigator === "object" && (function (global, factory) {
* @return {PreviewThumbnails}
*/
function PreviewThumbnails(player) {
- _classCallCheck(this, PreviewThumbnails);
-
- this.player = player;
- this.thumbnails = [];
- this.loaded = false;
- this.lastMouseMoveTime = Date.now();
- this.mouseDown = false;
- this.loadedImages = [];
- this.elements = {
- thumb: {},
- scrubbing: {}
- };
- this.load();
- }
+ var _this = this;
- _createClass(PreviewThumbnails, [{
- key: "load",
- value: function load() {
- var _this = this;
+ _classCallCheck(this, PreviewThumbnails);
+ _defineProperty(this, "load", function () {
// Toggle the regular seek tooltip
- if (this.player.elements.display.seekTooltip) {
- this.player.elements.display.seekTooltip.hidden = this.enabled;
+ if (_this.player.elements.display.seekTooltip) {
+ _this.player.elements.display.seekTooltip.hidden = _this.enabled;
}
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
}
- this.getThumbnails().then(function () {
+ _this.getThumbnails().then(function () {
if (!_this.enabled) {
return;
} // Render DOM elements
@@ -13761,15 +13640,11 @@ typeof navigator === "object" && (function (global, factory) {
_this.loaded = true;
});
- } // Download VTT files and parse them
-
- }, {
- key: "getThumbnails",
- value: function getThumbnails() {
- var _this2 = this;
+ });
+ _defineProperty(this, "getThumbnails", function () {
return new Promise(function (resolve) {
- var src = _this2.player.config.previewThumbnails.src;
+ var src = _this.player.config.previewThumbnails.src;
if (is$1.empty(src)) {
throw new Error('Missing previewThumbnails.src config attribute');
@@ -13778,11 +13653,11 @@ typeof navigator === "object" && (function (global, factory) {
var sortAndResolve = function sortAndResolve() {
// Sort smallest to biggest (e.g., [120p, 480p, 1080p])
- _this2.thumbnails.sort(function (x, y) {
+ _this.thumbnails.sort(function (x, y) {
return x.height - y.height;
});
- _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
+ _this.player.debug.log('Preview thumbnails', _this.thumbnails);
resolve();
}; // Via callback()
@@ -13790,7 +13665,7 @@ typeof navigator === "object" && (function (global, factory) {
if (is$1.function(src)) {
src(function (thumbnails) {
- _this2.thumbnails = thumbnails;
+ _this.thumbnails = thumbnails;
sortAndResolve();
});
} // VTT urls
@@ -13799,19 +13674,15 @@ typeof navigator === "object" && (function (global, factory) {
var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
var promises = urls.map(function (u) {
- return _this2.getThumbnail(u);
+ return _this.getThumbnail(u);
}); // Resolve
Promise.all(promises).then(sortAndResolve);
}
});
- } // Process individual VTT file
-
- }, {
- key: "getThumbnail",
- value: function getThumbnail(url) {
- var _this3 = this;
+ });
+ _defineProperty(this, "getThumbnail", function (url) {
return new Promise(function (resolve) {
fetch(url).then(function (response) {
var thumbnail = {
@@ -13833,7 +13704,7 @@ typeof navigator === "object" && (function (global, factory) {
thumbnail.height = tempImage.naturalHeight;
thumbnail.width = tempImage.naturalWidth;
- _this3.thumbnails.push(thumbnail);
+ _this.thumbnails.push(thumbnail);
resolve();
};
@@ -13841,11 +13712,10 @@ typeof navigator === "object" && (function (global, factory) {
tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;
});
});
- }
- }, {
- key: "startMove",
- value: function startMove(event) {
- if (!this.loaded) {
+ });
+
+ _defineProperty(this, "startMove", function (event) {
+ if (!_this.loaded) {
return;
}
@@ -13854,163 +13724,153 @@ typeof navigator === "object" && (function (global, factory) {
} // Wait until media has a duration
- if (!this.player.media.duration) {
+ if (!_this.player.media.duration) {
return;
}
if (event.type === 'touchmove') {
// Calculate seek hover position as approx video seconds
- this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
+ _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);
} else {
// Calculate seek hover position as approx video seconds
- var clientRect = this.player.elements.progress.getBoundingClientRect();
+ var clientRect = _this.player.elements.progress.getBoundingClientRect();
+
var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);
- this.seekTime = this.player.media.duration * (percentage / 100);
+ _this.seekTime = _this.player.media.duration * (percentage / 100);
- if (this.seekTime < 0) {
+ if (_this.seekTime < 0) {
// The mousemove fires for 10+px out to the left
- this.seekTime = 0;
+ _this.seekTime = 0;
}
- if (this.seekTime > this.player.media.duration - 1) {
+ if (_this.seekTime > _this.player.media.duration - 1) {
// Took 1 second off the duration for safety, because different players can disagree on the real duration of a video
- this.seekTime = this.player.media.duration - 1;
+ _this.seekTime = _this.player.media.duration - 1;
}
- this.mousePosX = event.pageX; // Set time text inside image container
+ _this.mousePosX = event.pageX; // Set time text inside image container
- this.elements.thumb.time.innerText = formatTime(this.seekTime);
+ _this.elements.thumb.time.innerText = formatTime(_this.seekTime);
} // Download and show image
- this.showImageAtCurrentTime();
- }
- }, {
- key: "endMove",
- value: function endMove() {
- this.toggleThumbContainer(false, true);
- }
- }, {
- key: "startScrubbing",
- value: function startScrubbing(event) {
+ _this.showImageAtCurrentTime();
+ });
+
+ _defineProperty(this, "endMove", function () {
+ _this.toggleThumbContainer(false, true);
+ });
+
+ _defineProperty(this, "startScrubbing", function (event) {
// Only act on left mouse button (0), or touch device (event.button does not exist or is false)
if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {
- this.mouseDown = true; // Wait until media has a duration
+ _this.mouseDown = true; // Wait until media has a duration
+
+ if (_this.player.media.duration) {
+ _this.toggleScrubbingContainer(true);
- if (this.player.media.duration) {
- this.toggleScrubbingContainer(true);
- this.toggleThumbContainer(false, true); // Download and show image
+ _this.toggleThumbContainer(false, true); // Download and show image
- this.showImageAtCurrentTime();
+
+ _this.showImageAtCurrentTime();
}
}
- }
- }, {
- key: "endScrubbing",
- value: function endScrubbing() {
- var _this4 = this;
+ });
- this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
+ _defineProperty(this, "endScrubbing", function () {
+ _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
- if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {
+ if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {
// The video was already seeked/loaded at the chosen time - hide immediately
- this.toggleScrubbingContainer(false);
+ _this.toggleScrubbingContainer(false);
} else {
// The video hasn't seeked yet. Wait for that
- once.call(this.player, this.player.media, 'timeupdate', function () {
+ once.call(_this.player, _this.player.media, 'timeupdate', function () {
// Re-check mousedown - we might have already started scrubbing again
- if (!_this4.mouseDown) {
- _this4.toggleScrubbingContainer(false);
+ if (!_this.mouseDown) {
+ _this.toggleScrubbingContainer(false);
}
});
}
- }
- /**
- * Setup hooks for Plyr and window events
- */
-
- }, {
- key: "listeners",
- value: function listeners() {
- var _this5 = this;
+ });
+ _defineProperty(this, "listeners", function () {
// Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
- this.player.on('play', function () {
- _this5.toggleThumbContainer(false, true);
+ _this.player.on('play', function () {
+ _this.toggleThumbContainer(false, true);
});
- this.player.on('seeked', function () {
- _this5.toggleThumbContainer(false);
+
+ _this.player.on('seeked', function () {
+ _this.toggleThumbContainer(false);
});
- this.player.on('timeupdate', function () {
- _this5.lastTime = _this5.player.media.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ _this.lastTime = _this.player.media.currentTime;
});
- }
- /**
- * Create HTML elements for image containers
- */
+ });
- }, {
- key: "render",
- value: function render() {
+ _defineProperty(this, "render", function () {
// Create HTML element: plyr__preview-thumbnail-container
- this.elements.thumb.container = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.thumbContainer
+ _this.elements.thumb.container = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.thumbContainer
}); // Wrapper for the image for styling
- this.elements.thumb.imageContainer = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.imageContainer
+ _this.elements.thumb.imageContainer = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.imageContainer
});
- this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
+ _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
var timeContainer = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.timeContainer
+ class: _this.player.config.classNames.previewThumbnails.timeContainer
});
- this.elements.thumb.time = createElement('span', {}, '00:00');
- timeContainer.appendChild(this.elements.thumb.time);
- this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+ _this.elements.thumb.time = createElement('span', {}, '00:00');
+ timeContainer.appendChild(_this.elements.thumb.time);
+
+ _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+
- if (is$1.element(this.player.elements.progress)) {
- this.player.elements.progress.appendChild(this.elements.thumb.container);
+ if (is$1.element(_this.player.elements.progress)) {
+ _this.player.elements.progress.appendChild(_this.elements.thumb.container);
} // Create HTML element: plyr__preview-scrubbing-container
- this.elements.scrubbing.container = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.scrubbingContainer
+ _this.elements.scrubbing.container = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.scrubbingContainer
});
- this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
- }
- }, {
- key: "destroy",
- value: function destroy() {
- if (this.elements.thumb.container) {
- this.elements.thumb.container.remove();
+
+ _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);
+ });
+
+ _defineProperty(this, "destroy", function () {
+ if (_this.elements.thumb.container) {
+ _this.elements.thumb.container.remove();
}
- if (this.elements.scrubbing.container) {
- this.elements.scrubbing.container.remove();
+ if (_this.elements.scrubbing.container) {
+ _this.elements.scrubbing.container.remove();
}
- }
- }, {
- key: "showImageAtCurrentTime",
- value: function showImageAtCurrentTime() {
- var _this6 = this;
+ });
- if (this.mouseDown) {
- this.setScrubbingContainerSize();
+ _defineProperty(this, "showImageAtCurrentTime", function () {
+ if (_this.mouseDown) {
+ _this.setScrubbingContainerSize();
} else {
- this.setThumbContainerSizeAndPos();
+ _this.setThumbContainerSizeAndPos();
} // Find the desired thumbnail index
// TODO: Handle a video longer than the thumbs where thumbNum is null
- var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {
- return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;
+ var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {
+ return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;
});
+
var hasThumb = thumbNum >= 0;
var qualityIndex = 0; // Show the thumb container if we're not scrubbing
- if (!this.mouseDown) {
- this.toggleThumbContainer(hasThumb);
+ if (!_this.mouseDown) {
+ _this.toggleThumbContainer(hasThumb);
} // No matching thumb found
@@ -14019,36 +13879,34 @@ typeof navigator === "object" && (function (global, factory) {
} // Check to see if we've already downloaded higher quality versions of this image
- this.thumbnails.forEach(function (thumbnail, index) {
- if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
+ _this.thumbnails.forEach(function (thumbnail, index) {
+ if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
qualityIndex = index;
}
}); // Only proceed if either thumbnum or thumbfilename has changed
- if (thumbNum !== this.showingThumb) {
- this.showingThumb = thumbNum;
- this.loadImage(qualityIndex);
- }
- } // Show the image that's currently specified in this.showingThumb
- }, {
- key: "loadImage",
- value: function loadImage() {
- var _this7 = this;
+ if (thumbNum !== _this.showingThumb) {
+ _this.showingThumb = thumbNum;
+
+ _this.loadImage(qualityIndex);
+ }
+ });
+ _defineProperty(this, "loadImage", function () {
var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var thumbNum = this.showingThumb;
- var thumbnail = this.thumbnails[qualityIndex];
+ var thumbNum = _this.showingThumb;
+ var thumbnail = _this.thumbnails[qualityIndex];
var urlPrefix = thumbnail.urlPrefix;
var frame = thumbnail.frames[thumbNum];
var thumbFilename = thumbnail.frames[thumbNum].text;
var thumbUrl = urlPrefix + thumbFilename;
- if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {
+ if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {
// If we're already loading a previous image, remove its onload handler - we don't want it to load after this one
// Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort
- if (this.loadingImage && this.usingSprites) {
- this.loadingImage.onload = null;
+ if (_this.loadingImage && _this.usingSprites) {
+ _this.loadingImage.onload = null;
} // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image
// is instead used. But this causes issues with larger images in Firefox and Safari - switching between background
// images causes a flicker. Putting a new image over the top does not
@@ -14058,56 +13916,59 @@ typeof navigator === "object" && (function (global, factory) {
previewImage.src = thumbUrl;
previewImage.dataset.index = thumbNum;
previewImage.dataset.filename = thumbFilename;
- this.showingThumbFilename = thumbFilename;
- this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+ _this.showingThumbFilename = thumbFilename;
+
+ _this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+
previewImage.onload = function () {
- return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
+ return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
};
- this.loadingImage = previewImage;
- this.removeOldImages(previewImage);
+ _this.loadingImage = previewImage;
+
+ _this.removeOldImages(previewImage);
} else {
// Update the existing image
- this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
- this.currentImageElement.dataset.index = thumbNum;
- this.removeOldImages(this.currentImageElement);
+ _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
+
+ _this.currentImageElement.dataset.index = thumbNum;
+
+ _this.removeOldImages(_this.currentImageElement);
}
- }
- }, {
- key: "showImage",
- value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
+ });
+
+ _defineProperty(this, "showImage", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
- this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
- this.setImageSizeAndOffset(previewImage, frame);
+
+ _this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
+
+ _this.setImageSizeAndOffset(previewImage, frame);
if (newImage) {
- this.currentImageContainer.appendChild(previewImage);
- this.currentImageElement = previewImage;
+ _this.currentImageContainer.appendChild(previewImage);
+
+ _this.currentImageElement = previewImage;
- if (!this.loadedImages.includes(thumbFilename)) {
- this.loadedImages.push(thumbFilename);
+ if (!_this.loadedImages.includes(thumbFilename)) {
+ _this.loadedImages.push(thumbFilename);
}
} // Preload images before and after the current one
// Show higher quality of the same frame
// Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
- this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
- } // Remove all preview images that aren't the designated current image
-
- }, {
- key: "removeOldImages",
- value: function removeOldImages(currentImage) {
- var _this8 = this;
+ _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
+ });
+ _defineProperty(this, "removeOldImages", function (currentImage) {
// Get a list of all images, convert it from a DOM list to an array
- Array.from(this.currentImageContainer.children).forEach(function (image) {
+ Array.from(_this.currentImageContainer.children).forEach(function (image) {
if (image.tagName.toLowerCase() !== 'img') {
return;
}
- var removeDelay = _this8.usingSprites ? 500 : 1000;
+ var removeDelay = _this.usingSprites ? 500 : 1000;
if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {
// Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients
@@ -14115,35 +13976,30 @@ typeof navigator === "object" && (function (global, factory) {
// eslint-disable-next-line no-param-reassign
image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub
- var currentImageContainer = _this8.currentImageContainer;
+ var currentImageContainer = _this.currentImageContainer;
setTimeout(function () {
currentImageContainer.removeChild(image);
- _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
+ _this.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
}, removeDelay);
}
});
- } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
- // This will only preload the lowest quality
-
- }, {
- key: "preloadNearby",
- value: function preloadNearby(thumbNum) {
- var _this9 = this;
+ });
+ _defineProperty(this, "preloadNearby", function (thumbNum) {
var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return new Promise(function (resolve) {
setTimeout(function () {
- var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;
+ var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;
- if (_this9.showingThumbFilename === oldThumbFilename) {
+ if (_this.showingThumbFilename === oldThumbFilename) {
// Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away
var thumbnailsClone;
if (forward) {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);
+ thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);
} else {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();
+ thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();
}
var foundOne = false;
@@ -14152,20 +14008,20 @@ typeof navigator === "object" && (function (global, factory) {
if (newThumbFilename !== oldThumbFilename) {
// Found one with a different filename. Make sure it hasn't already been loaded on this page visit
- if (!_this9.loadedImages.includes(newThumbFilename)) {
+ if (!_this.loadedImages.includes(newThumbFilename)) {
foundOne = true;
- _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
- var urlPrefix = _this9.thumbnails[0].urlPrefix;
+ var urlPrefix = _this.thumbnails[0].urlPrefix;
var thumbURL = urlPrefix + newThumbFilename;
var previewImage = new Image();
previewImage.src = thumbURL;
previewImage.onload = function () {
- _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
- if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
+ if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
resolve();
};
@@ -14179,97 +14035,91 @@ typeof navigator === "object" && (function (global, factory) {
}
}, 300);
});
- } // If user has been hovering current image for half a second, look for a higher quality one
-
- }, {
- key: "getHigherQuality",
- value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {
- var _this10 = this;
+ });
- if (currentQualityIndex < this.thumbnails.length - 1) {
+ _defineProperty(this, "getHigherQuality", function (currentQualityIndex, previewImage, frame, thumbFilename) {
+ if (currentQualityIndex < _this.thumbnails.length - 1) {
// Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
var previewImageHeight = previewImage.naturalHeight;
- if (this.usingSprites) {
+ if (_this.usingSprites) {
previewImageHeight = frame.h;
}
- if (previewImageHeight < this.thumbContainerHeight) {
+ if (previewImageHeight < _this.thumbContainerHeight) {
// Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while
setTimeout(function () {
// Make sure the mouse hasn't already moved on and started hovering at another image
- if (_this10.showingThumbFilename === thumbFilename) {
- _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
+ if (_this.showingThumbFilename === thumbFilename) {
+ _this.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
- _this10.loadImage(currentQualityIndex + 1);
+ _this.loadImage(currentQualityIndex + 1);
}
}, 300);
}
}
- }
- }, {
- key: "toggleThumbContainer",
- value: function toggleThumbContainer() {
+ });
+
+ _defineProperty(this, "toggleThumbContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;
- this.elements.thumb.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;
+
+ _this.elements.thumb.container.classList.toggle(className, toggle);
if (!toggle && clearShowing) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "toggleScrubbingContainer",
- value: function toggleScrubbingContainer() {
+ });
+
+ _defineProperty(this, "toggleScrubbingContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
- this.elements.scrubbing.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
+
+ _this.elements.scrubbing.container.classList.toggle(className, toggle);
if (!toggle) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "determineContainerAutoSizing",
- value: function determineContainerAutoSizing() {
- if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {
+ });
+
+ _defineProperty(this, "determineContainerAutoSizing", function () {
+ if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {
// This will prevent auto sizing in this.setThumbContainerSizeAndPos()
- this.sizeSpecifiedInCSS = true;
+ _this.sizeSpecifiedInCSS = true;
}
- } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
+ });
- }, {
- key: "setThumbContainerSizeAndPos",
- value: function setThumbContainerSizeAndPos() {
- if (!this.sizeSpecifiedInCSS) {
- var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px");
- this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {
- var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);
+ _defineProperty(this, "setThumbContainerSizeAndPos", function () {
+ if (!_this.sizeSpecifiedInCSS) {
+ var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(_this.thumbContainerHeight, "px");
+ _this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {
+ var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {
- var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
+ _this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {
+ var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
}
- this.setThumbContainerPos();
- }
- }, {
- key: "setThumbContainerPos",
- value: function setThumbContainerPos() {
- var seekbarRect = this.player.elements.progress.getBoundingClientRect();
- var plyrRect = this.player.elements.container.getBoundingClientRect();
- var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
+ _this.setThumbContainerPos();
+ });
+
+ _defineProperty(this, "setThumbContainerPos", function () {
+ var seekbarRect = _this.player.elements.progress.getBoundingClientRect();
+
+ var plyrRect = _this.player.elements.container.getBoundingClientRect();
+
+ var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
var minVal = plyrRect.left - seekbarRect.left + 10;
var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth
- var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;
+ var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;
if (previewPos < minVal) {
previewPos = minVal;
@@ -14280,31 +14130,27 @@ typeof navigator === "object" && (function (global, factory) {
}
container.style.left = "".concat(previewPos, "px");
- } // Can't use 100% width, in case the video is a different aspect ratio to the video container
+ });
- }, {
- key: "setScrubbingContainerSize",
- value: function setScrubbingContainerSize() {
- var _fitRatio = fitRatio(this.thumbAspectRatio, {
- width: this.player.media.clientWidth,
- height: this.player.media.clientHeight
+ _defineProperty(this, "setScrubbingContainerSize", function () {
+ var _fitRatio = fitRatio(_this.thumbAspectRatio, {
+ width: _this.player.media.clientWidth,
+ height: _this.player.media.clientHeight
}),
width = _fitRatio.width,
height = _fitRatio.height;
- this.elements.scrubbing.container.style.width = "".concat(width, "px");
- this.elements.scrubbing.container.style.height = "".concat(height, "px");
- } // Sprites need to be offset to the correct location
+ _this.elements.scrubbing.container.style.width = "".concat(width, "px");
+ _this.elements.scrubbing.container.style.height = "".concat(height, "px");
+ });
- }, {
- key: "setImageSizeAndOffset",
- value: function setImageSizeAndOffset(previewImage, frame) {
- if (!this.usingSprites) {
+ _defineProperty(this, "setImageSizeAndOffset", function (previewImage, frame) {
+ if (!_this.usingSprites) {
return;
} // Find difference between height and preview container height
- var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
+ var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
previewImage.style.height = "".concat(previewImage.naturalHeight * multiplier, "px"); // eslint-disable-next-line no-param-reassign
@@ -14313,8 +14159,22 @@ typeof navigator === "object" && (function (global, factory) {
previewImage.style.left = "-".concat(frame.x * multiplier, "px"); // eslint-disable-next-line no-param-reassign
previewImage.style.top = "-".concat(frame.y * multiplier, "px");
- }
- }, {
+ });
+
+ this.player = player;
+ this.thumbnails = [];
+ this.loaded = false;
+ this.lastMouseMoveTime = Date.now();
+ this.mouseDown = false;
+ this.loadedImages = [];
+ this.elements = {
+ thumb: {},
+ scrubbing: {}
+ };
+ this.load();
+ }
+
+ _createClass(PreviewThumbnails, [{
key: "enabled",
get: function get() {
return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;
@@ -14560,6 +14420,214 @@ typeof navigator === "object" && (function (global, factory) {
_classCallCheck(this, Plyr);
+ _defineProperty(this, "play", function () {
+ if (!is$1.function(_this.media.play)) {
+ return null;
+ } // Intecept play with ads
+
+
+ if (_this.ads && _this.ads.enabled) {
+ _this.ads.managerPromise.then(function () {
+ return _this.ads.play();
+ }).catch(function () {
+ return silencePromise(_this.media.play());
+ });
+ } // Return the promise (for HTML5)
+
+
+ return _this.media.play();
+ });
+
+ _defineProperty(this, "pause", function () {
+ if (!_this.playing || !is$1.function(_this.media.pause)) {
+ return null;
+ }
+
+ return _this.media.pause();
+ });
+
+ _defineProperty(this, "togglePlay", function (input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is$1.boolean(input) ? input : !_this.playing;
+
+ if (toggle) {
+ return _this.play();
+ }
+
+ return _this.pause();
+ });
+
+ _defineProperty(this, "stop", function () {
+ if (_this.isHTML5) {
+ _this.pause();
+
+ _this.restart();
+ } else if (is$1.function(_this.media.stop)) {
+ _this.media.stop();
+ }
+ });
+
+ _defineProperty(this, "restart", function () {
+ _this.currentTime = 0;
+ });
+
+ _defineProperty(this, "rewind", function (seekTime) {
+ _this.currentTime -= is$1.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "forward", function (seekTime) {
+ _this.currentTime += is$1.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "increaseVolume", function (step) {
+ var volume = _this.media.muted ? 0 : _this.volume;
+ _this.volume = volume + (is$1.number(step) ? step : 0);
+ });
+
+ _defineProperty(this, "decreaseVolume", function (step) {
+ _this.increaseVolume(-step);
+ });
+
+ _defineProperty(this, "airplay", function () {
+ // Show dialog if supported
+ if (support.airplay) {
+ _this.media.webkitShowPlaybackTargetPicker();
+ }
+ });
+
+ _defineProperty(this, "toggleControls", function (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 && is$1.array(_this.config.controls) && _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;
+ });
+
+ _defineProperty(this, "on", function (event, callback) {
+ on.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "once", function (event, callback) {
+ once.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "off", function (event, callback) {
+ off(_this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "destroy", function (callback) {
+ 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
+
+ _this.embed = null; // If it's a soft destroy, make minimal changes
+
+ if (soft) {
+ if (Object.keys(_this.elements).length) {
+ // Remove elements
+ removeElement(_this.elements.buttons.play);
+ removeElement(_this.elements.captions);
+ removeElement(_this.elements.controls);
+ removeElement(_this.elements.wrapper); // Clear for GC
+
+ _this.elements.buttons.play = null;
+ _this.elements.captions = null;
+ _this.elements.controls = null;
+ _this.elements.wrapper = null;
+ } // Callback
+
+
+ if (is$1.function(callback)) {
+ callback();
+ }
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this); // Cancel current network requests
+
+ html5.cancelRequests.call(_this); // Replace the container with the original element provided
+
+ replaceElement(_this.elements.original, _this.elements.container); // Event
+
+ triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback
+
+ if (is$1.function(callback)) {
+ callback.call(_this.elements.original);
+ } // Reset state
+
+
+ _this.ready = false; // Clear for garbage collection
+
+ setTimeout(function () {
+ _this.elements = null;
+ _this.media = null;
+ }, 200);
+ }
+ }; // Stop playback
+
+
+ _this.stop(); // Clear timeouts
+
+
+ clearTimeout(_this.timers.loading);
+ clearTimeout(_this.timers.controls);
+ clearTimeout(_this.timers.resized); // Provider specific stuff
+
+ if (_this.isHTML5) {
+ // 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);
+ }
+ });
+
+ _defineProperty(this, "supports", function (type) {
+ return support.mime.call(_this, type);
+ });
+
this.timers = {}; // State
this.ready = false;
@@ -14656,12 +14724,13 @@ typeof navigator === "object" && (function (global, factory) {
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 _type = this.media.tagName.toLowerCase(); // Embed properties
+
var iframe = null;
var url = null; // Different setup based on type
- switch (type) {
+ switch (_type) {
case 'div':
// Find the frame
iframe = this.media.querySelector('iframe'); // <iframe> type
@@ -14704,7 +14773,7 @@ typeof navigator === "object" && (function (global, factory) {
} // Unsupported or missing provider
- if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ if (is$1.empty(this.provider) || !Object.values(providers).includes(this.provider)) {
this.debug.error('Setup failed: Invalid provider');
return;
} // Audio will come later for external providers
@@ -14715,7 +14784,7 @@ typeof navigator === "object" && (function (global, factory) {
case 'video':
case 'audio':
- this.type = type;
+ this.type = _type;
this.provider = providers.html5; // Get config from attributes
if (this.media.hasAttribute('crossorigin')) {
@@ -14821,139 +14890,6 @@ typeof navigator === "object" && (function (global, factory) {
_createClass(Plyr, [{
- key: "play",
-
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- var _this2 = this;
-
- if (!is$1.function(this.media.play)) {
- return null;
- } // Intecept play with ads
-
-
- if (this.ads && this.ads.enabled) {
- this.ads.managerPromise.then(function () {
- return _this2.ads.play();
- }).catch(function () {
- return silencePromise(_this2.media.play());
- });
- } // 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 null;
- }
-
- 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) {
- return this.play();
- }
-
- return 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 -= 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 += 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",
/**
@@ -14969,202 +14905,6 @@ typeof navigator === "object" && (function (global, factory) {
*/
}, {
- 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 && is$1.array(this.config.controls) && 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 _this3 = 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
-
- _this3.embed = null; // If it's a soft destroy, make minimal changes
-
- if (soft) {
- if (Object.keys(_this3.elements).length) {
- // Remove elements
- removeElement(_this3.elements.buttons.play);
- removeElement(_this3.elements.captions);
- removeElement(_this3.elements.controls);
- removeElement(_this3.elements.wrapper); // Clear for GC
-
- _this3.elements.buttons.play = null;
- _this3.elements.captions = null;
- _this3.elements.controls = null;
- _this3.elements.wrapper = null;
- } // Callback
-
-
- if (is$1.function(callback)) {
- callback();
- }
- } else {
- // Unbind listeners
- unbindListeners.call(_this3); // Cancel current network requests
-
- html5.cancelRequests.call(_this3); // Replace the container with the original element provided
-
- replaceElement(_this3.elements.original, _this3.elements.container); // Event
-
- triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback
-
- if (is$1.function(callback)) {
- callback.call(_this3.elements.original);
- } // Reset state
-
-
- _this3.ready = false; // Clear for garbage collection
-
- setTimeout(function () {
- _this3.elements = null;
- _this3.media = null;
- }, 200);
- }
- }; // Stop playback
-
-
- this.stop(); // Clear timeouts
-
- clearTimeout(this.timers.loading);
- clearTimeout(this.timers.controls);
- clearTimeout(this.timers.resized); // Provider specific stuff
-
- if (this.isHTML5) {
- // 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 {Boolean} inline - Where player has `playsinline` sttribute
- */
-
- }, {
key: "isHTML5",
get: function get() {
return this.provider === providers.html5;
@@ -15194,8 +14934,16 @@ typeof navigator === "object" && (function (global, factory) {
get: function get() {
return this.type === types.audio;
}
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+
}, {
key: "playing",
+
+ /**
+ * Get playing state
+ */
get: function get() {
return Boolean(this.ready && !this.paused && !this.ended);
}
@@ -15226,8 +14974,18 @@ typeof navigator === "object" && (function (global, factory) {
get: function get() {
return Boolean(this.media.ended);
}
+ /**
+ * Toggle playback based on current status
+ * @param {Boolean} input
+ */
+
}, {
key: "currentTime",
+
+ /**
+ * Seek to a time
+ * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
set: function set(input) {
// Bail if media duration isn't available yet
if (!this.duration) {
@@ -15346,8 +15104,18 @@ typeof navigator === "object" && (function (global, factory) {
get: function get() {
return Number(this.media.volume);
}
+ /**
+ * Increase volume
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
+ */
+
}, {
key: "muted",
+
+ /**
+ * Set muted state
+ * @param {Boolean} mute
+ */
set: function set(mute) {
var toggle = mute; // Load muted state from storage
@@ -15399,7 +15167,7 @@ typeof navigator === "object" && (function (global, factory) {
}, {
key: "speed",
set: function set(input) {
- var _this4 = this;
+ var _this2 = this;
var speed = null;
@@ -15423,7 +15191,7 @@ typeof navigator === "object" && (function (global, factory) {
this.config.speed.selected = speed; // Set media speed
setTimeout(function () {
- _this4.media.playbackRate = speed;
+ _this2.media.playbackRate = speed;
}, 0);
}
/**
@@ -15771,8 +15539,20 @@ typeof navigator === "object" && (function (global, factory) {
return this.media === document.pictureInPictureElement;
}
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+
}], [{
key: "supported",
+
+ /**
+ * Check for support
+ * @param {String} type - Player type (audio/video)
+ * @param {String} provider - Provider (html5/youtube/vimeo)
+ * @param {Boolean} inline - Where player has `playsinline` sttribute
+ */
value: function supported(type, provider, inline) {
return support.check(type, provider, inline);
}
diff --git a/dist/plyr.polyfilled.min.js b/dist/plyr.polyfilled.min.js
index 06f918de..0eeb773c 100644
--- a/dist/plyr.polyfilled.min.js
+++ b/dist/plyr.polyfilled.min.js
@@ -1,4 +1,4 @@
-"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):(e="undefined"!=typeof globalThis?globalThis:e||self).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=!!t.bubbles,t.cancelable=!!t.cancelable,(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 globalThis?globalThis:"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=function(e){return e&&e.Math==Math&&e},i=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||function(){return this}()||Function("return this")(),r=function(e){try{return!!e()}catch(e){return!0}},o=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,l={f:s&&!a.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:a},c=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},u={}.toString,h=function(e){return u.call(e).slice(8,-1)},f="".split,d=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==h(e)?f.call(e,""):Object(e)}:Object,p=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},m=function(e){return d(p(e))},g=function(e){return"object"==typeof e?null!==e:"function"==typeof e},v=function(e,t){if(!g(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!g(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!g(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!g(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},w=i.document,k=g(w)&&g(w.createElement),T=function(e){return k?w.createElement(e):{}},S=!o&&!r((function(){return 7!=Object.defineProperty(T("div"),"a",{get:function(){return 7}}).a})),E=Object.getOwnPropertyDescriptor,A={f:o?E:function(e,t){if(e=m(e),t=v(t,!0),S)try{return E(e,t)}catch(e){}if(b(e,t))return c(!l.f.call(e,t),e[t])}},C=function(e){if(!g(e))throw TypeError(String(e)+" is not an object");return e},P=Object.defineProperty,x={f:o?P:function(e,t,n){if(C(e),t=v(t,!0),C(n),S)try{return P(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}},O=o?function(e,t,n){return x.f(e,t,c(1,n))}:function(e,t,n){return e[t]=n,e},I=function(e,t){try{O(i,e,t)}catch(n){i[e]=t}return t},L="__core-js_shared__",j=i[L]||I(L,{}),N=Function.toString;"function"!=typeof j.inspectSource&&(j.inspectSource=function(e){return N.call(e)});var R,M,_,U=j.inspectSource,D=i.WeakMap,F="function"==typeof D&&/native code/.test(U(D)),q=t((function(e){(e.exports=function(e,t){return j[e]||(j[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.7.0",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),H=0,B=Math.random(),V=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++H+B).toString(36)},z=q("keys"),W=function(e){return z[e]||(z[e]=V(e))},K={},$=i.WeakMap;if(F){var Y=j.state||(j.state=new $),G=Y.get,X=Y.has,Q=Y.set;R=function(e,t){return t.facade=e,Q.call(Y,e,t),t},M=function(e){return G.call(Y,e)||{}},_=function(e){return X.call(Y,e)}}else{var J=W("state");K[J]=!0,R=function(e,t){return t.facade=e,O(e,J,t),t},M=function(e){return b(e,J)?e[J]:{}},_=function(e){return b(e,J)}}var Z,ee={set:R,get:M,has:_,enforce:function(e){return _(e)?M(e):R(e,{})},getterFor:function(e){return function(t){var n;if(!g(t)||(n=M(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},te=t((function(e){var t=ee.get,n=ee.enforce,r=String(String).split("String");(e.exports=function(e,t,o,a){var s,l=!!a&&!!a.unsafe,c=!!a&&!!a.enumerable,u=!!a&&!!a.noTargetGet;"function"==typeof o&&("string"!=typeof t||b(o,"name")||O(o,"name",t),(s=n(o)).source||(s.source=r.join("string"==typeof t?t:""))),e!==i?(l?!u&&e[t]&&(c=!0):delete e[t],c?e[t]=o:O(e,t,o)):c?e[t]=o:I(t,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||U(this)}))})),ne=i,ie=function(e){return"function"==typeof e?e:void 0},re=function(e,t){return arguments.length<2?ie(ne[e])||ie(i[e]):ne[e]&&ne[e][t]||i[e]&&i[e][t]},oe=Math.ceil,ae=Math.floor,se=function(e){return isNaN(e=+e)?0:(e>0?ae:oe)(e)},le=Math.min,ce=function(e){return e>0?le(se(e),9007199254740991):0},ue=Math.max,he=Math.min,fe=function(e,t){var n=se(e);return n<0?ue(n+t,0):he(n,t)},de=function(e){return function(t,n,i){var r,o=m(t),a=ce(o.length),s=fe(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}},pe={includes:de(!0),indexOf:de(!1)},me=pe.indexOf,ge=function(e,t){var n,i=m(e),r=0,o=[];for(n in i)!b(K,n)&&b(i,n)&&o.push(n);for(;t.length>r;)b(i,n=t[r++])&&(~me(o,n)||o.push(n));return o},ve=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ye=ve.concat("length","prototype"),be={f:Object.getOwnPropertyNames||function(e){return ge(e,ye)}},we={f:Object.getOwnPropertySymbols},ke=re("Reflect","ownKeys")||function(e){var t=be.f(C(e)),n=we.f;return n?t.concat(n(e)):t},Te=function(e,t){for(var n=ke(t),i=x.f,r=A.f,o=0;o<n.length;o++){var a=n[o];b(e,a)||i(e,a,r(t,a))}},Se=/#|\.prototype\./,Ee=function(e,t){var n=Ce[Ae(e)];return n==xe||n!=Pe&&("function"==typeof t?r(t):!!t)},Ae=Ee.normalize=function(e){return String(e).replace(Se,".").toLowerCase()},Ce=Ee.data={},Pe=Ee.NATIVE="N",xe=Ee.POLYFILL="P",Oe=Ee,Ie=A.f,Le=function(e,t){var n,r,o,a,s,l=e.target,c=e.global,u=e.stat;if(n=c?i:u?i[l]||I(l,{}):(i[l]||{}).prototype)for(r in t){if(a=t[r],o=e.noTargetGet?(s=Ie(n,r))&&s.value:n[r],!Oe(c?r:l+(u?".":"#")+r,e.forced)&&void 0!==o){if(typeof a==typeof o)continue;Te(a,o)}(e.sham||o&&o.sham)&&O(a,"sham",!0),te(n,r,a,e)}},je=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())})),Ne=je&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Re=Array.isArray||function(e){return"Array"==h(e)},Me=function(e){return Object(p(e))},_e=Object.keys||function(e){return ge(e,ve)},Ue=o?Object.defineProperties:function(e,t){C(e);for(var n,i=_e(t),r=i.length,o=0;r>o;)x.f(e,n=i[o++],t[n]);return e},De=re("document","documentElement"),Fe=W("IE_PROTO"),qe=function(){},He=function(e){return"<script>"+e+"</"+"script>"},Be=function(){try{Z=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t;Be=Z?function(e){e.write(He("")),e.close();var t=e.parentWindow.Object;return e=null,t}(Z):((t=T("iframe")).style.display="none",De.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(He("document.F=Object")),e.close(),e.F);for(var n=ve.length;n--;)delete Be.prototype[ve[n]];return Be()};K[Fe]=!0;var Ve=Object.create||function(e,t){var n;return null!==e?(qe.prototype=C(e),n=new qe,qe.prototype=null,n[Fe]=e):n=Be(),void 0===t?n:Ue(n,t)},ze=be.f,We={}.toString,Ke="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],$e={f:function(e){return Ke&&"[object Window]"==We.call(e)?function(e){try{return ze(e)}catch(e){return Ke.slice()}}(e):ze(m(e))}},Ye=q("wks"),Ge=i.Symbol,Xe=Ne?Ge:Ge&&Ge.withoutSetter||V,Qe=function(e){return b(Ye,e)||(je&&b(Ge,e)?Ye[e]=Ge[e]:Ye[e]=Xe("Symbol."+e)),Ye[e]},Je={f:Qe},Ze=x.f,et=function(e){var t=ne.Symbol||(ne.Symbol={});b(t,e)||Ze(t,e,{value:Je.f(e)})},tt=x.f,nt=Qe("toStringTag"),it=function(e,t,n){e&&!b(e=n?e:e.prototype,nt)&&tt(e,nt,{configurable:!0,value:t})},rt=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},ot=function(e,t,n){if(rt(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};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)}},at=Qe("species"),st=function(e,t){var n;return Re(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!Re(n.prototype)?g(n)&&null===(n=n[at])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},lt=[].push,ct=function(e){var t=1==e,n=2==e,i=3==e,r=4==e,o=6==e,a=5==e||o;return function(s,l,c,u){for(var h,f,p=Me(s),m=d(p),g=ot(l,c,3),v=ce(m.length),y=0,b=u||st,w=t?b(s,v):n?b(s,0):void 0;v>y;y++)if((a||y in m)&&(f=g(h=m[y],y,p),e))if(t)w[y]=f;else if(f)switch(e){case 3:return!0;case 5:return h;case 6:return y;case 2:lt.call(w,h)}else if(r)return!1;return o?-1:i||r?r:w}},ut={forEach:ct(0),map:ct(1),filter:ct(2),some:ct(3),every:ct(4),find:ct(5),findIndex:ct(6)},ht=ut.forEach,ft=W("hidden"),dt="Symbol",pt=Qe("toPrimitive"),mt=ee.set,gt=ee.getterFor(dt),vt=Object.prototype,yt=i.Symbol,bt=re("JSON","stringify"),wt=A.f,kt=x.f,Tt=$e.f,St=l.f,Et=q("symbols"),At=q("op-symbols"),Ct=q("string-to-symbol-registry"),Pt=q("symbol-to-string-registry"),xt=q("wks"),Ot=i.QObject,It=!Ot||!Ot.prototype||!Ot.prototype.findChild,Lt=o&&r((function(){return 7!=Ve(kt({},"a",{get:function(){return kt(this,"a",{value:7}).a}})).a}))?function(e,t,n){var i=wt(vt,t);i&&delete vt[t],kt(e,t,n),i&&e!==vt&&kt(vt,t,i)}:kt,jt=function(e,t){var n=Et[e]=Ve(yt.prototype);return mt(n,{type:dt,tag:e,description:t}),o||(n.description=t),n},Nt=Ne?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof yt},Rt=function(e,t,n){e===vt&&Rt(At,t,n),C(e);var i=v(t,!0);return C(n),b(Et,i)?(n.enumerable?(b(e,ft)&&e[ft][i]&&(e[ft][i]=!1),n=Ve(n,{enumerable:c(0,!1)})):(b(e,ft)||kt(e,ft,c(1,{})),e[ft][i]=!0),Lt(e,i,n)):kt(e,i,n)},Mt=function(e,t){C(e);var n=m(t),i=_e(n).concat(Ft(n));return ht(i,(function(t){o&&!_t.call(n,t)||Rt(e,t,n[t])})),e},_t=function(e){var t=v(e,!0),n=St.call(this,t);return!(this===vt&&b(Et,t)&&!b(At,t))&&(!(n||!b(this,t)||!b(Et,t)||b(this,ft)&&this[ft][t])||n)},Ut=function(e,t){var n=m(e),i=v(t,!0);if(n!==vt||!b(Et,i)||b(At,i)){var r=wt(n,i);return!r||!b(Et,i)||b(n,ft)&&n[ft][i]||(r.enumerable=!0),r}},Dt=function(e){var t=Tt(m(e)),n=[];return ht(t,(function(e){b(Et,e)||b(K,e)||n.push(e)})),n},Ft=function(e){var t=e===vt,n=Tt(t?At:m(e)),i=[];return ht(n,(function(e){!b(Et,e)||t&&!b(vt,e)||i.push(Et[e])})),i};if(je||(te((yt=function(){if(this instanceof yt)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=V(e),n=function(e){this===vt&&n.call(At,e),b(this,ft)&&b(this[ft],t)&&(this[ft][t]=!1),Lt(this,t,c(1,e))};return o&&It&&Lt(vt,t,{configurable:!0,set:n}),jt(t,e)}).prototype,"toString",(function(){return gt(this).tag})),te(yt,"withoutSetter",(function(e){return jt(V(e),e)})),l.f=_t,x.f=Rt,A.f=Ut,be.f=$e.f=Dt,we.f=Ft,Je.f=function(e){return jt(Qe(e),e)},o&&(kt(yt.prototype,"description",{configurable:!0,get:function(){return gt(this).description}}),te(vt,"propertyIsEnumerable",_t,{unsafe:!0}))),Le({global:!0,wrap:!0,forced:!je,sham:!je},{Symbol:yt}),ht(_e(xt),(function(e){et(e)})),Le({target:dt,stat:!0,forced:!je},{for:function(e){var t=String(e);if(b(Ct,t))return Ct[t];var n=yt(t);return Ct[t]=n,Pt[n]=t,n},keyFor:function(e){if(!Nt(e))throw TypeError(e+" is not a symbol");if(b(Pt,e))return Pt[e]},useSetter:function(){It=!0},useSimple:function(){It=!1}}),Le({target:"Object",stat:!0,forced:!je,sham:!o},{create:function(e,t){return void 0===t?Ve(e):Mt(Ve(e),t)},defineProperty:Rt,defineProperties:Mt,getOwnPropertyDescriptor:Ut}),Le({target:"Object",stat:!0,forced:!je},{getOwnPropertyNames:Dt,getOwnPropertySymbols:Ft}),Le({target:"Object",stat:!0,forced:r((function(){we.f(1)}))},{getOwnPropertySymbols:function(e){return we.f(Me(e))}}),bt){var qt=!je||r((function(){var e=yt();return"[null]"!=bt([e])||"{}"!=bt({a:e})||"{}"!=bt(Object(e))}));Le({target:"JSON",stat:!0,forced:qt},{stringify:function(e,t,n){for(var i,r=[e],o=1;arguments.length>o;)r.push(arguments[o++]);if(i=t,(g(t)||void 0!==e)&&!Nt(e))return Re(t)||(t=function(e,t){if("function"==typeof i&&(t=i.call(this,e,t)),!Nt(t))return t}),r[1]=t,bt.apply(null,r)}})}yt.prototype[pt]||O(yt.prototype,pt,yt.prototype.valueOf),it(yt,dt),K[ft]=!0;var Ht=x.f,Bt=i.Symbol;if(o&&"function"==typeof Bt&&(!("description"in Bt.prototype)||void 0!==Bt().description)){var Vt={},zt=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof zt?new Bt(e):void 0===e?Bt():Bt(e);return""===e&&(Vt[t]=!0),t};Te(zt,Bt);var Wt=zt.prototype=Bt.prototype;Wt.constructor=zt;var Kt=Wt.toString,$t="Symbol(test)"==String(Bt("test")),Yt=/^Symbol\((.*)\)[^)]+$/;Ht(Wt,"description",{configurable:!0,get:function(){var e=g(this)?this.valueOf():this,t=Kt.call(e);if(b(Vt,e))return"";var n=$t?t.slice(7,-1):t.replace(Yt,"$1");return""===n?void 0:n}}),Le({global:!0,forced:!0},{Symbol:zt})}et("iterator");var Gt=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))},Xt=Object.defineProperty,Qt={},Jt=function(e){throw e},Zt=function(e,t){if(b(Qt,e))return Qt[e];t||(t={});var n=[][e],i=!!b(t,"ACCESSORS")&&t.ACCESSORS,a=b(t,0)?t[0]:Jt,s=b(t,1)?t[1]:void 0;return Qt[e]=!!n&&!r((function(){if(i&&!o)return!0;var e={length:-1};i?Xt(e,1,{enumerable:!0,get:Jt}):e[1]=1,n.call(e,a,s)}))},en=ut.forEach,tn=Gt("forEach"),nn=Zt("forEach"),rn=tn&&nn?[].forEach:function(e){return en(this,e,arguments.length>1?arguments[1]:void 0)};Le({target:"Array",proto:!0,forced:[].forEach!=rn},{forEach:rn});var on=pe.indexOf,an=[].indexOf,sn=!!an&&1/[1].indexOf(1,-0)<0,ln=Gt("indexOf"),cn=Zt("indexOf",{ACCESSORS:!0,1:0});Le({target:"Array",proto:!0,forced:sn||!ln||!cn},{indexOf:function(e){return sn?an.apply(this,arguments)||0:on(this,e,arguments.length>1?arguments[1]:void 0)}});var un=Qe("unscopables"),hn=Array.prototype;null==hn[un]&&x.f(hn,un,{configurable:!0,value:Ve(null)});var fn,dn,pn,mn=function(e){hn[un][e]=!0},gn={},vn=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),yn=W("IE_PROTO"),bn=Object.prototype,wn=vn?Object.getPrototypeOf:function(e){return e=Me(e),b(e,yn)?e[yn]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?bn:null},kn=Qe("iterator"),Tn=!1;[].keys&&("next"in(pn=[].keys())?(dn=wn(wn(pn)))!==Object.prototype&&(fn=dn):Tn=!0),null==fn&&(fn={}),b(fn,kn)||O(fn,kn,(function(){return this}));var Sn={IteratorPrototype:fn,BUGGY_SAFARI_ITERATORS:Tn},En=Sn.IteratorPrototype,An=function(){return this},Cn=function(e,t,n){var i=t+" Iterator";return e.prototype=Ve(En,{next:c(1,n)}),it(e,i,!1),gn[i]=An,e},Pn=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,i){return C(n),function(e){if(!g(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype")}(i),t?e.call(n,i):n.__proto__=i,n}}():void 0),xn=Sn.IteratorPrototype,On=Sn.BUGGY_SAFARI_ITERATORS,In=Qe("iterator"),Ln="keys",jn="values",Nn="entries",Rn=function(){return this},Mn=function(e,t,n,i,r,o,a){Cn(n,t,i);var s,l,c,u=function(e){if(e===r&&m)return m;if(!On&&e in d)return d[e];switch(e){case Ln:case jn:case Nn:return function(){return new n(this,e)}}return function(){return new n(this)}},h=t+" Iterator",f=!1,d=e.prototype,p=d[In]||d["@@iterator"]||r&&d[r],m=!On&&p||u(r),g="Array"==t&&d.entries||p;if(g&&(s=wn(g.call(new e)),xn!==Object.prototype&&s.next&&(wn(s)!==xn&&(Pn?Pn(s,xn):"function"!=typeof s[In]&&O(s,In,Rn)),it(s,h,!0))),r==jn&&p&&p.name!==jn&&(f=!0,m=function(){return p.call(this)}),d[In]!==m&&O(d,In,m),gn[t]=m,r)if(l={values:u(jn),keys:o?m:u(Ln),entries:u(Nn)},a)for(c in l)(On||f||!(c in d))&&te(d,c,l[c]);else Le({target:t,proto:!0,forced:On||f},l);return l},_n="Array Iterator",Un=ee.set,Dn=ee.getterFor(_n),Fn=Mn(Array,"Array",(function(e,t){Un(this,{type:_n,target:m(e),index:0,kind:t})}),(function(){var e=Dn(this),t=e.target,n=e.kind,i=e.index++;return!t||i>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:i,done:!1}:"values"==n?{value:t[i],done:!1}:{value:[i,t[i]],done:!1}}),"values");gn.Arguments=gn.Array,mn("keys"),mn("values"),mn("entries");var qn=[].join,Hn=d!=Object,Bn=Gt("join",",");Le({target:"Array",proto:!0,forced:Hn||!Bn},{join:function(e){return qn.call(m(this),void 0===e?",":e)}});var Vn,zn,Wn=function(e,t,n){var i=v(t);i in e?x.f(e,i,c(0,n)):e[i]=n},Kn=re("navigator","userAgent")||"",$n=i.process,Yn=$n&&$n.versions,Gn=Yn&&Yn.v8;Gn?zn=(Vn=Gn.split("."))[0]+Vn[1]:Kn&&(!(Vn=Kn.match(/Edge\/(\d+)/))||Vn[1]>=74)&&(Vn=Kn.match(/Chrome\/(\d+)/))&&(zn=Vn[1]);var Xn=zn&&+zn,Qn=Qe("species"),Jn=function(e){return Xn>=51||!r((function(){var t=[];return(t.constructor={})[Qn]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Zn=Jn("slice"),ei=Zt("slice",{ACCESSORS:!0,0:0,1:2}),ti=Qe("species"),ni=[].slice,ii=Math.max;Le({target:"Array",proto:!0,forced:!Zn||!ei},{slice:function(e,t){var n,i,r,o=m(this),a=ce(o.length),s=fe(e,a),l=fe(void 0===t?a:t,a);if(Re(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!Re(n.prototype)?g(n)&&null===(n=n[ti])&&(n=void 0):n=void 0,n===Array||void 0===n))return ni.call(o,s,l);for(i=new(void 0===n?Array:n)(ii(l-s,0)),r=0;s<l;s++,r++)s in o&&Wn(i,r,o[s]);return i.length=r,i}});var ri={};ri[Qe("toStringTag")]="z";var oi="[object z]"===String(ri),ai=Qe("toStringTag"),si="Arguments"==h(function(){return arguments}()),li=oi?h: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),ai))?n:si?h(t):"Object"==(i=h(t))&&"function"==typeof t.callee?"Arguments":i},ci=oi?{}.toString:function(){return"[object "+li(this)+"]"};oi||te(Object.prototype,"toString",ci,{unsafe:!0});var ui=function(){var e=C(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function hi(e,t){return RegExp(e,t)}var fi={UNSUPPORTED_Y:r((function(){var e=hi("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:r((function(){var e=hi("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},di=RegExp.prototype.exec,pi=String.prototype.replace,mi=di,gi=function(){var e=/a/,t=/b*/g;return di.call(e,"a"),di.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),vi=fi.UNSUPPORTED_Y||fi.BROKEN_CARET,yi=void 0!==/()??/.exec("")[1];(gi||yi||vi)&&(mi=function(e){var t,n,i,r,o=this,a=vi&&o.sticky,s=ui.call(o),l=o.source,c=0,u=e;return a&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),u=String(e).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==e[o.lastIndex-1])&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",s)),yi&&(n=new RegExp("^"+l+"$(?!\\s)",s)),gi&&(t=o.lastIndex),i=di.call(a?n:o,u),a?i?(i.input=i.input.slice(c),i[0]=i[0].slice(c),i.index=o.lastIndex,o.lastIndex+=i[0].length):o.lastIndex=0:gi&&i&&(o.lastIndex=o.global?i.index+i[0].length:t),yi&&i&&i.length>1&&pi.call(i[0],n,(function(){for(r=1;r<arguments.length-2;r++)void 0===arguments[r]&&(i[r]=void 0)})),i});var bi=mi;Le({target:"RegExp",proto:!0,forced:/./.exec!==bi},{exec:bi});var wi="toString",ki=RegExp.prototype,Ti=ki.toString,Si=r((function(){return"/a/b"!=Ti.call({source:"a",flags:"b"})})),Ei=Ti.name!=wi;(Si||Ei)&&te(RegExp.prototype,wi,(function(){var e=C(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in ki)?ui.call(e):n)}),{unsafe:!0});var Ai=function(e){return function(t,n){var i,r,o=String(p(t)),a=se(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}},Ci={codeAt:Ai(!1),charAt:Ai(!0)},Pi=Ci.charAt,xi="String Iterator",Oi=ee.set,Ii=ee.getterFor(xi);Mn(String,"String",(function(e){Oi(this,{type:xi,string:String(e),index:0})}),(function(){var e,t=Ii(this),n=t.string,i=t.index;return i>=n.length?{value:void 0,done:!0}:(e=Pi(n,i),t.index+=e.length,{value:e,done:!1})}));var Li=Qe("species"),ji=!r((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),Ni="$0"==="a".replace(/./,"$0"),Ri=Qe("replace"),Mi=!!/./[Ri]&&""===/./[Ri]("a","$0"),_i=!r((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),Ui=function(e,t,n,i){var o=Qe(e),a=!r((function(){var t={};return t[o]=function(){return 7},7!=""[e](t)})),s=a&&!r((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[Li]=function(){return n},n.flags="",n[o]=/./[o]),n.exec=function(){return t=!0,null},n[o](""),!t}));if(!a||!s||"replace"===e&&(!ji||!Ni||Mi)||"split"===e&&!_i){var l=/./[o],c=n(o,""[e],(function(e,t,n,i,r){return t.exec===bi?a&&!r?{done:!0,value:l.call(t,n,i)}:{done:!0,value:e.call(n,t,i)}:{done:!1}}),{REPLACE_KEEPS_$0:Ni,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:Mi}),u=c[0],h=c[1];te(String.prototype,e,u),te(RegExp.prototype,o,2==t?function(e,t){return h.call(e,this,t)}:function(e){return h.call(e,this)})}i&&O(RegExp.prototype[o],"sham",!0)},Di=Ci.charAt,Fi=function(e,t,n){return t+(n?Di(e,t).length:1)},qi=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==h(e))throw TypeError("RegExp#exec called on incompatible receiver");return bi.call(e,t)},Hi=Math.max,Bi=Math.min,Vi=Math.floor,zi=/\$([$&'`]|\d\d?|<[^>]*>)/g,Wi=/\$([$&'`]|\d\d?)/g;Ui("replace",2,(function(e,t,n,i){var r=i.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=i.REPLACE_KEEPS_$0,a=r?"$":"$0";return[function(n,i){var r=p(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,r,i):t.call(String(r),n,i)},function(e,i){if(!r&&o||"string"==typeof i&&-1===i.indexOf(a)){var l=n(t,e,this,i);if(l.done)return l.value}var c=C(e),u=String(this),h="function"==typeof i;h||(i=String(i));var f=c.global;if(f){var d=c.unicode;c.lastIndex=0}for(var p=[];;){var m=qi(c,u);if(null===m)break;if(p.push(m),!f)break;""===String(m[0])&&(c.lastIndex=Fi(u,ce(c.lastIndex),d))}for(var g,v="",y=0,b=0;b<p.length;b++){m=p[b];for(var w=String(m[0]),k=Hi(Bi(se(m.index),u.length),0),T=[],S=1;S<m.length;S++)T.push(void 0===(g=m[S])?g:String(g));var E=m.groups;if(h){var A=[w].concat(T,k,u);void 0!==E&&A.push(E);var P=String(i.apply(void 0,A))}else P=s(w,u,k,T,E,i);k>=y&&(v+=u.slice(y,k)+P,y=k+w.length)}return v+u.slice(y)}];function s(e,n,i,r,o,a){var s=i+e.length,l=r.length,c=Wi;return void 0!==o&&(o=Me(o),c=zi),t.call(a,c,(function(t,a){var c;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,i);case"'":return n.slice(s);case"<":c=o[a.slice(1,-1)];break;default:var u=+a;if(0===u)return t;if(u>l){var h=Vi(u/10);return 0===h?t:h<=l?void 0===r[h-1]?a.charAt(1):r[h-1]+a.charAt(1):t}c=r[u-1]}return void 0===c?"":c}))}}));var Ki=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};Ui("search",1,(function(e,t,n){return[function(t){var n=p(this),i=null==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var r=C(e),o=String(this),a=r.lastIndex;Ki(a,0)||(r.lastIndex=0);var s=qi(r,o);return Ki(r.lastIndex,a)||(r.lastIndex=a),null===s?-1:s.index}]}));var $i=Qe("match"),Yi=function(e){var t;return g(e)&&(void 0!==(t=e[$i])?!!t:"RegExp"==h(e))},Gi=Qe("species"),Xi=function(e,t){var n,i=C(e).constructor;return void 0===i||null==(n=C(i)[Gi])?t:rt(n)},Qi=[].push,Ji=Math.min,Zi=4294967295,er=!r((function(){return!RegExp(Zi,"y")}));Ui("split",2,(function(e,t,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var i=String(p(this)),r=void 0===n?Zi:n>>>0;if(0===r)return[];if(void 0===e)return[i];if(!Yi(e))return t.call(i,e,r);for(var o,a,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),u=0,h=new RegExp(e.source,c+"g");(o=bi.call(h,i))&&!((a=h.lastIndex)>u&&(l.push(i.slice(u,o.index)),o.length>1&&o.index<i.length&&Qi.apply(l,o.slice(1)),s=o[0].length,u=a,l.length>=r));)h.lastIndex===o.index&&h.lastIndex++;return u===i.length?!s&&h.test("")||l.push(""):l.push(i.slice(u)),l.length>r?l.slice(0,r):l}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=p(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,r,n):i.call(String(r),t,n)},function(e,r){var o=n(i,e,this,r,i!==t);if(o.done)return o.value;var a=C(e),s=String(this),l=Xi(a,RegExp),c=a.unicode,u=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(er?"y":"g"),h=new l(er?a:"^(?:"+a.source+")",u),f=void 0===r?Zi:r>>>0;if(0===f)return[];if(0===s.length)return null===qi(h,s)?[s]:[];for(var d=0,p=0,m=[];p<s.length;){h.lastIndex=er?p:0;var g,v=qi(h,er?s:s.slice(p));if(null===v||(g=Ji(ce(h.lastIndex+(er?0:p)),s.length))===d)p=Fi(s,p,c);else{if(m.push(s.slice(d,p)),m.length===f)return m;for(var y=1;y<=v.length-1;y++)if(m.push(v[y]),m.length===f)return m;p=d=g}}return m.push(s.slice(d)),m}]}),!er);var tr={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0};for(var nr in tr){var ir=i[nr],rr=ir&&ir.prototype;if(rr&&rr.forEach!==rn)try{O(rr,"forEach",rn)}catch(e){rr.forEach=rn}}var or=Qe("iterator"),ar=Qe("toStringTag"),sr=Fn.values;for(var lr in tr){var cr=i[lr],ur=cr&&cr.prototype;if(ur){if(ur[or]!==sr)try{O(ur,or,sr)}catch(e){ur[or]=sr}if(ur[ar]||O(ur,ar,lr),tr[lr])for(var hr in Fn)if(ur[hr]!==Fn[hr])try{O(ur,hr,Fn[hr])}catch(e){ur[hr]=Fn[hr]}}}var fr=Qe("iterator"),dr=!r((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,i){t.delete("b"),n+=i+e})),!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[fr]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})),pr=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},mr=Object.assign,gr=Object.defineProperty,vr=!mr||r((function(){if(o&&1!==mr({b:1},mr(gr({},"a",{enumerable:!0,get:function(){gr(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach((function(e){t[e]=e})),7!=mr({},e)[n]||_e(mr({},t)).join("")!=i}))?function(e,t){for(var n=Me(e),i=arguments.length,r=1,a=we.f,s=l.f;i>r;)for(var c,u=d(arguments[r++]),h=a?_e(u).concat(a(u)):_e(u),f=h.length,p=0;f>p;)c=h[p++],o&&!s.call(u,c)||(n[c]=u[c]);return n}:mr,yr=function(e){var t=e.return;if(void 0!==t)return C(t.call(e)).value},br=function(e,t,n,i){try{return i?t(C(n)[0],n[1]):t(n)}catch(t){throw yr(e),t}},wr=Qe("iterator"),kr=Array.prototype,Tr=function(e){return void 0!==e&&(gn.Array===e||kr[wr]===e)},Sr=Qe("iterator"),Er=function(e){if(null!=e)return e[Sr]||e["@@iterator"]||gn[li(e)]},Ar=function(e){var t,n,i,r,o,a,s=Me(e),l="function"==typeof this?this:Array,c=arguments.length,u=c>1?arguments[1]:void 0,h=void 0!==u,f=Er(s),d=0;if(h&&(u=ot(u,c>2?arguments[2]:void 0,2)),null==f||l==Array&&Tr(f))for(n=new l(t=ce(s.length));t>d;d++)a=h?u(s[d],d):s[d],Wn(n,d,a);else for(o=(r=f.call(s)).next,n=new l;!(i=o.call(r)).done;d++)a=h?br(r,u,[i.value,d],!0):i.value,Wn(n,d,a);return n.length=d,n},Cr=2147483647,Pr=/[^\0-\u007E]/,xr=/[.\u3002\uFF0E\uFF61]/g,Or="Overflow: input needs wider integers to process",Ir=Math.floor,Lr=String.fromCharCode,jr=function(e){return e+22+75*(e<26)},Nr=function(e,t,n){var i=0;for(e=n?Ir(e/700):e>>1,e+=Ir(e/t);e>455;i+=36)e=Ir(e/35);return Ir(i+36*e/(e+38))},Rr=function(e){var t,n,i=[],r=(e=function(e){for(var t=[],n=0,i=e.length;n<i;){var r=e.charCodeAt(n++);if(r>=55296&&r<=56319&&n<i){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&r)<<10)+(1023&o)+65536):(t.push(r),n--)}else t.push(r)}return t}(e)).length,o=128,a=0,s=72;for(t=0;t<e.length;t++)(n=e[t])<128&&i.push(Lr(n));var l=i.length,c=l;for(l&&i.push("-");c<r;){var u=Cr;for(t=0;t<e.length;t++)(n=e[t])>=o&&n<u&&(u=n);var h=c+1;if(u-o>Ir((Cr-a)/h))throw RangeError(Or);for(a+=(u-o)*h,o=u,t=0;t<e.length;t++){if((n=e[t])<o&&++a>Cr)throw RangeError(Or);if(n==o){for(var f=a,d=36;;d+=36){var p=d<=s?1:d>=s+26?26:d-s;if(f<p)break;var m=f-p,g=36-p;i.push(Lr(jr(p+m%g))),f=Ir(m/g)}i.push(Lr(jr(f))),s=Nr(a,h,c==l),a=0,++c}}++a,++o}return i.join("")},Mr=function(e,t,n){for(var i in t)te(e,i,t[i],n);return e},_r=function(e){var t=Er(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return C(t.call(e))},Ur=re("fetch"),Dr=re("Headers"),Fr=Qe("iterator"),qr="URLSearchParams",Hr="URLSearchParamsIterator",Br=ee.set,Vr=ee.getterFor(qr),zr=ee.getterFor(Hr),Wr=/\+/g,Kr=Array(4),$r=function(e){return Kr[e-1]||(Kr[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},Yr=function(e){try{return decodeURIComponent(e)}catch(t){return e}},Gr=function(e){var t=e.replace(Wr," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace($r(n--),Yr);return t}},Xr=/[!'()~]|%20/g,Qr={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},Jr=function(e){return Qr[e]},Zr=function(e){return encodeURIComponent(e).replace(Xr,Jr)},eo=function(e,t){if(t)for(var n,i,r=t.split("&"),o=0;o<r.length;)(n=r[o++]).length&&(i=n.split("="),e.push({key:Gr(i.shift()),value:Gr(i.join("="))}))},to=function(e){this.entries.length=0,eo(this.entries,e)},no=function(e,t){if(e<t)throw TypeError("Not enough arguments")},io=Cn((function(e,t){Br(this,{type:Hr,iterator:_r(Vr(e).entries),kind:t})}),"Iterator",(function(){var e=zr(this),t=e.kind,n=e.iterator.next(),i=n.value;return n.done||(n.value="keys"===t?i.key:"values"===t?i.value:[i.key,i.value]),n})),ro=function(){pr(this,ro,qr);var e,t,n,i,r,o,a,s,l,c=arguments.length>0?arguments[0]:void 0,u=this,h=[];if(Br(u,{type:qr,entries:h,updateURL:function(){},updateSearchParams:to}),void 0!==c)if(g(c))if("function"==typeof(e=Er(c)))for(n=(t=e.call(c)).next;!(i=n.call(t)).done;){if((a=(o=(r=_r(C(i.value))).next).call(r)).done||(s=o.call(r)).done||!o.call(r).done)throw TypeError("Expected sequence with length 2");h.push({key:a.value+"",value:s.value+""})}else for(l in c)b(c,l)&&h.push({key:l,value:c[l]+""});else eo(h,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},oo=ro.prototype;Mr(oo,{append:function(e,t){no(arguments.length,2);var n=Vr(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){no(arguments.length,1);for(var t=Vr(this),n=t.entries,i=e+"",r=0;r<n.length;)n[r].key===i?n.splice(r,1):r++;t.updateURL()},get:function(e){no(arguments.length,1);for(var t=Vr(this).entries,n=e+"",i=0;i<t.length;i++)if(t[i].key===n)return t[i].value;return null},getAll:function(e){no(arguments.length,1);for(var t=Vr(this).entries,n=e+"",i=[],r=0;r<t.length;r++)t[r].key===n&&i.push(t[r].value);return i},has:function(e){no(arguments.length,1);for(var t=Vr(this).entries,n=e+"",i=0;i<t.length;)if(t[i++].key===n)return!0;return!1},set:function(e,t){no(arguments.length,1);for(var n,i=Vr(this),r=i.entries,o=!1,a=e+"",s=t+"",l=0;l<r.length;l++)(n=r[l]).key===a&&(o?r.splice(l--,1):(o=!0,n.value=s));o||r.push({key:a,value:s}),i.updateURL()},sort:function(){var e,t,n,i=Vr(this),r=i.entries,o=r.slice();for(r.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(r[t].key>e.key){r.splice(t,0,e);break}t===n&&r.push(e)}i.updateURL()},forEach:function(e){for(var t,n=Vr(this).entries,i=ot(e,arguments.length>1?arguments[1]:void 0,3),r=0;r<n.length;)i((t=n[r++]).value,t.key,this)},keys:function(){return new io(this,"keys")},values:function(){return new io(this,"values")},entries:function(){return new io(this,"entries")}},{enumerable:!0}),te(oo,Fr,oo.entries),te(oo,"toString",(function(){for(var e,t=Vr(this).entries,n=[],i=0;i<t.length;)e=t[i++],n.push(Zr(e.key)+"="+Zr(e.value));return n.join("&")}),{enumerable:!0}),it(ro,qr),Le({global:!0,forced:!dr},{URLSearchParams:ro}),dr||"function"!=typeof Ur||"function"!=typeof Dr||Le({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,i,r=[e];return arguments.length>1&&(g(t=arguments[1])&&(n=t.body,li(n)===qr&&((i=t.headers?new Dr(t.headers):new Dr).has("content-type")||i.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=Ve(t,{body:c(0,String(n)),headers:c(0,i)}))),r.push(t)),Ur.apply(this,r)}});var ao,so={URLSearchParams:ro,getState:Vr},lo=Ci.codeAt,co=i.URL,uo=so.URLSearchParams,ho=so.getState,fo=ee.set,po=ee.getterFor("URL"),mo=Math.floor,go=Math.pow,vo="Invalid scheme",yo="Invalid host",bo="Invalid port",wo=/[A-Za-z]/,ko=/[\d+-.A-Za-z]/,To=/\d/,So=/^(0x|0X)/,Eo=/^[0-7]+$/,Ao=/^\d+$/,Co=/^[\dA-Fa-f]+$/,Po=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,xo=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,Oo=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,Io=/[\u0009\u000A\u000D]/g,Lo=function(e,t){var n,i,r;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return yo;if(!(n=No(t.slice(1,-1))))return yo;e.host=n}else if(Ho(e)){if(t=function(e){var t,n,i=[],r=e.toLowerCase().replace(xr,".").split(".");for(t=0;t<r.length;t++)n=r[t],i.push(Pr.test(n)?"xn--"+Rr(n):n);return i.join(".")}(t),Po.test(t))return yo;if(null===(n=jo(t)))return yo;e.host=n}else{if(xo.test(t))return yo;for(n="",i=Ar(t),r=0;r<i.length;r++)n+=Fo(i[r],Mo);e.host=n}},jo=function(e){var t,n,i,r,o,a,s,l=e.split(".");if(l.length&&""==l[l.length-1]&&l.pop(),(t=l.length)>4)return e;for(n=[],i=0;i<t;i++){if(""==(r=l[i]))return e;if(o=10,r.length>1&&"0"==r.charAt(0)&&(o=So.test(r)?16:8,r=r.slice(8==o?1:2)),""===r)a=0;else{if(!(10==o?Ao:8==o?Eo:Co).test(r))return e;a=parseInt(r,o)}n.push(a)}for(i=0;i<t;i++)if(a=n[i],i==t-1){if(a>=go(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),i=0;i<n.length;i++)s+=n[i]*go(256,3-i);return s},No=function(e){var t,n,i,r,o,a,s,l=[0,0,0,0,0,0,0,0],c=0,u=null,h=0,f=function(){return e.charAt(h)};if(":"==f()){if(":"!=e.charAt(1))return;h+=2,u=++c}for(;f();){if(8==c)return;if(":"!=f()){for(t=n=0;n<4&&Co.test(f());)t=16*t+parseInt(f(),16),h++,n++;if("."==f()){if(0==n)return;if(h-=n,c>6)return;for(i=0;f();){if(r=null,i>0){if(!("."==f()&&i<4))return;h++}if(!To.test(f()))return;for(;To.test(f());){if(o=parseInt(f(),10),null===r)r=o;else{if(0==r)return;r=10*r+o}if(r>255)return;h++}l[c]=256*l[c]+r,2!=++i&&4!=i||c++}if(4!=i)return;break}if(":"==f()){if(h++,!f())return}else if(f())return;l[c++]=t}else{if(null!==u)return;h++,u=++c}}if(null!==u)for(a=c-u,c=7;0!=c&&a>0;)s=l[c],l[c--]=l[u+a-1],l[u+--a]=s;else if(8!=c)return;return l},Ro=function(e){var t,n,i,r;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=mo(e/256);return t.join(".")}if("object"==typeof e){for(t="",i=function(e){for(var t=null,n=1,i=null,r=0,o=0;o<8;o++)0!==e[o]?(r>n&&(t=i,n=r),i=null,r=0):(null===i&&(i=o),++r);return r>n&&(t=i,n=r),t}(e),n=0;n<8;n++)r&&0===e[n]||(r&&(r=!1),i===n?(t+=n?":":"::",r=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},Mo={},_o=vr({},Mo,{" ":1,'"':1,"<":1,">":1,"`":1}),Uo=vr({},_o,{"#":1,"?":1,"{":1,"}":1}),Do=vr({},Uo,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Fo=function(e,t){var n=lo(e,0);return n>32&&n<127&&!b(t,e)?e:encodeURIComponent(e)},qo={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Ho=function(e){return b(qo,e.scheme)},Bo=function(e){return""!=e.username||""!=e.password},Vo=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},zo=function(e,t){var n;return 2==e.length&&wo.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},Wo=function(e){var t;return e.length>1&&zo(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},Ko=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&zo(t[0],!0)||t.pop()},$o=function(e){return"."===e||"%2e"===e.toLowerCase()},Yo={},Go={},Xo={},Qo={},Jo={},Zo={},ea={},ta={},na={},ia={},ra={},oa={},aa={},sa={},la={},ca={},ua={},ha={},fa={},da={},pa={},ma=function(e,t,n,i){var r,o,a,s,l,c=n||Yo,u=0,h="",f=!1,d=!1,p=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(Oo,"")),t=t.replace(Io,""),r=Ar(t);u<=r.length;){switch(o=r[u],c){case Yo:if(!o||!wo.test(o)){if(n)return vo;c=Xo;continue}h+=o.toLowerCase(),c=Go;break;case Go:if(o&&(ko.test(o)||"+"==o||"-"==o||"."==o))h+=o.toLowerCase();else{if(":"!=o){if(n)return vo;h="",c=Xo,u=0;continue}if(n&&(Ho(e)!=b(qo,h)||"file"==h&&(Bo(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=h,n)return void(Ho(e)&&qo[e.scheme]==e.port&&(e.port=null));h="","file"==e.scheme?c=sa:Ho(e)&&i&&i.scheme==e.scheme?c=Qo:Ho(e)?c=ta:"/"==r[u+1]?(c=Jo,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=fa)}break;case Xo:if(!i||i.cannotBeABaseURL&&"#"!=o)return vo;if(i.cannotBeABaseURL&&"#"==o){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=pa;break}c="file"==i.scheme?sa:Zo;continue;case Qo:if("/"!=o||"/"!=r[u+1]){c=Zo;continue}c=na,u++;break;case Jo:if("/"==o){c=ia;break}c=ha;continue;case Zo:if(e.scheme=i.scheme,o==ao)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==o||"\\"==o&&Ho(e))c=ea;else if("?"==o)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=da;else{if("#"!=o){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=ha;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=pa}break;case ea:if(!Ho(e)||"/"!=o&&"\\"!=o){if("/"!=o){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=ha;continue}c=ia}else c=na;break;case ta:if(c=na,"/"!=o||"/"!=h.charAt(u+1))continue;u++;break;case na:if("/"!=o&&"\\"!=o){c=ia;continue}break;case ia:if("@"==o){f&&(h="%40"+h),f=!0,a=Ar(h);for(var m=0;m<a.length;m++){var g=a[m];if(":"!=g||p){var v=Fo(g,Do);p?e.password+=v:e.username+=v}else p=!0}h=""}else if(o==ao||"/"==o||"?"==o||"#"==o||"\\"==o&&Ho(e)){if(f&&""==h)return"Invalid authority";u-=Ar(h).length+1,h="",c=ra}else h+=o;break;case ra:case oa:if(n&&"file"==e.scheme){c=ca;continue}if(":"!=o||d){if(o==ao||"/"==o||"?"==o||"#"==o||"\\"==o&&Ho(e)){if(Ho(e)&&""==h)return yo;if(n&&""==h&&(Bo(e)||null!==e.port))return;if(s=Lo(e,h))return s;if(h="",c=ua,n)return;continue}"["==o?d=!0:"]"==o&&(d=!1),h+=o}else{if(""==h)return yo;if(s=Lo(e,h))return s;if(h="",c=aa,n==oa)return}break;case aa:if(!To.test(o)){if(o==ao||"/"==o||"?"==o||"#"==o||"\\"==o&&Ho(e)||n){if(""!=h){var y=parseInt(h,10);if(y>65535)return bo;e.port=Ho(e)&&y===qo[e.scheme]?null:y,h=""}if(n)return;c=ua;continue}return bo}h+=o;break;case sa:if(e.scheme="file","/"==o||"\\"==o)c=la;else{if(!i||"file"!=i.scheme){c=ha;continue}if(o==ao)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==o)e.host=i.host,e.path=i.path.slice(),e.query="",c=da;else{if("#"!=o){Wo(r.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),Ko(e)),c=ha;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=pa}}break;case la:if("/"==o||"\\"==o){c=ca;break}i&&"file"==i.scheme&&!Wo(r.slice(u).join(""))&&(zo(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=ha;continue;case ca:if(o==ao||"/"==o||"\\"==o||"?"==o||"#"==o){if(!n&&zo(h))c=ha;else if(""==h){if(e.host="",n)return;c=ua}else{if(s=Lo(e,h))return s;if("localhost"==e.host&&(e.host=""),n)return;h="",c=ua}continue}h+=o;break;case ua:if(Ho(e)){if(c=ha,"/"!=o&&"\\"!=o)continue}else if(n||"?"!=o)if(n||"#"!=o){if(o!=ao&&(c=ha,"/"!=o))continue}else e.fragment="",c=pa;else e.query="",c=da;break;case ha:if(o==ao||"/"==o||"\\"==o&&Ho(e)||!n&&("?"==o||"#"==o)){if(".."===(l=(l=h).toLowerCase())||"%2e."===l||".%2e"===l||"%2e%2e"===l?(Ko(e),"/"==o||"\\"==o&&Ho(e)||e.path.push("")):$o(h)?"/"==o||"\\"==o&&Ho(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&zo(h)&&(e.host&&(e.host=""),h=h.charAt(0)+":"),e.path.push(h)),h="","file"==e.scheme&&(o==ao||"?"==o||"#"==o))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==o?(e.query="",c=da):"#"==o&&(e.fragment="",c=pa)}else h+=Fo(o,Uo);break;case fa:"?"==o?(e.query="",c=da):"#"==o?(e.fragment="",c=pa):o!=ao&&(e.path[0]+=Fo(o,Mo));break;case da:n||"#"!=o?o!=ao&&("'"==o&&Ho(e)?e.query+="%27":e.query+="#"==o?"%23":Fo(o,Mo)):(e.fragment="",c=pa);break;case pa:o!=ao&&(e.fragment+=Fo(o,_o))}u++}},ga=function(e){var t,n,i=pr(this,ga,"URL"),r=arguments.length>1?arguments[1]:void 0,a=String(e),s=fo(i,{type:"URL"});if(void 0!==r)if(r instanceof ga)t=po(r);else if(n=ma(t={},String(r)))throw TypeError(n);if(n=ma(s,a,null,t))throw TypeError(n);var l=s.searchParams=new uo,c=ho(l);c.updateSearchParams(s.query),c.updateURL=function(){s.query=String(l)||null},o||(i.href=ya.call(i),i.origin=ba.call(i),i.protocol=wa.call(i),i.username=ka.call(i),i.password=Ta.call(i),i.host=Sa.call(i),i.hostname=Ea.call(i),i.port=Aa.call(i),i.pathname=Ca.call(i),i.search=Pa.call(i),i.searchParams=xa.call(i),i.hash=Oa.call(i))},va=ga.prototype,ya=function(){var e=po(this),t=e.scheme,n=e.username,i=e.password,r=e.host,o=e.port,a=e.path,s=e.query,l=e.fragment,c=t+":";return null!==r?(c+="//",Bo(e)&&(c+=n+(i?":"+i:"")+"@"),c+=Ro(r),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(c+="?"+s),null!==l&&(c+="#"+l),c},ba=function(){var e=po(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&Ho(e)?t+"://"+Ro(e.host)+(null!==n?":"+n:""):"null"},wa=function(){return po(this).scheme+":"},ka=function(){return po(this).username},Ta=function(){return po(this).password},Sa=function(){var e=po(this),t=e.host,n=e.port;return null===t?"":null===n?Ro(t):Ro(t)+":"+n},Ea=function(){var e=po(this).host;return null===e?"":Ro(e)},Aa=function(){var e=po(this).port;return null===e?"":String(e)},Ca=function(){var e=po(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Pa=function(){var e=po(this).query;return e?"?"+e:""},xa=function(){return po(this).searchParams},Oa=function(){var e=po(this).fragment;return e?"#"+e:""},Ia=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&Ue(va,{href:Ia(ya,(function(e){var t=po(this),n=String(e),i=ma(t,n);if(i)throw TypeError(i);ho(t.searchParams).updateSearchParams(t.query)})),origin:Ia(ba),protocol:Ia(wa,(function(e){var t=po(this);ma(t,String(e)+":",Yo)})),username:Ia(ka,(function(e){var t=po(this),n=Ar(String(e));if(!Vo(t)){t.username="";for(var i=0;i<n.length;i++)t.username+=Fo(n[i],Do)}})),password:Ia(Ta,(function(e){var t=po(this),n=Ar(String(e));if(!Vo(t)){t.password="";for(var i=0;i<n.length;i++)t.password+=Fo(n[i],Do)}})),host:Ia(Sa,(function(e){var t=po(this);t.cannotBeABaseURL||ma(t,String(e),ra)})),hostname:Ia(Ea,(function(e){var t=po(this);t.cannotBeABaseURL||ma(t,String(e),oa)})),port:Ia(Aa,(function(e){var t=po(this);Vo(t)||(""==(e=String(e))?t.port=null:ma(t,e,aa))})),pathname:Ia(Ca,(function(e){var t=po(this);t.cannotBeABaseURL||(t.path=[],ma(t,e+"",ua))})),search:Ia(Pa,(function(e){var t=po(this);""==(e=String(e))?t.query=null:("?"==e.charAt(0)&&(e=e.slice(1)),t.query="",ma(t,e,da)),ho(t.searchParams).updateSearchParams(t.query)})),searchParams:Ia(xa),hash:Ia(Oa,(function(e){var t=po(this);""!=(e=String(e))?("#"==e.charAt(0)&&(e=e.slice(1)),t.fragment="",ma(t,e,pa)):t.fragment=null}))}),te(va,"toJSON",(function(){return ya.call(this)}),{enumerable:!0}),te(va,"toString",(function(){return ya.call(this)}),{enumerable:!0}),co){var La=co.createObjectURL,ja=co.revokeObjectURL;La&&te(ga,"createObjectURL",(function(e){return La.apply(co,arguments)})),ja&&te(ga,"revokeObjectURL",(function(e){return ja.apply(co,arguments)}))}function Na(e){return(Na="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ra(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ma(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 _a(e,t,n){return t&&Ma(e.prototype,t),n&&Ma(e,n),e}function Ua(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Da(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Fa(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Da(Object(n),!0).forEach((function(t){Ua(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Da(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function qa(e,t){if(null==e)return{};var n,i,r=function(e,t){if(null==e)return{};var n,i,r={},o=Object.keys(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function Ha(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;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)||Va(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ba(e){return function(e){if(Array.isArray(e))return za(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||Va(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Va(e,t){if(e){if("string"==typeof e)return za(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?za(e,t):void 0}}function za(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n<t;n++)i[n]=e[n];return i}it(ga,"URL"),Le({global:!0,forced:!dr,sham:!o},{URL:ga}),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(String(e).replace(/\+/g," "))};(function(){try{var t=e.URLSearchParams;return"a=1"===new t("?a=1").toString()&&"function"==typeof t.prototype.set&&"function"==typeof t.prototype.entries}catch(e){return!1}})()||function(){var r=function e(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var n=Na(t);if("undefined"===n);else if("string"===n)""!==t&&this._fromString(t);else if(t instanceof e){var i=this;t.forEach((function(e,t){i.append(t,e)}))}else{if(null===t||"object"!==n)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var r=0;r<t.length;r++){var o=t[r];if("[object Array]"!==Object.prototype.toString.call(o)&&2===o.length)throw new TypeError("Expected [string, any] as entry at index "+r+" of URLSearchParams's input");this.append(o[0],o[1])}else for(var a in t)t.hasOwnProperty(a)&&this.append(a,t[a])}},o=r.prototype;o.append=function(e,t){e in this._entries?this._entries[e].push(String(t)):this._entries[e]=[String(t)]},o.delete=function(e){delete this._entries[e]},o.get=function(e){return e in this._entries?this._entries[e][0]:null},o.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},o.has=function(e){return e in this._entries},o.set=function(e,t){this._entries[e]=[String(t)]},o.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)}},o.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),n(e)},o.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),n(e)},o.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),n(e)},t&&(o[Symbol.iterator]=o.entries),o.toString=function(){var e=[];return this.forEach((function(t,n){e.push(i(n)+"="+i(t))})),e.join("&")},e.URLSearchParams=r}();var o=e.URLSearchParams.prototype;"function"!=typeof o.sort&&(o.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])}),"function"!=typeof o._fromString&&Object.defineProperty(o,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){if(this._entries)this._entries={};else{var t=[];this.forEach((function(e,n){t.push(n)}));for(var n=0;n<t.length;n++)this.delete(t[n])}var i,o=(e=e.replace(/^\?/,"")).split("&");for(n=0;n<o.length;n++)i=o[n].split("="),this.append(r(i[0]),i.length>1?r(i[1]):"")}})}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var t=new e.URL("b","http://a");return t.pathname="c d","http://a/c%20d"===t.href&&t.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t)),n&&"string"!=typeof n&&(n=String(n));var i,r=document;if(n&&(void 0===e.location||n!==e.location.href)){n=n.toLowerCase(),(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");o.href=t,i&&(r.body.appendChild(o),o.href=o.href);var a=r.createElement("input");if(a.type="url",a.value=t,":"===o.protocol||!/:/.test(o.href)||!a.checkValidity()&&!n)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var s=new e.URLSearchParams(this.search),l=!0,c=!0,u=this;["append","delete","set"].forEach((function(e){var t=s[e];s[e]=function(){t.apply(s,arguments),l&&(c=!1,u.search=s.toString(),c=!0)}})),Object.defineProperty(this,"searchParams",{value:s,enumerable:!0});var h=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==h&&(h=this.search,c&&(l=!1,this.searchParams._fromString(this.search),l=!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 Wa=Qe("isConcatSpreadable"),Ka=9007199254740991,$a="Maximum allowed index exceeded",Ya=Xn>=51||!r((function(){var e=[];return e[Wa]=!1,e.concat()[0]!==e})),Ga=Jn("concat"),Xa=function(e){if(!g(e))return!1;var t=e[Wa];return void 0!==t?!!t:Re(e)};Le({target:"Array",proto:!0,forced:!Ya||!Ga},{concat:function(e){var t,n,i,r,o,a=Me(this),s=st(a,0),l=0;for(t=-1,i=arguments.length;t<i;t++)if(Xa(o=-1===t?a:arguments[t])){if(l+(r=ce(o.length))>Ka)throw TypeError($a);for(n=0;n<r;n++,l++)n in o&&Wn(s,l,o[n])}else{if(l>=Ka)throw TypeError($a);Wn(s,l++,o)}return s.length=l,s}});var Qa=ut.filter,Ja=Jn("filter"),Za=Zt("filter");Le({target:"Array",proto:!0,forced:!Ja||!Za},{filter:function(e){return Qa(this,e,arguments.length>1?arguments[1]:void 0)}});var es=ut.find,ts="find",ns=!0,is=Zt(ts);ts in[]&&Array(1).find((function(){ns=!1})),Le({target:"Array",proto:!0,forced:ns||!is},{find:function(e){return es(this,e,arguments.length>1?arguments[1]:void 0)}}),mn(ts);var rs=Qe("iterator"),os=!1;try{var as=0,ss={next:function(){return{done:!!as++}},return:function(){os=!0}};ss[rs]=function(){return this},Array.from(ss,(function(){throw 2}))}catch(e){}var ls=function(e,t){if(!t&&!os)return!1;var n=!1;try{var i={};i[rs]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n},cs=!ls((function(e){Array.from(e)}));Le({target:"Array",stat:!0,forced:cs},{from:Ar});var us=pe.includes,hs=Zt("indexOf",{ACCESSORS:!0,1:0});Le({target:"Array",proto:!0,forced:!hs},{includes:function(e){return us(this,e,arguments.length>1?arguments[1]:void 0)}}),mn("includes");var fs=ut.map,ds=Jn("map"),ps=Zt("map");Le({target:"Array",proto:!0,forced:!ds||!ps},{map:function(e){return fs(this,e,arguments.length>1?arguments[1]:void 0)}});var ms=function(e,t,n){var i,r;return Pn&&"function"==typeof(i=t.constructor)&&i!==n&&g(r=i.prototype)&&r!==n.prototype&&Pn(e,r),e},gs="\t\n\v\f\r                 \u2028\u2029\ufeff",vs="["+gs+"]",ys=RegExp("^"+vs+vs+"*"),bs=RegExp(vs+vs+"*$"),ws=function(e){return function(t){var n=String(p(t));return 1&e&&(n=n.replace(ys,"")),2&e&&(n=n.replace(bs,"")),n}},ks={start:ws(1),end:ws(2),trim:ws(3)},Ts=be.f,Ss=A.f,Es=x.f,As=ks.trim,Cs="Number",Ps=i.Number,xs=Ps.prototype,Os=h(Ve(xs))==Cs,Is=function(e){var t,n,i,r,o,a,s,l,c=v(e,!1);if("string"==typeof c&&c.length>2)if(43===(t=(c=As(c)).charCodeAt(0))||45===t){if(88===(n=c.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(c.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+c}for(a=(o=c.slice(2)).length,s=0;s<a;s++)if((l=o.charCodeAt(s))<48||l>r)return NaN;return parseInt(o,i)}return+c};if(Oe(Cs,!Ps(" 0o1")||!Ps("0b1")||Ps("+0x1"))){for(var Ls,js=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof js&&(Os?r((function(){xs.valueOf.call(n)})):h(n)!=Cs)?ms(new Ps(Is(t)),n,js):Is(t)},Ns=o?Ts(Ps):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Rs=0;Ns.length>Rs;Rs++)b(Ps,Ls=Ns[Rs])&&!b(js,Ls)&&Es(js,Ls,Ss(Ps,Ls));js.prototype=xs,xs.constructor=js,te(i,Cs,js)}var Ms=r((function(){_e(1)}));Le({target:"Object",stat:!0,forced:Ms},{keys:function(e){return _e(Me(e))}});var _s=function(e){if(Yi(e))throw TypeError("The method doesn't accept regular expressions");return e},Us=Qe("match"),Ds=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Us]=!1,"/./"[e](t)}catch(e){}}return!1};Le({target:"String",proto:!0,forced:!Ds("includes")},{includes:function(e){return!!~String(p(this)).indexOf(_s(e),arguments.length>1?arguments[1]:void 0)}});var Fs=!r((function(){return Object.isExtensible(Object.preventExtensions({}))})),qs=t((function(e){var t=x.f,n=V("meta"),i=0,r=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:"O"+ ++i,weakData:{}}})},a=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!g(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!b(e,n)){if(!r(e))return"F";if(!t)return"E";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!b(e,n)){if(!r(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return Fs&&a.REQUIRED&&r(e)&&!b(e,n)&&o(e),e}};K[n]=!0})),Hs=(qs.REQUIRED,qs.fastKey,qs.getWeakData,qs.onFreeze,function(e,t){this.stopped=e,this.result=t}),Bs=function(e,t,n){var i,r,o,a,s,l,c,u=n&&n.that,h=!(!n||!n.AS_ENTRIES),f=!(!n||!n.IS_ITERATOR),d=!(!n||!n.INTERRUPTED),p=ot(t,u,1+h+d),m=function(e){return i&&yr(i),new Hs(!0,e)},g=function(e){return h?(C(e),d?p(e[0],e[1],m):p(e[0],e[1])):d?p(e,m):p(e)};if(f)i=e;else{if("function"!=typeof(r=Er(e)))throw TypeError("Target is not iterable");if(Tr(r)){for(o=0,a=ce(e.length);a>o;o++)if((s=g(e[o]))&&s instanceof Hs)return s;return new Hs(!1)}i=r.call(e)}for(l=i.next;!(c=l.call(i)).done;){try{s=g(c.value)}catch(e){throw yr(i),e}if("object"==typeof s&&s&&s instanceof Hs)return s}return new Hs(!1)},Vs=qs.getWeakData,zs=ee.set,Ws=ee.getterFor,Ks=ut.find,$s=ut.findIndex,Ys=0,Gs=function(e){return e.frozen||(e.frozen=new Xs)},Xs=function(){this.entries=[]},Qs=function(e,t){return Ks(e.entries,(function(e){return e[0]===t}))};Xs.prototype={get:function(e){var t=Qs(this,e);if(t)return t[1]},has:function(e){return!!Qs(this,e)},set:function(e,t){var n=Qs(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=$s(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}};var Js={getConstructor:function(e,t,n,i){var r=e((function(e,o){pr(e,r,t),zs(e,{type:t,id:Ys++,frozen:void 0}),null!=o&&Bs(o,e[i],{that:e,AS_ENTRIES:n})})),o=Ws(t),a=function(e,t,n){var i=o(e),r=Vs(C(t),!0);return!0===r?Gs(i).set(t,n):r[i.id]=n,e};return Mr(r.prototype,{delete:function(e){var t=o(this);if(!g(e))return!1;var n=Vs(e);return!0===n?Gs(t).delete(e):n&&b(n,t.id)&&delete n[t.id]},has:function(e){var t=o(this);if(!g(e))return!1;var n=Vs(e);return!0===n?Gs(t).has(e):n&&b(n,t.id)}}),Mr(r.prototype,n?{get:function(e){var t=o(this);if(g(e)){var n=Vs(e);return!0===n?Gs(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return a(this,e,t)}}:{add:function(e){return a(this,e,!0)}}),r}},Zs=(t((function(e){var t,n=ee.enforce,o=!i.ActiveXObject&&"ActiveXObject"in i,a=Object.isExtensible,s=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},l=e.exports=function(e,t,n){var o=-1!==e.indexOf("Map"),a=-1!==e.indexOf("Weak"),s=o?"set":"add",l=i[e],c=l&&l.prototype,u=l,h={},f=function(e){var t=c[e];te(c,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(a&&!g(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return a&&!g(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(a&&!g(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(Oe(e,"function"!=typeof l||!(a||c.forEach&&!r((function(){(new l).entries().next()})))))u=n.getConstructor(t,e,o,s),qs.REQUIRED=!0;else if(Oe(e,!0)){var d=new u,p=d[s](a?{}:-0,1)!=d,m=r((function(){d.has(1)})),v=ls((function(e){new l(e)})),y=!a&&r((function(){for(var e=new l,t=5;t--;)e[s](t,t);return!e.has(-0)}));v||((u=t((function(t,n){pr(t,u,e);var i=ms(new l,t,u);return null!=n&&Bs(n,i[s],{that:i,AS_ENTRIES:o}),i}))).prototype=c,c.constructor=u),(m||y)&&(f("delete"),f("has"),o&&f("get")),(y||p)&&f(s),a&&c.clear&&delete c.clear}return h[e]=u,Le({global:!0,forced:u!=l},h),it(u,e),a||n.setStrong(u,e,o),u}("WeakMap",s,Js);if(F&&o){t=Js.getConstructor(s,"WeakMap",!0),qs.REQUIRED=!0;var c=l.prototype,u=c.delete,h=c.has,f=c.get,d=c.set;Mr(c,{delete:function(e){if(g(e)&&!a(e)){var i=n(this);return i.frozen||(i.frozen=new t),u.call(this,e)||i.frozen.delete(e)}return u.call(this,e)},has:function(e){if(g(e)&&!a(e)){var i=n(this);return i.frozen||(i.frozen=new t),h.call(this,e)||i.frozen.has(e)}return h.call(this,e)},get:function(e){if(g(e)&&!a(e)){var i=n(this);return i.frozen||(i.frozen=new t),h.call(this,e)?f.call(this,e):i.frozen.get(e)}return f.call(this,e)},set:function(e,i){if(g(e)&&!a(e)){var r=n(this);r.frozen||(r.frozen=new t),h.call(this,e)?d.call(this,e,i):r.frozen.set(e,i)}else d.call(this,e,i);return this}})}})),ut.every),el=Gt("every"),tl=Zt("every");Le({target:"Array",proto:!0,forced:!el||!tl},{every:function(e){return Zs(this,e,arguments.length>1?arguments[1]:void 0)}}),Le({target:"Object",stat:!0,forced:Object.assign!==vr},{assign:vr});var nl=ks.trim;Le({target:"String",proto:!0,forced:function(e){return r((function(){return!!gs[e]()||"​…᠎"!="​…᠎"[e]()||gs[e].name!==e}))}("trim")},{trim:function(){return nl(this)}});var il=ut.some,rl=Gt("some"),ol=Zt("some");Le({target:"Array",proto:!0,forced:!rl||!ol},{some:function(e){return il(this,e,arguments.length>1?arguments[1]:void 0)}});var al="".repeat||function(e){var t=String(p(this)),n="",i=se(e);if(i<0||i==1/0)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n},sl=1..toFixed,ll=Math.floor,cl=function(e,t,n){return 0===t?n:t%2==1?cl(e,t-1,n*e):cl(e*e,t/2,n)},ul=sl&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r((function(){sl.call({})}));Le({target:"Number",proto:!0,forced:ul},{toFixed:function(e){var t,n,i,r,o=function(e){if("number"!=typeof e&&"Number"!=h(e))throw TypeError("Incorrect invocation");return+e}(this),a=se(e),s=[0,0,0,0,0,0],l="",c="0",u=function(e,t){for(var n=-1,i=t;++n<6;)i+=e*s[n],s[n]=i%1e7,i=ll(i/1e7)},f=function(e){for(var t=6,n=0;--t>=0;)n+=s[t],s[t]=ll(n/e),n=n%e*1e7},d=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==s[e]){var n=String(s[e]);t=""===t?n:t+al.call("0",7-n.length)+n}return t};if(a<0||a>20)throw RangeError("Incorrect fraction digits");if(o!=o)return"NaN";if(o<=-1e21||o>=1e21)return String(o);if(o<0&&(l="-",o=-o),o>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(o*cl(2,69,1))-69)<0?o*cl(2,-t,1):o/cl(2,t,1),n*=4503599627370496,(t=52-t)>0){for(u(0,n),i=a;i>=7;)u(1e7,0),i-=7;for(u(cl(10,i,1),0),i=t-1;i>=23;)f(1<<23),i-=23;f(1<<i),u(1,1),f(2),c=d()}else u(0,n),u(1<<-t,0),c=d()+al.call("0",a);return c=a>0?l+((r=c.length)<=a?"0."+al.call("0",a-r)+c:c.slice(0,r-a)+"."+c.slice(r-a)):l+c}});var hl=l.f,fl=function(e){return function(t){for(var n,i=m(t),r=_e(i),a=r.length,s=0,l=[];a>s;)n=r[s++],o&&!hl.call(i,n)||l.push(e?[n,i[n]]:i[n]);return l}},dl={entries:fl(!0),values:fl(!1)},pl=dl.entries;Le({target:"Object",stat:!0},{entries:function(e){return pl(e)}});var ml=dl.values;Le({target:"Object",stat:!0},{values:function(e){return ml(e)}}),Le({target:"Number",stat:!0},{isNaN:function(e){return e!=e}});var gl=A.f,vl=r((function(){gl(1)}));function yl(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 bl(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function wl(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function kl(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?wl(Object(n),!0).forEach((function(t){bl(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):wl(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}Le({target:"Object",stat:!0,forced:!o||vl,sham:!o},{getOwnPropertyDescriptor:function(e,t){return gl(m(e),t)}}),Le({target:"Object",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(e){for(var t,n,i=m(e),r=A.f,o=ke(i),a={},s=0;o.length>s;)void 0!==(n=r(i,t=o[s++]))&&Wn(a,t,n);return a}}),Ui("match",1,(function(e,t,n){return[function(t){var n=p(this),i=null==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var r=C(e),o=String(this);if(!r.global)return qi(r,o);var a=r.unicode;r.lastIndex=0;for(var s,l=[],c=0;null!==(s=qi(r,o));){var u=String(s[0]);l[c]=u,""===u&&(r.lastIndex=Fi(o,ce(r.lastIndex),a)),c++}return 0===c?null:l}]}));var Tl={addCSS:!0,thumbWidth:15,watch:!0};function Sl(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}var El=function(e){return null!=e?e.constructor:null},Al=function(e,t){return!!(e&&t&&e instanceof t)},Cl=function(e){return null==e},Pl=function(e){return El(e)===Object},xl=function(e){return El(e)===String},Ol=function(e){return Array.isArray(e)},Il=function(e){return Al(e,NodeList)},Ll=xl,jl=Ol,Nl=Il,Rl=function(e){return Al(e,Element)},Ml=function(e){return Al(e,Event)},_l=function(e){return Cl(e)||(xl(e)||Ol(e)||Il(e))&&!e.length||Pl(e)&&!Object.keys(e).length};function Ul(e,t){if(1>t){var n=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var Dl,Fl,ql,Hl=function(){function e(t,n){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),Rl(t)?this.element=t:Ll(t)&&(this.element=document.querySelector(t)),Rl(this.element)&&_l(this.element.rangeTouch)&&(this.config=kl({},Tl,{},n),this.init())}return function(e,t,n){t&&yl(e.prototype,t),n&&yl(e,n)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!Ml(t))return null;var n,i=t.target,r=t.changedTouches[0],o=parseFloat(i.getAttribute("min"))||0,a=parseFloat(i.getAttribute("max"))||100,s=parseFloat(i.getAttribute("step"))||1,l=i.getBoundingClientRect(),c=100/l.width*(this.config.thumbWidth/2)/100;return 0>(n=100/l.width*(r.clientX-l.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*c:50<n&&(n+=2*(n-50)*c),o+Ul(n/100*(a-o),s)}},{key:"set",value:function(t){e.enabled&&Ml(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},i=null;if(_l(t)||Ll(t)?i=Array.from(document.querySelectorAll(Ll(t)?t:'input[type="range"]')):Rl(t)?i=[t]:Nl(t)?i=Array.from(t):jl(t)&&(i=t.filter(Rl)),_l(i))return null;var r=kl({},Tl,{},n);if(Ll(t)&&r.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){Rl(n)&&Sl(n,t)&&new e(n,r)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return i.map((function(t){return new e(t,n)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),Bl=i.Promise,Vl=Qe("species"),zl=function(e){var t=re(e),n=x.f;o&&t&&!t[Vl]&&n(t,Vl,{configurable:!0,get:function(){return this}})},Wl=/(iphone|ipod|ipad).*applewebkit/i.test(Kn),Kl="process"==h(i.process),$l=i.location,Yl=i.setImmediate,Gl=i.clearImmediate,Xl=i.process,Ql=i.MessageChannel,Jl=i.Dispatch,Zl=0,ec={},tc="onreadystatechange",nc=function(e){if(ec.hasOwnProperty(e)){var t=ec[e];delete ec[e],t()}},ic=function(e){return function(){nc(e)}},rc=function(e){nc(e.data)},oc=function(e){i.postMessage(e+"",$l.protocol+"//"+$l.host)};Yl&&Gl||(Yl=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return ec[++Zl]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},Dl(Zl),Zl},Gl=function(e){delete ec[e]},Kl?Dl=function(e){Xl.nextTick(ic(e))}:Jl&&Jl.now?Dl=function(e){Jl.now(ic(e))}:Ql&&!Wl?(ql=(Fl=new Ql).port2,Fl.port1.onmessage=rc,Dl=ot(ql.postMessage,ql,1)):i.addEventListener&&"function"==typeof postMessage&&!i.importScripts&&$l&&"file:"!==$l.protocol&&!r(oc)?(Dl=oc,i.addEventListener("message",rc,!1)):Dl=tc in T("script")?function(e){De.appendChild(T("script")).onreadystatechange=function(){De.removeChild(this),nc(e)}}:function(e){setTimeout(ic(e),0)});var ac,sc,lc,cc,uc,hc,fc,dc,pc={set:Yl,clear:Gl},mc=A.f,gc=pc.set,vc=i.MutationObserver||i.WebKitMutationObserver,yc=i.document,bc=i.process,wc=i.Promise,kc=mc(i,"queueMicrotask"),Tc=kc&&kc.value;Tc||(ac=function(){var e,t;for(Kl&&(e=bc.domain)&&e.exit();sc;){t=sc.fn,sc=sc.next;try{t()}catch(e){throw sc?cc():lc=void 0,e}}lc=void 0,e&&e.enter()},!Wl&&!Kl&&vc&&yc?(uc=!0,hc=yc.createTextNode(""),new vc(ac).observe(hc,{characterData:!0}),cc=function(){hc.data=uc=!uc}):wc&&wc.resolve?(fc=wc.resolve(void 0),dc=fc.then,cc=function(){dc.call(fc,ac)}):cc=Kl?function(){bc.nextTick(ac)}:function(){gc.call(i,ac)});var Sc,Ec,Ac,Cc,Pc=Tc||function(e){var t={fn:e,next:void 0};lc&&(lc.next=t),sc||(sc=t,cc()),lc=t},xc=function(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=rt(t),this.reject=rt(n)},Oc={f:function(e){return new xc(e)}},Ic=function(e,t){if(C(e),g(t)&&t.constructor===e)return t;var n=Oc.f(e);return(0,n.resolve)(t),n.promise},Lc=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},jc=pc.set,Nc=Qe("species"),Rc="Promise",Mc=ee.get,_c=ee.set,Uc=ee.getterFor(Rc),Dc=Bl,Fc=i.TypeError,qc=i.document,Hc=i.process,Bc=re("fetch"),Vc=Oc.f,zc=Vc,Wc=!!(qc&&qc.createEvent&&i.dispatchEvent),Kc="function"==typeof PromiseRejectionEvent,$c="unhandledrejection",Yc=Oe(Rc,(function(){if(!(U(Dc)!==String(Dc))){if(66===Xn)return!0;if(!Kl&&!Kc)return!0}if(Xn>=51&&/native code/.test(Dc))return!1;var e=Dc.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[Nc]=t,!(e.then((function(){}))instanceof t)})),Gc=Yc||!ls((function(e){Dc.all(e).catch((function(){}))})),Xc=function(e){var t;return!(!g(e)||"function"!=typeof(t=e.then))&&t},Qc=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;Pc((function(){for(var i=e.value,r=1==e.state,o=0;n.length>o;){var a,s,l,c=n[o++],u=r?c.ok:c.fail,h=c.resolve,f=c.reject,d=c.domain;try{u?(r||(2===e.rejection&&tu(e),e.rejection=1),!0===u?a=i:(d&&d.enter(),a=u(i),d&&(d.exit(),l=!0)),a===c.promise?f(Fc("Promise-chain cycle")):(s=Xc(a))?s.call(a,h,f):h(a)):f(i)}catch(e){d&&!l&&d.exit(),f(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&Zc(e)}))}},Jc=function(e,t,n){var r,o;Wc?((r=qc.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),i.dispatchEvent(r)):r={promise:t,reason:n},!Kc&&(o=i["on"+e])?o(r):e===$c&&function(e,t){var n=i.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}("Unhandled promise rejection",n)},Zc=function(e){jc.call(i,(function(){var t,n=e.facade,i=e.value;if(eu(e)&&(t=Lc((function(){Kl?Hc.emit("unhandledRejection",i,n):Jc($c,n,i)})),e.rejection=Kl||eu(e)?2:1,t.error))throw t.value}))},eu=function(e){return 1!==e.rejection&&!e.parent},tu=function(e){jc.call(i,(function(){var t=e.facade;Kl?Hc.emit("rejectionHandled",t):Jc("rejectionhandled",t,e.value)}))},nu=function(e,t,n){return function(i){e(t,i,n)}},iu=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,Qc(e,!0))},ru=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw Fc("Promise can't be resolved itself");var i=Xc(t);i?Pc((function(){var n={done:!1};try{i.call(t,nu(ru,n,e),nu(iu,n,e))}catch(t){iu(n,t,e)}})):(e.value=t,e.state=1,Qc(e,!1))}catch(t){iu({done:!1},t,e)}}};Yc&&(Dc=function(e){pr(this,Dc,Rc),rt(e),Sc.call(this);var t=Mc(this);try{e(nu(ru,t),nu(iu,t))}catch(e){iu(t,e)}},(Sc=function(e){_c(this,{type:Rc,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=Mr(Dc.prototype,{then:function(e,t){var n=Uc(this),i=Vc(Xi(this,Dc));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=Kl?Hc.domain:void 0,n.parent=!0,n.reactions.push(i),0!=n.state&&Qc(n,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),Ec=function(){var e=new Sc,t=Mc(e);this.promise=e,this.resolve=nu(ru,t),this.reject=nu(iu,t)},Oc.f=Vc=function(e){return e===Dc||e===Ac?new Ec(e):zc(e)},"function"==typeof Bl&&(Cc=Bl.prototype.then,te(Bl.prototype,"then",(function(e,t){var n=this;return new Dc((function(e,t){Cc.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof Bc&&Le({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return Ic(Dc,Bc.apply(i,arguments))}}))),Le({global:!0,wrap:!0,forced:Yc},{Promise:Dc}),it(Dc,Rc,!1),zl(Rc),Ac=re(Rc),Le({target:Rc,stat:!0,forced:Yc},{reject:function(e){var t=Vc(this);return t.reject.call(void 0,e),t.promise}}),Le({target:Rc,stat:!0,forced:Yc},{resolve:function(e){return Ic(this,e)}}),Le({target:Rc,stat:!0,forced:Gc},{all:function(e){var t=this,n=Vc(t),i=n.resolve,r=n.reject,o=Lc((function(){var n=rt(t.resolve),o=[],a=0,s=1;Bs(e,(function(e){var l=a++,c=!1;o.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,o[l]=e,--s||i(o))}),r)})),--s||i(o)}));return o.error&&r(o.value),n.promise},race:function(e){var t=this,n=Vc(t),i=n.reject,r=Lc((function(){var r=rt(t.resolve);Bs(e,(function(e){r.call(t,e).then(n.resolve,i)}))}));return r.error&&i(r.value),n.promise}});var ou,au=A.f,su="".startsWith,lu=Math.min,cu=Ds("startsWith"),uu=!(cu||(ou=au(String.prototype,"startsWith"),!ou||ou.writable));Le({target:"String",proto:!0,forced:!uu&&!cu},{startsWith:function(e){var t=String(p(this));_s(e);var n=ce(lu(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return su?su.call(t,i,n):t.slice(n,n+i.length)===i}});var hu,fu,du,pu=function(e){return null!=e?e.constructor:null},mu=function(e,t){return Boolean(e&&t&&e instanceof t)},gu=function(e){return null==e},vu=function(e){return pu(e)===Object},yu=function(e){return pu(e)===String},bu=function(e){return pu(e)===Function},wu=function(e){return Array.isArray(e)},ku=function(e){return mu(e,NodeList)},Tu=function(e){return gu(e)||(yu(e)||wu(e)||ku(e))&&!e.length||vu(e)&&!Object.keys(e).length},Su=gu,Eu=vu,Au=function(e){return pu(e)===Number&&!Number.isNaN(e)},Cu=yu,Pu=function(e){return pu(e)===Boolean},xu=bu,Ou=wu,Iu=ku,Lu=function(e){return mu(e,Element)},ju=function(e){return mu(e,Event)},Nu=function(e){return mu(e,KeyboardEvent)},Ru=function(e){return mu(e,TextTrack)||!gu(e)&&yu(e.kind)},Mu=function(e){return mu(e,Promise)&&bu(e.then)},_u=function(e){if(mu(e,window.URL))return!0;if(!yu(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!Tu(new URL(t).hostname)}catch(e){return!1}},Uu=Tu,Du=(hu=document.createElement("span"),fu={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},du=Object.keys(fu).find((function(e){return void 0!==hu.style[e]})),!!Cu(du)&&fu[du]);function Fu(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var qu={isIE:
+"object"==typeof navigator&&function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define("Plyr",t):(e="undefined"!=typeof globalThis?globalThis:e||self).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=!!t.bubbles,t.cancelable=!!t.cancelable,(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 globalThis?globalThis:"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=function(e){return e&&e.Math==Math&&e},i=n("object"==typeof globalThis&&globalThis)||n("object"==typeof window&&window)||n("object"==typeof self&&self)||n("object"==typeof e&&e)||function(){return this}()||Function("return this")(),r=function(e){try{return!!e()}catch(e){return!0}},o=!r((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),a={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,l={f:s&&!a.call({1:2},1)?function(e){var t=s(this,e);return!!t&&t.enumerable}:a},c=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},u={}.toString,f=function(e){return u.call(e).slice(8,-1)},d="".split,h=r((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==f(e)?d.call(e,""):Object(e)}:Object,p=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},m=function(e){return h(p(e))},g=function(e){return"object"==typeof e?null!==e:"function"==typeof e},v=function(e,t){if(!g(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!g(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!g(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!g(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")},y={}.hasOwnProperty,b=function(e,t){return y.call(e,t)},w=i.document,k=g(w)&&g(w.createElement),T=function(e){return k?w.createElement(e):{}},S=!o&&!r((function(){return 7!=Object.defineProperty(T("div"),"a",{get:function(){return 7}}).a})),E=Object.getOwnPropertyDescriptor,A={f:o?E:function(e,t){if(e=m(e),t=v(t,!0),S)try{return E(e,t)}catch(e){}if(b(e,t))return c(!l.f.call(e,t),e[t])}},C=function(e){if(!g(e))throw TypeError(String(e)+" is not an object");return e},P=Object.defineProperty,x={f:o?P:function(e,t,n){if(C(e),t=v(t,!0),C(n),S)try{return P(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}},O=o?function(e,t,n){return x.f(e,t,c(1,n))}:function(e,t,n){return e[t]=n,e},I=function(e,t){try{O(i,e,t)}catch(n){i[e]=t}return t},j="__core-js_shared__",L=i[j]||I(j,{}),N=Function.toString;"function"!=typeof L.inspectSource&&(L.inspectSource=function(e){return N.call(e)});var R,M,_,U=L.inspectSource,D=i.WeakMap,F="function"==typeof D&&/native code/.test(U(D)),q=t((function(e){(e.exports=function(e,t){return L[e]||(L[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.7.0",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),H=0,B=Math.random(),V=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++H+B).toString(36)},z=q("keys"),W=function(e){return z[e]||(z[e]=V(e))},K={},$=i.WeakMap;if(F){var Y=L.state||(L.state=new $),G=Y.get,X=Y.has,Q=Y.set;R=function(e,t){return t.facade=e,Q.call(Y,e,t),t},M=function(e){return G.call(Y,e)||{}},_=function(e){return X.call(Y,e)}}else{var J=W("state");K[J]=!0,R=function(e,t){return t.facade=e,O(e,J,t),t},M=function(e){return b(e,J)?e[J]:{}},_=function(e){return b(e,J)}}var Z,ee={set:R,get:M,has:_,enforce:function(e){return _(e)?M(e):R(e,{})},getterFor:function(e){return function(t){var n;if(!g(t)||(n=M(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}}},te=t((function(e){var t=ee.get,n=ee.enforce,r=String(String).split("String");(e.exports=function(e,t,o,a){var s,l=!!a&&!!a.unsafe,c=!!a&&!!a.enumerable,u=!!a&&!!a.noTargetGet;"function"==typeof o&&("string"!=typeof t||b(o,"name")||O(o,"name",t),(s=n(o)).source||(s.source=r.join("string"==typeof t?t:""))),e!==i?(l?!u&&e[t]&&(c=!0):delete e[t],c?e[t]=o:O(e,t,o)):c?e[t]=o:I(t,o)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||U(this)}))})),ne=i,ie=function(e){return"function"==typeof e?e:void 0},re=function(e,t){return arguments.length<2?ie(ne[e])||ie(i[e]):ne[e]&&ne[e][t]||i[e]&&i[e][t]},oe=Math.ceil,ae=Math.floor,se=function(e){return isNaN(e=+e)?0:(e>0?ae:oe)(e)},le=Math.min,ce=function(e){return e>0?le(se(e),9007199254740991):0},ue=Math.max,fe=Math.min,de=function(e,t){var n=se(e);return n<0?ue(n+t,0):fe(n,t)},he=function(e){return function(t,n,i){var r,o=m(t),a=ce(o.length),s=de(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}},pe={includes:he(!0),indexOf:he(!1)},me=pe.indexOf,ge=function(e,t){var n,i=m(e),r=0,o=[];for(n in i)!b(K,n)&&b(i,n)&&o.push(n);for(;t.length>r;)b(i,n=t[r++])&&(~me(o,n)||o.push(n));return o},ve=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],ye=ve.concat("length","prototype"),be={f:Object.getOwnPropertyNames||function(e){return ge(e,ye)}},we={f:Object.getOwnPropertySymbols},ke=re("Reflect","ownKeys")||function(e){var t=be.f(C(e)),n=we.f;return n?t.concat(n(e)):t},Te=function(e,t){for(var n=ke(t),i=x.f,r=A.f,o=0;o<n.length;o++){var a=n[o];b(e,a)||i(e,a,r(t,a))}},Se=/#|\.prototype\./,Ee=function(e,t){var n=Ce[Ae(e)];return n==xe||n!=Pe&&("function"==typeof t?r(t):!!t)},Ae=Ee.normalize=function(e){return String(e).replace(Se,".").toLowerCase()},Ce=Ee.data={},Pe=Ee.NATIVE="N",xe=Ee.POLYFILL="P",Oe=Ee,Ie=A.f,je=function(e,t){var n,r,o,a,s,l=e.target,c=e.global,u=e.stat;if(n=c?i:u?i[l]||I(l,{}):(i[l]||{}).prototype)for(r in t){if(a=t[r],o=e.noTargetGet?(s=Ie(n,r))&&s.value:n[r],!Oe(c?r:l+(u?".":"#")+r,e.forced)&&void 0!==o){if(typeof a==typeof o)continue;Te(a,o)}(e.sham||o&&o.sham)&&O(a,"sham",!0),te(n,r,a,e)}},Le=!!Object.getOwnPropertySymbols&&!r((function(){return!String(Symbol())})),Ne=Le&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,Re=Array.isArray||function(e){return"Array"==f(e)},Me=function(e){return Object(p(e))},_e=Object.keys||function(e){return ge(e,ve)},Ue=o?Object.defineProperties:function(e,t){C(e);for(var n,i=_e(t),r=i.length,o=0;r>o;)x.f(e,n=i[o++],t[n]);return e},De=re("document","documentElement"),Fe=W("IE_PROTO"),qe=function(){},He=function(e){return"<script>"+e+"</"+"script>"},Be=function(){try{Z=document.domain&&new ActiveXObject("htmlfile")}catch(e){}var e,t;Be=Z?function(e){e.write(He("")),e.close();var t=e.parentWindow.Object;return e=null,t}(Z):((t=T("iframe")).style.display="none",De.appendChild(t),t.src=String("javascript:"),(e=t.contentWindow.document).open(),e.write(He("document.F=Object")),e.close(),e.F);for(var n=ve.length;n--;)delete Be.prototype[ve[n]];return Be()};K[Fe]=!0;var Ve=Object.create||function(e,t){var n;return null!==e?(qe.prototype=C(e),n=new qe,qe.prototype=null,n[Fe]=e):n=Be(),void 0===t?n:Ue(n,t)},ze=be.f,We={}.toString,Ke="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],$e={f:function(e){return Ke&&"[object Window]"==We.call(e)?function(e){try{return ze(e)}catch(e){return Ke.slice()}}(e):ze(m(e))}},Ye=q("wks"),Ge=i.Symbol,Xe=Ne?Ge:Ge&&Ge.withoutSetter||V,Qe=function(e){return b(Ye,e)||(Le&&b(Ge,e)?Ye[e]=Ge[e]:Ye[e]=Xe("Symbol."+e)),Ye[e]},Je={f:Qe},Ze=x.f,et=function(e){var t=ne.Symbol||(ne.Symbol={});b(t,e)||Ze(t,e,{value:Je.f(e)})},tt=x.f,nt=Qe("toStringTag"),it=function(e,t,n){e&&!b(e=n?e:e.prototype,nt)&&tt(e,nt,{configurable:!0,value:t})},rt=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},ot=function(e,t,n){if(rt(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};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)}},at=Qe("species"),st=function(e,t){var n;return Re(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!Re(n.prototype)?g(n)&&null===(n=n[at])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},lt=[].push,ct=function(e){var t=1==e,n=2==e,i=3==e,r=4==e,o=6==e,a=5==e||o;return function(s,l,c,u){for(var f,d,p=Me(s),m=h(p),g=ot(l,c,3),v=ce(m.length),y=0,b=u||st,w=t?b(s,v):n?b(s,0):void 0;v>y;y++)if((a||y in m)&&(d=g(f=m[y],y,p),e))if(t)w[y]=d;else if(d)switch(e){case 3:return!0;case 5:return f;case 6:return y;case 2:lt.call(w,f)}else if(r)return!1;return o?-1:i||r?r:w}},ut={forEach:ct(0),map:ct(1),filter:ct(2),some:ct(3),every:ct(4),find:ct(5),findIndex:ct(6)},ft=ut.forEach,dt=W("hidden"),ht="Symbol",pt=Qe("toPrimitive"),mt=ee.set,gt=ee.getterFor(ht),vt=Object.prototype,yt=i.Symbol,bt=re("JSON","stringify"),wt=A.f,kt=x.f,Tt=$e.f,St=l.f,Et=q("symbols"),At=q("op-symbols"),Ct=q("string-to-symbol-registry"),Pt=q("symbol-to-string-registry"),xt=q("wks"),Ot=i.QObject,It=!Ot||!Ot.prototype||!Ot.prototype.findChild,jt=o&&r((function(){return 7!=Ve(kt({},"a",{get:function(){return kt(this,"a",{value:7}).a}})).a}))?function(e,t,n){var i=wt(vt,t);i&&delete vt[t],kt(e,t,n),i&&e!==vt&&kt(vt,t,i)}:kt,Lt=function(e,t){var n=Et[e]=Ve(yt.prototype);return mt(n,{type:ht,tag:e,description:t}),o||(n.description=t),n},Nt=Ne?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof yt},Rt=function(e,t,n){e===vt&&Rt(At,t,n),C(e);var i=v(t,!0);return C(n),b(Et,i)?(n.enumerable?(b(e,dt)&&e[dt][i]&&(e[dt][i]=!1),n=Ve(n,{enumerable:c(0,!1)})):(b(e,dt)||kt(e,dt,c(1,{})),e[dt][i]=!0),jt(e,i,n)):kt(e,i,n)},Mt=function(e,t){C(e);var n=m(t),i=_e(n).concat(Ft(n));return ft(i,(function(t){o&&!_t.call(n,t)||Rt(e,t,n[t])})),e},_t=function(e){var t=v(e,!0),n=St.call(this,t);return!(this===vt&&b(Et,t)&&!b(At,t))&&(!(n||!b(this,t)||!b(Et,t)||b(this,dt)&&this[dt][t])||n)},Ut=function(e,t){var n=m(e),i=v(t,!0);if(n!==vt||!b(Et,i)||b(At,i)){var r=wt(n,i);return!r||!b(Et,i)||b(n,dt)&&n[dt][i]||(r.enumerable=!0),r}},Dt=function(e){var t=Tt(m(e)),n=[];return ft(t,(function(e){b(Et,e)||b(K,e)||n.push(e)})),n},Ft=function(e){var t=e===vt,n=Tt(t?At:m(e)),i=[];return ft(n,(function(e){!b(Et,e)||t&&!b(vt,e)||i.push(Et[e])})),i};if(Le||(te((yt=function(){if(this instanceof yt)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=V(e),n=function(e){this===vt&&n.call(At,e),b(this,dt)&&b(this[dt],t)&&(this[dt][t]=!1),jt(this,t,c(1,e))};return o&&It&&jt(vt,t,{configurable:!0,set:n}),Lt(t,e)}).prototype,"toString",(function(){return gt(this).tag})),te(yt,"withoutSetter",(function(e){return Lt(V(e),e)})),l.f=_t,x.f=Rt,A.f=Ut,be.f=$e.f=Dt,we.f=Ft,Je.f=function(e){return Lt(Qe(e),e)},o&&(kt(yt.prototype,"description",{configurable:!0,get:function(){return gt(this).description}}),te(vt,"propertyIsEnumerable",_t,{unsafe:!0}))),je({global:!0,wrap:!0,forced:!Le,sham:!Le},{Symbol:yt}),ft(_e(xt),(function(e){et(e)})),je({target:ht,stat:!0,forced:!Le},{for:function(e){var t=String(e);if(b(Ct,t))return Ct[t];var n=yt(t);return Ct[t]=n,Pt[n]=t,n},keyFor:function(e){if(!Nt(e))throw TypeError(e+" is not a symbol");if(b(Pt,e))return Pt[e]},useSetter:function(){It=!0},useSimple:function(){It=!1}}),je({target:"Object",stat:!0,forced:!Le,sham:!o},{create:function(e,t){return void 0===t?Ve(e):Mt(Ve(e),t)},defineProperty:Rt,defineProperties:Mt,getOwnPropertyDescriptor:Ut}),je({target:"Object",stat:!0,forced:!Le},{getOwnPropertyNames:Dt,getOwnPropertySymbols:Ft}),je({target:"Object",stat:!0,forced:r((function(){we.f(1)}))},{getOwnPropertySymbols:function(e){return we.f(Me(e))}}),bt){var qt=!Le||r((function(){var e=yt();return"[null]"!=bt([e])||"{}"!=bt({a:e})||"{}"!=bt(Object(e))}));je({target:"JSON",stat:!0,forced:qt},{stringify:function(e,t,n){for(var i,r=[e],o=1;arguments.length>o;)r.push(arguments[o++]);if(i=t,(g(t)||void 0!==e)&&!Nt(e))return Re(t)||(t=function(e,t){if("function"==typeof i&&(t=i.call(this,e,t)),!Nt(t))return t}),r[1]=t,bt.apply(null,r)}})}yt.prototype[pt]||O(yt.prototype,pt,yt.prototype.valueOf),it(yt,ht),K[dt]=!0;var Ht=x.f,Bt=i.Symbol;if(o&&"function"==typeof Bt&&(!("description"in Bt.prototype)||void 0!==Bt().description)){var Vt={},zt=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof zt?new Bt(e):void 0===e?Bt():Bt(e);return""===e&&(Vt[t]=!0),t};Te(zt,Bt);var Wt=zt.prototype=Bt.prototype;Wt.constructor=zt;var Kt=Wt.toString,$t="Symbol(test)"==String(Bt("test")),Yt=/^Symbol\((.*)\)[^)]+$/;Ht(Wt,"description",{configurable:!0,get:function(){var e=g(this)?this.valueOf():this,t=Kt.call(e);if(b(Vt,e))return"";var n=$t?t.slice(7,-1):t.replace(Yt,"$1");return""===n?void 0:n}}),je({global:!0,forced:!0},{Symbol:zt})}et("iterator");var Gt=function(e,t){var n=[][e];return!!n&&r((function(){n.call(null,t||function(){throw 1},1)}))},Xt=Object.defineProperty,Qt={},Jt=function(e){throw e},Zt=function(e,t){if(b(Qt,e))return Qt[e];t||(t={});var n=[][e],i=!!b(t,"ACCESSORS")&&t.ACCESSORS,a=b(t,0)?t[0]:Jt,s=b(t,1)?t[1]:void 0;return Qt[e]=!!n&&!r((function(){if(i&&!o)return!0;var e={length:-1};i?Xt(e,1,{enumerable:!0,get:Jt}):e[1]=1,n.call(e,a,s)}))},en=ut.forEach,tn=Gt("forEach"),nn=Zt("forEach"),rn=tn&&nn?[].forEach:function(e){return en(this,e,arguments.length>1?arguments[1]:void 0)};je({target:"Array",proto:!0,forced:[].forEach!=rn},{forEach:rn});var on=pe.indexOf,an=[].indexOf,sn=!!an&&1/[1].indexOf(1,-0)<0,ln=Gt("indexOf"),cn=Zt("indexOf",{ACCESSORS:!0,1:0});je({target:"Array",proto:!0,forced:sn||!ln||!cn},{indexOf:function(e){return sn?an.apply(this,arguments)||0:on(this,e,arguments.length>1?arguments[1]:void 0)}});var un=Qe("unscopables"),fn=Array.prototype;null==fn[un]&&x.f(fn,un,{configurable:!0,value:Ve(null)});var dn,hn,pn,mn=function(e){fn[un][e]=!0},gn={},vn=!r((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),yn=W("IE_PROTO"),bn=Object.prototype,wn=vn?Object.getPrototypeOf:function(e){return e=Me(e),b(e,yn)?e[yn]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?bn:null},kn=Qe("iterator"),Tn=!1;[].keys&&("next"in(pn=[].keys())?(hn=wn(wn(pn)))!==Object.prototype&&(dn=hn):Tn=!0),null==dn&&(dn={}),b(dn,kn)||O(dn,kn,(function(){return this}));var Sn={IteratorPrototype:dn,BUGGY_SAFARI_ITERATORS:Tn},En=Sn.IteratorPrototype,An=function(){return this},Cn=function(e,t,n){var i=t+" Iterator";return e.prototype=Ve(En,{next:c(1,n)}),it(e,i,!1),gn[i]=An,e},Pn=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,i){return C(n),function(e){if(!g(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype")}(i),t?e.call(n,i):n.__proto__=i,n}}():void 0),xn=Sn.IteratorPrototype,On=Sn.BUGGY_SAFARI_ITERATORS,In=Qe("iterator"),jn="keys",Ln="values",Nn="entries",Rn=function(){return this},Mn=function(e,t,n,i,r,o,a){Cn(n,t,i);var s,l,c,u=function(e){if(e===r&&m)return m;if(!On&&e in h)return h[e];switch(e){case jn:case Ln:case Nn:return function(){return new n(this,e)}}return function(){return new n(this)}},f=t+" Iterator",d=!1,h=e.prototype,p=h[In]||h["@@iterator"]||r&&h[r],m=!On&&p||u(r),g="Array"==t&&h.entries||p;if(g&&(s=wn(g.call(new e)),xn!==Object.prototype&&s.next&&(wn(s)!==xn&&(Pn?Pn(s,xn):"function"!=typeof s[In]&&O(s,In,Rn)),it(s,f,!0))),r==Ln&&p&&p.name!==Ln&&(d=!0,m=function(){return p.call(this)}),h[In]!==m&&O(h,In,m),gn[t]=m,r)if(l={values:u(Ln),keys:o?m:u(jn),entries:u(Nn)},a)for(c in l)(On||d||!(c in h))&&te(h,c,l[c]);else je({target:t,proto:!0,forced:On||d},l);return l},_n="Array Iterator",Un=ee.set,Dn=ee.getterFor(_n),Fn=Mn(Array,"Array",(function(e,t){Un(this,{type:_n,target:m(e),index:0,kind:t})}),(function(){var e=Dn(this),t=e.target,n=e.kind,i=e.index++;return!t||i>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:i,done:!1}:"values"==n?{value:t[i],done:!1}:{value:[i,t[i]],done:!1}}),"values");gn.Arguments=gn.Array,mn("keys"),mn("values"),mn("entries");var qn=[].join,Hn=h!=Object,Bn=Gt("join",",");je({target:"Array",proto:!0,forced:Hn||!Bn},{join:function(e){return qn.call(m(this),void 0===e?",":e)}});var Vn,zn,Wn=function(e,t,n){var i=v(t);i in e?x.f(e,i,c(0,n)):e[i]=n},Kn=re("navigator","userAgent")||"",$n=i.process,Yn=$n&&$n.versions,Gn=Yn&&Yn.v8;Gn?zn=(Vn=Gn.split("."))[0]+Vn[1]:Kn&&(!(Vn=Kn.match(/Edge\/(\d+)/))||Vn[1]>=74)&&(Vn=Kn.match(/Chrome\/(\d+)/))&&(zn=Vn[1]);var Xn=zn&&+zn,Qn=Qe("species"),Jn=function(e){return Xn>=51||!r((function(){var t=[];return(t.constructor={})[Qn]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},Zn=Jn("slice"),ei=Zt("slice",{ACCESSORS:!0,0:0,1:2}),ti=Qe("species"),ni=[].slice,ii=Math.max;je({target:"Array",proto:!0,forced:!Zn||!ei},{slice:function(e,t){var n,i,r,o=m(this),a=ce(o.length),s=de(e,a),l=de(void 0===t?a:t,a);if(Re(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!Re(n.prototype)?g(n)&&null===(n=n[ti])&&(n=void 0):n=void 0,n===Array||void 0===n))return ni.call(o,s,l);for(i=new(void 0===n?Array:n)(ii(l-s,0)),r=0;s<l;s++,r++)s in o&&Wn(i,r,o[s]);return i.length=r,i}});var ri={};ri[Qe("toStringTag")]="z";var oi="[object z]"===String(ri),ai=Qe("toStringTag"),si="Arguments"==f(function(){return arguments}()),li=oi?f: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),ai))?n:si?f(t):"Object"==(i=f(t))&&"function"==typeof t.callee?"Arguments":i},ci=oi?{}.toString:function(){return"[object "+li(this)+"]"};oi||te(Object.prototype,"toString",ci,{unsafe:!0});var ui=function(){var e=C(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function fi(e,t){return RegExp(e,t)}var di={UNSUPPORTED_Y:r((function(){var e=fi("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET:r((function(){var e=fi("^r","gy");return e.lastIndex=2,null!=e.exec("str")}))},hi=RegExp.prototype.exec,pi=String.prototype.replace,mi=hi,gi=function(){var e=/a/,t=/b*/g;return hi.call(e,"a"),hi.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),vi=di.UNSUPPORTED_Y||di.BROKEN_CARET,yi=void 0!==/()??/.exec("")[1];(gi||yi||vi)&&(mi=function(e){var t,n,i,r,o=this,a=vi&&o.sticky,s=ui.call(o),l=o.source,c=0,u=e;return a&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),u=String(e).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==e[o.lastIndex-1])&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",s)),yi&&(n=new RegExp("^"+l+"$(?!\\s)",s)),gi&&(t=o.lastIndex),i=hi.call(a?n:o,u),a?i?(i.input=i.input.slice(c),i[0]=i[0].slice(c),i.index=o.lastIndex,o.lastIndex+=i[0].length):o.lastIndex=0:gi&&i&&(o.lastIndex=o.global?i.index+i[0].length:t),yi&&i&&i.length>1&&pi.call(i[0],n,(function(){for(r=1;r<arguments.length-2;r++)void 0===arguments[r]&&(i[r]=void 0)})),i});var bi=mi;je({target:"RegExp",proto:!0,forced:/./.exec!==bi},{exec:bi});var wi="toString",ki=RegExp.prototype,Ti=ki.toString,Si=r((function(){return"/a/b"!=Ti.call({source:"a",flags:"b"})})),Ei=Ti.name!=wi;(Si||Ei)&&te(RegExp.prototype,wi,(function(){var e=C(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in ki)?ui.call(e):n)}),{unsafe:!0});var Ai=function(e){return function(t,n){var i,r,o=String(p(t)),a=se(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}},Ci={codeAt:Ai(!1),charAt:Ai(!0)},Pi=Ci.charAt,xi="String Iterator",Oi=ee.set,Ii=ee.getterFor(xi);Mn(String,"String",(function(e){Oi(this,{type:xi,string:String(e),index:0})}),(function(){var e,t=Ii(this),n=t.string,i=t.index;return i>=n.length?{value:void 0,done:!0}:(e=Pi(n,i),t.index+=e.length,{value:e,done:!1})}));var ji=Qe("species"),Li=!r((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),Ni="$0"==="a".replace(/./,"$0"),Ri=Qe("replace"),Mi=!!/./[Ri]&&""===/./[Ri]("a","$0"),_i=!r((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),Ui=function(e,t,n,i){var o=Qe(e),a=!r((function(){var t={};return t[o]=function(){return 7},7!=""[e](t)})),s=a&&!r((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[ji]=function(){return n},n.flags="",n[o]=/./[o]),n.exec=function(){return t=!0,null},n[o](""),!t}));if(!a||!s||"replace"===e&&(!Li||!Ni||Mi)||"split"===e&&!_i){var l=/./[o],c=n(o,""[e],(function(e,t,n,i,r){return t.exec===bi?a&&!r?{done:!0,value:l.call(t,n,i)}:{done:!0,value:e.call(n,t,i)}:{done:!1}}),{REPLACE_KEEPS_$0:Ni,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:Mi}),u=c[0],f=c[1];te(String.prototype,e,u),te(RegExp.prototype,o,2==t?function(e,t){return f.call(e,this,t)}:function(e){return f.call(e,this)})}i&&O(RegExp.prototype[o],"sham",!0)},Di=Ci.charAt,Fi=function(e,t,n){return t+(n?Di(e,t).length:1)},qi=function(e,t){var n=e.exec;if("function"==typeof n){var i=n.call(e,t);if("object"!=typeof i)throw TypeError("RegExp exec method returned something other than an Object or null");return i}if("RegExp"!==f(e))throw TypeError("RegExp#exec called on incompatible receiver");return bi.call(e,t)},Hi=Math.max,Bi=Math.min,Vi=Math.floor,zi=/\$([$&'`]|\d\d?|<[^>]*>)/g,Wi=/\$([$&'`]|\d\d?)/g;Ui("replace",2,(function(e,t,n,i){var r=i.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=i.REPLACE_KEEPS_$0,a=r?"$":"$0";return[function(n,i){var r=p(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,r,i):t.call(String(r),n,i)},function(e,i){if(!r&&o||"string"==typeof i&&-1===i.indexOf(a)){var l=n(t,e,this,i);if(l.done)return l.value}var c=C(e),u=String(this),f="function"==typeof i;f||(i=String(i));var d=c.global;if(d){var h=c.unicode;c.lastIndex=0}for(var p=[];;){var m=qi(c,u);if(null===m)break;if(p.push(m),!d)break;""===String(m[0])&&(c.lastIndex=Fi(u,ce(c.lastIndex),h))}for(var g,v="",y=0,b=0;b<p.length;b++){m=p[b];for(var w=String(m[0]),k=Hi(Bi(se(m.index),u.length),0),T=[],S=1;S<m.length;S++)T.push(void 0===(g=m[S])?g:String(g));var E=m.groups;if(f){var A=[w].concat(T,k,u);void 0!==E&&A.push(E);var P=String(i.apply(void 0,A))}else P=s(w,u,k,T,E,i);k>=y&&(v+=u.slice(y,k)+P,y=k+w.length)}return v+u.slice(y)}];function s(e,n,i,r,o,a){var s=i+e.length,l=r.length,c=Wi;return void 0!==o&&(o=Me(o),c=zi),t.call(a,c,(function(t,a){var c;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,i);case"'":return n.slice(s);case"<":c=o[a.slice(1,-1)];break;default:var u=+a;if(0===u)return t;if(u>l){var f=Vi(u/10);return 0===f?t:f<=l?void 0===r[f-1]?a.charAt(1):r[f-1]+a.charAt(1):t}c=r[u-1]}return void 0===c?"":c}))}}));var Ki=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};Ui("search",1,(function(e,t,n){return[function(t){var n=p(this),i=null==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var r=C(e),o=String(this),a=r.lastIndex;Ki(a,0)||(r.lastIndex=0);var s=qi(r,o);return Ki(r.lastIndex,a)||(r.lastIndex=a),null===s?-1:s.index}]}));var $i=Qe("match"),Yi=function(e){var t;return g(e)&&(void 0!==(t=e[$i])?!!t:"RegExp"==f(e))},Gi=Qe("species"),Xi=function(e,t){var n,i=C(e).constructor;return void 0===i||null==(n=C(i)[Gi])?t:rt(n)},Qi=[].push,Ji=Math.min,Zi=4294967295,er=!r((function(){return!RegExp(Zi,"y")}));Ui("split",2,(function(e,t,n){var i;return i="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var i=String(p(this)),r=void 0===n?Zi:n>>>0;if(0===r)return[];if(void 0===e)return[i];if(!Yi(e))return t.call(i,e,r);for(var o,a,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),u=0,f=new RegExp(e.source,c+"g");(o=bi.call(f,i))&&!((a=f.lastIndex)>u&&(l.push(i.slice(u,o.index)),o.length>1&&o.index<i.length&&Qi.apply(l,o.slice(1)),s=o[0].length,u=a,l.length>=r));)f.lastIndex===o.index&&f.lastIndex++;return u===i.length?!s&&f.test("")||l.push(""):l.push(i.slice(u)),l.length>r?l.slice(0,r):l}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var r=p(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,r,n):i.call(String(r),t,n)},function(e,r){var o=n(i,e,this,r,i!==t);if(o.done)return o.value;var a=C(e),s=String(this),l=Xi(a,RegExp),c=a.unicode,u=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(er?"y":"g"),f=new l(er?a:"^(?:"+a.source+")",u),d=void 0===r?Zi:r>>>0;if(0===d)return[];if(0===s.length)return null===qi(f,s)?[s]:[];for(var h=0,p=0,m=[];p<s.length;){f.lastIndex=er?p:0;var g,v=qi(f,er?s:s.slice(p));if(null===v||(g=Ji(ce(f.lastIndex+(er?0:p)),s.length))===h)p=Fi(s,p,c);else{if(m.push(s.slice(h,p)),m.length===d)return m;for(var y=1;y<=v.length-1;y++)if(m.push(v[y]),m.length===d)return m;p=h=g}}return m.push(s.slice(h)),m}]}),!er);var tr={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0};for(var nr in tr){var ir=i[nr],rr=ir&&ir.prototype;if(rr&&rr.forEach!==rn)try{O(rr,"forEach",rn)}catch(e){rr.forEach=rn}}var or=Qe("iterator"),ar=Qe("toStringTag"),sr=Fn.values;for(var lr in tr){var cr=i[lr],ur=cr&&cr.prototype;if(ur){if(ur[or]!==sr)try{O(ur,or,sr)}catch(e){ur[or]=sr}if(ur[ar]||O(ur,ar,lr),tr[lr])for(var fr in Fn)if(ur[fr]!==Fn[fr])try{O(ur,fr,Fn[fr])}catch(e){ur[fr]=Fn[fr]}}}var dr=Qe("iterator"),hr=!r((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,i){t.delete("b"),n+=i+e})),!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[dr]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})),pr=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},mr=Object.assign,gr=Object.defineProperty,vr=!mr||r((function(){if(o&&1!==mr({b:1},mr(gr({},"a",{enumerable:!0,get:function(){gr(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),i="abcdefghijklmnopqrst";return e[n]=7,i.split("").forEach((function(e){t[e]=e})),7!=mr({},e)[n]||_e(mr({},t)).join("")!=i}))?function(e,t){for(var n=Me(e),i=arguments.length,r=1,a=we.f,s=l.f;i>r;)for(var c,u=h(arguments[r++]),f=a?_e(u).concat(a(u)):_e(u),d=f.length,p=0;d>p;)c=f[p++],o&&!s.call(u,c)||(n[c]=u[c]);return n}:mr,yr=function(e){var t=e.return;if(void 0!==t)return C(t.call(e)).value},br=function(e,t,n,i){try{return i?t(C(n)[0],n[1]):t(n)}catch(t){throw yr(e),t}},wr=Qe("iterator"),kr=Array.prototype,Tr=function(e){return void 0!==e&&(gn.Array===e||kr[wr]===e)},Sr=Qe("iterator"),Er=function(e){if(null!=e)return e[Sr]||e["@@iterator"]||gn[li(e)]},Ar=function(e){var t,n,i,r,o,a,s=Me(e),l="function"==typeof this?this:Array,c=arguments.length,u=c>1?arguments[1]:void 0,f=void 0!==u,d=Er(s),h=0;if(f&&(u=ot(u,c>2?arguments[2]:void 0,2)),null==d||l==Array&&Tr(d))for(n=new l(t=ce(s.length));t>h;h++)a=f?u(s[h],h):s[h],Wn(n,h,a);else for(o=(r=d.call(s)).next,n=new l;!(i=o.call(r)).done;h++)a=f?br(r,u,[i.value,h],!0):i.value,Wn(n,h,a);return n.length=h,n},Cr=2147483647,Pr=/[^\0-\u007E]/,xr=/[.\u3002\uFF0E\uFF61]/g,Or="Overflow: input needs wider integers to process",Ir=Math.floor,jr=String.fromCharCode,Lr=function(e){return e+22+75*(e<26)},Nr=function(e,t,n){var i=0;for(e=n?Ir(e/700):e>>1,e+=Ir(e/t);e>455;i+=36)e=Ir(e/35);return Ir(i+36*e/(e+38))},Rr=function(e){var t,n,i=[],r=(e=function(e){for(var t=[],n=0,i=e.length;n<i;){var r=e.charCodeAt(n++);if(r>=55296&&r<=56319&&n<i){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&r)<<10)+(1023&o)+65536):(t.push(r),n--)}else t.push(r)}return t}(e)).length,o=128,a=0,s=72;for(t=0;t<e.length;t++)(n=e[t])<128&&i.push(jr(n));var l=i.length,c=l;for(l&&i.push("-");c<r;){var u=Cr;for(t=0;t<e.length;t++)(n=e[t])>=o&&n<u&&(u=n);var f=c+1;if(u-o>Ir((Cr-a)/f))throw RangeError(Or);for(a+=(u-o)*f,o=u,t=0;t<e.length;t++){if((n=e[t])<o&&++a>Cr)throw RangeError(Or);if(n==o){for(var d=a,h=36;;h+=36){var p=h<=s?1:h>=s+26?26:h-s;if(d<p)break;var m=d-p,g=36-p;i.push(jr(Lr(p+m%g))),d=Ir(m/g)}i.push(jr(Lr(d))),s=Nr(a,f,c==l),a=0,++c}}++a,++o}return i.join("")},Mr=function(e,t,n){for(var i in t)te(e,i,t[i],n);return e},_r=function(e){var t=Er(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return C(t.call(e))},Ur=re("fetch"),Dr=re("Headers"),Fr=Qe("iterator"),qr="URLSearchParams",Hr="URLSearchParamsIterator",Br=ee.set,Vr=ee.getterFor(qr),zr=ee.getterFor(Hr),Wr=/\+/g,Kr=Array(4),$r=function(e){return Kr[e-1]||(Kr[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},Yr=function(e){try{return decodeURIComponent(e)}catch(t){return e}},Gr=function(e){var t=e.replace(Wr," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace($r(n--),Yr);return t}},Xr=/[!'()~]|%20/g,Qr={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},Jr=function(e){return Qr[e]},Zr=function(e){return encodeURIComponent(e).replace(Xr,Jr)},eo=function(e,t){if(t)for(var n,i,r=t.split("&"),o=0;o<r.length;)(n=r[o++]).length&&(i=n.split("="),e.push({key:Gr(i.shift()),value:Gr(i.join("="))}))},to=function(e){this.entries.length=0,eo(this.entries,e)},no=function(e,t){if(e<t)throw TypeError("Not enough arguments")},io=Cn((function(e,t){Br(this,{type:Hr,iterator:_r(Vr(e).entries),kind:t})}),"Iterator",(function(){var e=zr(this),t=e.kind,n=e.iterator.next(),i=n.value;return n.done||(n.value="keys"===t?i.key:"values"===t?i.value:[i.key,i.value]),n})),ro=function(){pr(this,ro,qr);var e,t,n,i,r,o,a,s,l,c=arguments.length>0?arguments[0]:void 0,u=this,f=[];if(Br(u,{type:qr,entries:f,updateURL:function(){},updateSearchParams:to}),void 0!==c)if(g(c))if("function"==typeof(e=Er(c)))for(n=(t=e.call(c)).next;!(i=n.call(t)).done;){if((a=(o=(r=_r(C(i.value))).next).call(r)).done||(s=o.call(r)).done||!o.call(r).done)throw TypeError("Expected sequence with length 2");f.push({key:a.value+"",value:s.value+""})}else for(l in c)b(c,l)&&f.push({key:l,value:c[l]+""});else eo(f,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},oo=ro.prototype;Mr(oo,{append:function(e,t){no(arguments.length,2);var n=Vr(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){no(arguments.length,1);for(var t=Vr(this),n=t.entries,i=e+"",r=0;r<n.length;)n[r].key===i?n.splice(r,1):r++;t.updateURL()},get:function(e){no(arguments.length,1);for(var t=Vr(this).entries,n=e+"",i=0;i<t.length;i++)if(t[i].key===n)return t[i].value;return null},getAll:function(e){no(arguments.length,1);for(var t=Vr(this).entries,n=e+"",i=[],r=0;r<t.length;r++)t[r].key===n&&i.push(t[r].value);return i},has:function(e){no(arguments.length,1);for(var t=Vr(this).entries,n=e+"",i=0;i<t.length;)if(t[i++].key===n)return!0;return!1},set:function(e,t){no(arguments.length,1);for(var n,i=Vr(this),r=i.entries,o=!1,a=e+"",s=t+"",l=0;l<r.length;l++)(n=r[l]).key===a&&(o?r.splice(l--,1):(o=!0,n.value=s));o||r.push({key:a,value:s}),i.updateURL()},sort:function(){var e,t,n,i=Vr(this),r=i.entries,o=r.slice();for(r.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(r[t].key>e.key){r.splice(t,0,e);break}t===n&&r.push(e)}i.updateURL()},forEach:function(e){for(var t,n=Vr(this).entries,i=ot(e,arguments.length>1?arguments[1]:void 0,3),r=0;r<n.length;)i((t=n[r++]).value,t.key,this)},keys:function(){return new io(this,"keys")},values:function(){return new io(this,"values")},entries:function(){return new io(this,"entries")}},{enumerable:!0}),te(oo,Fr,oo.entries),te(oo,"toString",(function(){for(var e,t=Vr(this).entries,n=[],i=0;i<t.length;)e=t[i++],n.push(Zr(e.key)+"="+Zr(e.value));return n.join("&")}),{enumerable:!0}),it(ro,qr),je({global:!0,forced:!hr},{URLSearchParams:ro}),hr||"function"!=typeof Ur||"function"!=typeof Dr||je({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,i,r=[e];return arguments.length>1&&(g(t=arguments[1])&&(n=t.body,li(n)===qr&&((i=t.headers?new Dr(t.headers):new Dr).has("content-type")||i.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=Ve(t,{body:c(0,String(n)),headers:c(0,i)}))),r.push(t)),Ur.apply(this,r)}});var ao,so={URLSearchParams:ro,getState:Vr},lo=Ci.codeAt,co=i.URL,uo=so.URLSearchParams,fo=so.getState,ho=ee.set,po=ee.getterFor("URL"),mo=Math.floor,go=Math.pow,vo="Invalid scheme",yo="Invalid host",bo="Invalid port",wo=/[A-Za-z]/,ko=/[\d+-.A-Za-z]/,To=/\d/,So=/^(0x|0X)/,Eo=/^[0-7]+$/,Ao=/^\d+$/,Co=/^[\dA-Fa-f]+$/,Po=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,xo=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,Oo=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,Io=/[\u0009\u000A\u000D]/g,jo=function(e,t){var n,i,r;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return yo;if(!(n=No(t.slice(1,-1))))return yo;e.host=n}else if(Ho(e)){if(t=function(e){var t,n,i=[],r=e.toLowerCase().replace(xr,".").split(".");for(t=0;t<r.length;t++)n=r[t],i.push(Pr.test(n)?"xn--"+Rr(n):n);return i.join(".")}(t),Po.test(t))return yo;if(null===(n=Lo(t)))return yo;e.host=n}else{if(xo.test(t))return yo;for(n="",i=Ar(t),r=0;r<i.length;r++)n+=Fo(i[r],Mo);e.host=n}},Lo=function(e){var t,n,i,r,o,a,s,l=e.split(".");if(l.length&&""==l[l.length-1]&&l.pop(),(t=l.length)>4)return e;for(n=[],i=0;i<t;i++){if(""==(r=l[i]))return e;if(o=10,r.length>1&&"0"==r.charAt(0)&&(o=So.test(r)?16:8,r=r.slice(8==o?1:2)),""===r)a=0;else{if(!(10==o?Ao:8==o?Eo:Co).test(r))return e;a=parseInt(r,o)}n.push(a)}for(i=0;i<t;i++)if(a=n[i],i==t-1){if(a>=go(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),i=0;i<n.length;i++)s+=n[i]*go(256,3-i);return s},No=function(e){var t,n,i,r,o,a,s,l=[0,0,0,0,0,0,0,0],c=0,u=null,f=0,d=function(){return e.charAt(f)};if(":"==d()){if(":"!=e.charAt(1))return;f+=2,u=++c}for(;d();){if(8==c)return;if(":"!=d()){for(t=n=0;n<4&&Co.test(d());)t=16*t+parseInt(d(),16),f++,n++;if("."==d()){if(0==n)return;if(f-=n,c>6)return;for(i=0;d();){if(r=null,i>0){if(!("."==d()&&i<4))return;f++}if(!To.test(d()))return;for(;To.test(d());){if(o=parseInt(d(),10),null===r)r=o;else{if(0==r)return;r=10*r+o}if(r>255)return;f++}l[c]=256*l[c]+r,2!=++i&&4!=i||c++}if(4!=i)return;break}if(":"==d()){if(f++,!d())return}else if(d())return;l[c++]=t}else{if(null!==u)return;f++,u=++c}}if(null!==u)for(a=c-u,c=7;0!=c&&a>0;)s=l[c],l[c--]=l[u+a-1],l[u+--a]=s;else if(8!=c)return;return l},Ro=function(e){var t,n,i,r;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=mo(e/256);return t.join(".")}if("object"==typeof e){for(t="",i=function(e){for(var t=null,n=1,i=null,r=0,o=0;o<8;o++)0!==e[o]?(r>n&&(t=i,n=r),i=null,r=0):(null===i&&(i=o),++r);return r>n&&(t=i,n=r),t}(e),n=0;n<8;n++)r&&0===e[n]||(r&&(r=!1),i===n?(t+=n?":":"::",r=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},Mo={},_o=vr({},Mo,{" ":1,'"':1,"<":1,">":1,"`":1}),Uo=vr({},_o,{"#":1,"?":1,"{":1,"}":1}),Do=vr({},Uo,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),Fo=function(e,t){var n=lo(e,0);return n>32&&n<127&&!b(t,e)?e:encodeURIComponent(e)},qo={ftp:21,file:null,http:80,https:443,ws:80,wss:443},Ho=function(e){return b(qo,e.scheme)},Bo=function(e){return""!=e.username||""!=e.password},Vo=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},zo=function(e,t){var n;return 2==e.length&&wo.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},Wo=function(e){var t;return e.length>1&&zo(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},Ko=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&zo(t[0],!0)||t.pop()},$o=function(e){return"."===e||"%2e"===e.toLowerCase()},Yo={},Go={},Xo={},Qo={},Jo={},Zo={},ea={},ta={},na={},ia={},ra={},oa={},aa={},sa={},la={},ca={},ua={},fa={},da={},ha={},pa={},ma=function(e,t,n,i){var r,o,a,s,l,c=n||Yo,u=0,f="",d=!1,h=!1,p=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(Oo,"")),t=t.replace(Io,""),r=Ar(t);u<=r.length;){switch(o=r[u],c){case Yo:if(!o||!wo.test(o)){if(n)return vo;c=Xo;continue}f+=o.toLowerCase(),c=Go;break;case Go:if(o&&(ko.test(o)||"+"==o||"-"==o||"."==o))f+=o.toLowerCase();else{if(":"!=o){if(n)return vo;f="",c=Xo,u=0;continue}if(n&&(Ho(e)!=b(qo,f)||"file"==f&&(Bo(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=f,n)return void(Ho(e)&&qo[e.scheme]==e.port&&(e.port=null));f="","file"==e.scheme?c=sa:Ho(e)&&i&&i.scheme==e.scheme?c=Qo:Ho(e)?c=ta:"/"==r[u+1]?(c=Jo,u++):(e.cannotBeABaseURL=!0,e.path.push(""),c=da)}break;case Xo:if(!i||i.cannotBeABaseURL&&"#"!=o)return vo;if(i.cannotBeABaseURL&&"#"==o){e.scheme=i.scheme,e.path=i.path.slice(),e.query=i.query,e.fragment="",e.cannotBeABaseURL=!0,c=pa;break}c="file"==i.scheme?sa:Zo;continue;case Qo:if("/"!=o||"/"!=r[u+1]){c=Zo;continue}c=na,u++;break;case Jo:if("/"==o){c=ia;break}c=fa;continue;case Zo:if(e.scheme=i.scheme,o==ao)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query;else if("/"==o||"\\"==o&&Ho(e))c=ea;else if("?"==o)e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query="",c=ha;else{if("#"!=o){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.path.pop(),c=fa;continue}e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=pa}break;case ea:if(!Ho(e)||"/"!=o&&"\\"!=o){if("/"!=o){e.username=i.username,e.password=i.password,e.host=i.host,e.port=i.port,c=fa;continue}c=ia}else c=na;break;case ta:if(c=na,"/"!=o||"/"!=f.charAt(u+1))continue;u++;break;case na:if("/"!=o&&"\\"!=o){c=ia;continue}break;case ia:if("@"==o){d&&(f="%40"+f),d=!0,a=Ar(f);for(var m=0;m<a.length;m++){var g=a[m];if(":"!=g||p){var v=Fo(g,Do);p?e.password+=v:e.username+=v}else p=!0}f=""}else if(o==ao||"/"==o||"?"==o||"#"==o||"\\"==o&&Ho(e)){if(d&&""==f)return"Invalid authority";u-=Ar(f).length+1,f="",c=ra}else f+=o;break;case ra:case oa:if(n&&"file"==e.scheme){c=ca;continue}if(":"!=o||h){if(o==ao||"/"==o||"?"==o||"#"==o||"\\"==o&&Ho(e)){if(Ho(e)&&""==f)return yo;if(n&&""==f&&(Bo(e)||null!==e.port))return;if(s=jo(e,f))return s;if(f="",c=ua,n)return;continue}"["==o?h=!0:"]"==o&&(h=!1),f+=o}else{if(""==f)return yo;if(s=jo(e,f))return s;if(f="",c=aa,n==oa)return}break;case aa:if(!To.test(o)){if(o==ao||"/"==o||"?"==o||"#"==o||"\\"==o&&Ho(e)||n){if(""!=f){var y=parseInt(f,10);if(y>65535)return bo;e.port=Ho(e)&&y===qo[e.scheme]?null:y,f=""}if(n)return;c=ua;continue}return bo}f+=o;break;case sa:if(e.scheme="file","/"==o||"\\"==o)c=la;else{if(!i||"file"!=i.scheme){c=fa;continue}if(o==ao)e.host=i.host,e.path=i.path.slice(),e.query=i.query;else if("?"==o)e.host=i.host,e.path=i.path.slice(),e.query="",c=ha;else{if("#"!=o){Wo(r.slice(u).join(""))||(e.host=i.host,e.path=i.path.slice(),Ko(e)),c=fa;continue}e.host=i.host,e.path=i.path.slice(),e.query=i.query,e.fragment="",c=pa}}break;case la:if("/"==o||"\\"==o){c=ca;break}i&&"file"==i.scheme&&!Wo(r.slice(u).join(""))&&(zo(i.path[0],!0)?e.path.push(i.path[0]):e.host=i.host),c=fa;continue;case ca:if(o==ao||"/"==o||"\\"==o||"?"==o||"#"==o){if(!n&&zo(f))c=fa;else if(""==f){if(e.host="",n)return;c=ua}else{if(s=jo(e,f))return s;if("localhost"==e.host&&(e.host=""),n)return;f="",c=ua}continue}f+=o;break;case ua:if(Ho(e)){if(c=fa,"/"!=o&&"\\"!=o)continue}else if(n||"?"!=o)if(n||"#"!=o){if(o!=ao&&(c=fa,"/"!=o))continue}else e.fragment="",c=pa;else e.query="",c=ha;break;case fa:if(o==ao||"/"==o||"\\"==o&&Ho(e)||!n&&("?"==o||"#"==o)){if(".."===(l=(l=f).toLowerCase())||"%2e."===l||".%2e"===l||"%2e%2e"===l?(Ko(e),"/"==o||"\\"==o&&Ho(e)||e.path.push("")):$o(f)?"/"==o||"\\"==o&&Ho(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&zo(f)&&(e.host&&(e.host=""),f=f.charAt(0)+":"),e.path.push(f)),f="","file"==e.scheme&&(o==ao||"?"==o||"#"==o))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==o?(e.query="",c=ha):"#"==o&&(e.fragment="",c=pa)}else f+=Fo(o,Uo);break;case da:"?"==o?(e.query="",c=ha):"#"==o?(e.fragment="",c=pa):o!=ao&&(e.path[0]+=Fo(o,Mo));break;case ha:n||"#"!=o?o!=ao&&("'"==o&&Ho(e)?e.query+="%27":e.query+="#"==o?"%23":Fo(o,Mo)):(e.fragment="",c=pa);break;case pa:o!=ao&&(e.fragment+=Fo(o,_o))}u++}},ga=function(e){var t,n,i=pr(this,ga,"URL"),r=arguments.length>1?arguments[1]:void 0,a=String(e),s=ho(i,{type:"URL"});if(void 0!==r)if(r instanceof ga)t=po(r);else if(n=ma(t={},String(r)))throw TypeError(n);if(n=ma(s,a,null,t))throw TypeError(n);var l=s.searchParams=new uo,c=fo(l);c.updateSearchParams(s.query),c.updateURL=function(){s.query=String(l)||null},o||(i.href=ya.call(i),i.origin=ba.call(i),i.protocol=wa.call(i),i.username=ka.call(i),i.password=Ta.call(i),i.host=Sa.call(i),i.hostname=Ea.call(i),i.port=Aa.call(i),i.pathname=Ca.call(i),i.search=Pa.call(i),i.searchParams=xa.call(i),i.hash=Oa.call(i))},va=ga.prototype,ya=function(){var e=po(this),t=e.scheme,n=e.username,i=e.password,r=e.host,o=e.port,a=e.path,s=e.query,l=e.fragment,c=t+":";return null!==r?(c+="//",Bo(e)&&(c+=n+(i?":"+i:"")+"@"),c+=Ro(r),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(c+="?"+s),null!==l&&(c+="#"+l),c},ba=function(){var e=po(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&Ho(e)?t+"://"+Ro(e.host)+(null!==n?":"+n:""):"null"},wa=function(){return po(this).scheme+":"},ka=function(){return po(this).username},Ta=function(){return po(this).password},Sa=function(){var e=po(this),t=e.host,n=e.port;return null===t?"":null===n?Ro(t):Ro(t)+":"+n},Ea=function(){var e=po(this).host;return null===e?"":Ro(e)},Aa=function(){var e=po(this).port;return null===e?"":String(e)},Ca=function(){var e=po(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},Pa=function(){var e=po(this).query;return e?"?"+e:""},xa=function(){return po(this).searchParams},Oa=function(){var e=po(this).fragment;return e?"#"+e:""},Ia=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(o&&Ue(va,{href:Ia(ya,(function(e){var t=po(this),n=String(e),i=ma(t,n);if(i)throw TypeError(i);fo(t.searchParams).updateSearchParams(t.query)})),origin:Ia(ba),protocol:Ia(wa,(function(e){var t=po(this);ma(t,String(e)+":",Yo)})),username:Ia(ka,(function(e){var t=po(this),n=Ar(String(e));if(!Vo(t)){t.username="";for(var i=0;i<n.length;i++)t.username+=Fo(n[i],Do)}})),password:Ia(Ta,(function(e){var t=po(this),n=Ar(String(e));if(!Vo(t)){t.password="";for(var i=0;i<n.length;i++)t.password+=Fo(n[i],Do)}})),host:Ia(Sa,(function(e){var t=po(this);t.cannotBeABaseURL||ma(t,String(e),ra)})),hostname:Ia(Ea,(function(e){var t=po(this);t.cannotBeABaseURL||ma(t,String(e),oa)})),port:Ia(Aa,(function(e){var t=po(this);Vo(t)||(""==(e=String(e))?t.port=null:ma(t,e,aa))})),pathname:Ia(Ca,(function(e){var t=po(this);t.cannotBeABaseURL||(t.path=[],ma(t,e+"",ua))})),search:Ia(Pa,(function(e){var t=po(this);""==(e=String(e))?t.query=null:("?"==e.charAt(0)&&(e=e.slice(1)),t.query="",ma(t,e,ha)),fo(t.searchParams).updateSearchParams(t.query)})),searchParams:Ia(xa),hash:Ia(Oa,(function(e){var t=po(this);""!=(e=String(e))?("#"==e.charAt(0)&&(e=e.slice(1)),t.fragment="",ma(t,e,pa)):t.fragment=null}))}),te(va,"toJSON",(function(){return ya.call(this)}),{enumerable:!0}),te(va,"toString",(function(){return ya.call(this)}),{enumerable:!0}),co){var ja=co.createObjectURL,La=co.revokeObjectURL;ja&&te(ga,"createObjectURL",(function(e){return ja.apply(co,arguments)})),La&&te(ga,"revokeObjectURL",(function(e){return La.apply(co,arguments)}))}function Na(e){return(Na="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function Ra(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function Ma(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 _a(e,t,n){return t&&Ma(e.prototype,t),n&&Ma(e,n),e}function Ua(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function Da(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function Fa(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?Da(Object(n),!0).forEach((function(t){Ua(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):Da(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function qa(e,t){if(null==e)return{};var n,i,r=function(e,t){if(null==e)return{};var n,i,r={},o=Object.keys(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||(r[n]=e[n]);return r}(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(i=0;i<o.length;i++)n=o[i],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(r[n]=e[n])}return r}function Ha(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){if("undefined"==typeof Symbol||!(Symbol.iterator in Object(e)))return;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)||Va(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Ba(e){return function(e){if(Array.isArray(e))return za(e)}(e)||function(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}(e)||Va(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function Va(e,t){if(e){if("string"==typeof e)return za(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?za(e,t):void 0}}function za(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,i=new Array(t);n<t;n++)i[n]=e[n];return i}it(ga,"URL"),je({global:!0,forced:!hr,sham:!o},{URL:ga}),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(String(e).replace(/\+/g," "))};(function(){try{var t=e.URLSearchParams;return"a=1"===new t("?a=1").toString()&&"function"==typeof t.prototype.set&&"function"==typeof t.prototype.entries}catch(e){return!1}})()||function(){var r=function e(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var n=Na(t);if("undefined"===n);else if("string"===n)""!==t&&this._fromString(t);else if(t instanceof e){var i=this;t.forEach((function(e,t){i.append(t,e)}))}else{if(null===t||"object"!==n)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var r=0;r<t.length;r++){var o=t[r];if("[object Array]"!==Object.prototype.toString.call(o)&&2===o.length)throw new TypeError("Expected [string, any] as entry at index "+r+" of URLSearchParams's input");this.append(o[0],o[1])}else for(var a in t)t.hasOwnProperty(a)&&this.append(a,t[a])}},o=r.prototype;o.append=function(e,t){e in this._entries?this._entries[e].push(String(t)):this._entries[e]=[String(t)]},o.delete=function(e){delete this._entries[e]},o.get=function(e){return e in this._entries?this._entries[e][0]:null},o.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},o.has=function(e){return e in this._entries},o.set=function(e,t){this._entries[e]=[String(t)]},o.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)}},o.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),n(e)},o.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),n(e)},o.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),n(e)},t&&(o[Symbol.iterator]=o.entries),o.toString=function(){var e=[];return this.forEach((function(t,n){e.push(i(n)+"="+i(t))})),e.join("&")},e.URLSearchParams=r}();var o=e.URLSearchParams.prototype;"function"!=typeof o.sort&&(o.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])}),"function"!=typeof o._fromString&&Object.defineProperty(o,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){if(this._entries)this._entries={};else{var t=[];this.forEach((function(e,n){t.push(n)}));for(var n=0;n<t.length;n++)this.delete(t[n])}var i,o=(e=e.replace(/^\?/,"")).split("&");for(n=0;n<o.length;n++)i=o[n].split("="),this.append(r(i[0]),i.length>1?r(i[1]):"")}})}(void 0!==e?e:"undefined"!=typeof window?window:"undefined"!=typeof self?self:e),function(e){if(function(){try{var t=new e.URL("b","http://a");return t.pathname="c d","http://a/c%20d"===t.href&&t.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t)),n&&"string"!=typeof n&&(n=String(n));var i,r=document;if(n&&(void 0===e.location||n!==e.location.href)){n=n.toLowerCase(),(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");o.href=t,i&&(r.body.appendChild(o),o.href=o.href);var a=r.createElement("input");if(a.type="url",a.value=t,":"===o.protocol||!/:/.test(o.href)||!a.checkValidity()&&!n)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var s=new e.URLSearchParams(this.search),l=!0,c=!0,u=this;["append","delete","set"].forEach((function(e){var t=s[e];s[e]=function(){t.apply(s,arguments),l&&(c=!1,u.search=s.toString(),c=!0)}})),Object.defineProperty(this,"searchParams",{value:s,enumerable:!0});var f=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==f&&(f=this.search,c&&(l=!1,this.searchParams._fromString(this.search),l=!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 Wa=Qe("isConcatSpreadable"),Ka=9007199254740991,$a="Maximum allowed index exceeded",Ya=Xn>=51||!r((function(){var e=[];return e[Wa]=!1,e.concat()[0]!==e})),Ga=Jn("concat"),Xa=function(e){if(!g(e))return!1;var t=e[Wa];return void 0!==t?!!t:Re(e)};je({target:"Array",proto:!0,forced:!Ya||!Ga},{concat:function(e){var t,n,i,r,o,a=Me(this),s=st(a,0),l=0;for(t=-1,i=arguments.length;t<i;t++)if(Xa(o=-1===t?a:arguments[t])){if(l+(r=ce(o.length))>Ka)throw TypeError($a);for(n=0;n<r;n++,l++)n in o&&Wn(s,l,o[n])}else{if(l>=Ka)throw TypeError($a);Wn(s,l++,o)}return s.length=l,s}});var Qa=ut.filter,Ja=Jn("filter"),Za=Zt("filter");je({target:"Array",proto:!0,forced:!Ja||!Za},{filter:function(e){return Qa(this,e,arguments.length>1?arguments[1]:void 0)}});var es=ut.find,ts="find",ns=!0,is=Zt(ts);ts in[]&&Array(1).find((function(){ns=!1})),je({target:"Array",proto:!0,forced:ns||!is},{find:function(e){return es(this,e,arguments.length>1?arguments[1]:void 0)}}),mn(ts);var rs=Qe("iterator"),os=!1;try{var as=0,ss={next:function(){return{done:!!as++}},return:function(){os=!0}};ss[rs]=function(){return this},Array.from(ss,(function(){throw 2}))}catch(e){}var ls=function(e,t){if(!t&&!os)return!1;var n=!1;try{var i={};i[rs]=function(){return{next:function(){return{done:n=!0}}}},e(i)}catch(e){}return n},cs=!ls((function(e){Array.from(e)}));je({target:"Array",stat:!0,forced:cs},{from:Ar});var us=pe.includes,fs=Zt("indexOf",{ACCESSORS:!0,1:0});je({target:"Array",proto:!0,forced:!fs},{includes:function(e){return us(this,e,arguments.length>1?arguments[1]:void 0)}}),mn("includes");var ds=ut.map,hs=Jn("map"),ps=Zt("map");je({target:"Array",proto:!0,forced:!hs||!ps},{map:function(e){return ds(this,e,arguments.length>1?arguments[1]:void 0)}});var ms=function(e,t,n){var i,r;return Pn&&"function"==typeof(i=t.constructor)&&i!==n&&g(r=i.prototype)&&r!==n.prototype&&Pn(e,r),e},gs="\t\n\v\f\r                 \u2028\u2029\ufeff",vs="["+gs+"]",ys=RegExp("^"+vs+vs+"*"),bs=RegExp(vs+vs+"*$"),ws=function(e){return function(t){var n=String(p(t));return 1&e&&(n=n.replace(ys,"")),2&e&&(n=n.replace(bs,"")),n}},ks={start:ws(1),end:ws(2),trim:ws(3)},Ts=be.f,Ss=A.f,Es=x.f,As=ks.trim,Cs="Number",Ps=i.Number,xs=Ps.prototype,Os=f(Ve(xs))==Cs,Is=function(e){var t,n,i,r,o,a,s,l,c=v(e,!1);if("string"==typeof c&&c.length>2)if(43===(t=(c=As(c)).charCodeAt(0))||45===t){if(88===(n=c.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(c.charCodeAt(1)){case 66:case 98:i=2,r=49;break;case 79:case 111:i=8,r=55;break;default:return+c}for(a=(o=c.slice(2)).length,s=0;s<a;s++)if((l=o.charCodeAt(s))<48||l>r)return NaN;return parseInt(o,i)}return+c};if(Oe(Cs,!Ps(" 0o1")||!Ps("0b1")||Ps("+0x1"))){for(var js,Ls=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof Ls&&(Os?r((function(){xs.valueOf.call(n)})):f(n)!=Cs)?ms(new Ps(Is(t)),n,Ls):Is(t)},Ns=o?Ts(Ps):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),Rs=0;Ns.length>Rs;Rs++)b(Ps,js=Ns[Rs])&&!b(Ls,js)&&Es(Ls,js,Ss(Ps,js));Ls.prototype=xs,xs.constructor=Ls,te(i,Cs,Ls)}var Ms=r((function(){_e(1)}));je({target:"Object",stat:!0,forced:Ms},{keys:function(e){return _e(Me(e))}});var _s=l.f,Us=function(e){return function(t){for(var n,i=m(t),r=_e(i),a=r.length,s=0,l=[];a>s;)n=r[s++],o&&!_s.call(i,n)||l.push(e?[n,i[n]]:i[n]);return l}},Ds={entries:Us(!0),values:Us(!1)},Fs=Ds.values;je({target:"Object",stat:!0},{values:function(e){return Fs(e)}});var qs=function(e){if(Yi(e))throw TypeError("The method doesn't accept regular expressions");return e},Hs=Qe("match"),Bs=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[Hs]=!1,"/./"[e](t)}catch(e){}}return!1};je({target:"String",proto:!0,forced:!Bs("includes")},{includes:function(e){return!!~String(p(this)).indexOf(qs(e),arguments.length>1?arguments[1]:void 0)}});var Vs=!r((function(){return Object.isExtensible(Object.preventExtensions({}))})),zs=t((function(e){var t=x.f,n=V("meta"),i=0,r=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:"O"+ ++i,weakData:{}}})},a=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!g(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!b(e,n)){if(!r(e))return"F";if(!t)return"E";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!b(e,n)){if(!r(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return Vs&&a.REQUIRED&&r(e)&&!b(e,n)&&o(e),e}};K[n]=!0})),Ws=(zs.REQUIRED,zs.fastKey,zs.getWeakData,zs.onFreeze,function(e,t){this.stopped=e,this.result=t}),Ks=function(e,t,n){var i,r,o,a,s,l,c,u=n&&n.that,f=!(!n||!n.AS_ENTRIES),d=!(!n||!n.IS_ITERATOR),h=!(!n||!n.INTERRUPTED),p=ot(t,u,1+f+h),m=function(e){return i&&yr(i),new Ws(!0,e)},g=function(e){return f?(C(e),h?p(e[0],e[1],m):p(e[0],e[1])):h?p(e,m):p(e)};if(d)i=e;else{if("function"!=typeof(r=Er(e)))throw TypeError("Target is not iterable");if(Tr(r)){for(o=0,a=ce(e.length);a>o;o++)if((s=g(e[o]))&&s instanceof Ws)return s;return new Ws(!1)}i=r.call(e)}for(l=i.next;!(c=l.call(i)).done;){try{s=g(c.value)}catch(e){throw yr(i),e}if("object"==typeof s&&s&&s instanceof Ws)return s}return new Ws(!1)},$s=zs.getWeakData,Ys=ee.set,Gs=ee.getterFor,Xs=ut.find,Qs=ut.findIndex,Js=0,Zs=function(e){return e.frozen||(e.frozen=new el)},el=function(){this.entries=[]},tl=function(e,t){return Xs(e.entries,(function(e){return e[0]===t}))};el.prototype={get:function(e){var t=tl(this,e);if(t)return t[1]},has:function(e){return!!tl(this,e)},set:function(e,t){var n=tl(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=Qs(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}};var nl={getConstructor:function(e,t,n,i){var r=e((function(e,o){pr(e,r,t),Ys(e,{type:t,id:Js++,frozen:void 0}),null!=o&&Ks(o,e[i],{that:e,AS_ENTRIES:n})})),o=Gs(t),a=function(e,t,n){var i=o(e),r=$s(C(t),!0);return!0===r?Zs(i).set(t,n):r[i.id]=n,e};return Mr(r.prototype,{delete:function(e){var t=o(this);if(!g(e))return!1;var n=$s(e);return!0===n?Zs(t).delete(e):n&&b(n,t.id)&&delete n[t.id]},has:function(e){var t=o(this);if(!g(e))return!1;var n=$s(e);return!0===n?Zs(t).has(e):n&&b(n,t.id)}}),Mr(r.prototype,n?{get:function(e){var t=o(this);if(g(e)){var n=$s(e);return!0===n?Zs(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return a(this,e,t)}}:{add:function(e){return a(this,e,!0)}}),r}},il=(t((function(e){var t,n=ee.enforce,o=!i.ActiveXObject&&"ActiveXObject"in i,a=Object.isExtensible,s=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},l=e.exports=function(e,t,n){var o=-1!==e.indexOf("Map"),a=-1!==e.indexOf("Weak"),s=o?"set":"add",l=i[e],c=l&&l.prototype,u=l,f={},d=function(e){var t=c[e];te(c,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(a&&!g(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return a&&!g(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(a&&!g(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(Oe(e,"function"!=typeof l||!(a||c.forEach&&!r((function(){(new l).entries().next()})))))u=n.getConstructor(t,e,o,s),zs.REQUIRED=!0;else if(Oe(e,!0)){var h=new u,p=h[s](a?{}:-0,1)!=h,m=r((function(){h.has(1)})),v=ls((function(e){new l(e)})),y=!a&&r((function(){for(var e=new l,t=5;t--;)e[s](t,t);return!e.has(-0)}));v||((u=t((function(t,n){pr(t,u,e);var i=ms(new l,t,u);return null!=n&&Ks(n,i[s],{that:i,AS_ENTRIES:o}),i}))).prototype=c,c.constructor=u),(m||y)&&(d("delete"),d("has"),o&&d("get")),(y||p)&&d(s),a&&c.clear&&delete c.clear}return f[e]=u,je({global:!0,forced:u!=l},f),it(u,e),a||n.setStrong(u,e,o),u}("WeakMap",s,nl);if(F&&o){t=nl.getConstructor(s,"WeakMap",!0),zs.REQUIRED=!0;var c=l.prototype,u=c.delete,f=c.has,d=c.get,h=c.set;Mr(c,{delete:function(e){if(g(e)&&!a(e)){var i=n(this);return i.frozen||(i.frozen=new t),u.call(this,e)||i.frozen.delete(e)}return u.call(this,e)},has:function(e){if(g(e)&&!a(e)){var i=n(this);return i.frozen||(i.frozen=new t),f.call(this,e)||i.frozen.has(e)}return f.call(this,e)},get:function(e){if(g(e)&&!a(e)){var i=n(this);return i.frozen||(i.frozen=new t),f.call(this,e)?d.call(this,e):i.frozen.get(e)}return d.call(this,e)},set:function(e,i){if(g(e)&&!a(e)){var r=n(this);r.frozen||(r.frozen=new t),f.call(this,e)?h.call(this,e,i):r.frozen.set(e,i)}else h.call(this,e,i);return this}})}})),ut.every),rl=Gt("every"),ol=Zt("every");je({target:"Array",proto:!0,forced:!rl||!ol},{every:function(e){return il(this,e,arguments.length>1?arguments[1]:void 0)}}),je({target:"Object",stat:!0,forced:Object.assign!==vr},{assign:vr});var al=ks.trim;je({target:"String",proto:!0,forced:function(e){return r((function(){return!!gs[e]()||"​…᠎"!="​…᠎"[e]()||gs[e].name!==e}))}("trim")},{trim:function(){return al(this)}});var sl=ut.some,ll=Gt("some"),cl=Zt("some");je({target:"Array",proto:!0,forced:!ll||!cl},{some:function(e){return sl(this,e,arguments.length>1?arguments[1]:void 0)}});var ul="".repeat||function(e){var t=String(p(this)),n="",i=se(e);if(i<0||i==1/0)throw RangeError("Wrong number of repetitions");for(;i>0;(i>>>=1)&&(t+=t))1&i&&(n+=t);return n},fl=1..toFixed,dl=Math.floor,hl=function(e,t,n){return 0===t?n:t%2==1?hl(e,t-1,n*e):hl(e*e,t/2,n)},pl=fl&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!r((function(){fl.call({})}));je({target:"Number",proto:!0,forced:pl},{toFixed:function(e){var t,n,i,r,o=function(e){if("number"!=typeof e&&"Number"!=f(e))throw TypeError("Incorrect invocation");return+e}(this),a=se(e),s=[0,0,0,0,0,0],l="",c="0",u=function(e,t){for(var n=-1,i=t;++n<6;)i+=e*s[n],s[n]=i%1e7,i=dl(i/1e7)},d=function(e){for(var t=6,n=0;--t>=0;)n+=s[t],s[t]=dl(n/e),n=n%e*1e7},h=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==s[e]){var n=String(s[e]);t=""===t?n:t+ul.call("0",7-n.length)+n}return t};if(a<0||a>20)throw RangeError("Incorrect fraction digits");if(o!=o)return"NaN";if(o<=-1e21||o>=1e21)return String(o);if(o<0&&(l="-",o=-o),o>1e-21)if(n=(t=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t}(o*hl(2,69,1))-69)<0?o*hl(2,-t,1):o/hl(2,t,1),n*=4503599627370496,(t=52-t)>0){for(u(0,n),i=a;i>=7;)u(1e7,0),i-=7;for(u(hl(10,i,1),0),i=t-1;i>=23;)d(1<<23),i-=23;d(1<<i),u(1,1),d(2),c=h()}else u(0,n),u(1<<-t,0),c=h()+ul.call("0",a);return c=a>0?l+((r=c.length)<=a?"0."+ul.call("0",a-r)+c:c.slice(0,r-a)+"."+c.slice(r-a)):l+c}});var ml=Ds.entries;je({target:"Object",stat:!0},{entries:function(e){return ml(e)}}),je({target:"Number",stat:!0},{isNaN:function(e){return e!=e}});var gl=A.f,vl=r((function(){gl(1)}));function yl(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 bl(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function wl(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);t&&(i=i.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,i)}return n}function kl(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?wl(Object(n),!0).forEach((function(t){bl(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):wl(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}je({target:"Object",stat:!0,forced:!o||vl,sham:!o},{getOwnPropertyDescriptor:function(e,t){return gl(m(e),t)}}),je({target:"Object",stat:!0,sham:!o},{getOwnPropertyDescriptors:function(e){for(var t,n,i=m(e),r=A.f,o=ke(i),a={},s=0;o.length>s;)void 0!==(n=r(i,t=o[s++]))&&Wn(a,t,n);return a}}),Ui("match",1,(function(e,t,n){return[function(t){var n=p(this),i=null==t?void 0:t[e];return void 0!==i?i.call(t,n):new RegExp(t)[e](String(n))},function(e){var i=n(t,e,this);if(i.done)return i.value;var r=C(e),o=String(this);if(!r.global)return qi(r,o);var a=r.unicode;r.lastIndex=0;for(var s,l=[],c=0;null!==(s=qi(r,o));){var u=String(s[0]);l[c]=u,""===u&&(r.lastIndex=Fi(o,ce(r.lastIndex),a)),c++}return 0===c?null:l}]}));var Tl={addCSS:!0,thumbWidth:15,watch:!0};function Sl(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}var El=function(e){return null!=e?e.constructor:null},Al=function(e,t){return!!(e&&t&&e instanceof t)},Cl=function(e){return null==e},Pl=function(e){return El(e)===Object},xl=function(e){return El(e)===String},Ol=function(e){return Array.isArray(e)},Il=function(e){return Al(e,NodeList)},jl=xl,Ll=Ol,Nl=Il,Rl=function(e){return Al(e,Element)},Ml=function(e){return Al(e,Event)},_l=function(e){return Cl(e)||(xl(e)||Ol(e)||Il(e))&&!e.length||Pl(e)&&!Object.keys(e).length};function Ul(e,t){if(1>t){var n=function(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var Dl,Fl,ql,Hl=function(){function e(t,n){(function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")})(this,e),Rl(t)?this.element=t:jl(t)&&(this.element=document.querySelector(t)),Rl(this.element)&&_l(this.element.rangeTouch)&&(this.config=kl({},Tl,{},n),this.init())}return function(e,t,n){t&&yl(e.prototype,t),n&&yl(e,n)}(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!Ml(t))return null;var n,i=t.target,r=t.changedTouches[0],o=parseFloat(i.getAttribute("min"))||0,a=parseFloat(i.getAttribute("max"))||100,s=parseFloat(i.getAttribute("step"))||1,l=i.getBoundingClientRect(),c=100/l.width*(this.config.thumbWidth/2)/100;return 0>(n=100/l.width*(r.clientX-l.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*c:50<n&&(n+=2*(n-50)*c),o+Ul(n/100*(a-o),s)}},{key:"set",value:function(t){e.enabled&&Ml(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),function(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},i=null;if(_l(t)||jl(t)?i=Array.from(document.querySelectorAll(jl(t)?t:'input[type="range"]')):Rl(t)?i=[t]:Nl(t)?i=Array.from(t):Ll(t)&&(i=t.filter(Rl)),_l(i))return null;var r=kl({},Tl,{},n);if(jl(t)&&r.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){Rl(n)&&Sl(n,t)&&new e(n,r)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return i.map((function(t){return new e(t,n)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),Bl=i.Promise,Vl=Qe("species"),zl=function(e){var t=re(e),n=x.f;o&&t&&!t[Vl]&&n(t,Vl,{configurable:!0,get:function(){return this}})},Wl=/(iphone|ipod|ipad).*applewebkit/i.test(Kn),Kl="process"==f(i.process),$l=i.location,Yl=i.setImmediate,Gl=i.clearImmediate,Xl=i.process,Ql=i.MessageChannel,Jl=i.Dispatch,Zl=0,ec={},tc="onreadystatechange",nc=function(e){if(ec.hasOwnProperty(e)){var t=ec[e];delete ec[e],t()}},ic=function(e){return function(){nc(e)}},rc=function(e){nc(e.data)},oc=function(e){i.postMessage(e+"",$l.protocol+"//"+$l.host)};Yl&&Gl||(Yl=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return ec[++Zl]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},Dl(Zl),Zl},Gl=function(e){delete ec[e]},Kl?Dl=function(e){Xl.nextTick(ic(e))}:Jl&&Jl.now?Dl=function(e){Jl.now(ic(e))}:Ql&&!Wl?(ql=(Fl=new Ql).port2,Fl.port1.onmessage=rc,Dl=ot(ql.postMessage,ql,1)):i.addEventListener&&"function"==typeof postMessage&&!i.importScripts&&$l&&"file:"!==$l.protocol&&!r(oc)?(Dl=oc,i.addEventListener("message",rc,!1)):Dl=tc in T("script")?function(e){De.appendChild(T("script")).onreadystatechange=function(){De.removeChild(this),nc(e)}}:function(e){setTimeout(ic(e),0)});var ac,sc,lc,cc,uc,fc,dc,hc,pc={set:Yl,clear:Gl},mc=A.f,gc=pc.set,vc=i.MutationObserver||i.WebKitMutationObserver,yc=i.document,bc=i.process,wc=i.Promise,kc=mc(i,"queueMicrotask"),Tc=kc&&kc.value;Tc||(ac=function(){var e,t;for(Kl&&(e=bc.domain)&&e.exit();sc;){t=sc.fn,sc=sc.next;try{t()}catch(e){throw sc?cc():lc=void 0,e}}lc=void 0,e&&e.enter()},!Wl&&!Kl&&vc&&yc?(uc=!0,fc=yc.createTextNode(""),new vc(ac).observe(fc,{characterData:!0}),cc=function(){fc.data=uc=!uc}):wc&&wc.resolve?(dc=wc.resolve(void 0),hc=dc.then,cc=function(){hc.call(dc,ac)}):cc=Kl?function(){bc.nextTick(ac)}:function(){gc.call(i,ac)});var Sc,Ec,Ac,Cc,Pc=Tc||function(e){var t={fn:e,next:void 0};lc&&(lc.next=t),sc||(sc=t,cc()),lc=t},xc=function(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=rt(t),this.reject=rt(n)},Oc={f:function(e){return new xc(e)}},Ic=function(e,t){if(C(e),g(t)&&t.constructor===e)return t;var n=Oc.f(e);return(0,n.resolve)(t),n.promise},jc=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},Lc=pc.set,Nc=Qe("species"),Rc="Promise",Mc=ee.get,_c=ee.set,Uc=ee.getterFor(Rc),Dc=Bl,Fc=i.TypeError,qc=i.document,Hc=i.process,Bc=re("fetch"),Vc=Oc.f,zc=Vc,Wc=!!(qc&&qc.createEvent&&i.dispatchEvent),Kc="function"==typeof PromiseRejectionEvent,$c="unhandledrejection",Yc=Oe(Rc,(function(){if(!(U(Dc)!==String(Dc))){if(66===Xn)return!0;if(!Kl&&!Kc)return!0}if(Xn>=51&&/native code/.test(Dc))return!1;var e=Dc.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[Nc]=t,!(e.then((function(){}))instanceof t)})),Gc=Yc||!ls((function(e){Dc.all(e).catch((function(){}))})),Xc=function(e){var t;return!(!g(e)||"function"!=typeof(t=e.then))&&t},Qc=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;Pc((function(){for(var i=e.value,r=1==e.state,o=0;n.length>o;){var a,s,l,c=n[o++],u=r?c.ok:c.fail,f=c.resolve,d=c.reject,h=c.domain;try{u?(r||(2===e.rejection&&tu(e),e.rejection=1),!0===u?a=i:(h&&h.enter(),a=u(i),h&&(h.exit(),l=!0)),a===c.promise?d(Fc("Promise-chain cycle")):(s=Xc(a))?s.call(a,f,d):f(a)):d(i)}catch(e){h&&!l&&h.exit(),d(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&Zc(e)}))}},Jc=function(e,t,n){var r,o;Wc?((r=qc.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),i.dispatchEvent(r)):r={promise:t,reason:n},!Kc&&(o=i["on"+e])?o(r):e===$c&&function(e,t){var n=i.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))}("Unhandled promise rejection",n)},Zc=function(e){Lc.call(i,(function(){var t,n=e.facade,i=e.value;if(eu(e)&&(t=jc((function(){Kl?Hc.emit("unhandledRejection",i,n):Jc($c,n,i)})),e.rejection=Kl||eu(e)?2:1,t.error))throw t.value}))},eu=function(e){return 1!==e.rejection&&!e.parent},tu=function(e){Lc.call(i,(function(){var t=e.facade;Kl?Hc.emit("rejectionHandled",t):Jc("rejectionhandled",t,e.value)}))},nu=function(e,t,n){return function(i){e(t,i,n)}},iu=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=2,Qc(e,!0))},ru=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw Fc("Promise can't be resolved itself");var i=Xc(t);i?Pc((function(){var n={done:!1};try{i.call(t,nu(ru,n,e),nu(iu,n,e))}catch(t){iu(n,t,e)}})):(e.value=t,e.state=1,Qc(e,!1))}catch(t){iu({done:!1},t,e)}}};Yc&&(Dc=function(e){pr(this,Dc,Rc),rt(e),Sc.call(this);var t=Mc(this);try{e(nu(ru,t),nu(iu,t))}catch(e){iu(t,e)}},(Sc=function(e){_c(this,{type:Rc,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:0,value:void 0})}).prototype=Mr(Dc.prototype,{then:function(e,t){var n=Uc(this),i=Vc(Xi(this,Dc));return i.ok="function"!=typeof e||e,i.fail="function"==typeof t&&t,i.domain=Kl?Hc.domain:void 0,n.parent=!0,n.reactions.push(i),0!=n.state&&Qc(n,!1),i.promise},catch:function(e){return this.then(void 0,e)}}),Ec=function(){var e=new Sc,t=Mc(e);this.promise=e,this.resolve=nu(ru,t),this.reject=nu(iu,t)},Oc.f=Vc=function(e){return e===Dc||e===Ac?new Ec(e):zc(e)},"function"==typeof Bl&&(Cc=Bl.prototype.then,te(Bl.prototype,"then",(function(e,t){var n=this;return new Dc((function(e,t){Cc.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof Bc&&je({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return Ic(Dc,Bc.apply(i,arguments))}}))),je({global:!0,wrap:!0,forced:Yc},{Promise:Dc}),it(Dc,Rc,!1),zl(Rc),Ac=re(Rc),je({target:Rc,stat:!0,forced:Yc},{reject:function(e){var t=Vc(this);return t.reject.call(void 0,e),t.promise}}),je({target:Rc,stat:!0,forced:Yc},{resolve:function(e){return Ic(this,e)}}),je({target:Rc,stat:!0,forced:Gc},{all:function(e){var t=this,n=Vc(t),i=n.resolve,r=n.reject,o=jc((function(){var n=rt(t.resolve),o=[],a=0,s=1;Ks(e,(function(e){var l=a++,c=!1;o.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,o[l]=e,--s||i(o))}),r)})),--s||i(o)}));return o.error&&r(o.value),n.promise},race:function(e){var t=this,n=Vc(t),i=n.reject,r=jc((function(){var r=rt(t.resolve);Ks(e,(function(e){r.call(t,e).then(n.resolve,i)}))}));return r.error&&i(r.value),n.promise}});var ou,au=A.f,su="".startsWith,lu=Math.min,cu=Bs("startsWith"),uu=!(cu||(ou=au(String.prototype,"startsWith"),!ou||ou.writable));je({target:"String",proto:!0,forced:!uu&&!cu},{startsWith:function(e){var t=String(p(this));qs(e);var n=ce(lu(arguments.length>1?arguments[1]:void 0,t.length)),i=String(e);return su?su.call(t,i,n):t.slice(n,n+i.length)===i}});var fu,du,hu,pu=function(e){return null!=e?e.constructor:null},mu=function(e,t){return Boolean(e&&t&&e instanceof t)},gu=function(e){return null==e},vu=function(e){return pu(e)===Object},yu=function(e){return pu(e)===String},bu=function(e){return pu(e)===Function},wu=function(e){return Array.isArray(e)},ku=function(e){return mu(e,NodeList)},Tu=function(e){return gu(e)||(yu(e)||wu(e)||ku(e))&&!e.length||vu(e)&&!Object.keys(e).length},Su=gu,Eu=vu,Au=function(e){return pu(e)===Number&&!Number.isNaN(e)},Cu=yu,Pu=function(e){return pu(e)===Boolean},xu=bu,Ou=wu,Iu=ku,ju=function(e){return null!==e&&"object"===Na(e)&&1===e.nodeType&&"object"===Na(e.style)&&"object"===Na(e.ownerDocument)},Lu=function(e){return mu(e,Event)},Nu=function(e){return mu(e,KeyboardEvent)},Ru=function(e){return mu(e,TextTrack)||!gu(e)&&yu(e.kind)},Mu=function(e){return mu(e,Promise)&&bu(e.then)},_u=function(e){if(mu(e,window.URL))return!0;if(!yu(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!Tu(new URL(t).hostname)}catch(e){return!1}},Uu=Tu,Du=(fu=document.createElement("span"),du={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},hu=Object.keys(du).find((function(e){return void 0!==fu.style[e]})),!!Cu(hu)&&du[hu]);function Fu(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var qu={isIE:
/* @cc_on!@ */
-!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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)},Hu=function(e){return function(t,n,i,r){rt(n);var o=Me(t),a=d(o),s=ce(o.length),l=e?s-1:0,c=e?-1:1;if(i<2)for(;;){if(l in a){r=a[l],l+=c;break}if(l+=c,e?l<0:s<=l)throw TypeError("Reduce of empty array with no initial value")}for(;e?l>=0:s>l;l+=c)l in a&&(r=n(r,a[l],l,o));return r}},Bu={left:Hu(!1),right:Hu(!0)}.left,Vu=Gt("reduce"),zu=Zt("reduce",{1:0});function Wu(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function Ku(){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 Eu(r)?(Object.keys(r).forEach((function(t){Eu(r[t])?(Object.keys(e).includes(t)||Object.assign(e,Ua({},t,{})),Ku(e[t],r[t])):Object.assign(e,Ua({},t,r[t]))})),Ku.apply(void 0,[e].concat(n))):e}function $u(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 Yu(e,t){Lu(e)&&!Uu(t)&&Object.entries(t).filter((function(e){var t=Ha(e,2)[1];return!Su(t)})).forEach((function(t){var n=Ha(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)}))}function Gu(e,t,n){var i=document.createElement(e);return Eu(t)&&Yu(i,t),Cu(n)&&(i.innerText=n),i}function Xu(e,t,n,i){Lu(t)&&t.appendChild(Gu(e,n,i))}function Qu(e){Iu(e)||Ou(e)?Array.from(e).forEach(Qu):Lu(e)&&Lu(e.parentNode)&&e.parentNode.removeChild(e)}function Ju(e){if(Lu(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function Zu(e,t){return Lu(t)&&Lu(t.parentNode)&&Lu(e)?(t.parentNode.replaceChild(e,t),e):null}function eh(e,t){if(!Cu(e)||Uu(e))return{};var n={},i=Ku({},t);return e.split(",").forEach((function(e){var t=e.trim(),r=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=Ha(o,1)[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":Cu(i.class)?n.class="".concat(i.class," ").concat(r):n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}})),Ku(i,n)}function th(e,t){if(Lu(e)){var n=t;Pu(n)||(n=!e.hidden),e.hidden=n}}function nh(e,t,n){if(Iu(e))return Array.from(e).map((function(e){return nh(e,t,n)}));if(Lu(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function ih(e,t){return Lu(e)&&e.classList.contains(t)}function rh(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function oh(e){return this.elements.container.querySelectorAll(e)}function ah(e){return this.elements.container.querySelector(e)}function sh(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];Lu(e)&&(e.focus({preventScroll:!0}),t&&nh(e,this.config.classNames.tabFocus))}Le({target:"Array",proto:!0,forced:!Vu||!zu||!Kl&&Xn>79&&Xn<83},{reduce:function(e){return Bu(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var lh,ch={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},uh={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=qu.isIPhone&&n&&uh.playsinline,r=uh[e]||"html5"!==t;return{api:r,ui:r&&uh.rangeInput&&("video"!==e||!qu.isIPhone||i)}},pip:!(qu.isIPhone||!xu(Gu("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||Gu("video").disablePictureInPicture)),airplay:xu(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(Uu(e))return!1;var t=Ha(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(ch).includes(n)&&(n+='; codecs="'.concat(ch[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(lh=document.createElement("input"),lh.type="range","range"===lh.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==Du,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},hh=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 fh(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&&!Uu(t)&&xu(n)){var s=t.split(" "),l=a;hh&&(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 dh(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];fh.call(this,e,t,n,!0,i,r)}function ph(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];fh.call(this,e,t,n,!1,i,r)}function mh(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],a=function a(){ph(e,n,a,r,o);for(var s=arguments.length,l=new Array(s),c=0;c<s;c++)l[c]=arguments[c];i.apply(t,l)};fh.call(this,e,n,a,!0,r,o)}function gh(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(Lu(e)&&!Uu(t)){var r=new CustomEvent(t,{bubbles:n,detail:Fa(Fa({},i),{},{plyr:this})});e.dispatchEvent(r)}}function vh(){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=[])}function yh(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):dh.call(e,e.elements.container,"ready",t)})).then((function(){}))}function bh(e){Mu(e)&&e.then(null,(function(){}))}function wh(e){return!!(Ou(e)||Cu(e)&&e.includes(":"))&&(Ou(e)?e:e.split(":")).map(Number).every(Au)}function kh(e){if(!Ou(e)||!e.every(Au))return null;var t=Ha(e,2),n=t[0],i=t[1],r=function e(t,n){return 0===n?t:e(n,t%n)}(n,i);return[n/r,i/r]}function Th(e){var t=function(e){return wh(e)?e.split(":").map(Number):null},n=t(e);if(null===n&&(n=t(this.config.ratio)),null===n&&!Uu(this.embed)&&Ou(this.embed.ratio)&&(n=this.embed.ratio),null===n&&this.isHTML5){var i=this.media;n=kh([i.videoWidth,i.videoHeight])}return n}function Sh(e){if(!this.isVideo)return{};var t=this.elements.wrapper,n=Th.call(this,e),i=Ha(Ou(n)?n:[0,0],2),r=100/i[0]*i[1];if(t.style.paddingBottom="".concat(r,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var o=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),a=(o-r)/(o/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(a,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==n);return{padding:r,ratio:n}}var Eh={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var n=t.getAttribute("type");return!!Uu(n)||uh.mime.call(e,n)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:Eh.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,Uu(this.config.ratio)||Sh.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=Eh.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&xu(e.config.quality.onChange))e.config.quality.onChange(t);else{var n=Eh.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!n)return;var i=e.media,r=i.currentTime,o=i.paused,a=i.preload,s=i.readyState,l=i.playbackRate;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",(function(){e.speed=l,e.currentTime=r,o||bh(e.play())})),e.media.load())}gh.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(Qu(Eh.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Ah(e){return Ou(e)?e.filter((function(t,n){return e.indexOf(t)===n})):e}var Ch=x.f,Ph=be.f,xh=ee.set,Oh=Qe("match"),Ih=i.RegExp,Lh=Ih.prototype,jh=/a/g,Nh=/a/g,Rh=new Ih(jh)!==jh,Mh=fi.UNSUPPORTED_Y;if(o&&Oe("RegExp",!Rh||Mh||r((function(){return Nh[Oh]=!1,Ih(jh)!=jh||Ih(Nh)==Nh||"/a/i"!=Ih(jh,"i")})))){for(var _h=function(e,t){var n,i=this instanceof _h,r=Yi(e),o=void 0===t;if(!i&&r&&e.constructor===_h&&o)return e;Rh?r&&!o&&(e=e.source):e instanceof _h&&(o&&(t=ui.call(e)),e=e.source),Mh&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var a=ms(Rh?new Ih(e,t):Ih(e,t),i?this:Lh,_h);return Mh&&n&&xh(a,{sticky:n}),a},Uh=function(e){e in _h||Ch(_h,e,{configurable:!0,get:function(){return Ih[e]},set:function(t){Ih[e]=t}})},Dh=Ph(Ih),Fh=0;Dh.length>Fh;)Uh(Dh[Fh++]);Lh.constructor=_h,_h.prototype=Lh,te(i,"RegExp",_h)}function qh(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 Uu(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return n[t].toString()}))}zl("RegExp");var Hh=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())},Bh=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function Vh(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=Hh(t,"-"," "),t=Hh(t,"_"," "),t=Bh(t),Hh(t," ","")}function zh(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var Wh={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},Kh=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Uu(e)||Uu(t))return"";var n=Wu(t.i18n,e);if(Uu(n))return Object.keys(Wh).includes(e)?Wh[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach((function(e){var t=Ha(e,2),i=t[0],r=t[1];n=Hh(n,i,r)})),n},$h=function(){function e(t){Ra(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return _a(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(Uu(n))return null;var i=JSON.parse(n);return Cu(t)&&t.length?i[t]:i}},{key:"set",value:function(t){if(e.supported&&this.enabled&&Eu(t)){var n=this.get();Uu(n)&&(n={}),Ku(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function Yh(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 Gh(e,t){if(Cu(e)){var n="cache",i=Cu(t),r=function(){return null!==document.getElementById(t)},o=function(e,t){e.innerHTML=t,i&&r()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!r()){var a=$h.supported,s=document.createElement("div");if(s.setAttribute("hidden",""),i&&s.setAttribute("id",t),a){var l=window.localStorage.getItem("".concat(n,"-").concat(t));if(null!==l){var c=JSON.parse(l);o(s,c.content)}}Yh(e).then((function(e){Uu(e)||(a&&window.localStorage.setItem("".concat(n,"-").concat(t),JSON.stringify({content:e})),o(s,e))})).catch((function(){}))}}}var Xh=Math.ceil,Qh=Math.floor;Le({target:"Math",stat:!0},{trunc:function(e){return(e>0?Qh:Xh)(e)}});var Jh=function(e){return Math.trunc(e/60/60%60,10)},Zh=function(e){return Math.trunc(e/60%60,10)},ef=function(e){return Math.trunc(e%60,10)};function tf(){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(!Au(e))return tf(void 0,t,n);var i=function(e){return"0".concat(e).slice(-2)},r=Jh(e),o=Zh(e),a=ef(e);return r=t||r>0?"".concat(r,":"):"","".concat(n&&e>0?"-":"").concat(r).concat(i(o),":").concat(i(a))}var nf={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||qu.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=ah.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:oh.call(this,this.config.selectors.buttons.play),pause:ah.call(this,this.config.selectors.buttons.pause),restart:ah.call(this,this.config.selectors.buttons.restart),rewind:ah.call(this,this.config.selectors.buttons.rewind),fastForward:ah.call(this,this.config.selectors.buttons.fastForward),mute:ah.call(this,this.config.selectors.buttons.mute),pip:ah.call(this,this.config.selectors.buttons.pip),airplay:ah.call(this,this.config.selectors.buttons.airplay),settings:ah.call(this,this.config.selectors.buttons.settings),captions:ah.call(this,this.config.selectors.buttons.captions),fullscreen:ah.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=ah.call(this,this.config.selectors.progress),this.elements.inputs={seek:ah.call(this,this.config.selectors.inputs.seek),volume:ah.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:ah.call(this,this.config.selectors.display.buffer),currentTime:ah.call(this,this.config.selectors.display.currentTime),duration:ah.call(this,this.config.selectors.display.duration)},Lu(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="http://www.w3.org/2000/svg",i=nf.getIconUrl.call(this),r="".concat(i.cors?"":i.url,"#").concat(this.config.iconPrefix),o=document.createElementNS(n,"svg");Yu(o,Ku(t,{"aria-hidden":"true",focusable:"false"}));var a=document.createElementNS(n,"use"),s="".concat(r,"-").concat(e);return"href"in a&&a.setAttributeNS("http://www.w3.org/1999/xlink","href",s),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",s),o.appendChild(a),o},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=Kh(e,this.config),i=Fa(Fa({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return Gu("span",i,n)},createBadge:function(e){if(Uu(e))return null;var t=Gu("span",{class:this.config.classNames.menu.value});return t.appendChild(Gu("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=this,i=Ku({},t),r=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=Vh(e)).charAt(0).toLowerCase()+e.slice(1)}(e),o={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(i).includes(e)&&(o[e]=i[e],delete i[e])})),"button"!==o.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").some((function(e){return e===n.config.classNames.control}))||Ku(i,{class:"".concat(i.class," ").concat(this.config.classNames.control)}):i.class=this.config.classNames.control,e){case"play":o.toggle=!0,o.label="play",o.labelPressed="pause",o.icon="play",o.iconPressed="pause";break;case"mute":o.toggle=!0,o.label="mute",o.labelPressed="unmute",o.icon="volume",o.iconPressed="muted";break;case"captions":o.toggle=!0,o.label="enableCaptions",o.labelPressed="disableCaptions",o.icon="captions-off",o.iconPressed="captions-on";break;case"fullscreen":o.toggle=!0,o.label="enterFullscreen",o.labelPressed="exitFullscreen",o.icon="enter-fullscreen",o.iconPressed="exit-fullscreen";break;case"play-large":i.class+=" ".concat(this.config.classNames.control,"--overlaid"),r="play",o.label="play",o.icon="play";break;default:Uu(o.label)&&(o.label=r),Uu(o.icon)&&(o.icon=e)}var a=Gu(o.element);return o.toggle?(a.appendChild(nf.createIcon.call(this,o.iconPressed,{class:"icon--pressed"})),a.appendChild(nf.createIcon.call(this,o.icon,{class:"icon--not-pressed"})),a.appendChild(nf.createLabel.call(this,o.labelPressed,{class:"label--pressed"})),a.appendChild(nf.createLabel.call(this,o.label,{class:"label--not-pressed"}))):(a.appendChild(nf.createIcon.call(this,o.icon)),a.appendChild(nf.createLabel.call(this,o.label))),Ku(i,eh(this.config.selectors.buttons[r],i)),Yu(a,i),"play"===r?(Ou(this.elements.buttons[r])||(this.elements.buttons[r]=[]),this.elements.buttons[r].push(a)):this.elements.buttons[r]=a,a},createRange:function(e,t){var n=Gu("input",Ku(eh(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":Kh(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,nf.updateRangeFill.call(this,n),Hl.setup(n),n},createProgress:function(e,t){var n=Gu("progress",Ku(eh(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(Gu("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?Kh(i,this.config):"";n.innerText="% ".concat(r.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e,t){var n=eh(this.config.selectors.display[e],t),i=Gu("div",Ku(n,{class:"".concat(n.class?n.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":Kh(e,this.config)}),"00:00");return this.elements.display[e]=i,i},bindMenuItemShortcuts:function(e,t){var n=this;dh.call(this,e,"keydown keyup",(function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r,o=rh(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(i.which))nf.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||o&&39===i.which?(r=e.nextElementSibling,Lu(r)||(r=e.parentNode.firstElementChild)):(r=e.previousElementSibling,Lu(r)||(r=e.parentNode.lastElementChild)),sh.call(n,r,!0))}}),!1),dh.call(this,e,"keyup",(function(e){13===e.which&&nf.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=eh(this.config.selectors.inputs[r]),h=Gu("button",Ku(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),f=Gu("span");f.innerHTML=o,Lu(s)&&f.appendChild(s),h.appendChild(f),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 rh(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(!Nu(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),h.checked=!0,r){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}nf.showMenuPanel.call(t,"home",Nu(e))}}),r,!1),nf.bindMenuItemShortcuts.call(this,h,r),i.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];if(!Au(e))return e;var n=Jh(this.duration)>0;return tf(e,n,t)},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];Lu(e)&&Au(t)&&(e.innerText=nf.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(Lu(this.elements.inputs.volume)&&nf.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),Lu(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;Lu(e)&&(e.value=t,nf.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&ju(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=function(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}(this.currentTime,this.duration),"timeupdate"===e.type&&nf.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var i=Au(n)?n:0,r=Lu(e)?e:t.elements.display.buffer;if(Lu(r)){r.value=i;var o=r.getElementsByTagName("span")[0];Lu(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=ju(e)?e.target:e;if(Lu(t)&&"range"===t.getAttribute("type")){if(rh(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=nf.formatTime(this.currentTime),i=nf.formatTime(this.duration),r=Kh("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(rh(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);qu.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&Lu(this.elements.inputs.seek)&&Lu(this.elements.display.seekTooltip)&&0!==this.duration){var n="".concat(this.config.classNames.tooltip,"--visible"),i=function(e){return nh(t.elements.display.seekTooltip,n,e)};if(this.touch)i(!1);else{var r=0,o=this.elements.progress.getBoundingClientRect();if(ju(e))r=100/o.width*(e.pageX-o.left);else{if(!ih(this.elements.display.seekTooltip,n))return;r=parseFloat(this.elements.display.seekTooltip.style.left,10)}r<0?r=0:r>100&&(r=100),nf.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*r),this.elements.display.seekTooltip.style.left="".concat(r,"%"),ju(e)&&["mouseenter","mouseleave"].includes(e.type)&&i("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!Lu(this.elements.display.duration)&&this.config.invertTime;nf.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||nf.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return th(this.elements.display.currentTime,!0),void th(this.elements.progress,!0);Lu(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=Lu(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&nf.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&nf.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),nf.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){th(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=Uu(n)?this[e]:n,Uu(r)&&(r=this.config[e].default),!Uu(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(Lu(o)||(o=i&&i.querySelector('[role="menu"]')),Lu(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=nf.getLabel.call(this,e,r);var a=o&&o.querySelector('[value="'.concat(r,'"]'));Lu(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?Kh("normal",this.config):"".concat(t,"&times;");case"quality":if(Au(t)){var n=Kh("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return Bh(t);case"captions":return af.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(Lu(this.elements.settings.panels.quality)){var n="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');Ou(e)&&(this.options.quality=Ah(e).filter((function(e){return t.config.quality.options.includes(e)})));var r=!Uu(this.options.quality)&&this.options.quality.length>1;if(nf.toggleMenuButton.call(this,n,r),Ju(i),nf.checkMenu.call(this),r){var o=function(e){var n=Kh("qualityBadge.".concat(e),t.config);return n.length?nf.createBadge.call(t,n):null};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){nf.createMenuItem.call(t,{value:e,list:i,type:n,title:nf.getLabel.call(t,"quality",e),badge:o(e)})})),nf.updateSetting.call(this,n,i)}}},setCaptionsMenu:function(){var e=this;if(Lu(this.elements.settings.panels.captions)){var t="captions",n=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=af.getTracks.call(this),r=Boolean(i.length);if(nf.toggleMenuButton.call(this,t,r),Ju(n),nf.checkMenu.call(this),r){var o=i.map((function(t,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:af.getLabel.call(e,t),badge:t.language&&nf.createBadge.call(e,t.language.toUpperCase()),list:n,type:"language"}}));o.unshift({value:-1,checked:!this.captions.toggled,title:Kh("disabled",this.config),list:n,type:"language"}),o.forEach(nf.createMenuItem.bind(this)),nf.updateSetting.call(this,t,n)}}},setSpeedMenu:function(){var e=this;if(Lu(this.elements.settings.panels.speed)){var t="speed",n=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var i=!Uu(this.options.speed)&&this.options.speed.length>1;nf.toggleMenuButton.call(this,t,i),Ju(n),nf.checkMenu.call(this),i&&(this.options.speed.forEach((function(i){nf.createMenuItem.call(e,{value:i,list:n,type:t,title:nf.getLabel.call(e,"speed",i)})})),nf.updateSetting.call(this,t,n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!Uu(e)&&Object.values(e).some((function(e){return!e.hidden}));th(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;Lu(n)||(n=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var i=n.querySelector('[role^="menuitem"]');sh.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(Lu(t)&&Lu(n)){var i=t.hidden,r=i;if(Pu(e))r=e;else if(Nu(e)&&27===e.which)r=!1;else if(ju(e)){var o=xu(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(o);if(a||!a&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),th(t,!r),nh(this.elements.container,this.config.classNames.menu.open,r),r&&Nu(e)?nf.focusFirstMenuItem.call(this,null,!0):r||i||sh.call(this,n,Nu(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 Qu(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=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(Lu(i)){var r=i.parentNode,o=Array.from(r.children).find((function(e){return!e.hidden}));if(uh.transitions&&!uh.reducedMotion){r.style.width="".concat(o.scrollWidth,"px"),r.style.height="".concat(o.scrollHeight,"px");var a=nf.getMenuSize.call(this,i),s=function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",ph.call(e,r,Du,t))};dh.call(this,r,Du,s),r.style.width="".concat(a.width,"px"),r.style.height="".concat(a.height,"px")}th(o,!0),th(i,!1),nf.focusFirstMenuItem.call(this,i,n)}},setDownloadUrl:function(){var e=this.elements.buttons.download;Lu(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=nf.bindMenuItemShortcuts,i=nf.createButton,r=nf.createProgress,o=nf.createRange,a=nf.createTime,s=nf.setQualityMenu,l=nf.setSpeedMenu,c=nf.showMenuPanel;this.elements.controls=null,Ou(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));var u=Gu("div",eh(this.config.selectors.controls.wrapper));this.elements.controls=u;var h={class:"plyr__controls__item"};return Ah(Ou(this.config.controls)?this.config.controls:[]).forEach((function(s){if("restart"===s&&u.appendChild(i.call(t,"restart",h)),"rewind"===s&&u.appendChild(i.call(t,"rewind",h)),"play"===s&&u.appendChild(i.call(t,"play",h)),"fast-forward"===s&&u.appendChild(i.call(t,"fast-forward",h)),"progress"===s){var l=Gu("div",{class:"".concat(h.class," plyr__progress__container")}),f=Gu("div",eh(t.config.selectors.progress));if(f.appendChild(o.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),f.appendChild(r.call(t,"buffer")),t.config.tooltips.seek){var d=Gu("span",{class:t.config.classNames.tooltip},"00:00");f.appendChild(d),t.elements.display.seekTooltip=d}t.elements.progress=f,l.appendChild(t.elements.progress),u.appendChild(l)}if("current-time"===s&&u.appendChild(a.call(t,"currentTime",h)),"duration"===s&&u.appendChild(a.call(t,"duration",h)),"mute"===s||"volume"===s){var p=t.elements.volume;if(Lu(p)&&u.contains(p)||(p=Gu("div",Ku({},h,{class:"".concat(h.class," plyr__volume").trim()})),t.elements.volume=p,u.appendChild(p)),"mute"===s&&p.appendChild(i.call(t,"mute")),"volume"===s&&!qu.isIos){var m={max:1,step:.05,value:t.config.volume};p.appendChild(o.call(t,"volume",Ku(m,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===s&&u.appendChild(i.call(t,"captions",h)),"settings"===s&&!Uu(t.config.settings)){var g=Gu("div",Ku({},h,{class:"".concat(h.class," plyr__menu").trim(),hidden:""}));g.appendChild(i.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var v=Gu("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),y=Gu("div"),b=Gu("div",{id:"plyr-settings-".concat(e.id,"-home")}),w=Gu("div",{role:"menu"});b.appendChild(w),y.appendChild(b),t.elements.settings.panels.home=b,t.config.settings.forEach((function(i){var r=Gu("button",Ku(eh(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:""}));n.call(t,r,i),dh.call(t,r,"click",(function(){c.call(t,i,!1)}));var o=Gu("span",null,Kh(i,t.config)),a=Gu("span",{class:t.config.classNames.menu.value});a.innerHTML=e[i],o.appendChild(a),r.appendChild(o),w.appendChild(r);var s=Gu("div",{id:"plyr-settings-".concat(e.id,"-").concat(i),hidden:""}),l=Gu("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});l.appendChild(Gu("span",{"aria-hidden":!0},Kh(i,t.config))),l.appendChild(Gu("span",{class:t.config.classNames.hidden},Kh("menuBack",t.config))),dh.call(t,s,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),c.call(t,"home",!0))}),!1),dh.call(t,l,"click",(function(){c.call(t,"home",!1)})),s.appendChild(l),s.appendChild(Gu("div",{role:"menu"})),y.appendChild(s),t.elements.settings.buttons[i]=r,t.elements.settings.panels[i]=s})),v.appendChild(y),g.appendChild(v),u.appendChild(g),t.elements.settings.popup=v,t.elements.settings.menu=g}if("pip"===s&&uh.pip&&u.appendChild(i.call(t,"pip",h)),"airplay"===s&&uh.airplay&&u.appendChild(i.call(t,"airplay",h)),"download"===s){var k=Ku({},h,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(k.download="");var T=t.config.urls.download;!_u(T)&&t.isEmbed&&Ku(k,{icon:"logo-".concat(t.provider),label:t.provider}),u.appendChild(i.call(t,"download",k))}"fullscreen"===s&&u.appendChild(i.call(t,"fullscreen",h))})),this.isHTML5&&s.call(this,Eh.getQualityOptions.call(this)),l.call(this),u},inject:function(){var e=this;if(this.config.loadSprite){var t=nf.getIconUrl.call(this);t.cors&&Gh(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;xu(this.config.controls)&&(this.config.controls=this.config.controls.call(this,i)),this.config.controls||(this.config.controls=[]),Lu(this.config.controls)||Cu(this.config.controls)?n=this.config.controls:(n=nf.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:af.getLabel.call(this)}),r=!1);var o,a;if(r&&Cu(this.config.controls)&&(o=n,Object.entries(i).forEach((function(e){var t=Ha(e,2),n=t[0],i=t[1];o=Hh(o,"{".concat(n,"}"),i)})),n=o),Cu(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),Lu(a)||(a=this.elements.container),a[Lu(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),Lu(this.elements.controls)||nf.findElements.call(this),!Uu(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return ih(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];nh(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){Ou(e)||Iu(e)?Array.from(e).filter(Boolean).forEach(s):s(e)}))}if(qu.isEdge&&Fu(a),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,h="".concat(u.controls.wrapper," ").concat(u.labels," .").concat(c.hidden),f=oh.call(this,h);Array.from(f).forEach((function(t){nh(t,e.config.classNames.hidden,!1),nh(t,e.config.classNames.tooltip,!0)}))}}};function rf(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=e;if(t){var i=document.createElement("a");i.href=n,n=i.href}try{return new URL(n)}catch(e){return null}}function of(e){var t=new URLSearchParams;return Eu(e)&&Object.entries(e).forEach((function(e){var n=Ha(e,2),i=n[0],r=n[1];t.set(i,r)})),t}var af={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!uh.textTracks)Ou(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&nf.setCaptionsMenu.call(this);else{if(Lu(this.elements.captions)||(this.elements.captions=Gu("div",eh(this.config.selectors.captions)),function(e,t){Lu(e)&&Lu(t)&&t.parentNode.insertBefore(e,t.nextSibling)}(this.elements.captions,this.elements.wrapper)),qu.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),n=rf(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&Yh(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){Qu(e)}))}))}var t=Ah((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=Ha(t,1)[0];var i=this.storage.get("captions");if(Pu(i)||(i=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:i,language:n,languages:t}),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";dh.call(this,this.media.textTracks,r,af.update.bind(this))}setTimeout(af.update.bind(this),0)}},update:function(){var e=this,t=af.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}),"showing"===t.mode&&(t.mode="hidden"),dh.call(e,t,"cuechange",(function(){return af.updateCues.call(e)}))})),(s&&this.language!==r||!t.includes(a))&&(af.setLanguage.call(this,r),af.toggle.call(this,i&&s)),nh(this.elements.container,this.config.classNames.captions.enabled,!Uu(t)),Ou(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&nf.setCaptionsMenu.call(this)},toggle:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var i=this.captions.toggled,r=this.config.classNames.captions.active,o=Su(e)?!i:e;if(o!==i){if(n||(this.captions.active=o,this.storage.set({captions:o})),!this.language&&o&&!n){var a=af.getTracks.call(this),s=af.findTrack.call(this,[this.captions.language].concat(Ba(this.captions.languages)),!0);return this.captions.language=s.language,void af.set.call(this,a.indexOf(s))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=o),nh(this.elements.container,r,o),this.captions.toggled=o,nf.updateSetting.call(this,"captions"),gh.call(this,this.media,o?"captionsenabled":"captionsdisabled")}setTimeout((function(){o&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=af.getTracks.call(this);if(-1!==e)if(Au(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=i||{},o=r.language;this.captions.currentTrackNode=i,nf.updateSetting.call(this,"captions"),t||(this.captions.language=o,this.storage.set({language:o})),this.isVimeo&&this.embed.enableTextTrack(o),gh.call(this,this.media,"languagechange")}af.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&af.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else af.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(Cu(e)){var n=e.toLowerCase();this.captions.language=n;var i=af.getTracks.call(this),r=af.findTrack.call(this,[n]);af.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],n=Array.from((this.media||{}).textTracks||[]);return n.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=af.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 af.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!Ru(t)&&uh.textTracks&&this.captions.toggled&&(t=af.getCurrentTrack.call(this)),Ru(t)?Uu(t.label)?Uu(t.language)?Kh("enabled",this.config):e.language.toUpperCase():t.label:Kh("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(Lu(this.elements.captions))if(Su(e)||Array.isArray(e)){var t=e;if(!t){var n=af.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(zh)}var i=t.map((function(e){return e.trim()})).join("\n");if(i!==this.elements.captions.innerHTML){Ju(this.elements.captions);var r=Gu("span",eh(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),gh.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},sf={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.3/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},lf="picture-in-picture",cf="inline",uf={html5:"html5",youtube:"youtube",vimeo:"vimeo"},hf="audio",ff="video";var df=function(){},pf=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Ra(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return _a(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):df}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):df}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):df}}]),e}(),mf=function(){function e(t){var n=this;Ra(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&function(e,t){return(Element.prototype.closest||function(){var e=this;do{if(rh.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,t.config.fullscreen.container),dh.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){n.onChange()})),dh.call(this.player,this.player.elements.container,"dblclick",(function(e){Lu(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.player.listeners.proxy(e,n.toggle,"fullscreen")})),dh.call(this,this.player.elements.container,"keydown",(function(e){return n.trapFocus(e)})),this.update()}return _a(e,[{key:"onChange",value:function(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;Lu(e)&&(e.pressed=this.active);var t=this.target===this.player.media?this.target:this.player.elements.container;gh.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)}}},{key:"toggleFallback",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(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":"",nh(this.target,this.player.config.classNames.fullscreen.fallback,e),qu.isIos){var t=document.head.querySelector('meta[name="viewport"]'),n="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var i=Cu(t.content)&&t.content.includes(n);e?(this.cleanupViewport=!i,i||(t.content+=",".concat(n))):this.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==n})).join(","))}this.onChange()}},{key:"trapFocus",value:function(e){if(!qu.isIos&&this.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,n=oh.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),i=Ha(n,1)[0],r=n[n.length-1];t!==r||e.shiftKey?t===i&&e.shiftKey&&(r.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}}},{key:"update",value:function(){var t;this.enabled?(t=this.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",this.player.debug.log("".concat(t," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");nh(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(qu.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!e.native||this.forceFallback?this.toggleFallback(!0):this.prefix?Uu(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen({navigationUI:"hide"}))}},{key:"exit",value:function(){if(this.enabled)if(qu.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),bh(this.player.play());else if(!e.native||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!Uu(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)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return ih(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return qu.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(xu(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!xu(document["".concat(t,"ExitFullscreen")])&&!xu(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),gf=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function vf(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})}))}Le({target:"Math",stat:!0},{sign:gf});var yf={addStyleHook:function(){nh(this.elements.container,this.config.selectors.container.replace(".",""),!0),nh(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 yf.toggleNativeControls.call(this,!0);Lu(this.elements.controls)||(nf.inject.call(this),this.listeners.controls()),yf.toggleNativeControls.call(this),this.isHTML5&&af.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,nf.updateVolume.call(this),nf.timeUpdate.call(this),yf.checkPlaying.call(this),nh(this.elements.container,this.config.classNames.pip.supported,uh.pip&&this.isHTML5&&this.isVideo),nh(this.elements.container,this.config.classNames.airplay.supported,uh.airplay&&this.isHTML5),nh(this.elements.container,this.config.classNames.isIos,qu.isIos),nh(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){gh.call(e,e.media,"ready")}),0),yf.setTitle.call(this),this.poster&&yf.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&nf.durationUpdate.call(this)},setTitle:function(){var e=Kh("play",this.config);if(Cu(this.config.title)&&!Uu(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=ah.call(this,"iframe");if(!Lu(t))return;var n=Uu(this.config.title)?"video":this.config.title,i=Kh("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){nh(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),yh.call(this).then((function(){return vf(e)})).catch((function(n){throw e===t.poster&&yf.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:""}),yf.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;nh(this.elements.container,this.config.classNames.playing,this.playing),nh(this.elements.container,this.config.classNames.paused,this.paused),nh(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",Kh(t.playing?"pause":"play",t.config))})),ju(e)&&"timeupdate"===e.type||yf.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(){nh(t.elements.container,t.config.classNames.loading,t.loading),yf.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}},migrateStyles:function(){var e=this;Object.values(Fa({},this.media.style)).filter((function(e){return!Uu(e)&&Cu(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),Uu(this.media.style)&&this.media.removeAttribute("style")}},bf=function(){function e(t){Ra(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 _a(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)&&Au(i)){if(r){var a=document.activeElement;if(Lu(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&rh(a,s))return;if(32===e.which&&rh(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||bh(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}27===i&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){nf.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,nh(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,nh(oh.call(t,".".concat(i)),i,!1),"focusout"!==e.type&&(this.focusTimer=setTimeout((function(){var e=document.activeElement;n.container.contains(e)&&nh(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&&fh.call(t,window,"keydown keyup",this.handleKey,e,!1),fh.call(t,document.body,"click",this.toggleMenu,e),mh.call(t,document.body,"touchstart",this.firstTouch),fh.call(t,document.body,"keydown focus blur focusout",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,n=e.elements,i=e.timers;!t.keyboard.global&&t.keyboard.focused&&dh.call(e,n.container,"keydown keyup",this.handleKey,!1),dh.call(e,n.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var r=n.controls;r&&"enterfullscreen"===t.type&&(r.pressed=!1,r.hover=!1);var o=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(yf.toggleControls.call(e,!0),o=e.touch?3e3:2e3),clearTimeout(i.controls),i.controls=setTimeout((function(){return yf.toggleControls.call(e,!1)}),o)}));var r=function(t){if(!t)return Sh.call(e);var i=n.container.getBoundingClientRect(),r=i.width,o=i.height;return Sh.call(e,"".concat(r,":").concat(o))},o=function(){clearTimeout(i.resized),i.resized=setTimeout(r,50)};dh.call(e,n.container,"enterfullscreen exitfullscreen",(function(t){var i=e.fullscreen,a=i.target,s=i.usingNative;if(a===n.container&&(e.isEmbed||!Uu(e.config.ratio))){var l="enterfullscreen"===t.type,c=r(l);c.padding;!function(t,n,i){if(e.isVimeo&&!e.config.vimeo.premium){var r=e.elements.wrapper.firstChild,o=Ha(t,2)[1],a=Ha(Th.call(e),2),s=a[0],l=a[1];r.style.maxWidth=i?"".concat(o/l*s,"px"):null,r.style.margin=i?"0 auto":null}}(c.ratio,0,l),l&&setTimeout((function(){return Fu(n.container)}),100),s||(l?dh.call(e,window,"resize",o):ph.call(e,window,"resize",o))}}))}},{key:"media",value:function(){var e=this,t=this.player,n=t.elements;if(dh.call(t,t.media,"timeupdate seeking seeked",(function(e){return nf.timeUpdate.call(t,e)})),dh.call(t,t.media,"durationchange loadeddata loadedmetadata",(function(e){return nf.durationUpdate.call(t,e)})),dh.call(t,t.media,"ended",(function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&(t.restart(),t.pause())})),dh.call(t,t.media,"progress playing seeking seeked",(function(e){return nf.updateProgress.call(t,e)})),dh.call(t,t.media,"volumechange",(function(e){return nf.updateVolume.call(t,e)})),dh.call(t,t.media,"playing play pause ended emptied timeupdate",(function(e){return yf.checkPlaying.call(t,e)})),dh.call(t,t.media,"waiting canplay seeked playing",(function(e){return yf.checkLoading.call(t,e)})),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var i=ah.call(t,".".concat(t.config.classNames.video));if(!Lu(i))return;dh.call(t,n.container,"click",(function(r){([n.container,i].includes(r.target)||i.contains(r.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(r,t.restart,"restart"),e.proxy(r,(function(){bh(t.play())}),"play")):e.proxy(r,(function(){bh(t.togglePlay())}),"play")))}))}t.supported.ui&&t.config.disableContextMenu&&dh.call(t,n.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),dh.call(t,t.media,"volumechange",(function(){t.storage.set({volume:t.volume,muted:t.muted})})),dh.call(t,t.media,"ratechange",(function(){nf.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})})),dh.call(t,t.media,"qualitychange",(function(e){nf.updateSetting.call(t,"quality",null,e.detail.quality)})),dh.call(t,t.media,"ready qualitychange",(function(){nf.setDownloadUrl.call(t)}));var r=t.config.events.concat(["keyup","keydown"]).join(" ");dh.call(t,t.media,r,(function(e){var i=e.detail,r=void 0===i?{}:i;"error"===e.type&&(r=t.media.error),gh.call(t,n.container,e.type,!0,r)}))}},{key:"proxy",value:function(e,t,n){var i=this.player,r=i.config.listeners[n],o=!0;xu(r)&&(o=r.call(i,e)),!1!==o&&xu(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=xu(s);dh.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=qu.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach((function(n){e.bind(n,"click",(function(){bh(t.togglePlay())}),"play")})),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",(function(){t.lastSeekTime=Date.now(),t.rewind()}),"rewind"),this.bind(n.buttons.fastForward,"click",(function(){t.lastSeekTime=Date.now(),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.download,"click",(function(){gh.call(t,t.media,"download")}),"download"),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(),e.preventDefault(),nf.toggleMenu.call(t,e)}),null,!1),this.bind(n.buttons.settings,"keyup",(function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),nf.toggleMenu.call(t,e)):nf.focusFirstMenuItem.call(t,null,!0))}),null,!1),this.bind(n.settings.menu,"keydown",(function(e){27===e.which&&nf.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,r="play-on-seeked";if(!Nu(e)||39===i||37===i){t.lastSeekTime=Date.now();var o=n.hasAttribute(r),a=["mouseup","touchend","keyup"].includes(e.type);o&&a?(n.removeAttribute(r),bh(t.play())):!a&&t.playing&&(n.setAttribute(r,""),t.pause())}})),qu.isIos){var r=oh.call(t,'input[type="range"]');Array.from(r).forEach((function(t){return e.bind(t,i,(function(e){return Fu(e.target)}))}))}this.bind(n.inputs.seek,i,(function(e){var n=e.currentTarget,i=n.getAttribute("seek-value");Uu(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 nf.updateSeekTooltip.call(t,e)})),this.bind(n.progress,"mousemove touchmove",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startMove(e)})),this.bind(n.progress,"mouseleave touchend click",(function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)})),this.bind(n.progress,"mousedown touchstart",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startScrubbing(e)})),this.bind(n.progress,"mouseup touchend",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.endScrubbing(e)})),qu.isWebkit&&Array.from(oh.call(t,'input[type="range"]')).forEach((function(n){e.bind(n,"input",(function(e){return nf.updateRangeFill.call(t,e.target)}))})),t.config.toggleInvert&&!Lu(n.display.duration)&&this.bind(n.display.currentTime,"click",(function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,nf.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})),n.fullscreen&&Array.from(n.fullscreen.children).filter((function(e){return!e.contains(n.container)})).forEach((function(i){e.bind(i,"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",(function(){var i=t.config,r=t.timers;nh(n.controls,i.classNames.noTransition,!0),yf.toggleControls.call(t,!0),setTimeout((function(){nh(n.controls,i.classNames.noTransition,!1)}),0);var o=e.touch?3e3:4e3;clearTimeout(r.controls),r.controls=setTimeout((function(){return yf.toggleControls.call(t,!1)}),o)})),this.bind(n.inputs.volume,"wheel",(function(e){var n=e.webkitDirectionInvertedFromDevice,i=Ha([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}(),wf=Jn("splice"),kf=Zt("splice",{ACCESSORS:!0,0:0,1:2}),Tf=Math.max,Sf=Math.min,Ef=9007199254740991,Af="Maximum allowed length exceeded";Le({target:"Array",proto:!0,forced:!wf||!kf},{splice:function(e,t){var n,i,r,o,a,s,l=Me(this),c=ce(l.length),u=fe(e,c),h=arguments.length;if(0===h?n=i=0:1===h?(n=0,i=c-u):(n=h-2,i=Sf(Tf(se(t),0),c-u)),c+n-i>Ef)throw TypeError(Af);for(r=st(l,i),o=0;o<i;o++)(a=u+o)in l&&Wn(r,o,l[a]);if(r.length=i,n<i){for(o=u;o<c-i;o++)s=o+n,(a=o+i)in l?l[s]=l[a]:delete l[s];for(o=c;o>c-i+n;o--)delete l[o-1]}else if(n>i)for(o=c-i;o>u;o--)s=o+n-1,(a=o+i-1)in l?l[s]=l[a]:delete l[s];for(o=0;o<n;o++)l[o+u]=arguments[o+2];return l.length=c-i+n,r}});var Cf=t((function(e,t){e.exports=function(){var e=function(){},t={},n={},i={};function r(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)}function o(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 a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function s(t,n,i,r){var o,a,l=document,c=i.async,u=(i.numRetries||0)+1,h=i.before||e,f=t.replace(/[\?|#].*$/,""),d=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(f)?((a=l.createElement("link")).rel="stylesheet",a.href=d,(o="hideFocus"in a)&&a.relList&&(o=0,a.rel="preload",a.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(f)?(a=l.createElement("img")).src=d:((a=l.createElement("script")).src=t,a.async=void 0===c||c),a.onload=a.onerror=a.onbeforeload=function(e){var l=e.type[0];if(o)try{a.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l){if((r+=1)<u)return s(t,n,i,r)}else if("preload"==a.rel&&"style"==a.as)return a.rel="stylesheet";n(t,l,e.defaultPrevented)},!1!==h(t,a)&&l.head.appendChild(a)}function l(e,t,n){var i,r,o=(e=e.push?e:[e]).length,a=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<a;r++)s(e[r],i,n)}function c(e,n,i){var r,s;if(n&&n.trim&&(r=n),s=(r?i:n)||{},r){if(r in t)throw"LoadJS";t[r]=!0}function c(t,n){l(e,(function(e){a(s,e),t&&a({success:t,error:n},e),o(r,e)}),s)}if(s.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return r(e,(function(e){a(t,e)})),c},c.done=function(e){o(e,[])},c.reset=function(){t={},n={},i={}},c.isDefined=function(e){return e in t},c}()}));function Pf(e){return new Promise((function(t,n){Cf(e,{success:t,error:n})}))}function xf(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,gh.call(this,this.media,e?"play":"pause"))}var Of={setup:function(){var e=this;nh(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,Sh.call(e),Eu(window.Vimeo)?Of.ready.call(e):Pf(e.config.urls.vimeo.sdk).then((function(){Of.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,n=t.config.vimeo,i=n.premium,r=n.referrerPolicy,o=qa(n,["premium","referrerPolicy"]);i&&Object.assign(o,{controls:!1,sidedock:!1});var a=of(Fa({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},o)),s=t.media.getAttribute("src");Uu(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var l,c=Uu(l=s)?null:Au(Number(l))?l:l.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:l,u=Gu("iframe"),h=qh(t.config.urls.vimeo.iframe,c,a);if(u.setAttribute("src",h),u.setAttribute("allowfullscreen",""),u.setAttribute("allow","autoplay,fullscreen,picture-in-picture"),Uu(r)||u.setAttribute("referrerPolicy",r),i||!n.customControls)u.setAttribute("data-poster",t.poster),t.media=Zu(u,t.media);else{var f=Gu("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});f.appendChild(u),t.media=Zu(f,t.media)}n.customControls||Yh(qh(t.config.urls.vimeo.api,h)).then((function(e){!Uu(e)&&e.thumbnail_url&&yf.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(u,{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 xf.call(t,!0),t.embed.play()},t.media.pause=function(){return xf.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var d=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return d},set:function(e){var n=t.embed,i=t.media,r=t.paused,o=t.volume,a=r&&!n.hasPlayed;i.seeking=!0,gh.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 p=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return p},set:function(e){t.embed.setPlaybackRate(e).then((function(){p=e,gh.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});var m=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return m},set:function(e){t.embed.setVolume(e).then((function(){m=e,gh.call(t,t.media,"volumechange")}))}});var g=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return g},set:function(e){var n=!!Pu(e)&&e;t.embed.setVolume(n?0:t.config.volume).then((function(){g=n,gh.call(t,t.media,"volumechange")}))}});var v,y=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return y},set:function(e){var n=Pu(e)?e:t.config.loop.active;t.embed.setLoop(n).then((function(){y=n}))}}),t.embed.getVideoUrl().then((function(e){v=e,nf.setDownloadUrl.call(t)})).catch((function(t){e.debug.warn(t)})),Object.defineProperty(t.media,"currentSrc",{get:function(){return v}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then((function(n){var i=Ha(n,2),r=i[0],o=i[1];t.embed.ratio=[r,o],Sh.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(n){t.config.title=n,yf.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){d=e,gh.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,gh.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,af.setup.call(t)})),t.embed.on("cuechange",(function(e){var n=e.cues,i=(void 0===n?[]:n).map((function(e){return function(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}(e.text)}));af.updateCues.call(t,i)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){xf.call(t,!e),e||gh.call(t,t.media,"playing")})),Lu(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){gh.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){gh.call(t,t.media,"playing")})),t.embed.on("play",(function(){xf.call(t,!0),gh.call(t,t.media,"playing")})),t.embed.on("pause",(function(){xf.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,d=e.seconds,gh.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,gh.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&gh.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,gh.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,gh.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,gh.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,gh.call(t,t.media,"error")})),n.customControls&&setTimeout((function(){return yf.build.call(t)}),0)}};function If(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,gh.call(this,this.media,e?"play":"pause"))}function Lf(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var jf={setup:function(){var e=this;if(nh(this.elements.wrapper,this.config.classNames.embed,!0),Eu(window.YT)&&xu(window.YT.Player))jf.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){xu(t)&&t(),jf.ready.call(e)},Pf(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;Yh(qh(this.config.urls.youtube.api,e)).then((function(e){if(Eu(e)){var n=e.title,i=e.height,r=e.width;t.config.title=n,yf.setTitle.call(t),t.embed.ratio=[r,i]}Sh.call(t)})).catch((function(){Sh.call(t)}))},ready:function(){var e=this,t=e.config.youtube,n=e.media&&e.media.getAttribute("id");if(Uu(n)||!n.startsWith("youtube-")){var i=e.media.getAttribute("src");Uu(i)&&(i=e.media.getAttribute(this.config.attributes.embed.id));var r,o,a=Uu(r=i)?null:r.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:r,s=Gu("div",{id:(o=e.provider,"".concat(o,"-").concat(Math.floor(1e4*Math.random()))),"data-poster":t.customControls?e.poster:void 0});if(e.media=Zu(s,e.media),t.customControls){var l=function(e){return"https://i.ytimg.com/vi/".concat(a,"/").concat(e,"default.jpg")};vf(l("maxres"),121).catch((function(){return vf(l("sd"),121)})).catch((function(){return vf(l("hq"))})).then((function(t){return yf.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(e.media,{videoId:a,host:Lf(t),playerVars:Ku({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),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},gh.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),gh.call(e,e.media,"ratechange")},onReady:function(n){if(!xu(e.media.play)){var i=n.target;jf.getTitle.call(e,a),e.media.play=function(){If.call(e,!0),i.playVideo()},e.media.pause=function(){If.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,gh.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 r=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return r},set:function(t){r=t,i.setVolume(100*r),gh.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var n=Pu(t)?t:o;o=n,i[n?"mute":"unMute"](),i.setVolume(100*r),gh.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}});var s=i.getAvailablePlaybackRates();e.options.speed=s.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),gh.call(e,e.media,"timeupdate"),gh.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)&&gh.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),gh.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return yf.build.call(e)}),50)}},onStateChange:function(n){var i=n.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(n.data)&&(e.media.seeking=!1,gh.call(e,e.media,"seeked")),n.data){case-1:gh.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),gh.call(e,e.media,"progress");break;case 0:If.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):gh.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(If.call(e,!0),gh.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){gh.call(e,e.media,"timeupdate")}),50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),gh.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),If.call(e,!1);break;case 3:gh.call(e,e.media,"waiting")}gh.call(e,e.elements.container,"statechange",!1,{code:n.data})}}})}}},Nf={setup:function(){this.media?(nh(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),nh(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&nh(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Gu("div",{class:this.config.classNames.video}),$u(this.media,this.elements.wrapper),this.elements.poster=Gu("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Eh.setup.call(this):this.isYouTube?jf.setup.call(this):this.isVimeo&&Of.setup.call(this)):this.debug.warn("No media element found!")}},Rf=function(){function e(t){var n=this;Ra(this,e),this.player=t,this.config=t.config.ads,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 _a(e,[{key:"load",value:function(){var e=this;this.enabled&&(Eu(window.google)&&Eu(window.google.ima)?this.ready():Pf(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,t=this;this.enabled||((e=this).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then((function(){t.clearSafetyTimer("onAdsManagerLoaded()")})),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){var e=this;this.elements.container=Gu("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),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),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),this.requestAds()}},{key:"requestAds",value:function(){var e=this.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!t)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");var n=function(){var t=tf(Math.max(e.manager.getRemainingTime(),0)),n="".concat(Kh("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)};this.countdownTimer=setInterval(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(),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:"addCuePoints",value:function(){var e=this;Uu(this.cuePoints)||this.cuePoints.forEach((function(t){if(0!==t&&-1!==t&&t<e.player.duration){var n=e.player.elements.progress;if(Lu(n)){var i=100/e.player.duration*t,r=Gu("span",{class:e.player.config.classNames.cues});r.style.left="".concat(i.toString(),"%"),n.appendChild(r)}}}))}},{key:"onAdEvent",value:function(e){var t=this,n=this.player.elements.container,i=e.getAd(),r=e.getAdData();switch(function(e){gh.call(t.player,t.player.media,"ads".concat(e.replace(/_/g,"").toLowerCase()))}(e.type),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),i.isLinear()||(i.width=n.offsetWidth,i.height=n.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:r.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(r.adError.getMessage()))}}},{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("canplay",(function(){t.addCuePoints()})),this.player.on("ended",(function(){t.loader.contentComplete()})),this.player.on("timeupdate",(function(){e=t.player.currentTime})),this.player.on("seeked",(function(){var n=t.player.currentTime;Uu(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.manager.setVolume(e.player.volume),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,bh(this.player.media.play())}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.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.initialized=!1,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];Ou(o)&&o.forEach((function(e){xu(e)&&e.apply(t,i)}))}},{key:"on",value:function(e,t){return Ou(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){Su(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!Uu(e.publisherId)||_u(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(_u(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(of(t))}}]),e}(),Mf=ut.findIndex,_f="findIndex",Uf=!0,Df=Zt(_f);_f in[]&&Array(1).findIndex((function(){Uf=!1})),Le({target:"Array",proto:!0,forced:Uf||!Df},{findIndex:function(e){return Mf(this,e,arguments.length>1?arguments[1]:void 0)}}),mn(_f);var Ff=Math.min,qf=[].lastIndexOf,Hf=!!qf&&1/[1].lastIndexOf(1,-0)<0,Bf=Gt("lastIndexOf"),Vf=Zt("indexOf",{ACCESSORS:!0,1:0}),zf=Hf||!Bf||!Vf?function(e){if(Hf)return qf.apply(this,arguments)||0;var t=m(this),n=ce(t.length),i=n-1;for(arguments.length>1&&(i=Ff(i,se(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:qf;Le({target:"Array",proto:!0,forced:zf!==[].lastIndexOf},{lastIndexOf:zf});var Wf=function(e,t){var n={};return e>t.width/t.height?(n.width=t.width,n.height=1/e*t.width):(n.height=t.height,n.width=e*t.height),n},Kf=function(){function e(t){Ra(this,e),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return _a(e,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then((function(){e.enabled&&(e.render(),e.determineContainerAutoSizing(),e.loaded=!0)}))}},{key:"getThumbnails",value:function(){var e=this;return new Promise((function(t){var n=e.player.config.previewThumbnails.src;if(Uu(n))throw new Error("Missing previewThumbnails.src config attribute");var i=function(){e.thumbnails.sort((function(e,t){return e.height-t.height})),e.player.debug.log("Preview thumbnails",e.thumbnails),t()};if(xu(n))n((function(t){e.thumbnails=t,i()}));else{var r=(Cu(n)?[n]:n).map((function(t){return e.getThumbnail(t)}));Promise.all(r).then(i)}}))}},{key:"getThumbnail",value:function(e){var t=this;return new Promise((function(n){Yh(e).then((function(i){var r,o,a={frames:(r=i,o=[],r.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var t={};e.split(/\r\n|\n|\r/).forEach((function(e){if(Au(t.startTime)){if(!Uu(e.trim())&&Uu(t.text)){var n=e.trim().split("#xywh="),i=Ha(n,1);if(t.text=i[0],n[1]){var r=Ha(n[1].split(","),4);t.x=r[0],t.y=r[1],t.w=r[2],t.h=r[3]}}}else{var o=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);o&&(t.startTime=60*Number(o[1]||0)*60+60*Number(o[2])+Number(o[3])+Number("0.".concat(o[4])),t.endTime=60*Number(o[6]||0)*60+60*Number(o[7])+Number(o[8])+Number("0.".concat(o[9])))}})),t.text&&o.push(t)})),o),height:null,urlPrefix:""};a.frames[0].text.startsWith("/")||a.frames[0].text.startsWith("http://")||a.frames[0].text.startsWith("https://")||(a.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var s=new Image;s.onload=function(){a.height=s.naturalHeight,a.width=s.naturalWidth,t.thumbnails.push(a),n()},s.src=a.urlPrefix+a.frames[0].text}))}))}},{key:"startMove",value:function(e){if(this.loaded&&ju(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=tf(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){(Su(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):mh.call(this.player,this.player.media,"timeupdate",(function(){e.mouseDown||e.toggleScrubbingContainer(!1)}))}},{key:"listeners",value:function(){var e=this;this.player.on("play",(function(){e.toggleThumbContainer(!1,!0)})),this.player.on("seeked",(function(){e.toggleThumbContainer(!1)})),this.player.on("timeupdate",(function(){e.lastTime=e.player.media.currentTime}))}},{key:"render",value:function(){this.elements.thumb.container=Gu("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=Gu("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=Gu("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=Gu("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),Lu(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=Gu("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"destroy",value:function(){this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();var t=this.thumbnails[0].frames.findIndex((function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime})),n=t>=0,i=0;this.mouseDown||this.toggleThumbContainer(n),n&&(this.thumbnails.forEach((function(n,r){e.loadedImages.includes(n.frames[t].text)&&(i=r)})),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(i)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=this.showingThumb,i=this.thumbnails[t],r=i.urlPrefix,o=i.frames[n],a=i.frames[n].text,s=r+a;if(this.currentImageElement&&this.currentImageElement.dataset.filename===a)this.showImage(this.currentImageElement,o,t,n,a,!1),this.currentImageElement.dataset.index=n,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var l=new Image;l.src=s,l.dataset.index=n,l.dataset.filename=a,this.showingThumbFilename=a,this.player.debug.log("Loading image: ".concat(s)),l.onload=function(){return e.showImage(l,o,t,n,a,!0)},this.loadingImage=l,this.removeOldImages(l)}}},{key:"showImage",value:function(e,t,n,i,r){var o=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(r,". num: ").concat(i,". qual: ").concat(n,". newimg: ").concat(o)),this.setImageSizeAndOffset(e,t),o&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(r)||this.loadedImages.push(r)),this.preloadNearby(i,!0).then(this.preloadNearby(i,!1)).then(this.getHigherQuality(n,e,t,r))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach((function(n){if("img"===n.tagName.toLowerCase()){var i=t.usingSprites?500:1e3;if(n.dataset.index!==e.dataset.index&&!n.dataset.deleting){n.dataset.deleting=!0;var r=t.currentImageContainer;setTimeout((function(){r.removeChild(n),t.player.debug.log("Removing thumb: ".concat(n.dataset.filename))}),i)}}}))}},{key:"preloadNearby",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(i){setTimeout((function(){var r=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===r){var o;o=n?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var a=!1;o.forEach((function(e){var n=e.text;if(n!==r&&!t.loadedImages.includes(n)){a=!0,t.player.debug.log("Preloading thumb filename: ".concat(n));var o=t.thumbnails[0].urlPrefix+n,s=new Image;s.src=o,s.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(n)),t.loadedImages.includes(n)||t.loadedImages.push(n),i()}}})),a||i()}}),300)}))}},{key:"getHigherQuality",value:function(e,t,n,i){var r=this;if(e<this.thumbnails.length-1){var o=t.naturalHeight;this.usingSprites&&(o=n.h),o<this.thumbContainerHeight&&setTimeout((function(){r.showingThumbFilename===i&&(r.player.debug.log("Showing higher quality thumb for: ".concat(i)),r.loadImage(e+1))}),300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(n,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(this.sizeSpecifiedInCSS){if(this.elements.thumb.imageContainer.clientHeight>20&&this.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(this.elements.thumb.imageContainer.clientHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(this.elements.thumb.imageContainer.clientHeight<20&&this.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(this.elements.thumb.imageContainer.clientWidth/this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var n=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(n,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),n=this.elements.thumb.container,i=t.left-e.left+10,r=t.right-e.left-n.clientWidth-10,o=this.mousePosX-e.left-n.clientWidth/2;o<i&&(o=i),o>r&&(o=r),n.style.left="".concat(o,"px")}},{key:"setScrubbingContainerSize",value:function(){var e=Wf(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}),t=e.width,n=e.height;this.elements.scrubbing.container.style.width="".concat(t,"px"),this.elements.scrubbing.container.style.height="".concat(n,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var n=this.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*n,"px"),e.style.width="".concat(e.naturalWidth*n,"px"),e.style.left="-".concat(t.x*n,"px"),e.style.top="-".concat(t.y*n,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?Wf(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),$f={insertElements:function(e,t){var n=this;Cu(t)?Xu(e,this.media,{src:t}):Ou(t)&&t.forEach((function(t){Xu(e,n.media,t)}))},change:function(e){var t=this;Wu(e,"sources.length")?(Eh.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],Qu(t.media),t.media=null,Lu(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=Ha(n,1)[0],o=r.provider,a=void 0===o?uf.html5:o,s=r.src,l="html5"===a?i:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:i,supported:uh.check(i,a,t.config.playsinline),media:Gu(l,c)}),t.elements.container.appendChild(t.media),Pu(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),Uu(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","")),yf.addStyleHook.call(t),t.isHTML5&&$f.insertElements.call(t,"source",n),t.config.title=e.title,Nf.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&$f.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&yf.build.call(t),t.isHTML5&&t.media.load(),Uu(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new Kf(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};var Yf,Gf=function(){function e(t,n){var i=this;if(Ra(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=uh.touch,this.media=t,Cu(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||Iu(this.media)||Ou(this.media))&&(this.media=this.media[0]),this.config=Ku({},sf,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 pf(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",uh),!Su(this.media)&&Lu(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(uh.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"),Lu(a)){if(s=rf(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?uf.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?uf.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.youtube.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(Uu(this.provider)||!Object.keys(uf).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=ff;break;case"video":case"audio":this.type=o,this.provider=uf.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=uh.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new bf(this),this.storage=new $h(this),this.media.plyr=this,Lu(this.elements.container)||(this.elements.container=Gu("div",{tabindex:0}),$u(this.media,this.elements.container)),yf.migrateStyles.call(this),yf.addStyleHook.call(this),Nf.setup.call(this),this.config.debug&&dh.call(this,this.elements.container,this.config.events.join(" "),(function(e){i.debug.log("event: ".concat(e.type))})),this.fullscreen=new mf(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&yf.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Rf(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return bh(i.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Kf(this))):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 _a(e,[{key:"play",value:function(){var e=this;return xu(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then((function(){return e.ads.play()})).catch((function(){return bh(e.media.play())})),this.media.play()):null}},{key:"pause",value:function(){return this.playing&&xu(this.media.pause)?this.media.pause():null}},{key:"togglePlay",value:function(e){return(Pu(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):xu(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime-=Au(e)?e:this.config.seekTime}},{key:"forward",value:function(e){this.currentTime+=Au(e)?e:this.config.seekTime}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(Au(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){af.toggle.call(this,e,!1)}},{key:"airplay",value:function(){uh.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=ih(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,i=nh(this.elements.container,this.config.classNames.hideControls,n);if(i&&Ou(this.config.controls)&&this.config.controls.includes("settings")&&!Uu(this.config.settings)&&nf.toggleMenu.call(this,!1),i!==t){var r=i?"controlshidden":"controlsshown";gh.call(this,this.media,r)}return!i}return!1}},{key:"on",value:function(e,t){dh.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){mh.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){ph(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&&(Qu(t.elements.buttons.play),Qu(t.elements.captions),Qu(t.elements.controls),Qu(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),xu(e)&&e()):(vh.call(t),Eh.cancelRequests.call(t),Zu(t.elements.original,t.elements.container),gh.call(t,t.elements.original,"destroyed",!0),xu(e)&&e.call(t.elements.original),t.ready=!1,setTimeout((function(){t.elements=null,t.media=null}),200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(yf.toggleNativeControls.call(this,!0),i()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&xu(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 uh.mime.call(this,e)}},{key:"isHTML5",get:function(){return this.provider===uf.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===uf.youtube}},{key:"isVimeo",get:function(){return this.provider===uf.vimeo}},{key:"isVideo",get:function(){return this.type===ff}},{key:"isAudio",get:function(){return this.type===hf}},{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=Au(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 Au(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=Au(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;Cu(t)&&(t=Number(t)),Au(t)||(t=this.storage.get("volume")),Au(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!Uu(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;Pu(t)||(t=this.storage.get("muted")),Pu(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=this,n=null;Au(e)&&(n=e),Au(n)||(n=this.storage.get("speed")),Au(n)||(n=this.config.speed.selected);var i=this.minimumSpeed,r=this.maximumSpeed;n=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),n)}(n,i,r),this.config.speed.selected=n,setTimeout((function(){t.media.playbackRate=n}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,Ba(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,Ba(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!Uu(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(Au),r=!0;if(!n.includes(i)){var o=function(e,t){return Ou(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(o," instead")),i=o,r=!1}t.selected=i,this.media.quality=i,r&&this.storage.set({quality:i})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=Pu(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){$f.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return _u(e)?e:this.source},set:function(e){_u(e)&&(this.config.urls.download=e,nf.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?yf.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=kh(Th.call(this));return Ou(e)?e.join(":"):e},set:function(e){this.isVideo?Cu(e)&&wh(e)?(this.config.ratio=e,Sh.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=Pu(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){af.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){af.setLanguage.call(this,e,!1)},get:function(){return(af.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(uh.pip){var t=Pu(e)?e:!this.pip;xu(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?lf:cf),xu(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return uh.pip?Uu(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===lf:null}}],[{key:"supported",value:function(e,t,n){return uh.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return Gh(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return Cu(t)?i=Array.from(document.querySelectorAll(t)):Iu(t)?i=Array.from(t):Ou(t)&&(i=t.filter(Lu)),Uu(i)?null:i.map((function(t){return new e(t,n)}))}}]),e}();return Gf.defaults=(Yf=sf,JSON.parse(JSON.stringify(Yf))),Gf}));
+!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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)},Hu=function(e){return function(t,n,i,r){rt(n);var o=Me(t),a=h(o),s=ce(o.length),l=e?s-1:0,c=e?-1:1;if(i<2)for(;;){if(l in a){r=a[l],l+=c;break}if(l+=c,e?l<0:s<=l)throw TypeError("Reduce of empty array with no initial value")}for(;e?l>=0:s>l;l+=c)l in a&&(r=n(r,a[l],l,o));return r}},Bu={left:Hu(!1),right:Hu(!0)}.left,Vu=Gt("reduce"),zu=Zt("reduce",{1:0});function Wu(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function Ku(){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 Eu(r)?(Object.keys(r).forEach((function(t){Eu(r[t])?(Object.keys(e).includes(t)||Object.assign(e,Ua({},t,{})),Ku(e[t],r[t])):Object.assign(e,Ua({},t,r[t]))})),Ku.apply(void 0,[e].concat(n))):e}function $u(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 Yu(e,t){ju(e)&&!Uu(t)&&Object.entries(t).filter((function(e){var t=Ha(e,2)[1];return!Su(t)})).forEach((function(t){var n=Ha(t,2),i=n[0],r=n[1];return e.setAttribute(i,r)}))}function Gu(e,t,n){var i=document.createElement(e);return Eu(t)&&Yu(i,t),Cu(n)&&(i.innerText=n),i}function Xu(e,t,n,i){ju(t)&&t.appendChild(Gu(e,n,i))}function Qu(e){Iu(e)||Ou(e)?Array.from(e).forEach(Qu):ju(e)&&ju(e.parentNode)&&e.parentNode.removeChild(e)}function Ju(e){if(ju(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function Zu(e,t){return ju(t)&&ju(t.parentNode)&&ju(e)?(t.parentNode.replaceChild(e,t),e):null}function ef(e,t){if(!Cu(e)||Uu(e))return{};var n={},i=Ku({},t);return e.split(",").forEach((function(e){var t=e.trim(),r=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=Ha(o,1)[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":Cu(i.class)?n.class="".concat(i.class," ").concat(r):n.class=r;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}})),Ku(i,n)}function tf(e,t){if(ju(e)){var n=t;Pu(n)||(n=!e.hidden),e.hidden=n}}function nf(e,t,n){if(Iu(e))return Array.from(e).map((function(e){return nf(e,t,n)}));if(ju(e)){var i="toggle";return void 0!==n&&(i=n?"add":"remove"),e.classList[i](t),e.classList.contains(t)}return!1}function rf(e,t){return ju(e)&&e.classList.contains(t)}function of(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function af(e){return this.elements.container.querySelectorAll(e)}function sf(e){return this.elements.container.querySelector(e)}function lf(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];ju(e)&&(e.focus({preventScroll:!0}),t&&nf(e,this.config.classNames.tabFocus))}je({target:"Array",proto:!0,forced:!Vu||!zu||!Kl&&Xn>79&&Xn<83},{reduce:function(e){return Bu(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var cf,uf={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},ff={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var i=qu.isIPhone&&n&&ff.playsinline,r=ff[e]||"html5"!==t;return{api:r,ui:r&&ff.rangeInput&&("video"!==e||!qu.isIPhone||i)}},pip:!(qu.isIPhone||!xu(Gu("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||Gu("video").disablePictureInPicture)),airplay:xu(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(Uu(e))return!1;var t=Ha(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(uf).includes(n)&&(n+='; codecs="'.concat(uf[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:(cf=document.createElement("input"),cf.type="range","range"===cf.type),touch:"ontouchstart"in document.documentElement,transitions:!1!==Du,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},df=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 hf(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&&!Uu(t)&&xu(n)){var s=t.split(" "),l=a;df&&(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 pf(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];hf.call(this,e,t,n,!0,i,r)}function mf(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];hf.call(this,e,t,n,!1,i,r)}function gf(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",i=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],a=function a(){mf(e,n,a,r,o);for(var s=arguments.length,l=new Array(s),c=0;c<s;c++)l[c]=arguments[c];i.apply(t,l)};hf.call(this,e,n,a,!0,r,o)}function vf(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(ju(e)&&!Uu(t)){var r=new CustomEvent(t,{bubbles:n,detail:Fa(Fa({},i),{},{plyr:this})});e.dispatchEvent(r)}}function yf(){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=[])}function bf(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):pf.call(e,e.elements.container,"ready",t)})).then((function(){}))}function wf(e){Mu(e)&&e.then(null,(function(){}))}function kf(e){return!!(Ou(e)||Cu(e)&&e.includes(":"))&&(Ou(e)?e:e.split(":")).map(Number).every(Au)}function Tf(e){if(!Ou(e)||!e.every(Au))return null;var t=Ha(e,2),n=t[0],i=t[1],r=function e(t,n){return 0===n?t:e(n,t%n)}(n,i);return[n/r,i/r]}function Sf(e){var t=function(e){return kf(e)?e.split(":").map(Number):null},n=t(e);if(null===n&&(n=t(this.config.ratio)),null===n&&!Uu(this.embed)&&Ou(this.embed.ratio)&&(n=this.embed.ratio),null===n&&this.isHTML5){var i=this.media;n=Tf([i.videoWidth,i.videoHeight])}return n}function Ef(e){if(!this.isVideo)return{};var t=this.elements.wrapper,n=Sf.call(this,e),i=Ha(Ou(n)?n:[0,0],2),r=100/i[0]*i[1];if(t.style.paddingBottom="".concat(r,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var o=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),a=(o-r)/(o/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(a,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==n);return{padding:r,ratio:n}}var Af={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var n=t.getAttribute("type");return!!Uu(n)||ff.mime.call(e,n)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:Af.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,Uu(this.config.ratio)||Ef.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=Af.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&xu(e.config.quality.onChange))e.config.quality.onChange(t);else{var n=Af.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!n)return;var i=e.media,r=i.currentTime,o=i.paused,a=i.preload,s=i.readyState,l=i.playbackRate;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",(function(){e.speed=l,e.currentTime=r,o||wf(e.play())})),e.media.load())}vf.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(Qu(Af.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function Cf(e){return Ou(e)?e.filter((function(t,n){return e.indexOf(t)===n})):e}var Pf=x.f,xf=be.f,Of=ee.set,If=Qe("match"),jf=i.RegExp,Lf=jf.prototype,Nf=/a/g,Rf=/a/g,Mf=new jf(Nf)!==Nf,_f=di.UNSUPPORTED_Y;if(o&&Oe("RegExp",!Mf||_f||r((function(){return Rf[If]=!1,jf(Nf)!=Nf||jf(Rf)==Rf||"/a/i"!=jf(Nf,"i")})))){for(var Uf=function(e,t){var n,i=this instanceof Uf,r=Yi(e),o=void 0===t;if(!i&&r&&e.constructor===Uf&&o)return e;Mf?r&&!o&&(e=e.source):e instanceof Uf&&(o&&(t=ui.call(e)),e=e.source),_f&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var a=ms(Mf?new jf(e,t):jf(e,t),i?this:Lf,Uf);return _f&&n&&Of(a,{sticky:n}),a},Df=function(e){e in Uf||Pf(Uf,e,{configurable:!0,get:function(){return jf[e]},set:function(t){jf[e]=t}})},Ff=xf(jf),qf=0;Ff.length>qf;)Df(Ff[qf++]);Lf.constructor=Uf,Uf.prototype=Lf,te(i,"RegExp",Uf)}function Hf(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 Uu(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return n[t].toString()}))}zl("RegExp");var Bf=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())},Vf=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function zf(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=Bf(t,"-"," "),t=Bf(t,"_"," "),t=Vf(t),Bf(t," ","")}function Wf(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var Kf={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},$f=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(Uu(e)||Uu(t))return"";var n=Wu(t.i18n,e);if(Uu(n))return Object.keys(Kf).includes(e)?Kf[e]:"";var i={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(i).forEach((function(e){var t=Ha(e,2),i=t[0],r=t[1];n=Bf(n,i,r)})),n},Yf=function(){function e(t){var n=this;Ra(this,e),Ua(this,"get",(function(t){if(!e.supported||!n.enabled)return null;var i=window.localStorage.getItem(n.key);if(Uu(i))return null;var r=JSON.parse(i);return Cu(t)&&t.length?r[t]:r})),Ua(this,"set",(function(t){if(e.supported&&n.enabled&&Eu(t)){var i=n.get();Uu(i)&&(i={}),Ku(i,t),window.localStorage.setItem(n.key,JSON.stringify(i))}})),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return _a(e,null,[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function Gf(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 Xf(e,t){if(Cu(e)){var n="cache",i=Cu(t),r=function(){return null!==document.getElementById(t)},o=function(e,t){e.innerHTML=t,i&&r()||document.body.insertAdjacentElement("afterbegin",e)};if(!i||!r()){var a=Yf.supported,s=document.createElement("div");if(s.setAttribute("hidden",""),i&&s.setAttribute("id",t),a){var l=window.localStorage.getItem("".concat(n,"-").concat(t));if(null!==l){var c=JSON.parse(l);o(s,c.content)}}Gf(e).then((function(e){Uu(e)||(a&&window.localStorage.setItem("".concat(n,"-").concat(t),JSON.stringify({content:e})),o(s,e))})).catch((function(){}))}}}var Qf=Math.ceil,Jf=Math.floor;je({target:"Math",stat:!0},{trunc:function(e){return(e>0?Jf:Qf)(e)}});var Zf=function(e){return Math.trunc(e/60/60%60,10)},ed=function(e){return Math.trunc(e/60%60,10)},td=function(e){return Math.trunc(e%60,10)};function nd(){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(!Au(e))return nd(void 0,t,n);var i=function(e){return"0".concat(e).slice(-2)},r=Zf(e),o=ed(e),a=td(e);return r=t||r>0?"".concat(r,":"):"","".concat(n&&e>0?"-":"").concat(r).concat(i(o),":").concat(i(a))}var id={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||qu.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=sf.call(this,this.config.selectors.controls.wrapper),this.elements.buttons={play:af.call(this,this.config.selectors.buttons.play),pause:sf.call(this,this.config.selectors.buttons.pause),restart:sf.call(this,this.config.selectors.buttons.restart),rewind:sf.call(this,this.config.selectors.buttons.rewind),fastForward:sf.call(this,this.config.selectors.buttons.fastForward),mute:sf.call(this,this.config.selectors.buttons.mute),pip:sf.call(this,this.config.selectors.buttons.pip),airplay:sf.call(this,this.config.selectors.buttons.airplay),settings:sf.call(this,this.config.selectors.buttons.settings),captions:sf.call(this,this.config.selectors.buttons.captions),fullscreen:sf.call(this,this.config.selectors.buttons.fullscreen)},this.elements.progress=sf.call(this,this.config.selectors.progress),this.elements.inputs={seek:sf.call(this,this.config.selectors.inputs.seek),volume:sf.call(this,this.config.selectors.inputs.volume)},this.elements.display={buffer:sf.call(this,this.config.selectors.display.buffer),currentTime:sf.call(this,this.config.selectors.display.currentTime),duration:sf.call(this,this.config.selectors.display.duration)},ju(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="http://www.w3.org/2000/svg",i=id.getIconUrl.call(this),r="".concat(i.cors?"":i.url,"#").concat(this.config.iconPrefix),o=document.createElementNS(n,"svg");Yu(o,Ku(t,{"aria-hidden":"true",focusable:"false"}));var a=document.createElementNS(n,"use"),s="".concat(r,"-").concat(e);return"href"in a&&a.setAttributeNS("http://www.w3.org/1999/xlink","href",s),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",s),o.appendChild(a),o},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=$f(e,this.config),i=Fa(Fa({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return Gu("span",i,n)},createBadge:function(e){if(Uu(e))return null;var t=Gu("span",{class:this.config.classNames.menu.value});return t.appendChild(Gu("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=this,i=Ku({},t),r=function(){var e=(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"").toString();return(e=zf(e)).charAt(0).toLowerCase()+e.slice(1)}(e),o={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(i).includes(e)&&(o[e]=i[e],delete i[e])})),"button"!==o.element||Object.keys(i).includes("type")||(i.type="button"),Object.keys(i).includes("class")?i.class.split(" ").some((function(e){return e===n.config.classNames.control}))||Ku(i,{class:"".concat(i.class," ").concat(this.config.classNames.control)}):i.class=this.config.classNames.control,e){case"play":o.toggle=!0,o.label="play",o.labelPressed="pause",o.icon="play",o.iconPressed="pause";break;case"mute":o.toggle=!0,o.label="mute",o.labelPressed="unmute",o.icon="volume",o.iconPressed="muted";break;case"captions":o.toggle=!0,o.label="enableCaptions",o.labelPressed="disableCaptions",o.icon="captions-off",o.iconPressed="captions-on";break;case"fullscreen":o.toggle=!0,o.label="enterFullscreen",o.labelPressed="exitFullscreen",o.icon="enter-fullscreen",o.iconPressed="exit-fullscreen";break;case"play-large":i.class+=" ".concat(this.config.classNames.control,"--overlaid"),r="play",o.label="play",o.icon="play";break;default:Uu(o.label)&&(o.label=r),Uu(o.icon)&&(o.icon=e)}var a=Gu(o.element);return o.toggle?(a.appendChild(id.createIcon.call(this,o.iconPressed,{class:"icon--pressed"})),a.appendChild(id.createIcon.call(this,o.icon,{class:"icon--not-pressed"})),a.appendChild(id.createLabel.call(this,o.labelPressed,{class:"label--pressed"})),a.appendChild(id.createLabel.call(this,o.label,{class:"label--not-pressed"}))):(a.appendChild(id.createIcon.call(this,o.icon)),a.appendChild(id.createLabel.call(this,o.label))),Ku(i,ef(this.config.selectors.buttons[r],i)),Yu(a,i),"play"===r?(Ou(this.elements.buttons[r])||(this.elements.buttons[r]=[]),this.elements.buttons[r].push(a)):this.elements.buttons[r]=a,a},createRange:function(e,t){var n=Gu("input",Ku(ef(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":$f(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,id.updateRangeFill.call(this,n),Hl.setup(n),n},createProgress:function(e,t){var n=Gu("progress",Ku(ef(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(Gu("span",null,"0"));var i={played:"played",buffer:"buffered"}[e],r=i?$f(i,this.config):"";n.innerText="% ".concat(r.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e,t){var n=ef(this.config.selectors.display[e],t),i=Gu("div",Ku(n,{class:"".concat(n.class?n.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":$f(e,this.config)}),"00:00");return this.elements.display[e]=i,i},bindMenuItemShortcuts:function(e,t){var n=this;pf.call(this,e,"keydown keyup",(function(i){if([32,38,39,40].includes(i.which)&&(i.preventDefault(),i.stopPropagation(),"keydown"!==i.type)){var r,o=of(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(i.which))id.showMenuPanel.call(n,t,!0);else 32!==i.which&&(40===i.which||o&&39===i.which?(r=e.nextElementSibling,ju(r)||(r=e.parentNode.firstElementChild)):(r=e.previousElementSibling,ju(r)||(r=e.parentNode.lastElementChild)),lf.call(n,r,!0))}}),!1),pf.call(this,e,"keyup",(function(e){13===e.which&&id.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=ef(this.config.selectors.inputs[r]),f=Gu("button",Ku(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),d=Gu("span");d.innerHTML=o,ju(s)&&d.appendChild(s),f.appendChild(d),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 of(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(!Nu(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)}id.showMenuPanel.call(t,"home",Nu(e))}}),r,!1),id.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];if(!Au(e))return e;var n=Zf(this.duration)>0;return nd(e,n,t)},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];ju(e)&&Au(t)&&(e.innerText=id.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(ju(this.elements.inputs.volume)&&id.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),ju(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;ju(e)&&(e.value=t,id.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&Lu(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=function(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}(this.currentTime,this.duration),"timeupdate"===e.type&&id.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var i=Au(n)?n:0,r=ju(e)?e:t.elements.display.buffer;if(ju(r)){r.value=i;var o=r.getElementsByTagName("span")[0];ju(o)&&(o.childNodes[0].nodeValue=i)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=Lu(e)?e.target:e;if(ju(t)&&"range"===t.getAttribute("type")){if(of(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=id.formatTime(this.currentTime),i=id.formatTime(this.duration),r=$f("seekLabel",this.config);t.setAttribute("aria-valuetext",r.replace("{currentTime}",n).replace("{duration}",i))}else if(of(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);qu.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&ju(this.elements.inputs.seek)&&ju(this.elements.display.seekTooltip)&&0!==this.duration){var n="".concat(this.config.classNames.tooltip,"--visible"),i=function(e){return nf(t.elements.display.seekTooltip,n,e)};if(this.touch)i(!1);else{var r=0,o=this.elements.progress.getBoundingClientRect();if(Lu(e))r=100/o.width*(e.pageX-o.left);else{if(!rf(this.elements.display.seekTooltip,n))return;r=parseFloat(this.elements.display.seekTooltip.style.left,10)}r<0?r=0:r>100&&(r=100),id.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*r),this.elements.display.seekTooltip.style.left="".concat(r,"%"),Lu(e)&&["mouseenter","mouseleave"].includes(e.type)&&i("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!ju(this.elements.display.duration)&&this.config.invertTime;id.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||id.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return tf(this.elements.display.currentTime,!0),void tf(this.elements.progress,!0);ju(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=ju(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&id.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&id.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),id.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){tf(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=Uu(n)?this[e]:n,Uu(r)&&(r=this.config[e].default),!Uu(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(ju(o)||(o=i&&i.querySelector('[role="menu"]')),ju(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=id.getLabel.call(this,e,r);var a=o&&o.querySelector('[value="'.concat(r,'"]'));ju(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?$f("normal",this.config):"".concat(t,"&times;");case"quality":if(Au(t)){var n=$f("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return Vf(t);case"captions":return ad.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(ju(this.elements.settings.panels.quality)){var n="quality",i=this.elements.settings.panels.quality.querySelector('[role="menu"]');Ou(e)&&(this.options.quality=Cf(e).filter((function(e){return t.config.quality.options.includes(e)})));var r=!Uu(this.options.quality)&&this.options.quality.length>1;if(id.toggleMenuButton.call(this,n,r),Ju(i),id.checkMenu.call(this),r){var o=function(e){var n=$f("qualityBadge.".concat(e),t.config);return n.length?id.createBadge.call(t,n):null};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){id.createMenuItem.call(t,{value:e,list:i,type:n,title:id.getLabel.call(t,"quality",e),badge:o(e)})})),id.updateSetting.call(this,n,i)}}},setCaptionsMenu:function(){var e=this;if(ju(this.elements.settings.panels.captions)){var t="captions",n=this.elements.settings.panels.captions.querySelector('[role="menu"]'),i=ad.getTracks.call(this),r=Boolean(i.length);if(id.toggleMenuButton.call(this,t,r),Ju(n),id.checkMenu.call(this),r){var o=i.map((function(t,i){return{value:i,checked:e.captions.toggled&&e.currentTrack===i,title:ad.getLabel.call(e,t),badge:t.language&&id.createBadge.call(e,t.language.toUpperCase()),list:n,type:"language"}}));o.unshift({value:-1,checked:!this.captions.toggled,title:$f("disabled",this.config),list:n,type:"language"}),o.forEach(id.createMenuItem.bind(this)),id.updateSetting.call(this,t,n)}}},setSpeedMenu:function(){var e=this;if(ju(this.elements.settings.panels.speed)){var t="speed",n=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var i=!Uu(this.options.speed)&&this.options.speed.length>1;id.toggleMenuButton.call(this,t,i),Ju(n),id.checkMenu.call(this),i&&(this.options.speed.forEach((function(i){id.createMenuItem.call(e,{value:i,list:n,type:t,title:id.getLabel.call(e,"speed",i)})})),id.updateSetting.call(this,t,n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!Uu(e)&&Object.values(e).some((function(e){return!e.hidden}));tf(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;ju(n)||(n=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var i=n.querySelector('[role^="menuitem"]');lf.call(this,i,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(ju(t)&&ju(n)){var i=t.hidden,r=i;if(Pu(e))r=e;else if(Nu(e)&&27===e.which)r=!1;else if(Lu(e)){var o=xu(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(o);if(a||!a&&e.target!==n&&r)return}n.setAttribute("aria-expanded",r),tf(t,!r),nf(this.elements.container,this.config.classNames.menu.open,r),r&&Nu(e)?id.focusFirstMenuItem.call(this,null,!0):r||i||lf.call(this,n,Nu(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 Qu(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=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(ju(i)){var r=i.parentNode,o=Array.from(r.children).find((function(e){return!e.hidden}));if(ff.transitions&&!ff.reducedMotion){r.style.width="".concat(o.scrollWidth,"px"),r.style.height="".concat(o.scrollHeight,"px");var a=id.getMenuSize.call(this,i),s=function t(n){n.target===r&&["width","height"].includes(n.propertyName)&&(r.style.width="",r.style.height="",mf.call(e,r,Du,t))};pf.call(this,r,Du,s),r.style.width="".concat(a.width,"px"),r.style.height="".concat(a.height,"px")}tf(o,!0),tf(i,!1),id.focusFirstMenuItem.call(this,i,n)}},setDownloadUrl:function(){var e=this.elements.buttons.download;ju(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=id.bindMenuItemShortcuts,i=id.createButton,r=id.createProgress,o=id.createRange,a=id.createTime,s=id.setQualityMenu,l=id.setSpeedMenu,c=id.showMenuPanel;this.elements.controls=null,Ou(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(i.call(this,"play-large"));var u=Gu("div",ef(this.config.selectors.controls.wrapper));this.elements.controls=u;var f={class:"plyr__controls__item"};return Cf(Ou(this.config.controls)?this.config.controls:[]).forEach((function(s){if("restart"===s&&u.appendChild(i.call(t,"restart",f)),"rewind"===s&&u.appendChild(i.call(t,"rewind",f)),"play"===s&&u.appendChild(i.call(t,"play",f)),"fast-forward"===s&&u.appendChild(i.call(t,"fast-forward",f)),"progress"===s){var l=Gu("div",{class:"".concat(f.class," plyr__progress__container")}),d=Gu("div",ef(t.config.selectors.progress));if(d.appendChild(o.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),d.appendChild(r.call(t,"buffer")),t.config.tooltips.seek){var h=Gu("span",{class:t.config.classNames.tooltip},"00:00");d.appendChild(h),t.elements.display.seekTooltip=h}t.elements.progress=d,l.appendChild(t.elements.progress),u.appendChild(l)}if("current-time"===s&&u.appendChild(a.call(t,"currentTime",f)),"duration"===s&&u.appendChild(a.call(t,"duration",f)),"mute"===s||"volume"===s){var p=t.elements.volume;if(ju(p)&&u.contains(p)||(p=Gu("div",Ku({},f,{class:"".concat(f.class," plyr__volume").trim()})),t.elements.volume=p,u.appendChild(p)),"mute"===s&&p.appendChild(i.call(t,"mute")),"volume"===s&&!qu.isIos){var m={max:1,step:.05,value:t.config.volume};p.appendChild(o.call(t,"volume",Ku(m,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===s&&u.appendChild(i.call(t,"captions",f)),"settings"===s&&!Uu(t.config.settings)){var g=Gu("div",Ku({},f,{class:"".concat(f.class," plyr__menu").trim(),hidden:""}));g.appendChild(i.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var v=Gu("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),y=Gu("div"),b=Gu("div",{id:"plyr-settings-".concat(e.id,"-home")}),w=Gu("div",{role:"menu"});b.appendChild(w),y.appendChild(b),t.elements.settings.panels.home=b,t.config.settings.forEach((function(i){var r=Gu("button",Ku(ef(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:""}));n.call(t,r,i),pf.call(t,r,"click",(function(){c.call(t,i,!1)}));var o=Gu("span",null,$f(i,t.config)),a=Gu("span",{class:t.config.classNames.menu.value});a.innerHTML=e[i],o.appendChild(a),r.appendChild(o),w.appendChild(r);var s=Gu("div",{id:"plyr-settings-".concat(e.id,"-").concat(i),hidden:""}),l=Gu("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});l.appendChild(Gu("span",{"aria-hidden":!0},$f(i,t.config))),l.appendChild(Gu("span",{class:t.config.classNames.hidden},$f("menuBack",t.config))),pf.call(t,s,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),c.call(t,"home",!0))}),!1),pf.call(t,l,"click",(function(){c.call(t,"home",!1)})),s.appendChild(l),s.appendChild(Gu("div",{role:"menu"})),y.appendChild(s),t.elements.settings.buttons[i]=r,t.elements.settings.panels[i]=s})),v.appendChild(y),g.appendChild(v),u.appendChild(g),t.elements.settings.popup=v,t.elements.settings.menu=g}if("pip"===s&&ff.pip&&u.appendChild(i.call(t,"pip",f)),"airplay"===s&&ff.airplay&&u.appendChild(i.call(t,"airplay",f)),"download"===s){var k=Ku({},f,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(k.download="");var T=t.config.urls.download;!_u(T)&&t.isEmbed&&Ku(k,{icon:"logo-".concat(t.provider),label:t.provider}),u.appendChild(i.call(t,"download",k))}"fullscreen"===s&&u.appendChild(i.call(t,"fullscreen",f))})),this.isHTML5&&s.call(this,Af.getQualityOptions.call(this)),l.call(this),u},inject:function(){var e=this;if(this.config.loadSprite){var t=id.getIconUrl.call(this);t.cors&&Xf(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;xu(this.config.controls)&&(this.config.controls=this.config.controls.call(this,i)),this.config.controls||(this.config.controls=[]),ju(this.config.controls)||Cu(this.config.controls)?n=this.config.controls:(n=id.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:ad.getLabel.call(this)}),r=!1);var o,a;if(r&&Cu(this.config.controls)&&(o=n,Object.entries(i).forEach((function(e){var t=Ha(e,2),n=t[0],i=t[1];o=Bf(o,"{".concat(n,"}"),i)})),n=o),Cu(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),ju(a)||(a=this.elements.container),a[ju(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),ju(this.elements.controls)||id.findElements.call(this),!Uu(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return rf(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];nf(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){Ou(e)||Iu(e)?Array.from(e).filter(Boolean).forEach(s):s(e)}))}if(qu.isEdge&&Fu(a),this.config.tooltips.controls){var l=this.config,c=l.classNames,u=l.selectors,f="".concat(u.controls.wrapper," ").concat(u.labels," .").concat(c.hidden),d=af.call(this,f);Array.from(d).forEach((function(t){nf(t,e.config.classNames.hidden,!1),nf(t,e.config.classNames.tooltip,!0)}))}}};function rd(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=e;if(t){var i=document.createElement("a");i.href=n,n=i.href}try{return new URL(n)}catch(e){return null}}function od(e){var t=new URLSearchParams;return Eu(e)&&Object.entries(e).forEach((function(e){var n=Ha(e,2),i=n[0],r=n[1];t.set(i,r)})),t}var ad={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!ff.textTracks)Ou(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&id.setCaptionsMenu.call(this);else{if(ju(this.elements.captions)||(this.elements.captions=Gu("div",ef(this.config.selectors.captions)),function(e,t){ju(e)&&ju(t)&&t.parentNode.insertBefore(e,t.nextSibling)}(this.elements.captions,this.elements.wrapper)),qu.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),n=rd(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&Gf(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){Qu(e)}))}))}var t=Cf((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=Ha(t,1)[0];var i=this.storage.get("captions");if(Pu(i)||(i=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:i,language:n,languages:t}),this.isHTML5){var r=this.config.captions.update?"addtrack removetrack":"removetrack";pf.call(this,this.media.textTracks,r,ad.update.bind(this))}setTimeout(ad.update.bind(this),0)}},update:function(){var e=this,t=ad.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}),"showing"===t.mode&&(t.mode="hidden"),pf.call(e,t,"cuechange",(function(){return ad.updateCues.call(e)}))})),(s&&this.language!==r||!t.includes(a))&&(ad.setLanguage.call(this,r),ad.toggle.call(this,i&&s)),nf(this.elements.container,this.config.classNames.captions.enabled,!Uu(t)),Ou(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&id.setCaptionsMenu.call(this)},toggle:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var i=this.captions.toggled,r=this.config.classNames.captions.active,o=Su(e)?!i:e;if(o!==i){if(n||(this.captions.active=o,this.storage.set({captions:o})),!this.language&&o&&!n){var a=ad.getTracks.call(this),s=ad.findTrack.call(this,[this.captions.language].concat(Ba(this.captions.languages)),!0);return this.captions.language=s.language,void ad.set.call(this,a.indexOf(s))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=o),nf(this.elements.container,r,o),this.captions.toggled=o,id.updateSetting.call(this,"captions"),vf.call(this,this.media,o?"captionsenabled":"captionsdisabled")}setTimeout((function(){o&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=ad.getTracks.call(this);if(-1!==e)if(Au(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var i=n[e],r=i||{},o=r.language;this.captions.currentTrackNode=i,id.updateSetting.call(this,"captions"),t||(this.captions.language=o,this.storage.set({language:o})),this.isVimeo&&this.embed.enableTextTrack(o),vf.call(this,this.media,"languagechange")}ad.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&ad.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else ad.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(Cu(e)){var n=e.toLowerCase();this.captions.language=n;var i=ad.getTracks.call(this),r=ad.findTrack.call(this,[n]);ad.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],n=Array.from((this.media||{}).textTracks||[]);return n.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=ad.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 ad.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!Ru(t)&&ff.textTracks&&this.captions.toggled&&(t=ad.getCurrentTrack.call(this)),Ru(t)?Uu(t.label)?Uu(t.language)?$f("enabled",this.config):e.language.toUpperCase():t.label:$f("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(ju(this.elements.captions))if(Su(e)||Array.isArray(e)){var t=e;if(!t){var n=ad.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(Wf)}var i=t.map((function(e){return e.trim()})).join("\n");if(i!==this.elements.captions.innerHTML){Ju(this.elements.captions);var r=Gu("span",ef(this.config.selectors.caption));r.innerHTML=i,this.elements.captions.appendChild(r),vf.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},sd={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.4/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},ld="picture-in-picture",cd="inline",ud={html5:"html5",youtube:"youtube",vimeo:"vimeo"},fd="audio",dd="video";var hd=function(){},pd=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];Ra(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return _a(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):hd}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):hd}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):hd}}]),e}(),md=function(){function e(t){var n=this;Ra(this,e),Ua(this,"onChange",(function(){if(n.enabled){var e=n.player.elements.buttons.fullscreen;ju(e)&&(e.pressed=n.active);var t=n.target===n.player.media?n.target:n.player.elements.container;vf.call(n.player,t,n.active?"enterfullscreen":"exitfullscreen",!0)}})),Ua(this,"toggleFallback",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e?n.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(n.scrollPosition.x,n.scrollPosition.y),document.body.style.overflow=e?"hidden":"",nf(n.target,n.player.config.classNames.fullscreen.fallback,e),qu.isIos){var t=document.head.querySelector('meta[name="viewport"]'),i="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var r=Cu(t.content)&&t.content.includes(i);e?(n.cleanupViewport=!r,r||(t.content+=",".concat(i))):n.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==i})).join(","))}n.onChange()})),Ua(this,"trapFocus",(function(e){if(!qu.isIos&&n.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,i=af.call(n.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),r=Ha(i,1)[0],o=i[i.length-1];t!==o||e.shiftKey?t===r&&e.shiftKey&&(o.focus(),e.preventDefault()):(r.focus(),e.preventDefault())}})),Ua(this,"update",(function(){var t;n.enabled?(t=n.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",n.player.debug.log("".concat(t," fullscreen enabled"))):n.player.debug.log("Fullscreen not supported and fallback disabled");nf(n.player.elements.container,n.player.config.classNames.fullscreen.enabled,n.enabled)})),Ua(this,"enter",(function(){n.enabled&&(qu.isIos&&n.player.config.fullscreen.iosNative?n.player.isVimeo?n.player.embed.requestFullscreen():n.target.webkitEnterFullscreen():!e.native||n.forceFallback?n.toggleFallback(!0):n.prefix?Uu(n.prefix)||n.target["".concat(n.prefix,"Request").concat(n.property)]():n.target.requestFullscreen({navigationUI:"hide"}))})),Ua(this,"exit",(function(){if(n.enabled)if(qu.isIos&&n.player.config.fullscreen.iosNative)n.target.webkitExitFullscreen(),wf(n.player.play());else if(!e.native||n.forceFallback)n.toggleFallback(!1);else if(n.prefix){if(!Uu(n.prefix)){var t="moz"===n.prefix?"Cancel":"Exit";document["".concat(n.prefix).concat(t).concat(n.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)})),Ua(this,"toggle",(function(){n.active?n.exit():n.enter()})),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&function(e,t){return(Element.prototype.closest||function(){var e=this;do{if(of.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}(this.player.elements.container,t.config.fullscreen.container),pf.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){n.onChange()})),pf.call(this.player,this.player.elements.container,"dblclick",(function(e){ju(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.player.listeners.proxy(e,n.toggle,"fullscreen")})),pf.call(this,this.player.elements.container,"keydown",(function(e){return n.trapFocus(e)})),this.update()}return _a(e,[{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return rf(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return qu.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(xu(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!xu(document["".concat(t,"ExitFullscreen")])&&!xu(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),gd=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function vd(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})}))}je({target:"Math",stat:!0},{sign:gd});var yd={addStyleHook:function(){nf(this.elements.container,this.config.selectors.container.replace(".",""),!0),nf(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 yd.toggleNativeControls.call(this,!0);ju(this.elements.controls)||(id.inject.call(this),this.listeners.controls()),yd.toggleNativeControls.call(this),this.isHTML5&&ad.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,id.updateVolume.call(this),id.timeUpdate.call(this),yd.checkPlaying.call(this),nf(this.elements.container,this.config.classNames.pip.supported,ff.pip&&this.isHTML5&&this.isVideo),nf(this.elements.container,this.config.classNames.airplay.supported,ff.airplay&&this.isHTML5),nf(this.elements.container,this.config.classNames.isIos,qu.isIos),nf(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){vf.call(e,e.media,"ready")}),0),yd.setTitle.call(this),this.poster&&yd.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&id.durationUpdate.call(this)},setTitle:function(){var e=$f("play",this.config);if(Cu(this.config.title)&&!Uu(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=sf.call(this,"iframe");if(!ju(t))return;var n=Uu(this.config.title)?"video":this.config.title,i=$f("frameTitle",this.config);t.setAttribute("title",i.replace("{title}",n))}},togglePoster:function(e){nf(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),bf.call(this).then((function(){return vd(e)})).catch((function(n){throw e===t.poster&&yd.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:""}),yd.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;nf(this.elements.container,this.config.classNames.playing,this.playing),nf(this.elements.container,this.config.classNames.paused,this.paused),nf(this.elements.container,this.config.classNames.stopped,this.stopped),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",$f(t.playing?"pause":"play",t.config))})),Lu(e)&&"timeupdate"===e.type||yd.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(){nf(t.elements.container,t.config.classNames.loading,t.loading),yd.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}},migrateStyles:function(){var e=this;Object.values(Fa({},this.media.style)).filter((function(e){return!Uu(e)&&Cu(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),Uu(this.media.style)&&this.media.removeAttribute("style")}},bd=function(){function e(t){var n=this;Ra(this,e),Ua(this,"firstTouch",(function(){var e=n.player,t=e.elements;e.touch=!0,nf(t.container,e.config.classNames.isTouch,!0)})),Ua(this,"setTabFocus",(function(e){var t=n.player,i=t.elements;if(clearTimeout(n.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(n.lastKeyDown=e.timeStamp);var r,o=e.timeStamp-n.lastKeyDown<=20;if("focus"!==e.type||o)r=t.config.classNames.tabFocus,nf(af.call(t,".".concat(r)),r,!1),"focusout"!==e.type&&(n.focusTimer=setTimeout((function(){var e=document.activeElement;i.container.contains(e)&&nf(document.activeElement,t.config.classNames.tabFocus,!0)}),10))}})),Ua(this,"global",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=n.player;t.config.keyboard.global&&hf.call(t,window,"keydown keyup",n.handleKey,e,!1),hf.call(t,document.body,"click",n.toggleMenu,e),gf.call(t,document.body,"touchstart",n.firstTouch),hf.call(t,document.body,"keydown focus blur focusout",n.setTabFocus,e,!1,!0)})),Ua(this,"container",(function(){var e=n.player,t=e.config,i=e.elements,r=e.timers;!t.keyboard.global&&t.keyboard.focused&&pf.call(e,i.container,"keydown keyup",n.handleKey,!1),pf.call(e,i.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var n=i.controls;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);var o=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(yd.toggleControls.call(e,!0),o=e.touch?3e3:2e3),clearTimeout(r.controls),r.controls=setTimeout((function(){return yd.toggleControls.call(e,!1)}),o)}));var o=function(t){if(!t)return Ef.call(e);var n=i.container.getBoundingClientRect(),r=n.width,o=n.height;return Ef.call(e,"".concat(r,":").concat(o))},a=function(){clearTimeout(r.resized),r.resized=setTimeout(o,50)};pf.call(e,i.container,"enterfullscreen exitfullscreen",(function(t){var n=e.fullscreen,r=n.target,s=n.usingNative;if(r===i.container&&(e.isEmbed||!Uu(e.config.ratio))){var l="enterfullscreen"===t.type,c=o(l);c.padding;!function(t,n,i){if(e.isVimeo&&!e.config.vimeo.premium){var r=e.elements.wrapper.firstChild,o=Ha(t,2)[1],a=Ha(Sf.call(e),2),s=a[0],l=a[1];r.style.maxWidth=i?"".concat(o/l*s,"px"):null,r.style.margin=i?"0 auto":null}}(c.ratio,0,l),l&&setTimeout((function(){return Fu(i.container)}),100),s||(l?pf.call(e,window,"resize",a):mf.call(e,window,"resize",a))}}))})),Ua(this,"media",(function(){var e=n.player,t=e.elements;if(pf.call(e,e.media,"timeupdate seeking seeked",(function(t){return id.timeUpdate.call(e,t)})),pf.call(e,e.media,"durationchange loadeddata loadedmetadata",(function(t){return id.durationUpdate.call(e,t)})),pf.call(e,e.media,"ended",(function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())})),pf.call(e,e.media,"progress playing seeking seeked",(function(t){return id.updateProgress.call(e,t)})),pf.call(e,e.media,"volumechange",(function(t){return id.updateVolume.call(e,t)})),pf.call(e,e.media,"playing play pause ended emptied timeupdate",(function(t){return yd.checkPlaying.call(e,t)})),pf.call(e,e.media,"waiting canplay seeked playing",(function(t){return yd.checkLoading.call(e,t)})),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var i=sf.call(e,".".concat(e.config.classNames.video));if(!ju(i))return;pf.call(e,t.container,"click",(function(r){([t.container,i].includes(r.target)||i.contains(r.target))&&(e.touch&&e.config.hideControls||(e.ended?(n.proxy(r,e.restart,"restart"),n.proxy(r,(function(){wf(e.play())}),"play")):n.proxy(r,(function(){wf(e.togglePlay())}),"play")))}))}e.supported.ui&&e.config.disableContextMenu&&pf.call(e,t.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),pf.call(e,e.media,"volumechange",(function(){e.storage.set({volume:e.volume,muted:e.muted})})),pf.call(e,e.media,"ratechange",(function(){id.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})})),pf.call(e,e.media,"qualitychange",(function(t){id.updateSetting.call(e,"quality",null,t.detail.quality)})),pf.call(e,e.media,"ready qualitychange",(function(){id.setDownloadUrl.call(e)}));var r=e.config.events.concat(["keyup","keydown"]).join(" ");pf.call(e,e.media,r,(function(n){var i=n.detail,r=void 0===i?{}:i;"error"===n.type&&(r=e.media.error),vf.call(e,t.container,n.type,!0,r)}))})),Ua(this,"proxy",(function(e,t,i){var r=n.player,o=r.config.listeners[i],a=!0;xu(o)&&(a=o.call(r,e)),!1!==a&&xu(t)&&t.call(r,e)})),Ua(this,"bind",(function(e,t,i,r){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=n.player,s=a.config.listeners[r],l=xu(s);pf.call(a,e,t,(function(e){return n.proxy(e,i,r)}),o&&!l)})),Ua(this,"controls",(function(){var e=n.player,t=e.elements,i=qu.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach((function(t){n.bind(t,"click",(function(){wf(e.togglePlay())}),"play")})),n.bind(t.buttons.restart,"click",e.restart,"restart"),n.bind(t.buttons.rewind,"click",(function(){e.lastSeekTime=Date.now(),e.rewind()}),"rewind"),n.bind(t.buttons.fastForward,"click",(function(){e.lastSeekTime=Date.now(),e.forward()}),"fastForward"),n.bind(t.buttons.mute,"click",(function(){e.muted=!e.muted}),"mute"),n.bind(t.buttons.captions,"click",(function(){return e.toggleCaptions()})),n.bind(t.buttons.download,"click",(function(){vf.call(e,e.media,"download")}),"download"),n.bind(t.buttons.fullscreen,"click",(function(){e.fullscreen.toggle()}),"fullscreen"),n.bind(t.buttons.pip,"click",(function(){e.pip="toggle"}),"pip"),n.bind(t.buttons.airplay,"click",e.airplay,"airplay"),n.bind(t.buttons.settings,"click",(function(t){t.stopPropagation(),t.preventDefault(),id.toggleMenu.call(e,t)}),null,!1),n.bind(t.buttons.settings,"keyup",(function(t){var n=t.which;[13,32].includes(n)&&(13!==n?(t.preventDefault(),t.stopPropagation(),id.toggleMenu.call(e,t)):id.focusFirstMenuItem.call(e,null,!0))}),null,!1),n.bind(t.settings.menu,"keydown",(function(t){27===t.which&&id.toggleMenu.call(e,t)})),n.bind(t.inputs.seek,"mousedown mousemove",(function(e){var n=t.progress.getBoundingClientRect(),i=100/n.width*(e.pageX-n.left);e.currentTarget.setAttribute("seek-value",i)})),n.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(function(t){var n=t.currentTarget,i=t.keyCode?t.keyCode:t.which,r="play-on-seeked";if(!Nu(t)||39===i||37===i){e.lastSeekTime=Date.now();var o=n.hasAttribute(r),a=["mouseup","touchend","keyup"].includes(t.type);o&&a?(n.removeAttribute(r),wf(e.play())):!a&&e.playing&&(n.setAttribute(r,""),e.pause())}})),qu.isIos){var r=af.call(e,'input[type="range"]');Array.from(r).forEach((function(e){return n.bind(e,i,(function(e){return Fu(e.target)}))}))}n.bind(t.inputs.seek,i,(function(t){var n=t.currentTarget,i=n.getAttribute("seek-value");Uu(i)&&(i=n.value),n.removeAttribute("seek-value"),e.currentTime=i/n.max*e.duration}),"seek"),n.bind(t.progress,"mouseenter mouseleave mousemove",(function(t){return id.updateSeekTooltip.call(e,t)})),n.bind(t.progress,"mousemove touchmove",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startMove(t)})),n.bind(t.progress,"mouseleave touchend click",(function(){var t=e.previewThumbnails;t&&t.loaded&&t.endMove(!1,!0)})),n.bind(t.progress,"mousedown touchstart",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startScrubbing(t)})),n.bind(t.progress,"mouseup touchend",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.endScrubbing(t)})),qu.isWebkit&&Array.from(af.call(e,'input[type="range"]')).forEach((function(t){n.bind(t,"input",(function(t){return id.updateRangeFill.call(e,t.target)}))})),e.config.toggleInvert&&!ju(t.display.duration)&&n.bind(t.display.currentTime,"click",(function(){0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,id.timeUpdate.call(e))})),n.bind(t.inputs.volume,i,(function(t){e.volume=t.target.value}),"volume"),n.bind(t.controls,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type})),t.fullscreen&&Array.from(t.fullscreen.children).filter((function(e){return!e.contains(t.container)})).forEach((function(i){n.bind(i,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type}))})),n.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",(function(e){t.controls.pressed=["mousedown","touchstart"].includes(e.type)})),n.bind(t.controls,"focusin",(function(){var i=e.config,r=e.timers;nf(t.controls,i.classNames.noTransition,!0),yd.toggleControls.call(e,!0),setTimeout((function(){nf(t.controls,i.classNames.noTransition,!1)}),0);var o=n.touch?3e3:4e3;clearTimeout(r.controls),r.controls=setTimeout((function(){return yd.toggleControls.call(e,!1)}),o)})),n.bind(t.inputs.volume,"wheel",(function(t){var n=t.webkitDirectionInvertedFromDevice,i=Ha([t.deltaX,-t.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);e.increaseVolume(a/50);var s=e.media.volume;(1===a&&s<1||-1===a&&s>0)&&t.preventDefault()}),"volume",!1)})),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 _a(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)&&Au(i)){if(r){var a=document.activeElement;if(ju(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&of(a,s))return;if(32===e.which&&of(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||wf(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}27===i&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=i}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){id.toggleMenu.call(this.player,e)}}]),e}(),wd=Jn("splice"),kd=Zt("splice",{ACCESSORS:!0,0:0,1:2}),Td=Math.max,Sd=Math.min,Ed=9007199254740991,Ad="Maximum allowed length exceeded";je({target:"Array",proto:!0,forced:!wd||!kd},{splice:function(e,t){var n,i,r,o,a,s,l=Me(this),c=ce(l.length),u=de(e,c),f=arguments.length;if(0===f?n=i=0:1===f?(n=0,i=c-u):(n=f-2,i=Sd(Td(se(t),0),c-u)),c+n-i>Ed)throw TypeError(Ad);for(r=st(l,i),o=0;o<i;o++)(a=u+o)in l&&Wn(r,o,l[a]);if(r.length=i,n<i){for(o=u;o<c-i;o++)s=o+n,(a=o+i)in l?l[s]=l[a]:delete l[s];for(o=c;o>c-i+n;o--)delete l[o-1]}else if(n>i)for(o=c-i;o>u;o--)s=o+n-1,(a=o+i-1)in l?l[s]=l[a]:delete l[s];for(o=0;o<n;o++)l[o+u]=arguments[o+2];return l.length=c-i+n,r}});var Cd=t((function(e,t){e.exports=function(){var e=function(){},t={},n={},i={};function r(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)}function o(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 a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function s(t,n,i,r){var o,a,l=document,c=i.async,u=(i.numRetries||0)+1,f=i.before||e,d=t.replace(/[\?|#].*$/,""),h=t.replace(/^(css|img)!/,"");r=r||0,/(^css!|\.css$)/.test(d)?((a=l.createElement("link")).rel="stylesheet",a.href=h,(o="hideFocus"in a)&&a.relList&&(o=0,a.rel="preload",a.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(d)?(a=l.createElement("img")).src=h:((a=l.createElement("script")).src=t,a.async=void 0===c||c),a.onload=a.onerror=a.onbeforeload=function(e){var l=e.type[0];if(o)try{a.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l){if((r+=1)<u)return s(t,n,i,r)}else if("preload"==a.rel&&"style"==a.as)return a.rel="stylesheet";n(t,l,e.defaultPrevented)},!1!==f(t,a)&&l.head.appendChild(a)}function l(e,t,n){var i,r,o=(e=e.push?e:[e]).length,a=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<a;r++)s(e[r],i,n)}function c(e,n,i){var r,s;if(n&&n.trim&&(r=n),s=(r?i:n)||{},r){if(r in t)throw"LoadJS";t[r]=!0}function c(t,n){l(e,(function(e){a(s,e),t&&a({success:t,error:n},e),o(r,e)}),s)}if(s.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return r(e,(function(e){a(t,e)})),c},c.done=function(e){o(e,[])},c.reset=function(){t={},n={},i={}},c.isDefined=function(e){return e in t},c}()}));function Pd(e){return new Promise((function(t,n){Cd(e,{success:t,error:n})}))}function xd(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,vf.call(this,this.media,e?"play":"pause"))}var Od={setup:function(){var e=this;nf(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,Ef.call(e),Eu(window.Vimeo)?Od.ready.call(e):Pd(e.config.urls.vimeo.sdk).then((function(){Od.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,n=t.config.vimeo,i=n.premium,r=n.referrerPolicy,o=qa(n,["premium","referrerPolicy"]);i&&Object.assign(o,{controls:!1,sidedock:!1});var a=od(Fa({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},o)),s=t.media.getAttribute("src");Uu(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var l,c=Uu(l=s)?null:Au(Number(l))?l:l.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:l,u=Gu("iframe"),f=Hf(t.config.urls.vimeo.iframe,c,a);if(u.setAttribute("src",f),u.setAttribute("allowfullscreen",""),u.setAttribute("allow",["autoplay","fullscreen","picture-in-picture"].join("; ")),Uu(r)||u.setAttribute("referrerPolicy",r),i||!n.customControls)u.setAttribute("data-poster",t.poster),t.media=Zu(u,t.media);else{var d=Gu("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});d.appendChild(u),t.media=Zu(d,t.media)}n.customControls||Gf(Hf(t.config.urls.vimeo.api,f)).then((function(e){!Uu(e)&&e.thumbnail_url&&yd.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(u,{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 xd.call(t,!0),t.embed.play()},t.media.pause=function(){return xd.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var h=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return h},set:function(e){var n=t.embed,i=t.media,r=t.paused,o=t.volume,a=r&&!n.hasPlayed;i.seeking=!0,vf.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 p=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return p},set:function(e){t.embed.setPlaybackRate(e).then((function(){p=e,vf.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});var m=t.config.volume;Object.defineProperty(t.media,"volume",{get:function(){return m},set:function(e){t.embed.setVolume(e).then((function(){m=e,vf.call(t,t.media,"volumechange")}))}});var g=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return g},set:function(e){var n=!!Pu(e)&&e;t.embed.setVolume(n?0:t.config.volume).then((function(){g=n,vf.call(t,t.media,"volumechange")}))}});var v,y=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return y},set:function(e){var n=Pu(e)?e:t.config.loop.active;t.embed.setLoop(n).then((function(){y=n}))}}),t.embed.getVideoUrl().then((function(e){v=e,id.setDownloadUrl.call(t)})).catch((function(t){e.debug.warn(t)})),Object.defineProperty(t.media,"currentSrc",{get:function(){return v}}),Object.defineProperty(t.media,"ended",{get:function(){return t.currentTime===t.duration}}),Promise.all([t.embed.getVideoWidth(),t.embed.getVideoHeight()]).then((function(n){var i=Ha(n,2),r=i[0],o=i[1];t.embed.ratio=[r,o],Ef.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(n){t.config.title=n,yd.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){h=e,vf.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,vf.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,ad.setup.call(t)})),t.embed.on("cuechange",(function(e){var n=e.cues,i=(void 0===n?[]:n).map((function(e){return function(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}(e.text)}));ad.updateCues.call(t,i)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){xd.call(t,!e),e||vf.call(t,t.media,"playing")})),ju(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){vf.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){vf.call(t,t.media,"playing")})),t.embed.on("play",(function(){xd.call(t,!0),vf.call(t,t.media,"playing")})),t.embed.on("pause",(function(){xd.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,h=e.seconds,vf.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,vf.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&vf.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,vf.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,vf.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,vf.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,vf.call(t,t.media,"error")})),n.customControls&&setTimeout((function(){return yd.build.call(t)}),0)}};function Id(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,vf.call(this,this.media,e?"play":"pause"))}function jd(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var Ld={setup:function(){var e=this;if(nf(this.elements.wrapper,this.config.classNames.embed,!0),Eu(window.YT)&&xu(window.YT.Player))Ld.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){xu(t)&&t(),Ld.ready.call(e)},Pd(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;Gf(Hf(this.config.urls.youtube.api,e)).then((function(e){if(Eu(e)){var n=e.title,i=e.height,r=e.width;t.config.title=n,yd.setTitle.call(t),t.embed.ratio=[r,i]}Ef.call(t)})).catch((function(){Ef.call(t)}))},ready:function(){var e=this,t=e.config.youtube,n=e.media&&e.media.getAttribute("id");if(Uu(n)||!n.startsWith("youtube-")){var i=e.media.getAttribute("src");Uu(i)&&(i=e.media.getAttribute(this.config.attributes.embed.id));var r,o,a=Uu(r=i)?null:r.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:r,s=Gu("div",{id:(o=e.provider,"".concat(o,"-").concat(Math.floor(1e4*Math.random()))),"data-poster":t.customControls?e.poster:void 0});if(e.media=Zu(s,e.media),t.customControls){var l=function(e){return"https://i.ytimg.com/vi/".concat(a,"/").concat(e,"default.jpg")};vd(l("maxres"),121).catch((function(){return vd(l("sd"),121)})).catch((function(){return vd(l("hq"))})).then((function(t){return yd.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(e.media,{videoId:a,host:jd(t),playerVars:Ku({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),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},vf.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),vf.call(e,e.media,"ratechange")},onReady:function(n){if(!xu(e.media.play)){var i=n.target;Ld.getTitle.call(e,a),e.media.play=function(){Id.call(e,!0),i.playVideo()},e.media.pause=function(){Id.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,vf.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 r=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return r},set:function(t){r=t,i.setVolume(100*r),vf.call(e,e.media,"volumechange")}});var o=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return o},set:function(t){var n=Pu(t)?t:o;o=n,i[n?"mute":"unMute"](),i.setVolume(100*r),vf.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}});var s=i.getAvailablePlaybackRates();e.options.speed=s.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),vf.call(e,e.media,"timeupdate"),vf.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)&&vf.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),vf.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return yd.build.call(e)}),50)}},onStateChange:function(n){var i=n.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(n.data)&&(e.media.seeking=!1,vf.call(e,e.media,"seeked")),n.data){case-1:vf.call(e,e.media,"timeupdate"),e.media.buffered=i.getVideoLoadedFraction(),vf.call(e,e.media,"progress");break;case 0:Id.call(e,!1),e.media.loop?(i.stopVideo(),i.playVideo()):vf.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(Id.call(e,!0),vf.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){vf.call(e,e.media,"timeupdate")}),50),e.media.duration!==i.getDuration()&&(e.media.duration=i.getDuration(),vf.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),Id.call(e,!1);break;case 3:vf.call(e,e.media,"waiting")}vf.call(e,e.elements.container,"statechange",!1,{code:n.data})}}})}}},Nd={setup:function(){this.media?(nf(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),nf(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&nf(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=Gu("div",{class:this.config.classNames.video}),$u(this.media,this.elements.wrapper),this.elements.poster=Gu("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?Af.setup.call(this):this.isYouTube?Ld.setup.call(this):this.isVimeo&&Od.setup.call(this)):this.debug.warn("No media element found!")}},Rd=function(){function e(t){var n=this;Ra(this,e),Ua(this,"load",(function(){n.enabled&&(Eu(window.google)&&Eu(window.google.ima)?n.ready():Pd(n.player.config.urls.googleIMA.sdk).then((function(){n.ready()})).catch((function(){n.trigger("error",new Error("Google IMA SDK failed to load"))})))})),Ua(this,"ready",(function(){var e;n.enabled||((e=n).manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()),n.startSafetyTimer(12e3,"ready()"),n.managerPromise.then((function(){n.clearSafetyTimer("onAdsManagerLoaded()")})),n.listeners(),n.setupIMA()})),Ua(this,"setupIMA",(function(){n.elements.container=Gu("div",{class:n.player.config.classNames.ads}),n.player.elements.container.appendChild(n.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(n.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(n.player.config.playsinline),n.elements.displayContainer=new google.ima.AdDisplayContainer(n.elements.container,n.player.media),n.loader=new google.ima.AdsLoader(n.elements.displayContainer),n.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(function(e){return n.onAdsManagerLoaded(e)}),!1),n.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return n.onAdError(e)}),!1),n.requestAds()})),Ua(this,"requestAds",(function(){var e=n.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=n.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!n.player.muted),n.loader.requestAds(t)}catch(e){n.onAdError(e)}})),Ua(this,"pollCountdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!e)return clearInterval(n.countdownTimer),void n.elements.container.removeAttribute("data-badge-text");var t=function(){var e=nd(Math.max(n.manager.getRemainingTime(),0)),t="".concat($f("advertisement",n.player.config)," - ").concat(e);n.elements.container.setAttribute("data-badge-text",t)};n.countdownTimer=setInterval(t,100)})),Ua(this,"onAdsManagerLoaded",(function(e){if(n.enabled){var t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,n.manager=e.getAdsManager(n.player,t),n.cuePoints=n.manager.getCuePoints(),n.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return n.onAdError(e)})),Object.keys(google.ima.AdEvent.Type).forEach((function(e){n.manager.addEventListener(google.ima.AdEvent.Type[e],(function(e){return n.onAdEvent(e)}))})),n.trigger("loaded")}})),Ua(this,"addCuePoints",(function(){Uu(n.cuePoints)||n.cuePoints.forEach((function(e){if(0!==e&&-1!==e&&e<n.player.duration){var t=n.player.elements.progress;if(ju(t)){var i=100/n.player.duration*e,r=Gu("span",{class:n.player.config.classNames.cues});r.style.left="".concat(i.toString(),"%"),t.appendChild(r)}}}))})),Ua(this,"onAdEvent",(function(e){var t=n.player.elements.container,i=e.getAd(),r=e.getAdData();switch(function(e){vf.call(n.player,n.player.media,"ads".concat(e.replace(/_/g,"").toLowerCase()))}(e.type),e.type){case google.ima.AdEvent.Type.LOADED:n.trigger("loaded"),n.pollCountdown(!0),i.isLinear()||(i.width=t.offsetWidth,i.height=t.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:n.manager.setVolume(n.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:n.player.ended?n.loadAds():n.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:n.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:n.pollCountdown(),n.resumeContent();break;case google.ima.AdEvent.Type.LOG:r.adError&&n.player.debug.warn("Non-fatal ad error: ".concat(r.adError.getMessage()))}})),Ua(this,"onAdError",(function(e){n.cancel(),n.player.debug.warn("Ads error",e)})),Ua(this,"listeners",(function(){var e,t=n.player.elements.container;n.player.on("canplay",(function(){n.addCuePoints()})),n.player.on("ended",(function(){n.loader.contentComplete()})),n.player.on("timeupdate",(function(){e=n.player.currentTime})),n.player.on("seeked",(function(){var t=n.player.currentTime;Uu(n.cuePoints)||n.cuePoints.forEach((function(i,r){e<i&&i<t&&(n.manager.discardAdBreak(),n.cuePoints.splice(r,1))}))})),window.addEventListener("resize",(function(){n.manager&&n.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)}))})),Ua(this,"play",(function(){var e=n.player.elements.container;n.managerPromise||n.resumeContent(),n.managerPromise.then((function(){n.manager.setVolume(n.player.volume),n.elements.displayContainer.initialize();try{n.initialized||(n.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),n.manager.start()),n.initialized=!0}catch(e){n.onAdError(e)}})).catch((function(){}))})),Ua(this,"resumeContent",(function(){n.elements.container.style.zIndex="",n.playing=!1,wf(n.player.media.play())})),Ua(this,"pauseContent",(function(){n.elements.container.style.zIndex=3,n.playing=!0,n.player.media.pause()})),Ua(this,"cancel",(function(){n.initialized&&n.resumeContent(),n.trigger("error"),n.loadAds()})),Ua(this,"loadAds",(function(){n.managerPromise.then((function(){n.manager&&n.manager.destroy(),n.managerPromise=new Promise((function(e){n.on("loaded",e),n.player.debug.log(n.manager)})),n.initialized=!1,n.requestAds()})).catch((function(){}))})),Ua(this,"trigger",(function(e){for(var t=arguments.length,i=new Array(t>1?t-1:0),r=1;r<t;r++)i[r-1]=arguments[r];var o=n.events[e];Ou(o)&&o.forEach((function(e){xu(e)&&e.apply(n,i)}))})),Ua(this,"on",(function(e,t){return Ou(n.events[e])||(n.events[e]=[]),n.events[e].push(t),n})),Ua(this,"startSafetyTimer",(function(e,t){n.player.debug.log("Safety timer invoked from: ".concat(t)),n.safetyTimer=setTimeout((function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")}),e)})),Ua(this,"clearSafetyTimer",(function(e){Su(n.safetyTimer)||(n.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(n.safetyTimer),n.safetyTimer=null)})),this.player=t,this.config=t.config.ads,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 _a(e,[{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!Uu(e.publisherId)||_u(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(_u(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(od(t))}}]),e}(),Md=ut.findIndex,_d="findIndex",Ud=!0,Dd=Zt(_d);_d in[]&&Array(1).findIndex((function(){Ud=!1})),je({target:"Array",proto:!0,forced:Ud||!Dd},{findIndex:function(e){return Md(this,e,arguments.length>1?arguments[1]:void 0)}}),mn(_d);var Fd=Math.min,qd=[].lastIndexOf,Hd=!!qd&&1/[1].lastIndexOf(1,-0)<0,Bd=Gt("lastIndexOf"),Vd=Zt("indexOf",{ACCESSORS:!0,1:0}),zd=Hd||!Bd||!Vd?function(e){if(Hd)return qd.apply(this,arguments)||0;var t=m(this),n=ce(t.length),i=n-1;for(arguments.length>1&&(i=Fd(i,se(arguments[1]))),i<0&&(i=n+i);i>=0;i--)if(i in t&&t[i]===e)return i||0;return-1}:qd;je({target:"Array",proto:!0,forced:zd!==[].lastIndexOf},{lastIndexOf:zd});var Wd=function(e,t){var n={};return e>t.width/t.height?(n.width=t.width,n.height=1/e*t.width):(n.height=t.height,n.width=e*t.height),n},Kd=function(){function e(t){var n=this;Ra(this,e),Ua(this,"load",(function(){n.player.elements.display.seekTooltip&&(n.player.elements.display.seekTooltip.hidden=n.enabled),n.enabled&&n.getThumbnails().then((function(){n.enabled&&(n.render(),n.determineContainerAutoSizing(),n.loaded=!0)}))})),Ua(this,"getThumbnails",(function(){return new Promise((function(e){var t=n.player.config.previewThumbnails.src;if(Uu(t))throw new Error("Missing previewThumbnails.src config attribute");var i=function(){n.thumbnails.sort((function(e,t){return e.height-t.height})),n.player.debug.log("Preview thumbnails",n.thumbnails),e()};if(xu(t))t((function(e){n.thumbnails=e,i()}));else{var r=(Cu(t)?[t]:t).map((function(e){return n.getThumbnail(e)}));Promise.all(r).then(i)}}))})),Ua(this,"getThumbnail",(function(e){return new Promise((function(t){Gf(e).then((function(i){var r,o,a={frames:(r=i,o=[],r.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var t={};e.split(/\r\n|\n|\r/).forEach((function(e){if(Au(t.startTime)){if(!Uu(e.trim())&&Uu(t.text)){var n=e.trim().split("#xywh="),i=Ha(n,1);if(t.text=i[0],n[1]){var r=Ha(n[1].split(","),4);t.x=r[0],t.y=r[1],t.w=r[2],t.h=r[3]}}}else{var o=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);o&&(t.startTime=60*Number(o[1]||0)*60+60*Number(o[2])+Number(o[3])+Number("0.".concat(o[4])),t.endTime=60*Number(o[6]||0)*60+60*Number(o[7])+Number(o[8])+Number("0.".concat(o[9])))}})),t.text&&o.push(t)})),o),height:null,urlPrefix:""};a.frames[0].text.startsWith("/")||a.frames[0].text.startsWith("http://")||a.frames[0].text.startsWith("https://")||(a.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var s=new Image;s.onload=function(){a.height=s.naturalHeight,a.width=s.naturalWidth,n.thumbnails.push(a),t()},s.src=a.urlPrefix+a.frames[0].text}))}))})),Ua(this,"startMove",(function(e){if(n.loaded&&Lu(e)&&["touchmove","mousemove"].includes(e.type)&&n.player.media.duration){if("touchmove"===e.type)n.seekTime=n.player.media.duration*(n.player.elements.inputs.seek.value/100);else{var t=n.player.elements.progress.getBoundingClientRect(),i=100/t.width*(e.pageX-t.left);n.seekTime=n.player.media.duration*(i/100),n.seekTime<0&&(n.seekTime=0),n.seekTime>n.player.media.duration-1&&(n.seekTime=n.player.media.duration-1),n.mousePosX=e.pageX,n.elements.thumb.time.innerText=nd(n.seekTime)}n.showImageAtCurrentTime()}})),Ua(this,"endMove",(function(){n.toggleThumbContainer(!1,!0)})),Ua(this,"startScrubbing",(function(e){(Su(e.button)||!1===e.button||0===e.button)&&(n.mouseDown=!0,n.player.media.duration&&(n.toggleScrubbingContainer(!0),n.toggleThumbContainer(!1,!0),n.showImageAtCurrentTime()))})),Ua(this,"endScrubbing",(function(){n.mouseDown=!1,Math.ceil(n.lastTime)===Math.ceil(n.player.media.currentTime)?n.toggleScrubbingContainer(!1):gf.call(n.player,n.player.media,"timeupdate",(function(){n.mouseDown||n.toggleScrubbingContainer(!1)}))})),Ua(this,"listeners",(function(){n.player.on("play",(function(){n.toggleThumbContainer(!1,!0)})),n.player.on("seeked",(function(){n.toggleThumbContainer(!1)})),n.player.on("timeupdate",(function(){n.lastTime=n.player.media.currentTime}))})),Ua(this,"render",(function(){n.elements.thumb.container=Gu("div",{class:n.player.config.classNames.previewThumbnails.thumbContainer}),n.elements.thumb.imageContainer=Gu("div",{class:n.player.config.classNames.previewThumbnails.imageContainer}),n.elements.thumb.container.appendChild(n.elements.thumb.imageContainer);var e=Gu("div",{class:n.player.config.classNames.previewThumbnails.timeContainer});n.elements.thumb.time=Gu("span",{},"00:00"),e.appendChild(n.elements.thumb.time),n.elements.thumb.container.appendChild(e),ju(n.player.elements.progress)&&n.player.elements.progress.appendChild(n.elements.thumb.container),n.elements.scrubbing.container=Gu("div",{class:n.player.config.classNames.previewThumbnails.scrubbingContainer}),n.player.elements.wrapper.appendChild(n.elements.scrubbing.container)})),Ua(this,"destroy",(function(){n.elements.thumb.container&&n.elements.thumb.container.remove(),n.elements.scrubbing.container&&n.elements.scrubbing.container.remove()})),Ua(this,"showImageAtCurrentTime",(function(){n.mouseDown?n.setScrubbingContainerSize():n.setThumbContainerSizeAndPos();var e=n.thumbnails[0].frames.findIndex((function(e){return n.seekTime>=e.startTime&&n.seekTime<=e.endTime})),t=e>=0,i=0;n.mouseDown||n.toggleThumbContainer(t),t&&(n.thumbnails.forEach((function(t,r){n.loadedImages.includes(t.frames[e].text)&&(i=r)})),e!==n.showingThumb&&(n.showingThumb=e,n.loadImage(i)))})),Ua(this,"loadImage",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=n.showingThumb,i=n.thumbnails[e],r=i.urlPrefix,o=i.frames[t],a=i.frames[t].text,s=r+a;if(n.currentImageElement&&n.currentImageElement.dataset.filename===a)n.showImage(n.currentImageElement,o,e,t,a,!1),n.currentImageElement.dataset.index=t,n.removeOldImages(n.currentImageElement);else{n.loadingImage&&n.usingSprites&&(n.loadingImage.onload=null);var l=new Image;l.src=s,l.dataset.index=t,l.dataset.filename=a,n.showingThumbFilename=a,n.player.debug.log("Loading image: ".concat(s)),l.onload=function(){return n.showImage(l,o,e,t,a,!0)},n.loadingImage=l,n.removeOldImages(l)}})),Ua(this,"showImage",(function(e,t,i,r,o){var a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];n.player.debug.log("Showing thumb: ".concat(o,". num: ").concat(r,". qual: ").concat(i,". newimg: ").concat(a)),n.setImageSizeAndOffset(e,t),a&&(n.currentImageContainer.appendChild(e),n.currentImageElement=e,n.loadedImages.includes(o)||n.loadedImages.push(o)),n.preloadNearby(r,!0).then(n.preloadNearby(r,!1)).then(n.getHigherQuality(i,e,t,o))})),Ua(this,"removeOldImages",(function(e){Array.from(n.currentImageContainer.children).forEach((function(t){if("img"===t.tagName.toLowerCase()){var i=n.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;var r=n.currentImageContainer;setTimeout((function(){r.removeChild(t),n.player.debug.log("Removing thumb: ".concat(t.dataset.filename))}),i)}}}))})),Ua(this,"preloadNearby",(function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(i){setTimeout((function(){var r=n.thumbnails[0].frames[e].text;if(n.showingThumbFilename===r){var o;o=t?n.thumbnails[0].frames.slice(e):n.thumbnails[0].frames.slice(0,e).reverse();var a=!1;o.forEach((function(e){var t=e.text;if(t!==r&&!n.loadedImages.includes(t)){a=!0,n.player.debug.log("Preloading thumb filename: ".concat(t));var o=n.thumbnails[0].urlPrefix+t,s=new Image;s.src=o,s.onload=function(){n.player.debug.log("Preloaded thumb filename: ".concat(t)),n.loadedImages.includes(t)||n.loadedImages.push(t),i()}}})),a||i()}}),300)}))})),Ua(this,"getHigherQuality",(function(e,t,i,r){if(e<n.thumbnails.length-1){var o=t.naturalHeight;n.usingSprites&&(o=i.h),o<n.thumbContainerHeight&&setTimeout((function(){n.showingThumbFilename===r&&(n.player.debug.log("Showing higher quality thumb for: ".concat(r)),n.loadImage(e+1))}),300)}})),Ua(this,"toggleThumbContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=n.player.config.classNames.previewThumbnails.thumbContainerShown;n.elements.thumb.container.classList.toggle(i,e),!e&&t&&(n.showingThumb=null,n.showingThumbFilename=null)})),Ua(this,"toggleScrubbingContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=n.player.config.classNames.previewThumbnails.scrubbingContainerShown;n.elements.scrubbing.container.classList.toggle(t,e),e||(n.showingThumb=null,n.showingThumbFilename=null)})),Ua(this,"determineContainerAutoSizing",(function(){(n.elements.thumb.imageContainer.clientHeight>20||n.elements.thumb.imageContainer.clientWidth>20)&&(n.sizeSpecifiedInCSS=!0)})),Ua(this,"setThumbContainerSizeAndPos",(function(){if(n.sizeSpecifiedInCSS){if(n.elements.thumb.imageContainer.clientHeight>20&&n.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(n.elements.thumb.imageContainer.clientHeight*n.thumbAspectRatio);n.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(n.elements.thumb.imageContainer.clientHeight<20&&n.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(n.elements.thumb.imageContainer.clientWidth/n.thumbAspectRatio);n.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var i=Math.floor(n.thumbContainerHeight*n.thumbAspectRatio);n.elements.thumb.imageContainer.style.height="".concat(n.thumbContainerHeight,"px"),n.elements.thumb.imageContainer.style.width="".concat(i,"px")}n.setThumbContainerPos()})),Ua(this,"setThumbContainerPos",(function(){var e=n.player.elements.progress.getBoundingClientRect(),t=n.player.elements.container.getBoundingClientRect(),i=n.elements.thumb.container,r=t.left-e.left+10,o=t.right-e.left-i.clientWidth-10,a=n.mousePosX-e.left-i.clientWidth/2;a<r&&(a=r),a>o&&(a=o),i.style.left="".concat(a,"px")})),Ua(this,"setScrubbingContainerSize",(function(){var e=Wd(n.thumbAspectRatio,{width:n.player.media.clientWidth,height:n.player.media.clientHeight}),t=e.width,i=e.height;n.elements.scrubbing.container.style.width="".concat(t,"px"),n.elements.scrubbing.container.style.height="".concat(i,"px")})),Ua(this,"setImageSizeAndOffset",(function(e,t){if(n.usingSprites){var i=n.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*i,"px"),e.style.width="".concat(e.naturalWidth*i,"px"),e.style.left="-".concat(t.x*i,"px"),e.style.top="-".concat(t.y*i,"px")}})),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return _a(e,[{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?Wd(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),$d={insertElements:function(e,t){var n=this;Cu(t)?Xu(e,this.media,{src:t}):Ou(t)&&t.forEach((function(t){Xu(e,n.media,t)}))},change:function(e){var t=this;Wu(e,"sources.length")?(Af.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],Qu(t.media),t.media=null,ju(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,i=e.type,r=Ha(n,1)[0],o=r.provider,a=void 0===o?ud.html5:o,s=r.src,l="html5"===a?i:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:i,supported:ff.check(i,a,t.config.playsinline),media:Gu(l,c)}),t.elements.container.appendChild(t.media),Pu(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),Uu(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","")),yd.addStyleHook.call(t),t.isHTML5&&$d.insertElements.call(t,"source",n),t.config.title=e.title,Nd.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&$d.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&yd.build.call(t),t.isHTML5&&t.media.load(),Uu(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new Kd(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};var Yd,Gd=function(){function e(t,n){var i=this;if(Ra(this,e),Ua(this,"play",(function(){return xu(i.media.play)?(i.ads&&i.ads.enabled&&i.ads.managerPromise.then((function(){return i.ads.play()})).catch((function(){return wf(i.media.play())})),i.media.play()):null})),Ua(this,"pause",(function(){return i.playing&&xu(i.media.pause)?i.media.pause():null})),Ua(this,"togglePlay",(function(e){return(Pu(e)?e:!i.playing)?i.play():i.pause()})),Ua(this,"stop",(function(){i.isHTML5?(i.pause(),i.restart()):xu(i.media.stop)&&i.media.stop()})),Ua(this,"restart",(function(){i.currentTime=0})),Ua(this,"rewind",(function(e){i.currentTime-=Au(e)?e:i.config.seekTime})),Ua(this,"forward",(function(e){i.currentTime+=Au(e)?e:i.config.seekTime})),Ua(this,"increaseVolume",(function(e){var t=i.media.muted?0:i.volume;i.volume=t+(Au(e)?e:0)})),Ua(this,"decreaseVolume",(function(e){i.increaseVolume(-e)})),Ua(this,"airplay",(function(){ff.airplay&&i.media.webkitShowPlaybackTargetPicker()})),Ua(this,"toggleControls",(function(e){if(i.supported.ui&&!i.isAudio){var t=rf(i.elements.container,i.config.classNames.hideControls),n=void 0===e?void 0:!e,r=nf(i.elements.container,i.config.classNames.hideControls,n);if(r&&Ou(i.config.controls)&&i.config.controls.includes("settings")&&!Uu(i.config.settings)&&id.toggleMenu.call(i,!1),r!==t){var o=r?"controlshidden":"controlsshown";vf.call(i,i.media,o)}return!r}return!1})),Ua(this,"on",(function(e,t){pf.call(i,i.elements.container,e,t)})),Ua(this,"once",(function(e,t){gf.call(i,i.elements.container,e,t)})),Ua(this,"off",(function(e,t){mf(i.elements.container,e,t)})),Ua(this,"destroy",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(i.ready){var n=function(){document.body.style.overflow="",i.embed=null,t?(Object.keys(i.elements).length&&(Qu(i.elements.buttons.play),Qu(i.elements.captions),Qu(i.elements.controls),Qu(i.elements.wrapper),i.elements.buttons.play=null,i.elements.captions=null,i.elements.controls=null,i.elements.wrapper=null),xu(e)&&e()):(yf.call(i),Af.cancelRequests.call(i),Zu(i.elements.original,i.elements.container),vf.call(i,i.elements.original,"destroyed",!0),xu(e)&&e.call(i.elements.original),i.ready=!1,setTimeout((function(){i.elements=null,i.media=null}),200))};i.stop(),clearTimeout(i.timers.loading),clearTimeout(i.timers.controls),clearTimeout(i.timers.resized),i.isHTML5?(yd.toggleNativeControls.call(i,!0),n()):i.isYouTube?(clearInterval(i.timers.buffering),clearInterval(i.timers.playing),null!==i.embed&&xu(i.embed.destroy)&&i.embed.destroy(),n()):i.isVimeo&&(null!==i.embed&&i.embed.unload().then(n),setTimeout(n,200))}})),Ua(this,"supports",(function(e){return ff.mime.call(i,e)})),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=ff.touch,this.media=t,Cu(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||Iu(this.media)||Ou(this.media))&&(this.media=this.media[0]),this.config=Ku({},sd,e.defaults,n||{},function(){try{return JSON.parse(i.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 pd(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",ff),!Su(this.media)&&ju(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(ff.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"),ju(a)){if(s=rd(a.getAttribute("src")),this.provider=function(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?ud.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?ud.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.youtube.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(Uu(this.provider)||!Object.values(ud).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=dd;break;case"video":case"audio":this.type=o,this.provider=ud.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=ff.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new bd(this),this.storage=new Yf(this),this.media.plyr=this,ju(this.elements.container)||(this.elements.container=Gu("div",{tabindex:0}),$u(this.media,this.elements.container)),yd.migrateStyles.call(this),yd.addStyleHook.call(this),Nd.setup.call(this),this.config.debug&&pf.call(this,this.elements.container,this.config.events.join(" "),(function(e){i.debug.log("event: ".concat(e.type))})),this.fullscreen=new md(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&yd.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Rd(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return wf(i.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new Kd(this))):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 _a(e,[{key:"toggleCaptions",value:function(e){ad.toggle.call(this,e,!1)}},{key:"isHTML5",get:function(){return this.provider===ud.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===ud.youtube}},{key:"isVimeo",get:function(){return this.provider===ud.vimeo}},{key:"isVideo",get:function(){return this.type===dd}},{key:"isAudio",get:function(){return this.type===fd}},{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=Au(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 Au(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=Au(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;Cu(t)&&(t=Number(t)),Au(t)||(t=this.storage.get("volume")),Au(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!Uu(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;Pu(t)||(t=this.storage.get("muted")),Pu(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=this,n=null;Au(e)&&(n=e),Au(n)||(n=this.storage.get("speed")),Au(n)||(n=this.config.speed.selected);var i=this.minimumSpeed,r=this.maximumSpeed;n=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),n)}(n,i,r),this.config.speed.selected=n,setTimeout((function(){t.media.playbackRate=n}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,Ba(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,Ba(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var i=[!Uu(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(Au),r=!0;if(!n.includes(i)){var o=function(e,t){return Ou(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(o," instead")),i=o,r=!1}t.selected=i,this.media.quality=i,r&&this.storage.set({quality:i})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=Pu(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){$d.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return _u(e)?e:this.source},set:function(e){_u(e)&&(this.config.urls.download=e,id.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?yd.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=Tf(Sf.call(this));return Ou(e)?e.join(":"):e},set:function(e){this.isVideo?Cu(e)&&kf(e)?(this.config.ratio=e,Ef.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=Pu(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){ad.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){ad.setLanguage.call(this,e,!1)},get:function(){return(ad.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(ff.pip){var t=Pu(e)?e:!this.pip;xu(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?ld:cd),xu(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return ff.pip?Uu(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===ld:null}}],[{key:"supported",value:function(e,t,n){return ff.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return Xf(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},i=null;return Cu(t)?i=Array.from(document.querySelectorAll(t)):Iu(t)?i=Array.from(t):Ou(t)&&(i=t.filter(ju)),Uu(i)?null:i.map((function(t){return new e(t,n)}))}}]),e}();return Gd.defaults=(Yd=sd,JSON.parse(JSON.stringify(Yd))),Gd}));
//# sourceMappingURL=plyr.polyfilled.min.js.map
diff --git a/dist/plyr.polyfilled.min.js.map b/dist/plyr.polyfilled.min.js.map
index 075e0c3c..3c61d82c 100644
--- a/dist/plyr.polyfilled.min.js.map
+++ b/dist/plyr.polyfilled.min.js.map
@@ -1 +1 @@
-{"version":3,"sources":["plyr.polyfilled.js","node_modules/custom-event-polyfill/polyfill.js","node_modules/core-js/internals/global.js","node_modules/core-js/internals/fails.js","node_modules/core-js/internals/descriptors.js","node_modules/core-js/internals/object-property-is-enumerable.js","node_modules/core-js/internals/create-property-descriptor.js","node_modules/core-js/internals/classof-raw.js","node_modules/core-js/internals/indexed-object.js","node_modules/core-js/internals/require-object-coercible.js","node_modules/core-js/internals/to-indexed-object.js","node_modules/core-js/internals/is-object.js","node_modules/core-js/internals/to-primitive.js","node_modules/core-js/internals/has.js","node_modules/core-js/internals/document-create-element.js","node_modules/core-js/internals/ie8-dom-define.js","node_modules/core-js/internals/object-get-own-property-descriptor.js","node_modules/core-js/internals/an-object.js","node_modules/core-js/internals/object-define-property.js","node_modules/core-js/internals/create-non-enumerable-property.js","node_modules/core-js/internals/set-global.js","node_modules/core-js/internals/shared-store.js","node_modules/core-js/internals/inspect-source.js","node_modules/core-js/internals/internal-state.js","node_modules/core-js/internals/native-weak-map.js","node_modules/core-js/internals/shared.js","node_modules/core-js/internals/uid.js","node_modules/core-js/internals/shared-key.js","node_modules/core-js/internals/hidden-keys.js","node_modules/core-js/internals/object-create.js","node_modules/core-js/internals/redefine.js","node_modules/core-js/internals/path.js","node_modules/core-js/internals/get-built-in.js","node_modules/core-js/internals/to-integer.js","node_modules/core-js/internals/to-length.js","node_modules/core-js/internals/to-absolute-index.js","node_modules/core-js/internals/array-includes.js","node_modules/core-js/internals/object-keys-internal.js","node_modules/core-js/internals/enum-bug-keys.js","node_modules/core-js/internals/object-get-own-property-names.js","node_modules/core-js/internals/object-get-own-property-symbols.js","node_modules/core-js/internals/own-keys.js","node_modules/core-js/internals/copy-constructor-properties.js","node_modules/core-js/internals/is-forced.js","node_modules/core-js/internals/export.js","node_modules/core-js/internals/native-symbol.js","node_modules/core-js/internals/use-symbol-as-uid.js","node_modules/core-js/internals/is-array.js","node_modules/core-js/internals/to-object.js","node_modules/core-js/internals/object-keys.js","node_modules/core-js/internals/object-define-properties.js","node_modules/core-js/internals/html.js","node_modules/core-js/internals/object-get-own-property-names-external.js","node_modules/core-js/internals/well-known-symbol.js","node_modules/core-js/internals/well-known-symbol-wrapped.js","node_modules/core-js/internals/define-well-known-symbol.js","node_modules/core-js/internals/set-to-string-tag.js","node_modules/core-js/internals/a-function.js","node_modules/core-js/internals/function-bind-context.js","node_modules/core-js/internals/array-species-create.js","node_modules/core-js/internals/array-iteration.js","node_modules/core-js/modules/es.symbol.js","node_modules/core-js/modules/es.symbol.description.js","node_modules/core-js/modules/es.symbol.iterator.js","node_modules/core-js/internals/array-method-is-strict.js","node_modules/core-js/internals/array-method-uses-to-length.js","node_modules/core-js/internals/array-for-each.js","node_modules/core-js/modules/es.array.for-each.js","node_modules/core-js/modules/es.array.index-of.js","node_modules/core-js/internals/add-to-unscopables.js","node_modules/core-js/internals/iterators-core.js","node_modules/core-js/internals/iterators.js","node_modules/core-js/internals/correct-prototype-getter.js","node_modules/core-js/internals/object-get-prototype-of.js","node_modules/core-js/internals/create-iterator-constructor.js","node_modules/core-js/internals/object-set-prototype-of.js","node_modules/core-js/internals/a-possible-prototype.js","node_modules/core-js/internals/define-iterator.js","node_modules/core-js/modules/es.array.iterator.js","node_modules/core-js/modules/es.array.join.js","node_modules/core-js/internals/create-property.js","node_modules/core-js/internals/engine-v8-version.js","node_modules/core-js/internals/engine-user-agent.js","node_modules/core-js/internals/array-method-has-species-support.js","node_modules/core-js/modules/es.array.slice.js","node_modules/core-js/internals/to-string-tag-support.js","node_modules/core-js/internals/classof.js","node_modules/core-js/internals/object-to-string.js","node_modules/core-js/modules/es.object.to-string.js","node_modules/core-js/internals/regexp-flags.js","node_modules/core-js/internals/regexp-sticky-helpers.js","node_modules/core-js/internals/regexp-exec.js","node_modules/core-js/modules/es.regexp.exec.js","node_modules/core-js/modules/es.regexp.to-string.js","node_modules/core-js/internals/string-multibyte.js","node_modules/core-js/modules/es.string.iterator.js","node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","node_modules/core-js/internals/advance-string-index.js","node_modules/core-js/internals/regexp-exec-abstract.js","node_modules/core-js/modules/es.string.replace.js","node_modules/core-js/internals/same-value.js","node_modules/core-js/modules/es.string.search.js","node_modules/core-js/internals/is-regexp.js","node_modules/core-js/internals/species-constructor.js","node_modules/core-js/modules/es.string.split.js","node_modules/core-js/internals/dom-iterables.js","node_modules/core-js/modules/web.dom-collections.for-each.js","node_modules/core-js/modules/web.dom-collections.iterator.js","node_modules/core-js/internals/native-url.js","node_modules/core-js/internals/an-instance.js","node_modules/core-js/internals/object-assign.js","node_modules/core-js/internals/iterator-close.js","node_modules/core-js/internals/call-with-safe-iteration-closing.js","node_modules/core-js/internals/is-array-iterator-method.js","node_modules/core-js/internals/get-iterator-method.js","node_modules/core-js/internals/array-from.js","node_modules/core-js/internals/string-punycode-to-ascii.js","node_modules/core-js/internals/redefine-all.js","node_modules/core-js/internals/get-iterator.js","node_modules/core-js/modules/web.url-search-params.js","node_modules/core-js/modules/web.url.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/es.array.concat.js","node_modules/core-js/modules/es.array.filter.js","node_modules/core-js/modules/es.array.find.js","node_modules/core-js/internals/check-correctness-of-iteration.js","node_modules/core-js/modules/es.array.from.js","node_modules/core-js/modules/es.array.includes.js","node_modules/core-js/modules/es.array.map.js","node_modules/core-js/internals/inherit-if-required.js","node_modules/core-js/internals/whitespaces.js","node_modules/core-js/internals/string-trim.js","node_modules/core-js/modules/es.number.constructor.js","node_modules/core-js/modules/es.object.keys.js","node_modules/core-js/internals/not-a-regexp.js","node_modules/core-js/internals/correct-is-regexp-logic.js","node_modules/core-js/modules/es.string.includes.js","node_modules/core-js/internals/freezing.js","node_modules/core-js/internals/internal-metadata.js","node_modules/core-js/internals/iterate.js","node_modules/core-js/internals/collection-weak.js","node_modules/core-js/modules/es.array.every.js","node_modules/core-js/modules/es.weak-map.js","node_modules/core-js/internals/collection.js","node_modules/core-js/modules/es.object.assign.js","node_modules/core-js/internals/string-trim-forced.js","node_modules/core-js/modules/es.string.trim.js","node_modules/core-js/modules/es.array.some.js","node_modules/core-js/internals/this-number-value.js","node_modules/core-js/internals/string-repeat.js","node_modules/core-js/modules/es.number.to-fixed.js","node_modules/core-js/internals/object-to-array.js","node_modules/core-js/modules/es.object.entries.js","node_modules/core-js/modules/es.object.values.js","node_modules/core-js/modules/es.number.is-nan.js","node_modules/core-js/modules/es.object.get-own-property-descriptor.js","node_modules/rangetouch/dist/rangetouch.mjs","node_modules/core-js/modules/es.object.get-own-property-descriptors.js","node_modules/core-js/modules/es.string.match.js","node_modules/core-js/internals/task.js","node_modules/core-js/internals/native-promise-constructor.js","node_modules/core-js/internals/set-species.js","node_modules/core-js/internals/engine-is-ios.js","node_modules/core-js/internals/engine-is-node.js","node_modules/core-js/internals/microtask.js","node_modules/core-js/modules/es.promise.js","node_modules/core-js/internals/new-promise-capability.js","node_modules/core-js/internals/promise-resolve.js","node_modules/core-js/internals/perform.js","node_modules/core-js/internals/host-report-errors.js","node_modules/core-js/modules/es.string.starts-with.js","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","node_modules/core-js/internals/array-reduce.js","node_modules/core-js/modules/es.array.reduce.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","node_modules/core-js/modules/es.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/load-sprite.js","node_modules/core-js/modules/es.math.trunc.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/internals/math-sign.js","src/js/utils/load-image.js","node_modules/core-js/modules/es.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es.array.splice.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","node_modules/core-js/modules/es.array.find-index.js","node_modules/core-js/internals/array-last-index-of.js","node_modules/core-js/modules/es.array.last-index-of.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js","src/js/utils/numbers.js"],"names":["navigator","global","factory","exports","module","define","amd","globalThis","self","Plyr","this","window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","document","createEvent","initCustomEvent","detail","call","Object","defineProperty","get","prototype","Event","commonjsGlobal","createCommonjsModule","fn","check","it","Math","global_1","Function","fails","exec","error","descriptors","nativePropertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor","objectPropertyIsEnumerable","f","1","V","descriptor","enumerable","createPropertyDescriptor","bitmap","value","configurable","writable","toString","classofRaw","slice","split","indexedObject","classof","requireObjectCoercible","undefined","TypeError","toIndexedObject","IndexedObject","isObject","toPrimitive","input","PREFERRED_STRING","val","valueOf","hasOwnProperty","has","key","EXISTS","createElement","documentCreateElement","ie8DomDefine","DESCRIPTORS","a","nativeGetOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","O","P","IE8_DOM_DEFINE","propertyIsEnumerableModule","anObject","String","nativeDefineProperty","objectDefineProperty","Attributes","createNonEnumerableProperty","object","definePropertyModule","setGlobal","SHARED","sharedStore","functionToString","store","inspectSource","set","WeakMap","nativeWeakMap","test","shared","push","version","mode","copyright","id","postfix","random","uid","keys","sharedKey","hiddenKeys","NATIVE_WEAK_MAP","state","wmget","wmhas","wmset","metadata","facade","STATE","objectHas","activeXDocument","internalState","enforce","getterFor","TYPE","type","redefine","getInternalState","InternalStateModule","enforceInternalState","TEMPLATE","options","unsafe","simple","noTargetGet","source","join","path","aFunction","variable","getBuiltIn","namespace","method","arguments","length","ceil","floor","toInteger","argument","isNaN","min","toLength","max","toAbsoluteIndex","index","integer","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayIncludes","includes","indexOf","require$$0","objectKeysInternal","names","i","result","enumBugKeys","concat","objectGetOwnPropertyNames","getOwnPropertyNames","internalObjectKeys","objectGetOwnPropertySymbols","getOwnPropertySymbols","ownKeys","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","copyConstructorProperties","target","getOwnPropertyDescriptorModule","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","replace","toLowerCase","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","sham","nativeSymbol","Symbol","useSymbolAsUid","NATIVE_SYMBOL","iterator","isArray","Array","arg","toObject","objectKeys","objectDefineProperties","defineProperties","Properties","html","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObject","domain","ActiveXObject","iframeDocument","iframe","write","close","temp","parentWindow","NullProtoObjectViaActiveX","style","display","appendChild","src","contentWindow","open","F","objectCreate","create","nativeGetOwnPropertyNames","windowNames","objectGetOwnPropertyNamesExternal","getWindowNames","WellKnownSymbolsStore","createWellKnownSymbol","USE_SYMBOL_AS_UID","withoutSetter","wellKnownSymbol","name","wellKnownSymbolWrapped","defineWellKnownSymbol","NAME","wrappedWellKnownSymbolModule","TO_STRING_TAG","setToStringTag","TAG","aFunction$1","functionBindContext","that","b","c","apply","SPECIES","arraySpeciesCreate","originalArray","C","constructor","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","callbackfn","specificCreate","boundFunction","bind","arrayIteration","forEach","map","filter","some","every","find","findIndex","$forEach","HIDDEN","SYMBOL","TO_PRIMITIVE","setInternalState","ObjectPrototype","$Symbol","$stringify","getOwnPropertyNamesExternal","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","QObject","USE_SETTER","findChild","setSymbolDescriptor","nativeObjectCreate","ObjectPrototypeDescriptor","wrap","tag","description","symbol","isSymbol","$defineProperty","$defineProperties","properties","$getOwnPropertySymbols","$propertyIsEnumerable","$getOwnPropertyDescriptor","$getOwnPropertyNames","IS_OBJECT_PROTOTYPE","setter","$","for","keyFor","sym","useSetter","useSimple","FORCED_JSON_STRINGIFY","stringify","replacer","space","$replacer","args","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","symbolPrototype","symbolToString","native","regexp","desc","arrayMethodIsStrict","METHOD_NAME","cache","thrower","arrayMethodUsesToLength","ACCESSORS","argument0","argument1","STRICT_METHOD","USES_TO_LENGTH","arrayForEach","proto","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","UNSCOPABLES","ArrayPrototype","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","addToUnscopables","iterators","correctPrototypeGetter","getPrototypeOf","objectGetPrototypeOf","CORRECT_PROTOTYPE_GETTER","ITERATOR","BUGGY_SAFARI_ITERATORS","iteratorsCore","returnThis","createIteratorConstructor","IteratorConstructor","next","Iterators","objectSetPrototypeOf","setPrototypeOf","CORRECT_SETTER","aPossiblePrototype","__proto__","IteratorsCore","KEYS","VALUES","ENTRIES","defineIterator","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","entries","values","ARRAY_ITERATOR","es_array_iterator","iterated","kind","done","Arguments","nativeJoin","ES3_STRINGS","separator","match","createProperty","propertyKey","engineUserAgent","process","versions","v8","userAgent","engineV8Version","arrayMethodHasSpeciesSupport","V8_VERSION","array","foo","Boolean","HAS_SPECIES_SUPPORT","0","nativeSlice","start","end","Constructor","n","k","fin","toStringTagSupport","CORRECT_ARGUMENTS","TO_STRING_TAG_SUPPORT","tryGet","callee","objectToString","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","s","RegExp","regexpStickyHelpers","UNSUPPORTED_Y","re","lastIndex","BROKEN_CARET","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","re1","re2","stickyHelpers","NPCG_INCLUDED","str","reCopy","flags","charsAdded","strCopy","regexpExec","TO_STRING","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","R","p","rf","CONVERT_TO_STRING","pos","first","second","S","position","size","charCodeAt","charAt","stringMultibyte","codeAt","STRING_ITERATOR","point","REPLACE_SUPPORTS_NAMED_GROUPS","groups","REPLACE_KEEPS_$0","REPLACE","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","fixRegexpWellKnownSymbolLogic","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","stringMethod","regexMethod","advanceStringIndex","regexpExecAbstract","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","fixRegExpWellKnownSymbolLogic","maybeCallNative","reason","UNSAFE_SUBSTITUTE","searchValue","replaceValue","res","rx","functionalReplace","fullUnicode","results","regExpExec","accumulatedResult","nextSourcePosition","matched","captures","j","namedCaptures","replacerArgs","getSubstitution","tailPos","m","symbols","ch","capture","sameValue","is","x","y","SEARCH","nativeSearch","searcher","previousLastIndex","MATCH","isRegexp","isRegExp","speciesConstructor","defaultConstructor","arrayPush","MAX_UINT32","SUPPORTS_Y","SPLIT","nativeSplit","internalSplit","limit","lim","lastLength","output","lastLastIndex","separatorCopy","splitter","unicodeMatching","callRegExpExec","q","A","z","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","COLLECTION_NAME","DOMIterables","Collection","CollectionPrototype","ArrayValues","ArrayIteratorMethods","nativeUrl","url","URL","searchParams","pathname","sort","href","URLSearchParams","username","host","hash","anInstance","nativeAssign","assign","objectAssign","B","alphabet","chr","T","argumentsLength","iteratorClose","returnMethod","callWithSafeIterationClosing","isArrayIteratorMethod","getIteratorMethod","arrayFrom","arrayLike","step","mapfn","mapping","iteratorMethod","maxInt","regexNonASCII","regexSeparators","OVERFLOW_ERROR","stringFromCharCode","fromCharCode","digitToBasic","digit","adapt","delta","numPoints","firstTime","baseMinusTMin","base","encode","currentValue","inputLength","counter","extra","ucs2decode","bias","basicLength","handledCPCount","handledCPCountPlusOne","RangeError","t","qMinusT","baseMinusT","redefineAll","getIterator","$fetch","Headers","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","getInternalIteratorState","plus","sequences","percentSequence","bytes","percentDecode","sequence","decodeURIComponent","deserialize","!","'","(",")","~","%20","serialize","encodeURIComponent","parseSearchParams","query","attribute","entry","attributes","shift","updateSearchParams","validateArgumentsLength","passed","required","URLSearchParamsIterator","URLSearchParamsConstructor","entryIterator","entryNext","init","updateURL","hasOwn","URLSearchParamsPrototype","append","delete","splice","getAll","found","entriesIndex","sliceIndex","callback","USE_NATIVE_URL","fetch","body","headers","EOF","web_urlSearchParams","getState","require$$1","NativeURL","URLSearchParamsModule","getInternalSearchParamsState","getInternalURLState","pow","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","parseHost","codePoints","parseIPv6","isSpecial","label","encoded","labels","toASCII","parseIPv4","percentEncode","C0ControlPercentEncodeSet","partsLength","numbers","part","radix","number","ipv4","parts","pop","parseInt","numbersSeen","ipv4Piece","swaps","swap","address","pieceIndex","compress","pointer","char","serializeHost","ignore0","unshift","ipv6","maxIndex","maxLength","currStart","currLength","findLongestZeroSequence","fragmentPercentEncodeSet"," ","\"","<",">","`","pathPercentEncodeSet","#","?","{","}","userinfoPercentEncodeSet","/",":",";","=","@","[","\\","]","^","|","code","specialSchemes","ftp","file","http","https","ws","wss","scheme","includesCredentials","password","cannotHaveUsernamePasswordPort","cannotBeABaseURL","isWindowsDriveLetter","normalized","startsWithWindowsDriveLetter","third","shortenURLsPath","pathSize","isSingleDot","segment","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","parseURL","stateOverride","bufferCodePoints","failure","buffer","seenAt","seenBracket","seenPasswordToken","port","fragment","codePoint","encodedCodePoints","URLConstructor","baseState","urlString","searchParamsState","serializeURL","origin","getOrigin","protocol","getProtocol","getUsername","getPassword","getHost","hostname","getHostname","getPort","getPathname","search","getSearch","getSearchParams","getHash","URLPrototype","accessorDescriptor","getter","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","blob","_typeof","obj","_classCallCheck","instance","_defineProperties","props","_createClass","protoProps","staticProps","_defineProperty","ownKeys$1","enumerableOnly","_objectSpread2","getOwnPropertyDescriptors","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","_slicedToArray","arr","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","err","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","from","_iterableToArray","_nonIterableSpread","o","minLen","len","arr2","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","serializeParam","deserializeParam","checkIfURLSearchParamsSupported","searchString","typeofSearchString","_fromString","_this","_entries","thisArg","searchArray","polyfillURLSearchParams","u","checkIfURLIsSupported","_URL","baseElement","doc","location","implementation","createHTMLDocument","head","anchorElement","inputElement","checkValidity","enableSearchUpdate","enableSearchParamsUpdate","methodName","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","expectedPort","http:","https:","ftp:","addPortToOrigin","polyfillURL","setInterval","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","E","$filter","$find","FIND","SKIPS_HOLES","SAFE_CLOSING","called","iteratorWithReturn","return","checkCorrectnessOfIteration","SKIP_CLOSING","ITERATION_SUPPORT","INCORRECT_ITERATION","iterable","$includes","$map","inheritIfRequired","dummy","Wrapper","NewTarget","NewTargetPrototype","whitespaces","whitespace","ltrim","rtrim","stringTrim","trim","require$$2","require$$3","NUMBER","NativeNumber","NumberPrototype","BROKEN_CLASSOF","toNumber","maxCode","digits","NaN","NumberWrapper","FAILS_ON_PRIMITIVES","nativeKeys","notARegexp","correctIsRegexpLogic","error1","error2","correctIsRegExpLogic","notARegExp","freezing","isExtensible","preventExtensions","internalMetadata","METADATA","setMetadata","objectID","weakData","meta","REQUIRED","fastKey","getWeakData","onFreeze","FREEZING","Result","stopped","iterate","unboundFunction","iterFn","AS_ENTRIES","IS_ITERATOR","INTERRUPTED","stop","condition","callFn","internalStateGetterFor","ArrayIterationModule","uncaughtFrozenStore","frozen","UncaughtFrozenStore","findUncaughtFrozen","collectionWeak","getConstructor","wrapper","CONSTRUCTOR_NAME","ADDER","$has","add","$every","InternalWeakMap","enforceIternalState","IS_IE11","$WeakMap","common","IS_WEAK","NativeConstructor","NativePrototype","exported","fixMethod","InternalMetadataModule","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","clear","setStrong","collection","WeakMapPrototype","nativeDelete","nativeHas","nativeGet","nativeSet","$trim","forcedStringTrimMethod","$some","stringRepeat","repeat","count","Infinity","nativeToFixed","toFixed","acc","fractionDigits","thisNumberValue","fractDigits","sign","multiply","c2","divide","dataToString","x2","log","TO_ENTRIES","objectToArray","$entries","$values","r","nativeMatch","matcher","matchStr","defaults","addCSS","thumbWidth","watch","matches","querySelectorAll","instanceOf","isNullOrUndefined","isString","isNodeList","Element","round","getDecimalPlaces","parseFloat","defer","channel","RangeTouch","element","querySelector","rangeTouch","config","enabled","userSelect","webKitUserSelect","touchAction","listeners","changedTouches","getAttribute","getBoundingClientRect","width","clientX","left","disabled","dispatchEvent","trigger","MutationObserver","addedNodes","observe","childList","subtree","documentElement","nativePromiseConstructor","Promise","setSpecies","engineIsIos","engineIsNode","setImmediate","clearImmediate","MessageChannel","Dispatch","queue","ONREADYSTATECHANGE","run","runner","listener","post","postMessage","IS_NODE","nextTick","now","IS_IOS","port2","port1","onmessage","addEventListener","importScripts","removeChild","setTimeout","flush","last","notify","toggle","node","promise","then","task","macrotask","WebKitMutationObserver","queueMicrotaskDescriptor","queueMicrotask","parent","exit","enter","createTextNode","characterData","resolve","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","microtask","PromiseCapability","reject","$$resolve","$$reject","newPromiseCapability","promiseResolve","promiseCapability","perform","PROMISE","getInternalPromiseState","PromiseConstructor","NativePromise","newPromiseCapabilityModule","newGenericPromiseCapability","DISPATCH_EVENT","NATIVE_REJECTION_EVENT","PromiseRejectionEvent","UNHANDLED_REJECTION","FakePromise","all","isThenable","isReject","notified","chain","reactions","ok","exited","reaction","handler","fail","rejection","onHandleUnhandled","onUnhandled","initEvent","console","hostReportErrors","isUnhandled","emit","unwrap","internalReject","internalResolve","executor","onFulfilled","onRejected","catch","capability","$promiseResolve","remaining","alreadyCalled","race","nativeStartsWith","startsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","events","isFunction","isEmpty","is$1","Number","KeyboardEvent","TextTrack","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","delay","hidden","offsetHeight","browser","isIE","documentMode","isEdge","isWebkit","isIPhone","platform","isIos","IS_RIGHT","memo","$reduce","right","getDeep","reduce","extend","_len","sources","_key","elements","targets","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","className","class","toggleHidden","hide","toggleClass","force","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","CHROME_VERSION","range","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","removeEventListener","toggleListener","passive","eventListeners","on","off","once","_this2","onceCallback","triggerEvent","plyr","unbindListeners","item","ready","_this3","silencePromise","validateRatio","reduceAspectRatio","ratio","_ratio","height","divider","getDivider","w","h","getAspectRatio","parse","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","getComputedStyle","offset","fullscreen","active","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","setup","player","speed","onChange","_player$media","currentTime","paused","preload","readyState","playbackRate","play","load","cancelRequests","blankVideo","debug","dedupe","NativeRegExp","CORRECT_NEW","RegExpWrapper","pattern","thisIsRegExp","patternIsRegExp","flagsAreUndefined","getFlags","proxy","format","replaceAll","toTitleCase","toUpperCase","substr","toPascalCase","getHTML","innerHTML","resources","youtube","i18n","{seektime}","seekTime","{title}","title","v","Storage","storage","localStorage","getItem","json","JSON","setItem","removeItem","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","prefix","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","trunc","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","toCamelCase","labelPressed","iconPressed","control","button","createRange","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","current","getPercentage","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sorting","setCaptionsMenu","_this7","tracks","getTracks","track","toggled","language","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","popup","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","restore","propertyName","setDownloadUrl","download","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this11","seektime","addProperty","controlPressed","_this$config","parseUrl","safe","parser","buildUrlParams","isYouTube","insertAfter","languages","userLanguage","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","cue","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","noop","Console","Fullscreen","property","scrollPosition","forceFallback","closest","parentElement","nodeType","trapFocus","scrollX","scrollY","scrollTo","overflow","viewport","hasProperty","cleanupViewport","keyCode","activeElement","shiftKey","webkitEnterFullscreen","toggleFallback","requestFullscreen","navigationUI","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","mathSign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","migrateStyles","getPropertyValue","removeProperty","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","firstChild","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","abs","MAXIMUM_ALLOWED_LENGTH_EXCEEDED","deleteCount","insertCount","actualDeleteCount","to","actualStart","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","executeCallbacks","success","loadFile","numTries","isLegacyIECss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","loadFiles","paths","loadjs","arg1","loadFn","returnPromise","deps","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","$2","data-poster","thumbnail_url","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","createDocumentFragment","stripHTML","getPaused","seconds","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","initialized","displayContainer","manager","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","google","ima","destroy","remove","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this12","handlers","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","$findIndex","FIND_INDEX","nativeLastIndexOf","lastIndexOf","arrayLastIndexOf","fitRatio","outer","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","promises","getThumbnail","vttDataString","processedList","thumbnail","frames","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","urlPrefix","substring","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","previewPos","_fitRatio","multiplier","top","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","failed","jQuery","original","getProviderByUrl","truthy","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","clamp","updateStorage","prev","curr","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.polyfilled.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());\n}(this, (function () { 'use strict';\n\n // Polyfill for creating CustomEvents on IE9/10/11\n // code pulled from:\n // https://github.com/d4tocchini/customevent-polyfill\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n (function () {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', {\n cancelable: true\n });\n ce.preventDefault();\n\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 CustomEvent(event, params) {\n var evt, origPrevent;\n params = params || {};\n params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n\n evt.preventDefault = function () {\n origPrevent.call(this);\n\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function get() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n })();\n\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n var check = function (it) {\n return it && it.Math == Math && it;\n };\n\n // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n var global_1 =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n\n var fails = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n };\n\n // Thank's IE8 for his funny defineProperty\n var descriptors = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n });\n\n var nativePropertyIsEnumerable = {}.propertyIsEnumerable;\n var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n // Nashorn ~ JDK8 bug\n var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n // `Object.prototype.propertyIsEnumerable` method implementation\n // https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n var f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n } : nativePropertyIsEnumerable;\n\n var objectPropertyIsEnumerable = {\n \tf: f\n };\n\n var createPropertyDescriptor = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n };\n\n var toString = {}.toString;\n\n var classofRaw = function (it) {\n return toString.call(it).slice(8, -1);\n };\n\n var split = ''.split;\n\n // fallback for non-array-like ES3 and non-enumerable old V8 strings\n var indexedObject = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n }) ? function (it) {\n return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n } : Object;\n\n // `RequireObjectCoercible` abstract operation\n // https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n var requireObjectCoercible = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n };\n\n // toObject with fallback for non-array-like ES3 strings\n\n\n\n var toIndexedObject = function (it) {\n return indexedObject(requireObjectCoercible(it));\n };\n\n var isObject = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n };\n\n // `ToPrimitive` abstract operation\n // https://tc39.github.io/ecma262/#sec-toprimitive\n // instead of the ES6 spec version, we didn't implement @@toPrimitive case\n // and the second argument - flag - preferred type is a string\n var toPrimitive = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n };\n\n var hasOwnProperty = {}.hasOwnProperty;\n\n var has = function (it, key) {\n return hasOwnProperty.call(it, key);\n };\n\n var document$1 = global_1.document;\n // typeof document.createElement is 'object' in old IE\n var EXISTS = isObject(document$1) && isObject(document$1.createElement);\n\n var documentCreateElement = function (it) {\n return EXISTS ? document$1.createElement(it) : {};\n };\n\n // Thank's IE8 for his funny defineProperty\n var ie8DomDefine = !descriptors && !fails(function () {\n return Object.defineProperty(documentCreateElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n });\n\n var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n var f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (ie8DomDefine) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n };\n\n var objectGetOwnPropertyDescriptor = {\n \tf: f$1\n };\n\n var anObject = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n };\n\n var nativeDefineProperty = Object.defineProperty;\n\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n var f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (ie8DomDefine) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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\n var objectDefineProperty = {\n \tf: f$2\n };\n\n var createNonEnumerableProperty = descriptors ? function (object, key, value) {\n return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n } : function (object, key, value) {\n object[key] = value;\n return object;\n };\n\n var setGlobal = function (key, value) {\n try {\n createNonEnumerableProperty(global_1, key, value);\n } catch (error) {\n global_1[key] = value;\n } return value;\n };\n\n var SHARED = '__core-js_shared__';\n var store = global_1[SHARED] || setGlobal(SHARED, {});\n\n var sharedStore = store;\n\n var functionToString = Function.toString;\n\n // this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\n if (typeof sharedStore.inspectSource != 'function') {\n sharedStore.inspectSource = function (it) {\n return functionToString.call(it);\n };\n }\n\n var inspectSource = sharedStore.inspectSource;\n\n var WeakMap$1 = global_1.WeakMap;\n\n var nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\n\n var isPure = false;\n\n var shared = createCommonjsModule(function (module) {\n (module.exports = function (key, value) {\n return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\n })('versions', []).push({\n version: '3.7.0',\n mode: 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n });\n });\n\n var id = 0;\n var postfix = Math.random();\n\n var uid = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n };\n\n var keys = shared('keys');\n\n var sharedKey = function (key) {\n return keys[key] || (keys[key] = uid(key));\n };\n\n var hiddenKeys = {};\n\n var WeakMap$2 = global_1.WeakMap;\n var set, get, has$1;\n\n var enforce = function (it) {\n return has$1(it) ? get(it) : set(it, {});\n };\n\n var getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n };\n\n if (nativeWeakMap) {\n var store$1 = sharedStore.state || (sharedStore.state = new WeakMap$2());\n var wmget = store$1.get;\n var wmhas = store$1.has;\n var wmset = store$1.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store$1, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store$1, it) || {};\n };\n has$1 = function (it) {\n return wmhas.call(store$1, it);\n };\n } else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return has(it, STATE) ? it[STATE] : {};\n };\n has$1 = function (it) {\n return has(it, STATE);\n };\n }\n\n var internalState = {\n set: set,\n get: get,\n has: has$1,\n enforce: enforce,\n getterFor: getterFor\n };\n\n var redefine = createCommonjsModule(function (module) {\n var getInternalState = internalState.get;\n var enforceInternalState = internalState.enforce;\n var TEMPLATE = String(String).split('String');\n\n (module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global_1) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n })(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n });\n });\n\n var path = global_1;\n\n var aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n };\n\n var getBuiltIn = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])\n : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n };\n\n var ceil = Math.ceil;\n var floor = Math.floor;\n\n // `ToInteger` abstract operation\n // https://tc39.github.io/ecma262/#sec-tointeger\n var toInteger = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n };\n\n var min = Math.min;\n\n // `ToLength` abstract operation\n // https://tc39.github.io/ecma262/#sec-tolength\n var toLength = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n };\n\n var max = Math.max;\n var min$1 = Math.min;\n\n // Helper for a popular repeating case of the spec:\n // Let integer be ? ToInteger(index).\n // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\n var toAbsoluteIndex = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n };\n\n // `Array.prototype.{ indexOf, includes }` methods implementation\n var createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n };\n\n var arrayIncludes = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n };\n\n var indexOf = arrayIncludes.indexOf;\n\n\n var objectKeysInternal = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n };\n\n // IE8- don't enum bug keys\n var enumBugKeys = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n ];\n\n var hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');\n\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return objectKeysInternal(O, hiddenKeys$1);\n };\n\n var objectGetOwnPropertyNames = {\n \tf: f$3\n };\n\n var f$4 = Object.getOwnPropertySymbols;\n\n var objectGetOwnPropertySymbols = {\n \tf: f$4\n };\n\n // all object keys, includes non-enumerable and symbols\n var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = objectGetOwnPropertyNames.f(anObject(it));\n var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n };\n\n var copyConstructorProperties = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = objectDefineProperty.f;\n var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n };\n\n var replacement = /#|\\.prototype\\./;\n\n var isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n };\n\n var normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n };\n\n var data = isForced.data = {};\n var NATIVE = isForced.NATIVE = 'N';\n var POLYFILL = isForced.POLYFILL = 'P';\n\n var isForced_1 = isForced;\n\n var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n /*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n */\n var _export = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global_1;\n } else if (STATIC) {\n target = global_1[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global_1[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor$1(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n };\n\n var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n });\n\n var useSymbolAsUid = nativeSymbol\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n\n // `IsArray` abstract operation\n // https://tc39.github.io/ecma262/#sec-isarray\n var isArray = Array.isArray || function isArray(arg) {\n return classofRaw(arg) == 'Array';\n };\n\n // `ToObject` abstract operation\n // https://tc39.github.io/ecma262/#sec-toobject\n var toObject = function (argument) {\n return Object(requireObjectCoercible(argument));\n };\n\n // `Object.keys` method\n // https://tc39.github.io/ecma262/#sec-object.keys\n var objectKeys = Object.keys || function keys(O) {\n return objectKeysInternal(O, enumBugKeys);\n };\n\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\n return O;\n };\n\n var html = getBuiltIn('document', 'documentElement');\n\n var GT = '>';\n var LT = '<';\n var PROTOTYPE = 'prototype';\n var SCRIPT = 'script';\n var IE_PROTO = sharedKey('IE_PROTO');\n\n var EmptyConstructor = function () { /* empty */ };\n\n var scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n };\n\n // Create object with fake `null` prototype: use ActiveX Object with cleared prototype\n var NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n };\n\n // Create object with fake `null` prototype: use iframe Object with cleared prototype\n var NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n };\n\n // Check for document.domain and active x support\n // No need to use active x approach when document.domain is not set\n // see https://github.com/es-shims/es5-shim/issues/150\n // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n // avoid IE GC bug\n var activeXDocument;\n var NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n };\n\n hiddenKeys[IE_PROTO] = true;\n\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n var objectCreate = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : objectDefineProperties(result, Properties);\n };\n\n var nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n var toString$1 = {}.toString;\n\n var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\n var getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n };\n\n // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n var f$5 = function getOwnPropertyNames(it) {\n return windowNames && toString$1.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n };\n\n var objectGetOwnPropertyNamesExternal = {\n \tf: f$5\n };\n\n var WellKnownSymbolsStore = shared('wks');\n var Symbol$1 = global_1.Symbol;\n var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\n\n var wellKnownSymbol = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n };\n\n var f$6 = wellKnownSymbol;\n\n var wellKnownSymbolWrapped = {\n \tf: f$6\n };\n\n var defineProperty = objectDefineProperty.f;\n\n var defineWellKnownSymbol = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wellKnownSymbolWrapped.f(NAME)\n });\n };\n\n var defineProperty$1 = objectDefineProperty.f;\n\n\n\n var TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\n var setToStringTag = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty$1(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n };\n\n var aFunction$1 = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n };\n\n // optional / simple context binding\n var functionBindContext = function (fn, that, length) {\n aFunction$1(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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\n var SPECIES = wellKnownSymbol('species');\n\n // `ArraySpeciesCreate` abstract operation\n // https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n var arraySpeciesCreate = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n };\n\n var push = [].push;\n\n // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n var createMethod$1 = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = indexedObject(O);\n var boundFunction = functionBindContext(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n };\n\n var arrayIteration = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod$1(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod$1(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod$1(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod$1(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod$1(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod$1(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod$1(6)\n };\n\n var $forEach = arrayIteration.forEach;\n\n var HIDDEN = sharedKey('hidden');\n var SYMBOL = 'Symbol';\n var PROTOTYPE$1 = 'prototype';\n var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n var setInternalState = internalState.set;\n var getInternalState = internalState.getterFor(SYMBOL);\n var ObjectPrototype = Object[PROTOTYPE$1];\n var $Symbol = global_1.Symbol;\n var $stringify = getBuiltIn('JSON', 'stringify');\n var nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n var nativeDefineProperty$1 = objectDefineProperty.f;\n var nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;\n var nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;\n var AllSymbols = shared('symbols');\n var ObjectPrototypeSymbols = shared('op-symbols');\n var StringToSymbolRegistry = shared('string-to-symbol-registry');\n var SymbolToStringRegistry = shared('symbol-to-string-registry');\n var WellKnownSymbolsStore$1 = shared('wks');\n var QObject = global_1.QObject;\n // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n var USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;\n\n // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n var setSymbolDescriptor = descriptors && fails(function () {\n return objectCreate(nativeDefineProperty$1({}, 'a', {\n get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }\n })).a != 7;\n }) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty$1(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty$1(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n } : nativeDefineProperty$1;\n\n var wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!descriptors) symbol.description = description;\n return symbol;\n };\n\n var isSymbol = useSymbolAsUid ? function (it) {\n return typeof it == 'symbol';\n } : function (it) {\n return Object(it) instanceof $Symbol;\n };\n\n var $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty$1(O, key, Attributes);\n };\n\n var $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n };\n\n var $create = function create(O, Properties) {\n return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);\n };\n\n var $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable$1.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n };\n\n var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n };\n\n var $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n };\n\n var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n };\n\n // `Symbol` constructor\n // https://tc39.github.io/ecma262/#sec-symbol-constructor\n if (!nativeSymbol) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n objectPropertyIsEnumerable.f = $propertyIsEnumerable;\n objectDefineProperty.f = $defineProperty;\n objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;\n objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;\n\n wellKnownSymbolWrapped.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (descriptors) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n }\n\n _export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, {\n Symbol: $Symbol\n });\n\n $forEach(objectKeys(WellKnownSymbolsStore$1), function (name) {\n defineWellKnownSymbol(name);\n });\n\n _export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n });\n\n _export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n });\n\n _export({ target: 'Object', stat: true, forced: !nativeSymbol }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n });\n\n // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n // https://bugs.chromium.org/p/v8/issues/detail?id=3443\n _export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return objectGetOwnPropertySymbols.f(toObject(it));\n }\n });\n\n // `JSON.stringify` method behavior with symbols\n // https://tc39.github.io/ecma262/#sec-json.stringify\n if ($stringify) {\n var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n _export({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n }\n\n // `Symbol.prototype[@@toPrimitive]` method\n // https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\n if (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);\n }\n // `Symbol.prototype[@@toStringTag]` property\n // https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\n setToStringTag($Symbol, SYMBOL);\n\n hiddenKeys[HIDDEN] = true;\n\n var defineProperty$2 = objectDefineProperty.f;\n\n\n var NativeSymbol = global_1.Symbol;\n\n if (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n )) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty$2(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n _export({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n }\n\n // `Symbol.iterator` well-known symbol\n // https://tc39.github.io/ecma262/#sec-symbol.iterator\n defineWellKnownSymbol('iterator');\n\n var arrayMethodIsStrict = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n };\n\n var defineProperty$3 = Object.defineProperty;\n var cache = {};\n\n var thrower = function (it) { throw it; };\n\n var arrayMethodUsesToLength = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !descriptors) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty$3(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n };\n\n var $forEach$1 = arrayIteration.forEach;\n\n\n\n var STRICT_METHOD = arrayMethodIsStrict('forEach');\n var USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n // `Array.prototype.forEach` method implementation\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n var arrayForEach = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n } : [].forEach;\n\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n _export({ target: 'Array', proto: true, forced: [].forEach != arrayForEach }, {\n forEach: arrayForEach\n });\n\n var $indexOf = arrayIncludes.indexOf;\n\n\n\n var nativeIndexOf = [].indexOf;\n\n var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\n var STRICT_METHOD$1 = arrayMethodIsStrict('indexOf');\n var USES_TO_LENGTH$1 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n _export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD$1 || !USES_TO_LENGTH$1 }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n var UNSCOPABLES = wellKnownSymbol('unscopables');\n var ArrayPrototype = Array.prototype;\n\n // Array.prototype[@@unscopables]\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n if (ArrayPrototype[UNSCOPABLES] == undefined) {\n objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: objectCreate(null)\n });\n }\n\n // add a key to Array.prototype[@@unscopables]\n var addToUnscopables = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n };\n\n var iterators = {};\n\n var correctPrototypeGetter = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n });\n\n var IE_PROTO$1 = sharedKey('IE_PROTO');\n var ObjectPrototype$1 = Object.prototype;\n\n // `Object.getPrototypeOf` method\n // https://tc39.github.io/ecma262/#sec-object.getprototypeof\n var objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO$1)) return O[IE_PROTO$1];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype$1 : null;\n };\n\n var ITERATOR = wellKnownSymbol('iterator');\n var BUGGY_SAFARI_ITERATORS = false;\n\n var returnThis = function () { return this; };\n\n // `%IteratorPrototype%` object\n // https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\n var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n if ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n }\n\n if (IteratorPrototype == undefined) IteratorPrototype = {};\n\n // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n if ( !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n }\n\n var iteratorsCore = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n };\n\n var IteratorPrototype$1 = iteratorsCore.IteratorPrototype;\n\n\n\n\n\n var returnThis$1 = function () { return this; };\n\n var createIteratorConstructor = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false);\n iterators[TO_STRING_TAG] = returnThis$1;\n return IteratorConstructor;\n };\n\n var aPossiblePrototype = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n };\n\n // `Object.setPrototypeOf` method\n // https://tc39.github.io/ecma262/#sec-object.setprototypeof\n // Works with __proto__ only. Old v8 can't work with null proto objects.\n /* eslint-disable no-proto */\n var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n }() : undefined);\n\n var IteratorPrototype$2 = iteratorsCore.IteratorPrototype;\n var BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\n var ITERATOR$1 = wellKnownSymbol('iterator');\n var KEYS = 'keys';\n var VALUES = 'values';\n var ENTRIES = 'entries';\n\n var returnThis$2 = function () { return this; };\n\n var defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR$1]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {\n if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {\n if (objectSetPrototypeOf) {\n objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);\n } else if (typeof CurrentIteratorPrototype[ITERATOR$1] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$1, returnThis$2);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ( IterablePrototype[ITERATOR$1] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR$1, defaultIterator);\n }\n iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n };\n\n var ARRAY_ITERATOR = 'Array Iterator';\n var setInternalState$1 = internalState.set;\n var getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR);\n\n // `Array.prototype.entries` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.entries\n // `Array.prototype.keys` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.keys\n // `Array.prototype.values` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.values\n // `Array.prototype[@@iterator]` method\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n // `CreateArrayIterator` internal method\n // https://tc39.github.io/ecma262/#sec-createarrayiterator\n var es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState$1(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n // `%ArrayIteratorPrototype%.next` method\n // https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n }, function () {\n var state = getInternalState$1(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n }, 'values');\n\n // argumentsList[@@iterator] is %ArrayProto_values%\n // https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n // https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\n iterators.Arguments = iterators.Array;\n\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n addToUnscopables('keys');\n addToUnscopables('values');\n addToUnscopables('entries');\n\n var nativeJoin = [].join;\n\n var ES3_STRINGS = indexedObject != Object;\n var STRICT_METHOD$2 = arrayMethodIsStrict('join', ',');\n\n // `Array.prototype.join` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.join\n _export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$2 }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n });\n\n var createProperty = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n };\n\n var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\n\n var process = global_1.process;\n var versions = process && process.versions;\n var v8 = versions && versions.v8;\n var match, version;\n\n if (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n } else if (engineUserAgent) {\n match = engineUserAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = engineUserAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n }\n\n var engineV8Version = version && +version;\n\n var SPECIES$1 = wellKnownSymbol('species');\n\n var arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return engineV8Version >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES$1] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n };\n\n var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\n var USES_TO_LENGTH$2 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n var SPECIES$2 = wellKnownSymbol('species');\n var nativeSlice = [].slice;\n var max$1 = Math.max;\n\n // `Array.prototype.slice` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.slice\n // fallback for not array-like ES3 strings and DOM objects\n _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$2 }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES$2];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n });\n\n var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\n var test = {};\n\n test[TO_STRING_TAG$1] = 'z';\n\n var toStringTagSupport = String(test) === '[object z]';\n\n var TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');\n // ES3 wrong here\n var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n // fallback for IE11 Script Access Denied error\n var tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n };\n\n // getting tag from ES6+ `Object.prototype.toString`\n var classof = toStringTagSupport ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$2)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n };\n\n // `Object.prototype.toString` method implementation\n // https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n var objectToString = toStringTagSupport ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n };\n\n // `Object.prototype.toString` method\n // https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n if (!toStringTagSupport) {\n redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\n }\n\n // `RegExp.prototype.flags` getter implementation\n // https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n var regexpFlags = 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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n };\n\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n // so we use an intermediate function.\n function RE(s, f) {\n return RegExp(s, f);\n }\n\n var UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n });\n\n var BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n });\n\n var regexpStickyHelpers = {\n \tUNSUPPORTED_Y: UNSUPPORTED_Y,\n \tBROKEN_CARET: BROKEN_CARET\n };\n\n var nativeExec = RegExp.prototype.exec;\n // This always refers to the native implementation, because the\n // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n // which loads this file before patching the method.\n var nativeReplace = String.prototype.replace;\n\n var patchedExec = nativeExec;\n\n var UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n })();\n\n var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\n\n // nonparticipating capturing group, copied from es5-shim's String#split patch.\n var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\n var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1;\n\n if (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y$1 && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n }\n\n var regexpExec = patchedExec;\n\n _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\n exec: regexpExec\n });\n\n var TO_STRING = 'toString';\n var RegExpPrototype = RegExp.prototype;\n var nativeToString = RegExpPrototype[TO_STRING];\n\n var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n // FF44- RegExp#toString has a wrong name\n var INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n // `RegExp.prototype.toString` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\n if (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n }\n\n // `String.prototype.{ codePointAt, at }` methods implementation\n var createMethod$2 = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n };\n\n var stringMultibyte = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod$2(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod$2(true)\n };\n\n var charAt = stringMultibyte.charAt;\n\n\n\n var STRING_ITERATOR = 'String Iterator';\n var setInternalState$2 = internalState.set;\n var getInternalState$2 = internalState.getterFor(STRING_ITERATOR);\n\n // `String.prototype[@@iterator]` method\n // https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\n defineIterator(String, 'String', function (iterated) {\n setInternalState$2(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n // `%StringIteratorPrototype%.next` method\n // https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n }, function next() {\n var state = getInternalState$2(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n });\n\n // TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\n\n\n\n\n var SPECIES$3 = wellKnownSymbol('species');\n\n var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n });\n\n // IE <= 11 replaces $0 with the whole match, as if it was $&\n // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\n var REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n })();\n\n var REPLACE = wellKnownSymbol('replace');\n // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n })();\n\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n // Weex JS has frozen built-in prototypes, so use try / catch wrapper\n var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n });\n\n var fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES$3] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n };\n\n var charAt$1 = stringMultibyte.charAt;\n\n // `AdvanceStringIndex` abstract operation\n // https://tc39.github.io/ecma262/#sec-advancestringindex\n var advanceStringIndex = function (S, index, unicode) {\n return index + (unicode ? charAt$1(S, index).length : 1);\n };\n\n // `RegExpExec` abstract operation\n // https://tc39.github.io/ecma262/#sec-regexpexec\n var regexpExecAbstract = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classofRaw(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n };\n\n var max$2 = Math.max;\n var min$2 = Math.min;\n var floor$1 = Math.floor;\n var SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\n var SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n var maybeToString = function (it) {\n return it === undefined ? it : String(it);\n };\n\n // @@replace logic\n fixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regexpExecAbstract(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max$2(min$2(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor$1(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n });\n\n // `SameValue` abstract operation\n // https://tc39.github.io/ecma262/#sec-samevalue\n var sameValue = 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\n // @@search logic\n fixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regexpExecAbstract(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n });\n\n var MATCH = wellKnownSymbol('match');\n\n // `IsRegExp` abstract operation\n // https://tc39.github.io/ecma262/#sec-isregexp\n var isRegexp = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\n };\n\n var SPECIES$4 = wellKnownSymbol('species');\n\n // `SpeciesConstructor` abstract operation\n // https://tc39.github.io/ecma262/#sec-speciesconstructor\n var speciesConstructor = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES$4]) == undefined ? defaultConstructor : aFunction$1(S);\n };\n\n var arrayPush = [].push;\n var min$3 = Math.min;\n var MAX_UINT32 = 0xFFFFFFFF;\n\n // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n var SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n // @@split logic\n fixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegexp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min$3(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n }, !SUPPORTS_Y);\n\n // iterable DOM collections\n // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\n var domIterables = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n };\n\n for (var COLLECTION_NAME in domIterables) {\n var Collection = global_1[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach);\n } catch (error) {\n CollectionPrototype.forEach = arrayForEach;\n }\n }\n\n var ITERATOR$2 = wellKnownSymbol('iterator');\n var TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');\n var ArrayValues = es_array_iterator.values;\n\n for (var COLLECTION_NAME$1 in domIterables) {\n var Collection$1 = global_1[COLLECTION_NAME$1];\n var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;\n if (CollectionPrototype$1) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype$1[ITERATOR$2] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype$1, ITERATOR$2, ArrayValues);\n } catch (error) {\n CollectionPrototype$1[ITERATOR$2] = ArrayValues;\n }\n if (!CollectionPrototype$1[TO_STRING_TAG$3]) {\n createNonEnumerableProperty(CollectionPrototype$1, TO_STRING_TAG$3, COLLECTION_NAME$1);\n }\n if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME];\n }\n }\n }\n }\n\n var ITERATOR$3 = wellKnownSymbol('iterator');\n\n var nativeUrl = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (isPure && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR$3]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n });\n\n var anInstance = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n };\n\n var nativeAssign = Object.assign;\n var defineProperty$4 = Object.defineProperty;\n\n // `Object.assign` method\n // https://tc39.github.io/ecma262/#sec-object.assign\n var objectAssign = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$4({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty$4(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n }) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n while (argumentsLength > index) {\n var S = indexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n } : nativeAssign;\n\n var iteratorClose = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n };\n\n // call something on iterator step with safe closing on error\n var callWithSafeIterationClosing = 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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n };\n\n var ITERATOR$4 = wellKnownSymbol('iterator');\n var ArrayPrototype$1 = Array.prototype;\n\n // check on default Array iterator\n var isArrayIteratorMethod = function (it) {\n return it !== undefined && (iterators.Array === it || ArrayPrototype$1[ITERATOR$4] === it);\n };\n\n var ITERATOR$5 = wellKnownSymbol('iterator');\n\n var getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR$5]\n || it['@@iterator']\n || iterators[classof(it)];\n };\n\n // `Array.from` method implementation\n // https://tc39.github.io/ecma262/#sec-array.from\n var arrayFrom = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n };\n\n // based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\n var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n var base = 36;\n var tMin = 1;\n var tMax = 26;\n var skew = 38;\n var damp = 700;\n var initialBias = 72;\n var initialN = 128; // 0x80\n var delimiter = '-'; // '\\x2D'\n var regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\n var regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\n var baseMinusTMin = base - tMin;\n var floor$2 = Math.floor;\n var stringFromCharCode = String.fromCharCode;\n\n /**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\n var ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n };\n\n /**\n * Converts a digit/integer into a basic code point.\n */\n var digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n };\n\n /**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\n var adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor$2(delta / damp) : delta >> 1;\n delta += floor$2(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor$2(delta / baseMinusTMin);\n }\n return floor$2(k + (baseMinusTMin + 1) * delta / (delta + skew));\n };\n\n /**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n // eslint-disable-next-line max-statements\n var encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor$2((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor$2(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n };\n\n var stringPunycodeToAscii = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n };\n\n var redefineAll = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n };\n\n var getIterator = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n };\n\n // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n var $fetch = getBuiltIn('fetch');\n var Headers = getBuiltIn('Headers');\n var ITERATOR$6 = wellKnownSymbol('iterator');\n var URL_SEARCH_PARAMS = 'URLSearchParams';\n var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\n var setInternalState$3 = internalState.set;\n var getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS);\n var getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\n var plus = /\\+/g;\n var sequences = Array(4);\n\n var percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n };\n\n var percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n };\n\n var deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n };\n\n var find = /[!'()~]|%20/g;\n\n var replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n };\n\n var replacer = function (match) {\n return replace[match];\n };\n\n var serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n };\n\n var parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n };\n\n var updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n };\n\n var validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n };\n\n var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState$3(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n }, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n });\n\n // `URLSearchParams` constructor\n // https://url.spec.whatwg.org/#interface-urlsearchparams\n var URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState$3(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (has(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n };\n\n var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\n redefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n }, { enumerable: true });\n\n // `URLSearchParams.prototype[@@iterator]` method\n redefine(URLSearchParamsPrototype, ITERATOR$6, URLSearchParamsPrototype.entries);\n\n // `URLSearchParams.prototype.toString` method\n // https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\n redefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n }, { enumerable: true });\n\n setToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n _export({ global: true, forced: !nativeUrl }, {\n URLSearchParams: URLSearchParamsConstructor\n });\n\n // Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n // https://github.com/zloirock/core-js/issues/674\n if (!nativeUrl && typeof $fetch == 'function' && typeof Headers == 'function') {\n _export({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = objectCreate(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n }\n\n var web_urlSearchParams = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n };\n\n // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n var codeAt = stringMultibyte.codeAt;\n\n\n\n\n\n var NativeURL = global_1.URL;\n var URLSearchParams$1 = web_urlSearchParams.URLSearchParams;\n var getInternalSearchParamsState = web_urlSearchParams.getState;\n var setInternalState$4 = internalState.set;\n var getInternalURLState = internalState.getterFor('URL');\n var floor$3 = Math.floor;\n var pow = Math.pow;\n\n var INVALID_AUTHORITY = 'Invalid authority';\n var INVALID_SCHEME = 'Invalid scheme';\n var INVALID_HOST = 'Invalid host';\n var INVALID_PORT = 'Invalid port';\n\n var ALPHA = /[A-Za-z]/;\n var ALPHANUMERIC = /[\\d+-.A-Za-z]/;\n var DIGIT = /\\d/;\n var HEX_START = /^(0x|0X)/;\n var OCT = /^[0-7]+$/;\n var DEC = /^\\d+$/;\n var HEX = /^[\\dA-Fa-f]+$/;\n // eslint-disable-next-line no-control-regex\n var FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n // eslint-disable-next-line no-control-regex\n var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n // eslint-disable-next-line no-control-regex\n var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n // eslint-disable-next-line no-control-regex\n var TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\n var EOF;\n\n var parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = stringPunycodeToAscii(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n };\n\n var parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n };\n\n // eslint-disable-next-line max-statements\n var parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n };\n\n var findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n };\n\n var serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor$3(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n };\n\n var C0ControlPercentEncodeSet = {};\n var fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n });\n var pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n });\n var userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n });\n\n var percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n };\n\n var specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n };\n\n var isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n };\n\n var includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n };\n\n var cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n };\n\n var isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n };\n\n var startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n };\n\n var shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n };\n\n var isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n };\n\n var isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n };\n\n // States:\n var SCHEME_START = {};\n var SCHEME = {};\n var NO_SCHEME = {};\n var SPECIAL_RELATIVE_OR_AUTHORITY = {};\n var PATH_OR_AUTHORITY = {};\n var RELATIVE = {};\n var RELATIVE_SLASH = {};\n var SPECIAL_AUTHORITY_SLASHES = {};\n var SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\n var AUTHORITY = {};\n var HOST = {};\n var HOSTNAME = {};\n var PORT = {};\n var FILE = {};\n var FILE_SLASH = {};\n var FILE_HOST = {};\n var PATH_START = {};\n var PATH = {};\n var CANNOT_BE_A_BASE_URL_PATH = {};\n var QUERY = {};\n var FRAGMENT = {};\n\n // eslint-disable-next-line max-statements\n var parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n };\n\n // `URL` constructor\n // https://url.spec.whatwg.org/#url-class\n var URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState$4(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams$1();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!descriptors) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n };\n\n var URLPrototype = URLConstructor.prototype;\n\n var serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n };\n\n var getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n };\n\n var getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n };\n\n var getUsername = function () {\n return getInternalURLState(this).username;\n };\n\n var getPassword = function () {\n return getInternalURLState(this).password;\n };\n\n var getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n };\n\n var getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n };\n\n var getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n };\n\n var getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n };\n\n var getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n };\n\n var getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n };\n\n var getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n };\n\n var accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n };\n\n if (descriptors) {\n objectDefineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n }\n\n // `URL.prototype.toJSON` method\n // https://url.spec.whatwg.org/#dom-url-tojson\n redefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n }, { enumerable: true });\n\n // `URL.prototype.toString` method\n // https://url.spec.whatwg.org/#URL-stringification-behavior\n redefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n }, { enumerable: true });\n\n if (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n }\n\n setToStringTag(URLConstructor, 'URL');\n\n _export({ global: true, forced: !nativeUrl, sham: !descriptors }, {\n URL: URLConstructor\n });\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function ownKeys$1(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n }\n\n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys$1(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys$1(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n }\n\n function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n }\n\n function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n }\n\n function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n (function (global) {\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 */\n var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() {\n try {\n return !!Symbol.iterator;\n } catch (error) {\n return false;\n }\n };\n\n var iteratorSupported = checkIfIteratorIsSupported();\n\n var createIterator = function createIterator(items) {\n var iterator = {\n next: function next() {\n var value = items.shift();\n return {\n done: value === void 0,\n value: value\n };\n }\n };\n\n if (iteratorSupported) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n };\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 */\n\n\n var serializeParam = function serializeParam(value) {\n return encodeURIComponent(value).replace(/%20/g, '+');\n };\n\n var deserializeParam = function deserializeParam(value) {\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\n };\n\n var polyfillURLSearchParams = function polyfillURLSearchParams() {\n var URLSearchParams = function URLSearchParams(searchString) {\n Object.defineProperty(this, '_entries', {\n writable: true,\n value: {}\n });\n\n var typeofSearchString = _typeof(searchString);\n\n if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n if (searchString !== '') {\n this._fromString(searchString);\n }\n } else if (searchString instanceof URLSearchParams) {\n var _this = this;\n\n searchString.forEach(function (value, name) {\n _this.append(name, value);\n });\n } else if (searchString !== null && typeofSearchString === 'object') {\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\n for (var i = 0; i < searchString.length; i++) {\n var entry = searchString[i];\n\n if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n this.append(entry[0], entry[1]);\n } else {\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n }\n }\n } else {\n for (var key in searchString) {\n if (searchString.hasOwnProperty(key)) {\n this.append(key, searchString[key]);\n }\n }\n }\n } else {\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n }\n };\n\n var proto = URLSearchParams.prototype;\n\n proto.append = function (name, value) {\n if (name in this._entries) {\n this._entries[name].push(String(value));\n } else {\n this._entries[name] = [String(value)];\n }\n };\n\n proto.delete = function (name) {\n delete this._entries[name];\n };\n\n proto.get = function (name) {\n return name in this._entries ? this._entries[name][0] : null;\n };\n\n proto.getAll = function (name) {\n return name in this._entries ? this._entries[name].slice(0) : [];\n };\n\n proto.has = function (name) {\n return name in this._entries;\n };\n\n proto.set = function (name, value) {\n this._entries[name] = [String(value)];\n };\n\n proto.forEach = function (callback, thisArg) {\n var entries;\n\n for (var name in this._entries) {\n if (this._entries.hasOwnProperty(name)) {\n entries = this._entries[name];\n\n for (var i = 0; i < entries.length; i++) {\n callback.call(thisArg, entries[i], name, this);\n }\n }\n }\n };\n\n proto.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return createIterator(items);\n };\n\n proto.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return createIterator(items);\n };\n\n proto.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return createIterator(items);\n };\n\n if (iteratorSupported) {\n proto[Symbol.iterator] = proto.entries;\n }\n\n proto.toString = function () {\n var searchArray = [];\n this.forEach(function (value, name) {\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n });\n return searchArray.join('&');\n };\n\n global.URLSearchParams = URLSearchParams;\n };\n\n var checkIfURLSearchParamsSupported = function checkIfURLSearchParamsSupported() {\n try {\n var URLSearchParams = global.URLSearchParams;\n return new URLSearchParams('?a=1').toString() === 'a=1' && typeof URLSearchParams.prototype.set === 'function' && typeof URLSearchParams.prototype.entries === 'function';\n } catch (e) {\n return false;\n }\n };\n\n if (!checkIfURLSearchParamsSupported()) {\n polyfillURLSearchParams();\n }\n\n var proto = global.URLSearchParams.prototype;\n\n if (typeof proto.sort !== 'function') {\n proto.sort = function () {\n var _this = this;\n\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n\n if (!_this._entries) {\n _this.delete(name);\n }\n });\n items.sort(function (a, b) {\n if (a[0] < b[0]) {\n return -1;\n } else if (a[0] > b[0]) {\n return +1;\n } else {\n return 0;\n }\n });\n\n if (_this._entries) {\n // force reset because IE keeps keys index\n _this._entries = {};\n }\n\n for (var i = 0; i < items.length; i++) {\n this.append(items[i][0], items[i][1]);\n }\n };\n }\n\n if (typeof proto._fromString !== 'function') {\n Object.defineProperty(proto, '_fromString', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value(searchString) {\n if (this._entries) {\n this._entries = {};\n } else {\n var keys = [];\n this.forEach(function (value, name) {\n keys.push(name);\n });\n\n for (var i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n }\n\n searchString = searchString.replace(/^\\?/, '');\n var attributes = searchString.split('&');\n var attribute;\n\n for (var i = 0; i < attributes.length; i++) {\n attribute = attributes[i].split('=');\n this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n }\n }\n });\n } // HTMLAnchorElement\n\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n (function (global) {\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 */\n var checkIfURLIsSupported = function checkIfURLIsSupported() {\n try {\n var u = new global.URL('b', 'http://a');\n u.pathname = 'c d';\n return u.href === 'http://a/c%20d' && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n\n var polyfillURL = function polyfillURL() {\n var _URL = global.URL;\n\n var URL = function URL(url, base) {\n if (typeof url !== 'string') url = String(url);\n if (base && typeof base !== 'string') base = String(base); // Only create another document if the base is different from current location.\n\n var doc = document,\n baseElement;\n\n if (base && (global.location === void 0 || base !== global.location.href)) {\n base = base.toLowerCase();\n doc = document.implementation.createHTMLDocument('');\n baseElement = doc.createElement('base');\n baseElement.href = base;\n doc.head.appendChild(baseElement);\n\n try {\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n } catch (err) {\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\n }\n }\n\n var anchorElement = doc.createElement('a');\n anchorElement.href = url;\n\n if (baseElement) {\n doc.body.appendChild(anchorElement);\n anchorElement.href = anchorElement.href; // force href to refresh\n }\n\n var inputElement = doc.createElement('input');\n inputElement.type = 'url';\n inputElement.value = url;\n\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || !inputElement.checkValidity() && !base) {\n throw new TypeError('Invalid URL');\n }\n\n Object.defineProperty(this, '_anchorElement', {\n value: anchorElement\n }); // create a linked searchParams which reflect its changes on URL\n\n var searchParams = new global.URLSearchParams(this.search);\n var enableSearchUpdate = true;\n var enableSearchParamsUpdate = true;\n\n var _this = this;\n\n ['append', 'delete', 'set'].forEach(function (methodName) {\n var method = searchParams[methodName];\n\n searchParams[methodName] = function () {\n method.apply(searchParams, arguments);\n\n if (enableSearchUpdate) {\n enableSearchParamsUpdate = false;\n _this.search = searchParams.toString();\n enableSearchParamsUpdate = true;\n }\n };\n });\n Object.defineProperty(this, 'searchParams', {\n value: searchParams,\n enumerable: true\n });\n var search = void 0;\n Object.defineProperty(this, '_updateSearchParams', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value() {\n if (this.search !== search) {\n search = this.search;\n\n if (enableSearchParamsUpdate) {\n enableSearchUpdate = false;\n\n this.searchParams._fromString(this.search);\n\n enableSearchUpdate = true;\n }\n }\n }\n });\n };\n\n var proto = URL.prototype;\n\n var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) {\n Object.defineProperty(proto, attributeName, {\n get: function get() {\n return this._anchorElement[attributeName];\n },\n set: function set(value) {\n this._anchorElement[attributeName] = value;\n },\n enumerable: true\n });\n };\n\n ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n linkURLWithAnchorAttribute(attributeName);\n });\n Object.defineProperty(proto, 'search', {\n get: function get() {\n return this._anchorElement['search'];\n },\n set: function set(value) {\n this._anchorElement['search'] = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n });\n Object.defineProperties(proto, {\n 'toString': {\n get: function get() {\n var _this = this;\n\n return function () {\n return _this.href;\n };\n }\n },\n 'href': {\n get: function get() {\n return this._anchorElement.href.replace(/\\?$/, '');\n },\n set: function set(value) {\n this._anchorElement.href = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n },\n 'pathname': {\n get: function get() {\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n },\n set: function set(value) {\n this._anchorElement.pathname = value;\n },\n enumerable: true\n },\n 'origin': {\n get: function get() {\n // get expected port from protocol\n var expectedPort = {\n 'http:': 80,\n 'https:': 443,\n 'ftp:': 21\n }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port\n // and it is not empty f.e http://foo:8080\n // 8080 != 80 && 8080 != ''\n\n var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n },\n enumerable: true\n },\n 'password': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n },\n 'username': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n }\n });\n\n URL.createObjectURL = function (blob) {\n return _URL.createObjectURL.apply(_URL, arguments);\n };\n\n URL.revokeObjectURL = function (url) {\n return _URL.revokeObjectURL.apply(_URL, arguments);\n };\n\n global.URL = URL;\n };\n\n if (!checkIfURLIsSupported()) {\n polyfillURL();\n }\n\n if (global.location !== void 0 && !('origin' in global.location)) {\n var getOrigin = function getOrigin() {\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n };\n\n try {\n Object.defineProperty(global.location, 'origin', {\n get: getOrigin,\n enumerable: true\n });\n } catch (e) {\n setInterval(function () {\n global.location.origin = getOrigin();\n }, 100);\n }\n }\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\n var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/679\n var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n });\n\n var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\n var isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n };\n\n var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n // `Array.prototype.concat` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.concat\n // with adding support of @@isConcatSpreadable and @@species\n _export({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n });\n\n var $filter = arrayIteration.filter;\n\n\n\n var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('filter');\n // Edge 14- issue\n var USES_TO_LENGTH$3 = arrayMethodUsesToLength('filter');\n\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n // with adding support of @@species\n _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$3 }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n var $find = arrayIteration.find;\n\n\n\n var FIND = 'find';\n var SKIPS_HOLES = true;\n\n var USES_TO_LENGTH$4 = arrayMethodUsesToLength(FIND);\n\n // Shouldn't skip holes\n if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n _export({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH$4 }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n addToUnscopables(FIND);\n\n var ITERATOR$7 = wellKnownSymbol('iterator');\n var SAFE_CLOSING = false;\n\n try {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR$7] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n } catch (error) { /* empty */ }\n\n var checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR$7] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n };\n\n var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n });\n\n // `Array.from` method\n // https://tc39.github.io/ecma262/#sec-array.from\n _export({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: arrayFrom\n });\n\n var $includes = arrayIncludes.includes;\n\n\n\n var USES_TO_LENGTH$5 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n _export({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$5 }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n addToUnscopables('includes');\n\n var $map = arrayIteration.map;\n\n\n\n var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('map');\n // FF49- issue\n var USES_TO_LENGTH$6 = arrayMethodUsesToLength('map');\n\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n // with adding support of @@species\n _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // makes subclassing work correct for wrapped built-ins\n var inheritIfRequired = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n objectSetPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) objectSetPrototypeOf($this, NewTargetPrototype);\n return $this;\n };\n\n // a string of all valid unicode whitespaces\n // eslint-disable-next-line max-len\n var whitespaces = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n var whitespace = '[' + whitespaces + ']';\n var ltrim = RegExp('^' + whitespace + whitespace + '*');\n var rtrim = RegExp(whitespace + whitespace + '*$');\n\n // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\n var createMethod$3 = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n };\n\n var stringTrim = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod$3(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod$3(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod$3(3)\n };\n\n var getOwnPropertyNames = objectGetOwnPropertyNames.f;\n var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n var defineProperty$5 = objectDefineProperty.f;\n var trim = stringTrim.trim;\n\n var NUMBER = 'Number';\n var NativeNumber = global_1[NUMBER];\n var NumberPrototype = NativeNumber.prototype;\n\n // Opera ~12 has broken Object#toString\n var BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;\n\n // `ToNumber` abstract operation\n // https://tc39.github.io/ecma262/#sec-tonumber\n var toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n // `Number` constructor\n // https://tc39.github.io/ecma262/#sec-number-constructor\n if (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys$1 = descriptors ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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$1.length > j; j++) {\n if (has(NativeNumber, key = keys$1[j]) && !has(NumberWrapper, key)) {\n defineProperty$5(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global_1, NUMBER, NumberWrapper);\n }\n\n var FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); });\n\n // `Object.keys` method\n // https://tc39.github.io/ecma262/#sec-object.keys\n _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return objectKeys(toObject(it));\n }\n });\n\n var notARegexp = function (it) {\n if (isRegexp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n };\n\n var MATCH$1 = wellKnownSymbol('match');\n\n var correctIsRegexpLogic = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH$1] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n };\n\n // `String.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.includes\n _export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n var freezing = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n });\n\n var internalMetadata = createCommonjsModule(function (module) {\n var defineProperty = objectDefineProperty.f;\n\n\n\n var METADATA = uid('meta');\n var id = 0;\n\n var isExtensible = Object.isExtensible || function () {\n return true;\n };\n\n var setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n };\n\n var fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n };\n\n var getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n };\n\n // add metadata on freeze-family methods calling\n var onFreeze = function (it) {\n if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n };\n\n var meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n };\n\n hiddenKeys[METADATA] = true;\n });\n var internalMetadata_1 = internalMetadata.REQUIRED;\n var internalMetadata_2 = internalMetadata.fastKey;\n var internalMetadata_3 = internalMetadata.getWeakData;\n var internalMetadata_4 = internalMetadata.onFreeze;\n\n var Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n };\n\n var iterate = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = functionBindContext(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n };\n\n var collection = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global_1[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n internalMetadata.REQUIRED = true;\n } else if (isForced_1(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n _export({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n };\n\n var getWeakData = internalMetadata.getWeakData;\n\n\n\n\n\n\n\n\n var setInternalState$5 = internalState.set;\n var internalStateGetterFor = internalState.getterFor;\n var find$1 = arrayIteration.find;\n var findIndex = arrayIteration.findIndex;\n var id$1 = 0;\n\n // fallback for uncaught frozen keys\n var uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n };\n\n var UncaughtFrozenStore = function () {\n this.entries = [];\n };\n\n var findUncaughtFrozen = function (store, key) {\n return find$1(store.entries, function (it) {\n return it[0] === key;\n });\n };\n\n UncaughtFrozenStore.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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n };\n\n var collectionWeak = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState$5(that, {\n type: CONSTRUCTOR_NAME,\n id: id$1++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && has(data, state.id) && delete data[state.id];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has$1(key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n };\n\n var es_weakMap = createCommonjsModule(function (module) {\n\n\n\n\n\n\n var enforceIternalState = internalState.enforce;\n\n\n var IS_IE11 = !global_1.ActiveXObject && 'ActiveXObject' in global_1;\n var isExtensible = Object.isExtensible;\n var InternalWeakMap;\n\n var wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n };\n\n // `WeakMap` constructor\n // https://tc39.github.io/ecma262/#sec-weakmap-constructor\n var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n // IE11 WeakMap frozen keys fix\n // We can't use feature detection because it crash some old IE builds\n // https://github.com/zloirock/core-js/issues/485\n if (nativeWeakMap && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n internalMetadata.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n }\n });\n\n var $every = arrayIteration.every;\n\n\n\n var STRICT_METHOD$3 = arrayMethodIsStrict('every');\n var USES_TO_LENGTH$7 = arrayMethodUsesToLength('every');\n\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$3 || !USES_TO_LENGTH$7 }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // `Object.assign` method\n // https://tc39.github.io/ecma262/#sec-object.assign\n _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\n assign: objectAssign\n });\n\n var non = '\\u200B\\u0085\\u180E';\n\n // check that a method works with the correct list\n // of whitespaces and has a correct name\n var stringTrimForced = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n };\n\n var $trim = stringTrim.trim;\n\n\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n _export({ target: 'String', proto: true, forced: stringTrimForced('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n });\n\n var $some = arrayIteration.some;\n\n\n\n var STRICT_METHOD$4 = arrayMethodIsStrict('some');\n var USES_TO_LENGTH$8 = arrayMethodUsesToLength('some');\n\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 || !USES_TO_LENGTH$8 }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // `thisNumberValue` abstract operation\n // https://tc39.github.io/ecma262/#sec-thisnumbervalue\n var thisNumberValue = function (value) {\n if (typeof value != 'number' && classofRaw(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n };\n\n // `String.prototype.repeat` method implementation\n // https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n var stringRepeat = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n };\n\n var nativeToFixed = 1.0.toFixed;\n var floor$4 = Math.floor;\n\n var pow$1 = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow$1(x, n - 1, acc * x) : pow$1(x * x, n / 2, acc);\n };\n\n var log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n };\n\n var FORCED$1 = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n ) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n });\n\n // `Number.prototype.toFixed` method\n // https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n _export({ target: 'Number', proto: true, forced: FORCED$1 }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor$4(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor$4(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow$1(2, 69, 1)) - 69;\n z = e < 0 ? number * pow$1(2, -e, 1) : number / pow$1(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow$1(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + stringRepeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + stringRepeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n });\n\n var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\n // `Object.{ entries, values }` methods implementation\n var createMethod$4 = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!descriptors || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n };\n\n var objectToArray = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod$4(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod$4(false)\n };\n\n var $entries = objectToArray.entries;\n\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n _export({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n });\n\n var $values = objectToArray.values;\n\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n _export({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n });\n\n // `Number.isNaN` method\n // https://tc39.github.io/ecma262/#sec-number.isnan\n _export({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n });\n\n var nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\n\n var FAILS_ON_PRIMITIVES$1 = fails(function () { nativeGetOwnPropertyDescriptor$2(1); });\n var FORCED$2 = !descriptors || FAILS_ON_PRIMITIVES$1;\n\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n _export({ target: 'Object', stat: true, forced: FORCED$2, sham: !descriptors }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key);\n }\n });\n\n // `Object.getOwnPropertyDescriptors` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n _export({ target: 'Object', stat: true, sham: !descriptors }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n });\n\n // @@match logic\n fixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regexpExecAbstract(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regexpExecAbstract(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n });\n\n function _classCallCheck$1(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function _defineProperties$1(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n }\n\n function _createClass$1(e, t, n) {\n return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n }\n\n function _defineProperty$1(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n\n function ownKeys$2(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n\n return n;\n }\n\n function _objectSpread2$1(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys$2(Object(n), !0).forEach(function (t) {\n _defineProperty$1(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$2(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n }\n\n var defaults = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n };\n\n function matches(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n }\n\n function trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n }\n\n var getConstructor = function getConstructor(e) {\n return null != e ? e.constructor : null;\n },\n instanceOf = function instanceOf(e, t) {\n return !!(e && t && e instanceof t);\n },\n isNullOrUndefined = function isNullOrUndefined(e) {\n return null == e;\n },\n isObject$1 = function isObject(e) {\n return getConstructor(e) === Object;\n },\n isNumber = function isNumber(e) {\n return getConstructor(e) === Number && !Number.isNaN(e);\n },\n isString = function isString(e) {\n return getConstructor(e) === String;\n },\n isBoolean = function isBoolean(e) {\n return getConstructor(e) === Boolean;\n },\n isFunction = function isFunction(e) {\n return getConstructor(e) === Function;\n },\n isArray$1 = function isArray(e) {\n return Array.isArray(e);\n },\n isNodeList = function isNodeList(e) {\n return instanceOf(e, NodeList);\n },\n isElement = function isElement(e) {\n return instanceOf(e, Element);\n },\n isEvent = function isEvent(e) {\n return instanceOf(e, Event);\n },\n isEmpty = function isEmpty(e) {\n return isNullOrUndefined(e) || (isString(e) || isArray$1(e) || isNodeList(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n },\n is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject$1,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray$1,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n };\n\n function getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n }\n\n function round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n\n return Math.round(e / t) * t;\n }\n\n var RangeTouch = function () {\n function e(t, n) {\n _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());\n }\n\n return _createClass$1(e, [{\n key: \"init\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function value(e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function value(t) {\n if (!e.enabled || !is.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function value(t) {\n e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function value(t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type=\"range\"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\n var i = _objectSpread2$1({}, defaults, {}, n);\n\n if (is.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is.element(n) && matches(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n }();\n\n var nativePromiseConstructor = global_1.Promise;\n\n var SPECIES$5 = wellKnownSymbol('species');\n\n var setSpecies = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = objectDefineProperty.f;\n\n if (descriptors && Constructor && !Constructor[SPECIES$5]) {\n defineProperty(Constructor, SPECIES$5, {\n configurable: true,\n get: function () { return this; }\n });\n }\n };\n\n var engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent);\n\n var engineIsNode = classofRaw(global_1.process) == 'process';\n\n var location = global_1.location;\n var set$1 = global_1.setImmediate;\n var clear = global_1.clearImmediate;\n var process$1 = global_1.process;\n var MessageChannel = global_1.MessageChannel;\n var Dispatch = global_1.Dispatch;\n var counter = 0;\n var queue = {};\n var ONREADYSTATECHANGE = 'onreadystatechange';\n var defer, channel, port;\n\n var run = function (id) {\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 };\n\n var runner = function (id) {\n return function () {\n run(id);\n };\n };\n\n var listener = function (event) {\n run(event.data);\n };\n\n var post = function (id) {\n // old engines have not location.origin\n global_1.postMessage(id + '', location.protocol + '//' + location.host);\n };\n\n // Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n if (!set$1 || !clear) {\n set$1 = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (engineIsNode) {\n defer = function (id) {\n process$1.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !engineIsIos) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = functionBindContext(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 (\n global_1.addEventListener &&\n typeof postMessage == 'function' &&\n !global_1.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global_1.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {\n defer = function (id) {\n html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n }\n\n var task = {\n set: set$1,\n clear: clear\n };\n\n var getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;\n var macrotask = task.set;\n\n\n\n var MutationObserver$1 = global_1.MutationObserver || global_1.WebKitMutationObserver;\n var document$2 = global_1.document;\n var process$2 = global_1.process;\n var Promise$1 = global_1.Promise;\n // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\n var queueMicrotaskDescriptor = getOwnPropertyDescriptor$3(global_1, 'queueMicrotask');\n var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\n var flush, head, last, notify, toggle, node, promise, then;\n\n // modern engines have queueMicrotask method\n if (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (engineIsNode && (parent = process$2.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!engineIsIos && !engineIsNode && MutationObserver$1 && document$2) {\n toggle = true;\n node = document$2.createTextNode('');\n new MutationObserver$1(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise$1 && Promise$1.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise$1.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (engineIsNode) {\n notify = function () {\n process$2.nextTick(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_1, flush);\n };\n }\n }\n\n var microtask = queueMicrotask || 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 var PromiseCapability = function (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$1(resolve);\n this.reject = aFunction$1(reject);\n };\n\n // 25.4.1.5 NewPromiseCapability(C)\n var f$7 = function (C) {\n return new PromiseCapability(C);\n };\n\n var newPromiseCapability = {\n \tf: f$7\n };\n\n var promiseResolve = 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\n var hostReportErrors = function (a, b) {\n var console = global_1.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n };\n\n var perform = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n };\n\n var task$1 = task.set;\n\n\n\n\n\n\n\n\n\n\n\n var SPECIES$6 = wellKnownSymbol('species');\n var PROMISE = 'Promise';\n var getInternalState$3 = internalState.get;\n var setInternalState$6 = internalState.set;\n var getInternalPromiseState = internalState.getterFor(PROMISE);\n var PromiseConstructor = nativePromiseConstructor;\n var TypeError$1 = global_1.TypeError;\n var document$3 = global_1.document;\n var process$3 = global_1.process;\n var $fetch$1 = getBuiltIn('fetch');\n var newPromiseCapability$1 = newPromiseCapability.f;\n var newGenericPromiseCapability = newPromiseCapability$1;\n var DISPATCH_EVENT = !!(document$3 && document$3.createEvent && global_1.dispatchEvent);\n var NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\n var UNHANDLED_REJECTION = 'unhandledrejection';\n var REJECTION_HANDLED = 'rejectionhandled';\n var PENDING = 0;\n var FULFILLED = 1;\n var REJECTED = 2;\n var HANDLED = 1;\n var UNHANDLED = 2;\n var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n var FORCED$3 = isForced_1(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (engineV8Version === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!engineIsNode && !NATIVE_REJECTION_EVENT) return true;\n }\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES$6] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n });\n\n var INCORRECT_ITERATION$1 = FORCED$3 || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n });\n\n // helpers\n var isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n };\n\n var notify$1 = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError$1('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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n };\n\n var dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document$3.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global_1.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global_1['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n };\n\n var onUnhandled = function (state) {\n task$1.call(global_1, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (engineIsNode) {\n process$3.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = engineIsNode || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n };\n\n var isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n };\n\n var onHandleUnhandled = function (state) {\n task$1.call(global_1, function () {\n var promise = state.facade;\n if (engineIsNode) {\n process$3.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n };\n\n var bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n };\n\n var internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify$1(state, true);\n };\n\n var internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError$1(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify$1(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n };\n\n // constructor polyfill\n if (FORCED$3) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction$1(executor);\n Internal.call(this);\n var state = getInternalState$3(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState$6(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = engineIsNode ? process$3.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify$1(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState$3(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapability.f = newPromiseCapability$1 = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if ( typeof nativePromiseConstructor == 'function') {\n nativeThen = nativePromiseConstructor.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch$1 == 'function') _export({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch$1.apply(global_1, arguments));\n }\n });\n }\n }\n\n _export({ global: true, wrap: true, forced: FORCED$3 }, {\n Promise: PromiseConstructor\n });\n\n setToStringTag(PromiseConstructor, PROMISE, false);\n setSpecies(PROMISE);\n\n PromiseWrapper = getBuiltIn(PROMISE);\n\n // statics\n _export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability$1(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n });\n\n _export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve( this, x);\n }\n });\n\n _export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability$1(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction$1(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability$1(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction$1(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n });\n\n var getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n var nativeStartsWith = ''.startsWith;\n var min$4 = Math.min;\n\n var CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic('startsWith');\n // https://github.com/zloirock/core-js/pull/702\n var MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor$4(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n }();\n\n // `String.prototype.startsWith` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n _export({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegexp(searchString);\n var index = toLength(min$4(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n });\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n var getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n };\n\n var instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n };\n\n var isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n };\n\n var isObject$2 = function isObject(input) {\n return getConstructor$1(input) === Object;\n };\n\n var isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n };\n\n var isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n };\n\n var isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n };\n\n var isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n };\n\n var isArray$2 = function isArray(input) {\n return Array.isArray(input);\n };\n\n var isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n };\n\n var isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n };\n\n var isElement$1 = function isElement(input) {\n return instanceOf$1(input, Element);\n };\n\n var isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n };\n\n var isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n };\n\n var isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n };\n\n var isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n };\n\n var isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n };\n\n var isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise) && isFunction$1(input.then);\n };\n\n var isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$2(input) || isNodeList$1(input)) && !input.length || isObject$2(input) && !Object.keys(input).length;\n };\n\n var isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n };\n\n var is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$2,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$2,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n };\n\n var transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n }(); // Force repaint of element\n\n function repaint(element, delay) {\n setTimeout(function () {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n element.hidden = false;\n } catch (e) {// Do nothing\n }\n }, delay);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n var browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\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\n // `Array.prototype.{ reduce, reduceRight }` methods implementation\n var createMethod$5 = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction$1(callbackfn);\n var O = toObject(that);\n var self = indexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n };\n\n var arrayReduce = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod$5(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod$5(true)\n };\n\n var $reduce = arrayReduce.left;\n\n\n\n\n\n var STRICT_METHOD$5 = arrayMethodIsStrict('reduce');\n var USES_TO_LENGTH$9 = arrayMethodUsesToLength('reduce', { 1: 0 });\n // Chrome 80-82 has a critical bug\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\n var CHROME_BUG = !engineIsNode && engineV8Version > 79 && engineV8Version < 83;\n\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$5 || !USES_TO_LENGTH$9 || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n } // Get a nested value in an object\n\n function getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n } // Deep extend destination object with N more objects\n\n function extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n }\n\n function wrap$1(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // 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\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n } // Set attributes\n\n function setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n } // Create a DocumentFragment\n\n function createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n } // Inaert an element after another\n\n function insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n } // Insert a DocumentFragment\n\n function insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n } // Remove element(s)\n\n function removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n } // Remove all child elements\n\n function emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n } // Replace element\n\n function replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n } // Get an attribute object from a string selector\n\n 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 if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = extend({}, existingAttributes);\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n\n var _parts = _slicedToArray(parts, 1),\n key = _parts[0];\n\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.string(existing.class)) {\n attributes.class = \"\".concat(existing.class, \" \").concat(className);\n } else {\n attributes.class = className;\n }\n\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 break;\n }\n });\n return extend(existing, attributes);\n } // Toggle hidden\n\n function toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n } // eslint-disable-next-line no-param-reassign\n\n\n element.hidden = hide;\n } // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\n function toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\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 } // Has class name\n\n function hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n } // Element matches selector\n\n function matches$1(element, selector) {\n var _Element = Element,\n prototype = _Element.prototype;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n } // Closest ancestor element matching selector (also tests element itself)\n\n function closest(element, selector) {\n var _Element2 = Element,\n prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n function closestElement() {\n var el = this;\n\n do {\n if (matches$1.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n }\n\n var method = prototype.closest || closestElement;\n return method.call(element, selector);\n } // Find all elements\n\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n } // Find a single element\n\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n } // Set focus and tab focus class\n\n function setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n }\n\n var 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 }; // Check for feature support\n\n var support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\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: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\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 // Detect transitions support\n transitions: transitionEndEvent !== false,\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\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n\n var supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n }(); // Toggle event listener\n\n\n function toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n } // Bind event handler\n\n function on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n } // Unbind event handler\n\n function off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n } // Bind once-only event handler\n\n function once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n } // Trigger event\n\n function triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n } // Unbind all cached event listeners\n\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n } // Run method when / if player is ready\n\n function ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n }\n\n /**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n\n function silencePromise(value) {\n if (is$1.promise(value)) {\n value.then(null, function () {});\n }\n }\n\n function validateRatio(input) {\n if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {\n return false;\n }\n\n var ratio = is$1.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is$1.number);\n }\n function reduceAspectRatio(ratio) {\n if (!is$1.array(ratio) || !ratio.every(is$1.number)) {\n return null;\n }\n\n var _ratio = _slicedToArray(ratio, 2),\n width = _ratio[0],\n height = _ratio[1];\n\n var getDivider = function getDivider(w, h) {\n return h === 0 ? w : getDivider(h, w % h);\n };\n\n var divider = getDivider(width, height);\n return [width / divider, height / divider];\n }\n function getAspectRatio(input) {\n var parse = function parse(ratio) {\n return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n }; // Try provided ratio\n\n\n var ratio = parse(input); // Get from config\n\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n } // Get from embed\n\n\n if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {\n ratio = this.embed.ratio;\n } // Get from HTML5 video\n\n\n if (ratio === null && this.isHTML5) {\n var _this$media = this.media,\n videoWidth = _this$media.videoWidth,\n videoHeight = _this$media.videoHeight;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n } // Set aspect ratio for responsive container\n\n function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n var wrapper = this.elements.wrapper;\n var ratio = getAspectRatio.call(this, input);\n\n var _ref = is$1.array(ratio) ? ratio : [0, 0],\n _ref2 = _slicedToArray(_ref, 2),\n w = _ref2[0],\n h = _ref2[1];\n\n var padding = 100 / w * h;\n wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n var offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n }\n\n var html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n } // Get sizes from <source> elements\n\n\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('size'));\n }).filter(Boolean);\n },\n setup: function setup() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n if (!is$1.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n } // Quality\n\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (s) {\n return s.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('size'));\n },\n set: function set(input) {\n if (player.quality === input) {\n return;\n } // If we're using an an external handler...\n\n\n if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (s) {\n return Number(s.getAttribute('size')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState,\n playbackRate = _player$media.playbackRate; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.speed = playbackRate;\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n silencePromise(player.play());\n }\n }); // Load new source\n\n player.media.load();\n }\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // 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\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n };\n\n function dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n } // Get the closest value in an array\n\n function closest$1(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n }\n\n var defineProperty$6 = objectDefineProperty.f;\n var getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;\n\n\n\n\n\n var setInternalState$7 = internalState.set;\n\n\n\n var MATCH$2 = wellKnownSymbol('match');\n var NativeRegExp = global_1.RegExp;\n var RegExpPrototype$1 = NativeRegExp.prototype;\n var re1 = /a/g;\n var re2 = /a/g;\n\n // \"new\" should create a new object, old webkit bug\n var CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\n var UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y;\n\n var FORCED$4 = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$2 || fails(function () {\n re2[MATCH$2] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n })));\n\n // `RegExp` constructor\n // https://tc39.github.io/ecma262/#sec-regexp-constructor\n if (FORCED$4) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegexp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = regexpFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y$2) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype$1,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y$2 && sticky) setInternalState$7(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty$6(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys$2 = getOwnPropertyNames$1(NativeRegExp);\n var index = 0;\n while (keys$2.length > index) proxy(keys$2[index++]);\n RegExpPrototype$1.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype$1;\n redefine(global_1, 'RegExp', RegExpWrapper);\n }\n\n // https://tc39.github.io/ecma262/#sec-get-regexp-@@species\n setSpecies('RegExp');\n\n function generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n } // Format string\n\n function format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n } // Get percentage\n\n 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 } // Replace all occurances of a string in a string\n\n var replaceAll = function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n }; // Convert to title case\n\n var toTitleCase = function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n }; // Convert string to pascalCase\n\n function toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n } // Convert string to pascalCase\n\n function toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n } // Remove HTML from a string\n\n function stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n } // Like outerHTML, but also works for DocumentFragment\n\n function getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n var resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n var i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n k = _ref2[0],\n v = _ref2[1];\n\n string = replaceAll(string, k, v);\n });\n return string;\n }\n };\n\n var Storage = /*#__PURE__*/function () {\n function Storage(player) {\n _classCallCheck(this, Storage);\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, [{\n key: \"get\",\n value: function get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n }\n }, {\n key: \"set\",\n value: function set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = this.get(); // Default to empty object\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n }], [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // 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\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n }();\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n function fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\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 request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n }\n\n // ==========================================================================\n\n function loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n }\n\n var ceil$1 = Math.ceil;\n var floor$5 = Math.floor;\n\n // `Math.trunc` method\n // https://tc39.github.io/ecma262/#sec-math.trunc\n _export({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor$5 : ceil$1)(it);\n }\n });\n\n var getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n };\n var getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n };\n var getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n }; // Format time to UI friendly string\n\n function formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n }\n\n var controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\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 }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\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 }; // Display\n\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 }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\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); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // 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\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n\n var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var _this = this;\n\n var attributes = extend({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some(function (c) {\n return c === _this.config.classNames.control;\n })) {\n extend(attributes, {\n class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.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 // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\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 }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type, attrs) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\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: function bindMenuItemShortcuts(menuItem, type) {\n var _this2 = this;\n\n // Navigate through menus via arrow keys and space\n on.call(this, menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this2, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this2, target, true);\n }\n }\n }, false); // 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\n on.call(this, menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this2, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this3 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(check) {\n // Ensure exclusivity\n if (check) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this3.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this3.quality = value;\n break;\n\n case 'speed':\n _this3.speed = parseFloat(value);\n break;\n }\n\n controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this4 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var val = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = val; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = val;\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); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this5 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(show) {\n return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n\n if (is$1.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 } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function 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 } // 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\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(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 // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this6.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this6, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this6.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this6, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this6, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\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 if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this7.captions.toggled && _this7.currentTrack === value,\n title: captions.getLabel.call(_this7, track),\n badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu() {\n var _this8 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n this.options.speed = this.options.speed.filter(function (o) {\n return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this8, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this8, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (p) {\n return !p.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;\n var isMenuItem = popup.contains(target); // 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\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.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$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this9 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function 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 } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this9, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl: function setDownloadUrl() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set attribute\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create: function create(data) {\n var _this10 = this;\n\n var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n createButton = controls.createButton,\n createProgress = controls.createProgress,\n createRange = controls.createRange,\n createTime = controls.createTime,\n setQualityMenu = controls.setQualityMenu,\n setSpeedMenu = controls.setSpeedMenu,\n showMenuPanel = controls.showMenuPanel;\n this.elements.controls = null; // Larger overlaid play button\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n } // Create the container\n\n\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container; // Default item attributes\n\n var defaultAttributes = {\n class: 'plyr__controls__item'\n }; // Loop through controls in order\n\n dedupe(is$1.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n } // Rewind button\n\n\n if (control === 'rewind') {\n container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n } // Play/Pause button\n\n\n if (control === 'play') {\n container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n } // Fast forward button\n\n\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n } // Progress\n\n\n if (control === 'progress') {\n var progressContainer = createElement('div', {\n class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n });\n var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(createRange.call(_this10, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (_this10.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: _this10.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n _this10.elements.display.seekTooltip = tooltip;\n }\n\n _this10.elements.progress = progress;\n progressContainer.appendChild(_this10.elements.progress);\n container.appendChild(progressContainer);\n } // Media current time display\n\n\n if (control === 'current-time') {\n container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n } // Media duration display\n\n\n if (control === 'duration') {\n container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n } // Volume controls\n\n\n if (control === 'mute' || control === 'volume') {\n var volume = _this10.elements.volume; // Create the volume container if needed\n\n if (!is$1.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n }));\n _this10.elements.volume = volume;\n container.appendChild(volume);\n } // Toggle mute button\n\n\n if (control === 'mute') {\n volume.appendChild(createButton.call(_this10, 'mute'));\n } // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: _this10.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n }\n } // Toggle captions button\n\n\n if (control === 'captions') {\n container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n } // Settings button / menu\n\n\n if (control === 'settings' && !is$1.empty(_this10.config.settings)) {\n var wrapper = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(_this10, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n _this10.elements.settings.panels.home = home; // Build the menu items\n\n _this10.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n on.call(_this10, menuItem, 'click', function () {\n showMenuPanel.call(_this10, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this10.config));\n var value = createElement('span', {\n class: _this10.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this10.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this10.config.classNames.hidden\n }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n on.call(_this10, pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n showMenuPanel.call(_this10, 'home', true);\n }, false); // Go back via button click\n\n on.call(_this10, backButton, 'click', function () {\n showMenuPanel.call(_this10, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this10.elements.settings.buttons[type] = menuItem;\n _this10.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n _this10.elements.settings.popup = popup;\n _this10.elements.settings.menu = wrapper;\n } // Picture in picture button\n\n\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n } // Airplay button\n\n\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n } // Download button\n\n\n if (control === 'download') {\n var _attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: _this10.download,\n target: '_blank'\n }); // Set download attribute for HTML5 only\n\n\n if (_this10.isHTML5) {\n _attributes.download = '';\n }\n\n var download = _this10.config.urls.download;\n\n if (!is$1.url(download) && _this10.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(_this10.provider),\n label: _this10.provider\n });\n }\n\n container.appendChild(createButton.call(_this10, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n }\n }); // Set available quality levels\n\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this11 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.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) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this11.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this11.config.classNames.hidden, false);\n toggleClass(label, _this11.config.classNames.tooltip, true);\n });\n }\n }\n };\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 */\n\n function parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var 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 } // Convert object to URLSearchParams\n\n function buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n }\n\n var captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\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\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n } // Add event listener for cue changes\n\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n 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\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n } // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n\n\n setTimeout(function () {\n if (active && _this2.captions.toggled) {\n _this2.captions.currentTrackNode.mode = 'hidden';\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: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.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 var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\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 // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\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: function getTracks() {\n var _this3 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // 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\n return tracks.filter(function (track) {\n return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this4 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this4.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (t) {\n return t.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.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 // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var 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 var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n var defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\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 // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\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 // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 // URLs\n urls: {\n download: null,\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/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\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 download: '[data-plyr=\"download\"]',\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',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\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 tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n var pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n var providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n var types = {\n audio: 'audio',\n video: 'video'\n };\n /**\n * Get provider by URL\n * @param {String} url\n */\n\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n var noop = function noop() {};\n\n var Console = /*#__PURE__*/function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n }();\n\n var Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(player) {\n var _this = this;\n\n _classCallCheck(this, Fullscreen);\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n\n this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n _this.onChange();\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n }); // Tap focus when in fullscreen\n\n on.call(this, this.player.elements.container, 'keydown', function (event) {\n return _this.trapFocus(event);\n }); // Update the UI\n\n this.update();\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"onChange\",\n value: function onChange() {\n if (!this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = this.active;\n } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event\n\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n }, {\n key: \"toggleFallback\",\n value: function toggleFallback() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\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 } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n }\n } // Toggle button and fire events\n\n\n this.onChange();\n } // Trap focus inside container\n\n }, {\n key: \"trapFocus\",\n value: function trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n var _focusable = _slicedToArray(focusable, 1),\n first = _focusable[0];\n\n var last = focusable[focusable.length - 1];\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 } // Update UI\n\n }, {\n key: \"update\",\n value: function update() {\n if (this.enabled) {\n var mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n } // Make an element fullscreen\n\n }, {\n key: \"enter\",\n value: function enter() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is$1.empty(this.prefix)) {\n this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n }\n } // Bail from fullscreen\n\n }, {\n key: \"exit\",\n value: function exit() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(this.prefix)) {\n var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n }\n } // Toggle state\n\n }, {\n key: \"toggle\",\n value: function toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n }, {\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n }();\n\n // `Math.sign` method implementation\n // https://tc39.github.io/ecma262/#sec-math.sign\n var mathSign = 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 // `Math.sign` method\n // https://tc39.github.io/ecma262/#sec-math.sign\n _export({ target: 'Math', stat: true }, {\n sign: mathSign\n });\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 function loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n }\n\n var ui = {\n addStyleHook: function 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 // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset speed\n\n this.speed = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\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\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('data-poster', poster); // Show the poster\n\n this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(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(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\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); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n Object.assign(target, {\n pressed: _this3.playing\n });\n target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controlsElement = this.elements.controls;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles: function migrateStyles() {\n var _this5 = this;\n\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n .filter(function (key) {\n return !is$1.empty(key) && is$1.string(key) && key.startsWith('--plyr');\n }).forEach(function (key) {\n // Set on the container\n _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n _this5.media.style.removeProperty(key);\n }); // Remove attribute if empty\n\n if (is$1.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n };\n\n var Listeners = /*#__PURE__*/function () {\n function Listeners(player) {\n _classCallCheck(this, Listeners);\n\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\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 } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\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 var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n 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)\n\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\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\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\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\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }, {\n key: \"firstTouch\",\n value: function firstTouch() {\n var player = this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n }, {\n key: \"setTabFocus\",\n value: function setTabFocus(event) {\n var player = this.player;\n var elements = player.elements;\n clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n if (event.type !== 'focusout') {\n this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n } // Global window & document listeners\n\n }, {\n key: \"global\",\n value: function global() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);\n } // Container listeners\n\n }, {\n key: \"container\",\n value: function container() {\n var player = this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controlsElement = elements.controls; // Remove button states for fullscreen\n\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio = _slicedToArray(ratio, 2),\n y = _ratio[1];\n\n var _getAspectRatio$call = getAspectRatio.call(player),\n _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n videoX = _getAspectRatio$call2[0],\n videoY = _getAspectRatio$call2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n if (target !== elements.container) {\n return;\n } // If it's not an embed and no ratio specified\n\n\n if (!player.isEmbed && is$1.empty(player.config.ratio)) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n if (isEnter) {\n setTimeout(function () {\n return repaint(elements.container);\n }, 100);\n } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n } // Listen for media events\n\n }, {\n key: \"media\",\n value: function media() {\n var _this = this;\n\n var player = this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n player.pause();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, function () {\n silencePromise(player.play());\n }, 'play');\n } else {\n _this.proxy(event, function () {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadUrl.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n } // Run default and custom handlers\n\n }, {\n key: \"proxy\",\n value: function proxy(event, defaultHandler, customHandlerKey) {\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned !== false && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n } // Trigger custom and default handlers\n\n }, {\n key: \"bind\",\n value: function bind(element, type, defaultHandler, customHandlerKey) {\n var _this2 = this;\n\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this2.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n } // Listen for control events\n\n }, {\n key: \"controls\",\n value: function controls$1() {\n var _this3 = this;\n\n var player = this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this3.bind(button, 'click', function () {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n } // Pause\n\n\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n this.bind(elements.buttons.rewind, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind'); // Rewind\n\n this.bind(elements.buttons.fastForward, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward'); // Mute toggle\n\n this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\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\n this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\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\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this3.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n this.bind(elements.progress, 'mouseleave touchend click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this3.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', function () {\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 } // Volume\n\n\n this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(function (c) {\n return !c.contains(elements.container);\n }).forEach(function (child) {\n _this3.bind(child, 'mouseenter mouseleave', function (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\n\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n }\n }]);\n\n return Listeners;\n }();\n\n var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('splice');\n var USES_TO_LENGTH$a = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n var max$3 = Math.max;\n var min$5 = Math.min;\n var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\n var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n // `Array.prototype.splice` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.splice\n // with adding support of @@species\n _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$a }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min$5(max$3(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n });\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\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 */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function 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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; // tag IE9+\n\n isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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]; // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // resolve Promise\n\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n } // publish bundle load event\n\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\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 */\n\n\n loadjs.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 return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n });\n\n function loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n function parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n var vimeo = {\n setup: function setup() {\n var player = this; // Add embed class for responsive\n\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set intial ratio\n\n setAspectRatio.call(player); // Load the SDK if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(player);\n }).catch(function (error) {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready: function ready() {\n var _this = this;\n\n var player = this;\n var config = player.config.vimeo;\n\n var premium = config.premium,\n referrerPolicy = config.referrerPolicy,\n frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n } // Get Vimeo params for the iframe\n\n\n var params = buildUrlParams(_objectSpread2({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, frameParams)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required\n\n if (!is$1.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n } // Inject the package\n\n\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n var wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n } // Get poster image\n\n\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n if (is$1.empty(response) || !response.thumbnail_url) {\n return;\n } // Set and show poster\n\n\n ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n });\n } // Setup instance\n // https://github.com/vimeo/player.js\n\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function () {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(function (error) {\n _this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = [width, height];\n setAspectRatio.call(_this);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', function () {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', function () {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n }\n };\n\n function parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n function getHost$1(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n } // Use YouTube's default\n\n\n return undefined;\n }\n\n var youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n // Call global callback if set\n if (is$1.function(callback)) {\n callback();\n }\n\n youtube.ready.call(_this);\n }; // Load the SDK\n\n\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n var url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(function (data) {\n if (is$1.object(data)) {\n var title = data.title,\n height = data.height,\n width = data.width; // Set title\n\n _this2.config.title = title;\n ui.setTitle.call(_this2); // Set aspect ratio\n\n _this2.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(_this2);\n }).catch(function () {\n // Set aspect ratio\n setAspectRatio.call(_this2);\n });\n },\n // API ready\n ready: function ready() {\n var player = this;\n var config = player.config.youtube; // Ignore already setup (race condition)\n\n var currentId = player.media && player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Replace media element\n\n var container = createElement('div', {\n id: id,\n 'data-poster': config.customControls ? player.poster : undefined\n });\n player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n if (config.customControls) {\n var posterSrc = function posterSrc(s) {\n return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (src) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n } // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n\n player.embed = new window.YT.Player(player.media, {\n videoId: videoId,\n host: getHost$1(config),\n playerVars: extend({}, {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\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 player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function 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 } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n player.options.speed = speeds.filter(function (s) {\n return player.config.speed.options.includes(s);\n }); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui && config.customControls) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n }\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var 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 } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\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 (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // 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\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\n assurePlaybackState$1.call(player, false);\n break;\n\n case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n };\n\n var media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap$1(this.media, this.elements.wrapper); // Poster image container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: ''\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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\n var destroy = function destroy(instance) {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n } // Destroy our adsManager\n\n\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n };\n\n var Ads = /*#__PURE__*/function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n this.player = player;\n this.config = player.config.ads;\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; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"load\",\n\n /**\n * Load the IMA SDK\n */\n value: function load() {\n var _this2 = this;\n\n if (!this.enabled) {\n return;\n } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n _this2.ready();\n }).catch(function () {\n // Script failed to load or is blocked\n _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n /**\n * Get the ads instance ready\n */\n\n }, {\n key: \"ready\",\n value: function ready() {\n var _this3 = this;\n\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n } // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n\n\n this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n this.managerPromise.then(function () {\n _this3.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n this.listeners(); // Setup the IMA SDK\n\n this.setupIMA();\n } // Build the tag URL\n\n }, {\n key: \"setupIMA\",\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 value: function setupIMA() {\n var _this4 = this;\n\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); // So we can run VPAID2\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Create ads loader\n\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this4.onAdsManagerLoaded(event);\n }, false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this4.onAdError(error);\n }, false); // Request video ads to be pre-loaded\n\n this.requestAds();\n }\n /**\n * Request advertisements\n */\n\n }, {\n key: \"requestAds\",\n value: function requestAds() {\n var container = this.player.elements.container;\n\n try {\n // Request video ads\n var request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!this.player.muted);\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n\n }, {\n key: \"pollCountdown\",\n value: function pollCountdown() {\n var _this5 = this;\n\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n _this5.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n\n }, {\n key: \"onAdsManagerLoaded\",\n value: function onAdsManagerLoaded(event) {\n var _this6 = this;\n\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // 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\n this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n this.cuePoints = this.manager.getCuePoints(); // Add listeners to the required events\n // Advertisement error events\n\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this6.onAdError(error);\n }); // Advertisement regular events\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n return _this6.onAdEvent(e);\n });\n }); // Resolve our adsManager\n\n this.trigger('loaded');\n }\n }, {\n key: \"addCuePoints\",\n value: function addCuePoints() {\n var _this7 = this;\n\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(this.cuePoints)) {\n this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n var seekElement = _this7.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this7.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this7.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\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\n }, {\n key: \"onAdEvent\",\n value: function onAdEvent(event) {\n var _this8 = this;\n\n var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n triggerEvent.call(_this8.player, _this8.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n }; // Bubble the event\n\n\n dispatchEvent(event.type);\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'); // Start countdown\n\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 } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\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 // 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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 this.pauseContent();\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 this.pollCountdown();\n this.resumeContent();\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n }\n }\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n\n }, {\n key: \"onAdError\",\n value: function onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\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\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this9 = this;\n\n var container = this.player.elements.container;\n var time;\n this.player.on('canplay', function () {\n _this9.addCuePoints();\n });\n this.player.on('ended', function () {\n _this9.loader.contentComplete();\n });\n this.player.on('timeupdate', function () {\n time = _this9.player.currentTime;\n });\n this.player.on('seeked', function () {\n var seekedTime = _this9.player.currentTime;\n\n if (is$1.empty(_this9.cuePoints)) {\n return;\n }\n\n _this9.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this9.manager.discardAdBreak();\n\n _this9.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n window.addEventListener('resize', function () {\n if (_this9.manager) {\n _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n /**\n * Initialize the adsManager and start playing advertisements\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var _this10 = this;\n\n var container = this.player.elements.container;\n\n if (!this.managerPromise) {\n this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n this.managerPromise.then(function () {\n // Set volume to match player\n _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\n _this10.elements.displayContainer.initialize();\n\n try {\n if (!_this10.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // 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\n\n _this10.manager.start();\n }\n\n _this10.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n _this10.onAdError(adError);\n }\n }).catch(function () {});\n }\n /**\n * Resume our video\n */\n\n }, {\n key: \"resumeContent\",\n value: function resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = ''; // Ad is stopped\n\n this.playing = false; // Play video\n\n silencePromise(this.player.media.play());\n }\n /**\n * Pause our video\n */\n\n }, {\n key: \"pauseContent\",\n value: function pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3; // Ad is playing\n\n this.playing = true; // Pause our video.\n\n this.player.media.pause();\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\n }, {\n key: \"cancel\",\n value: function cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n this.trigger('error'); // Re-create our adsManager\n\n this.loadAds();\n }\n /**\n * Re-create our adsManager\n */\n\n }, {\n key: \"loadAds\",\n value: function loadAds() {\n var _this11 = this;\n\n // Tell our adsManager to go bye bye\n this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this11.manager) {\n _this11.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this11.managerPromise = new Promise(function (resolve) {\n _this11.on('loaded', resolve);\n\n _this11.player.debug.log(_this11.manager);\n }); // Now that the manager has been destroyed set it to also be un-initialized\n\n _this11.initialized = false; // Now request some new advertisements\n\n _this11.requestAds();\n }).catch(function () {});\n }\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(event) {\n var _this12 = this;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this12, args);\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\n }, {\n key: \"on\",\n value: function on(event, callback) {\n if (!is$1.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n return this;\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\n }, {\n key: \"startSafetyTimer\",\n value: function startSafetyTimer(time, from) {\n var _this13 = this;\n\n this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n this.safetyTimer = setTimeout(function () {\n _this13.cancel();\n\n _this13.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n\n }, {\n key: \"clearSafetyTimer\",\n value: function clearSafetyTimer(from) {\n if (!is$1.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n }, {\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n }, {\n key: \"tagUrl\",\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var 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: config.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n }\n }]);\n\n return Ads;\n }();\n\n var $findIndex = arrayIteration.findIndex;\n\n\n\n var FIND_INDEX = 'findIndex';\n var SKIPS_HOLES$1 = true;\n\n var USES_TO_LENGTH$b = arrayMethodUsesToLength(FIND_INDEX);\n\n // Shouldn't skip holes\n if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES$1 = false; });\n\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n _export({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 || !USES_TO_LENGTH$b }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n addToUnscopables(FIND_INDEX);\n\n var min$6 = Math.min;\n var nativeLastIndexOf = [].lastIndexOf;\n var NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\n var STRICT_METHOD$6 = arrayMethodIsStrict('lastIndexOf');\n // For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\n var USES_TO_LENGTH$c = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n var FORCED$5 = NEGATIVE_ZERO$1 || !STRICT_METHOD$6 || !USES_TO_LENGTH$c;\n\n // `Array.prototype.lastIndexOf` method implementation\n // https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n var arrayLastIndexOf = FORCED$5 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min$6(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n } : nativeLastIndexOf;\n\n // `Array.prototype.lastIndexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n _export({ target: 'Array', proto: true, forced: arrayLastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: arrayLastIndexOf\n });\n\n var parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n };\n /**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\n var fitRatio = function fitRatio(ratio, outer) {\n var targetRatio = outer.width / outer.height;\n var result = {};\n\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = 1 / ratio * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n };\n\n var PreviewThumbnails = /*#__PURE__*/function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n _classCallCheck(this, PreviewThumbnails);\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"load\",\n value: function load() {\n var _this = this;\n\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(function () {\n if (!_this.enabled) {\n return;\n } // Render DOM elements\n\n\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n } // Download VTT files and parse them\n\n }, {\n key: \"getThumbnails\",\n value: function getThumbnails() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var src = _this2.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // Resolve promise\n\n\n var sortAndResolve = function sortAndResolve() {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this2.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n resolve();\n }; // Via callback()\n\n\n if (is$1.function(src)) {\n src(function (thumbnails) {\n _this2.thumbnails = thumbnails;\n sortAndResolve();\n });\n } // VTT urls\n else {\n // If string, convert into single-element list\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this2.getThumbnail(u);\n }); // Resolve\n\n Promise.all(promises).then(sortAndResolve);\n }\n });\n } // Process individual VTT file\n\n }, {\n key: \"getThumbnail\",\n value: function getThumbnail(url) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this3.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n }, {\n key: \"startMove\",\n value: function startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = this.player.elements.progress.getBoundingClientRect();\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX; // Set time text inside image container\n\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n } // Download and show image\n\n\n this.showImageAtCurrentTime();\n }\n }, {\n key: \"endMove\",\n value: function endMove() {\n this.toggleThumbContainer(false, true);\n }\n }, {\n key: \"startScrubbing\",\n value: function startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true; // Wait until media has a duration\n\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true); // Download and show image\n\n this.showImageAtCurrentTime();\n }\n }\n }\n }, {\n key: \"endScrubbing\",\n value: function endScrubbing() {\n var _this4 = this;\n\n this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this4.mouseDown) {\n _this4.toggleScrubbingContainer(false);\n }\n });\n }\n }\n /**\n * Setup hooks for Plyr and window events\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this5 = this;\n\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', function () {\n _this5.toggleThumbContainer(false, true);\n });\n this.player.on('seeked', function () {\n _this5.toggleThumbContainer(false);\n });\n this.player.on('timeupdate', function () {\n _this5.lastTime = _this5.player.media.currentTime;\n });\n }\n /**\n * Create HTML elements for image containers\n */\n\n }, {\n key: \"render\",\n value: function render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n var timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer\n });\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n if (is$1.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n } // Create HTML element: plyr__preview-scrubbing-container\n\n\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n }, {\n key: \"showImageAtCurrentTime\",\n value: function showImageAtCurrentTime() {\n var _this6 = this;\n\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n });\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n } // No matching thumb found\n\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n this.thumbnails.forEach(function (thumbnail, index) {\n if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n } // Show the image that's currently specified in this.showingThumb\n\n }, {\n key: \"loadImage\",\n value: function loadImage() {\n var _this7 = this;\n\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = this.showingThumb;\n var thumbnail = this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n previewImage.onload = function () {\n return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n }, {\n key: \"showImage\",\n value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n } // Remove all preview images that aren't the designated current image\n\n }, {\n key: \"removeOldImages\",\n value: function removeOldImages(currentImage) {\n var _this8 = this;\n\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this8.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n\n }, {\n key: \"preloadNearby\",\n value: function preloadNearby(thumbNum) {\n var _this9 = this;\n\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n if (_this9.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this9.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this9.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n } // If user has been hovering current image for half a second, look for a higher quality one\n\n }, {\n key: \"getHigherQuality\",\n value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n var _this10 = this;\n\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this10.showingThumbFilename === thumbFilename) {\n _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this10.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n }, {\n key: \"toggleThumbContainer\",\n value: function toggleThumbContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"toggleScrubbingContainer\",\n value: function toggleScrubbingContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"determineContainerAutoSizing\",\n value: function determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n }, {\n key: \"setThumbContainerSizeAndPos\",\n value: function setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {\n var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n\n this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {\n var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n }\n\n this.setThumbContainerPos();\n }\n }, {\n key: \"setThumbContainerPos\",\n value: function setThumbContainerPos() {\n var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n var plyrRect = this.player.elements.container.getBoundingClientRect();\n var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n }, {\n key: \"setScrubbingContainerSize\",\n value: function setScrubbingContainerSize() {\n var _fitRatio = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n width = _fitRatio.width,\n height = _fitRatio.height;\n\n this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n } // Sprites need to be offset to the correct location\n\n }, {\n key: \"setImageSizeAndOffset\",\n value: function setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n height = _fitRatio2.height;\n\n return height;\n } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n }();\n\n var source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Update previewThumbnails config & reload plugin\n\n\n if (!is$1.empty(input.previewThumbnails)) {\n Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n _this2.previewThumbnails.destroy();\n\n _this2.previewThumbnails = null;\n } // Create new instance if it is still enabled\n\n\n if (_this2.config.previewThumbnails.enabled) {\n _this2.previewThumbnails = new PreviewThumbnails(_this2);\n }\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n };\n\n /**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\n function clamp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n return Math.min(Math.max(input, min), max);\n }\n\n // TODO: Use a WeakMap for private globals\n // const globals = new WeakMap();\n // Plyr instance\n\n var Plyr = /*#__PURE__*/function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n fullscreen: 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 }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var type = this.media.tagName.toLowerCase(); // Embed properties\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.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); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\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 } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap$1(this.media, this.elements.container);\n } // Migrate custom properties from media to container (so they work 😉)\n\n\n ui.migrateStyles.call(this); // Add style hook\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup fullscreen\n\n\n this.fullscreen = new Fullscreen(this); // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', function () {\n return silencePromise(_this.play());\n });\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"play\",\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n value: function play() {\n var _this2 = this;\n\n if (!is$1.function(this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(function () {\n return _this2.ads.play();\n }).catch(function () {\n return silencePromise(_this2.media.play());\n });\n } // Return the promise (for HTML5)\n\n\n return this.media.play();\n }\n /**\n * Pause the media\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing || !is$1.function(this.media.pause)) {\n return null;\n }\n\n return this.media.pause();\n }\n /**\n * Get playing state\n */\n\n }, {\n key: \"togglePlay\",\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n value: function togglePlay(input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n return this.play();\n }\n\n return this.pause();\n }\n /**\n * Stop playback\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is$1.function(this.media.stop)) {\n this.media.stop();\n }\n }\n /**\n * Restart playback\n */\n\n }, {\n key: \"restart\",\n value: function restart() {\n this.currentTime = 0;\n }\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"rewind\",\n value: function rewind(seekTime) {\n this.currentTime -= is$1.number(seekTime) ? seekTime : this.config.seekTime;\n }\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"forward\",\n value: function forward(seekTime) {\n this.currentTime += is$1.number(seekTime) ? seekTime : this.config.seekTime;\n }\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n\n }, {\n key: \"increaseVolume\",\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n value: function increaseVolume(step) {\n var volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is$1.number(step) ? step : 0);\n }\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"decreaseVolume\",\n value: function decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n\n }, {\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"airplay\",\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n value: function airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n\n }, {\n key: \"toggleControls\",\n value: function 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 var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && is$1.array(this.config.controls) && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"on\",\n value: function on$1(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"once\",\n value: function once$1(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"off\",\n value: function off$1(event, callback) {\n off(this.elements.container, event, callback);\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\n }, {\n key: \"destroy\",\n value: function destroy(callback) {\n var _this3 = this;\n\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n if (soft) {\n if (Object.keys(_this3.elements).length) {\n // Remove elements\n removeElement(_this3.elements.buttons.play);\n removeElement(_this3.elements.captions);\n removeElement(_this3.elements.controls);\n removeElement(_this3.elements.wrapper); // Clear for GC\n\n _this3.elements.buttons.play = null;\n _this3.elements.captions = null;\n _this3.elements.controls = null;\n _this3.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this3); // Cancel current network requests\n\n html5.cancelRequests.call(_this3); // Replace the container with the original element provided\n\n replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this3.elements.original);\n } // Reset state\n\n\n _this3.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this3.elements = null;\n _this3.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n this.stop(); // Clear timeouts\n\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized); // Provider specific stuff\n\n if (this.isHTML5) {\n // Restore native video controls\n ui.toggleNativeControls.call(this, true); // Clean up\n\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing); // Destroy YouTube API\n\n if (this.embed !== null && is$1.function(this.embed.destroy)) {\n this.embed.destroy();\n } // Clean up\n\n\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 } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n }\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n\n }, {\n key: \"supports\",\n value: function supports(type) {\n return support.mime.call(this, type);\n }\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return this.provider === providers.html5;\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return this.isYouTube || this.isVimeo;\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return this.provider === providers.youtube;\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return this.provider === providers.vimeo;\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return this.type === types.video;\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return this.type === types.audio;\n }\n }, {\n key: \"playing\",\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n }, {\n key: \"currentTime\",\n set: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\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\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n }, {\n key: \"muted\",\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\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 } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var _this4 = this;\n\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Clamp to min/max\n\n\n var min = this.minimumSpeed,\n max = this.maximumSpeed;\n speed = clamp(speed, min, max); // Update config\n\n this.config.speed.selected = speed; // Set media speed\n\n setTimeout(function () {\n _this4.media.playbackRate = speed;\n }, 0);\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Get the minimum allowed speed\n */\n\n }, {\n key: \"minimumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 0.0625;\n }\n /**\n * Get the maximum allowed speed\n */\n\n }, {\n key: \"maximumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 16;\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest$1(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\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\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\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 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 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 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 default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the download URL\n */\n ,\n set: function set(input) {\n if (!is$1.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n controls.setDownloadUrl.call(this);\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(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(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n }\n /**\n * Get the current aspect ratio in use\n */\n\n }, {\n key: \"ratio\",\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n var ratio = reduceAspectRatio(getAspectRatio.call(this));\n return is$1.array(ratio) ? ratio.join(':') : ratio;\n }\n /**\n * Set video aspect ratio\n */\n ,\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is$1.string(input) || !validateRatio(input)) {\n this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n return;\n }\n\n this.config.ratio = input;\n setAspectRatio.call(this);\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\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\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\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\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n }], [{\n key: \"supported\",\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\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\n }, {\n key: \"loadSprite\",\n value: function loadSprite$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n }();\n\n Plyr.defaults = cloneDeep(defaults$1);\n\n // ==========================================================================\n\n return Plyr;\n\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 params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\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","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\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 toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\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 (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.7.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\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 nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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 isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","// `Symbol.prototype.description` getter\n// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar isObject = require('../internals/is-object');\nvar defineProperty = require('../internals/object-define-property').f;\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = global.Symbol;\n\nif (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? 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 ? ObjectPrototype : null;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\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","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var anObject = require('../internals/an-object');\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\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(String(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 var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === '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 } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\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(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\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] = [String(value)];\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\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (\r\n (new URLSearchParams('?a=1').toString() === 'a=1') &&\r\n (typeof URLSearchParams.prototype.set === 'function') &&\r\n (typeof URLSearchParams.prototype.entries === 'function')\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.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 if (typeof proto._fromString !== 'function') {\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 if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\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\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 global.URL('b', 'http://a');\r\n u.pathname = 'c d';\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 if (base && typeof base !== 'string') base = String(base);\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 base = base.toLowerCase();\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 var inputElement = doc.createElement('input');\r\n inputElement.type = 'url';\r\n inputElement.value = url;\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || (!inputElement.checkValidity() && !base)) {\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 global.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","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n","'use strict';\nvar redefineAll = require('../internals/redefine-all');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar $has = require('../internals/has');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && $has(data, state.id) && delete data[state.id];\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && $has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $every = require('../internals/array-iteration').every;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('every');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar global = require('../internals/global');\nvar redefineAll = require('../internals/redefine-all');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceIternalState = require('../internals/internal-state').enforce;\nvar NATIVE_WEAK_MAP = require('../internals/native-weak-map');\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var classof = require('../internals/classof-raw');\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nmodule.exports = function (value) {\n if (typeof value != 'number' && classof(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toInteger = require('../internals/to-integer');\nvar thisNumberValue = require('../internals/this-number-value');\nvar repeat = require('../internals/string-repeat');\nvar fails = require('../internals/fails');\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor = Math.floor;\n\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n$({ target: 'Number', proto: true, forced: FORCED }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow(2, 69, 1)) - 69;\n z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + repeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + repeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n }\n});\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","var $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar ownKeys = require('../internals/own-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar createProperty = require('../internals/create-property');\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(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 (\n global.addEventListener &&\n typeof postMessage == 'function' &&\n !global.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!IS_IOS && !IS_NODE && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\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 promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(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\nmodule.exports = queueMicrotask || 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","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can 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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\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 $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\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 var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (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\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/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","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 isEdge: window.navigator.userAgent.includes('Edge'),\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","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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","var $ = require('../internals/export');\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.github.io/ecma262/#sec-math.trunc\n$({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor : ceil)(it);\n }\n});\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = (value) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.3/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n\n 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\n // Toggle button and fire events\n this.onChange();\n }\n\n // Trap focus inside container\n trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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","// `Math.sign` method implementation\n// https://tc39.github.io/ecma262/#sec-math.sign\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","var $ = require('../internals/export');\nvar sign = require('../internals/math-sign');\n\n// `Math.sign` method\n// https://tc39.github.io/ecma262/#sec-math.sign\n$({ target: 'Math', stat: true }, {\n sign: sign\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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', 'autoplay,fullscreen,picture-in-picture');\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready() {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","'use strict';\nvar $ = require('../internals/export');\nvar $findIndex = require('../internals/array-iteration').findIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","var $ = require('../internals/export');\nvar lastIndexOf = require('../internals/array-last-index-of');\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: lastIndexOf\n});\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\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.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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 {Boolean} 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 * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n"]} \ No newline at end of file
+{"version":3,"sources":["plyr.polyfilled.js","node_modules/custom-event-polyfill/polyfill.js","node_modules/core-js/internals/global.js","node_modules/core-js/internals/fails.js","node_modules/core-js/internals/descriptors.js","node_modules/core-js/internals/object-property-is-enumerable.js","node_modules/core-js/internals/create-property-descriptor.js","node_modules/core-js/internals/classof-raw.js","node_modules/core-js/internals/indexed-object.js","node_modules/core-js/internals/require-object-coercible.js","node_modules/core-js/internals/to-indexed-object.js","node_modules/core-js/internals/is-object.js","node_modules/core-js/internals/to-primitive.js","node_modules/core-js/internals/has.js","node_modules/core-js/internals/document-create-element.js","node_modules/core-js/internals/ie8-dom-define.js","node_modules/core-js/internals/object-get-own-property-descriptor.js","node_modules/core-js/internals/an-object.js","node_modules/core-js/internals/object-define-property.js","node_modules/core-js/internals/create-non-enumerable-property.js","node_modules/core-js/internals/set-global.js","node_modules/core-js/internals/shared-store.js","node_modules/core-js/internals/inspect-source.js","node_modules/core-js/internals/internal-state.js","node_modules/core-js/internals/native-weak-map.js","node_modules/core-js/internals/shared.js","node_modules/core-js/internals/uid.js","node_modules/core-js/internals/shared-key.js","node_modules/core-js/internals/hidden-keys.js","node_modules/core-js/internals/object-create.js","node_modules/core-js/internals/redefine.js","node_modules/core-js/internals/path.js","node_modules/core-js/internals/get-built-in.js","node_modules/core-js/internals/to-integer.js","node_modules/core-js/internals/to-length.js","node_modules/core-js/internals/to-absolute-index.js","node_modules/core-js/internals/array-includes.js","node_modules/core-js/internals/object-keys-internal.js","node_modules/core-js/internals/enum-bug-keys.js","node_modules/core-js/internals/object-get-own-property-names.js","node_modules/core-js/internals/object-get-own-property-symbols.js","node_modules/core-js/internals/own-keys.js","node_modules/core-js/internals/copy-constructor-properties.js","node_modules/core-js/internals/is-forced.js","node_modules/core-js/internals/export.js","node_modules/core-js/internals/native-symbol.js","node_modules/core-js/internals/use-symbol-as-uid.js","node_modules/core-js/internals/is-array.js","node_modules/core-js/internals/to-object.js","node_modules/core-js/internals/object-keys.js","node_modules/core-js/internals/object-define-properties.js","node_modules/core-js/internals/html.js","node_modules/core-js/internals/object-get-own-property-names-external.js","node_modules/core-js/internals/well-known-symbol.js","node_modules/core-js/internals/well-known-symbol-wrapped.js","node_modules/core-js/internals/define-well-known-symbol.js","node_modules/core-js/internals/set-to-string-tag.js","node_modules/core-js/internals/a-function.js","node_modules/core-js/internals/function-bind-context.js","node_modules/core-js/internals/array-species-create.js","node_modules/core-js/internals/array-iteration.js","node_modules/core-js/modules/es.symbol.js","node_modules/core-js/modules/es.symbol.description.js","node_modules/core-js/modules/es.symbol.iterator.js","node_modules/core-js/internals/array-method-is-strict.js","node_modules/core-js/internals/array-method-uses-to-length.js","node_modules/core-js/internals/array-for-each.js","node_modules/core-js/modules/es.array.for-each.js","node_modules/core-js/modules/es.array.index-of.js","node_modules/core-js/internals/add-to-unscopables.js","node_modules/core-js/internals/iterators-core.js","node_modules/core-js/internals/iterators.js","node_modules/core-js/internals/correct-prototype-getter.js","node_modules/core-js/internals/object-get-prototype-of.js","node_modules/core-js/internals/create-iterator-constructor.js","node_modules/core-js/internals/object-set-prototype-of.js","node_modules/core-js/internals/a-possible-prototype.js","node_modules/core-js/internals/define-iterator.js","node_modules/core-js/modules/es.array.iterator.js","node_modules/core-js/modules/es.array.join.js","node_modules/core-js/internals/create-property.js","node_modules/core-js/internals/engine-v8-version.js","node_modules/core-js/internals/engine-user-agent.js","node_modules/core-js/internals/array-method-has-species-support.js","node_modules/core-js/modules/es.array.slice.js","node_modules/core-js/internals/to-string-tag-support.js","node_modules/core-js/internals/classof.js","node_modules/core-js/internals/object-to-string.js","node_modules/core-js/modules/es.object.to-string.js","node_modules/core-js/internals/regexp-flags.js","node_modules/core-js/internals/regexp-sticky-helpers.js","node_modules/core-js/internals/regexp-exec.js","node_modules/core-js/modules/es.regexp.exec.js","node_modules/core-js/modules/es.regexp.to-string.js","node_modules/core-js/internals/string-multibyte.js","node_modules/core-js/modules/es.string.iterator.js","node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","node_modules/core-js/internals/advance-string-index.js","node_modules/core-js/internals/regexp-exec-abstract.js","node_modules/core-js/modules/es.string.replace.js","node_modules/core-js/internals/same-value.js","node_modules/core-js/modules/es.string.search.js","node_modules/core-js/internals/is-regexp.js","node_modules/core-js/internals/species-constructor.js","node_modules/core-js/modules/es.string.split.js","node_modules/core-js/internals/dom-iterables.js","node_modules/core-js/modules/web.dom-collections.for-each.js","node_modules/core-js/modules/web.dom-collections.iterator.js","node_modules/core-js/internals/native-url.js","node_modules/core-js/internals/an-instance.js","node_modules/core-js/internals/object-assign.js","node_modules/core-js/internals/iterator-close.js","node_modules/core-js/internals/call-with-safe-iteration-closing.js","node_modules/core-js/internals/is-array-iterator-method.js","node_modules/core-js/internals/get-iterator-method.js","node_modules/core-js/internals/array-from.js","node_modules/core-js/internals/string-punycode-to-ascii.js","node_modules/core-js/internals/redefine-all.js","node_modules/core-js/internals/get-iterator.js","node_modules/core-js/modules/web.url-search-params.js","node_modules/core-js/modules/web.url.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/es.array.concat.js","node_modules/core-js/modules/es.array.filter.js","node_modules/core-js/modules/es.array.find.js","node_modules/core-js/internals/check-correctness-of-iteration.js","node_modules/core-js/modules/es.array.from.js","node_modules/core-js/modules/es.array.includes.js","node_modules/core-js/modules/es.array.map.js","node_modules/core-js/internals/inherit-if-required.js","node_modules/core-js/internals/whitespaces.js","node_modules/core-js/internals/string-trim.js","node_modules/core-js/modules/es.number.constructor.js","node_modules/core-js/modules/es.object.keys.js","node_modules/core-js/internals/object-to-array.js","node_modules/core-js/modules/es.object.values.js","node_modules/core-js/internals/not-a-regexp.js","node_modules/core-js/internals/correct-is-regexp-logic.js","node_modules/core-js/modules/es.string.includes.js","node_modules/core-js/internals/freezing.js","node_modules/core-js/internals/internal-metadata.js","node_modules/core-js/internals/iterate.js","node_modules/core-js/internals/collection-weak.js","node_modules/core-js/modules/es.array.every.js","node_modules/core-js/modules/es.weak-map.js","node_modules/core-js/internals/collection.js","node_modules/core-js/modules/es.object.assign.js","node_modules/core-js/internals/string-trim-forced.js","node_modules/core-js/modules/es.string.trim.js","node_modules/core-js/modules/es.array.some.js","node_modules/core-js/internals/this-number-value.js","node_modules/core-js/internals/string-repeat.js","node_modules/core-js/modules/es.number.to-fixed.js","node_modules/core-js/modules/es.object.entries.js","node_modules/core-js/modules/es.number.is-nan.js","node_modules/core-js/modules/es.object.get-own-property-descriptor.js","node_modules/rangetouch/dist/rangetouch.mjs","node_modules/core-js/modules/es.object.get-own-property-descriptors.js","node_modules/core-js/modules/es.string.match.js","node_modules/core-js/internals/task.js","node_modules/core-js/internals/native-promise-constructor.js","node_modules/core-js/internals/set-species.js","node_modules/core-js/internals/engine-is-ios.js","node_modules/core-js/internals/engine-is-node.js","node_modules/core-js/internals/microtask.js","node_modules/core-js/modules/es.promise.js","node_modules/core-js/internals/new-promise-capability.js","node_modules/core-js/internals/promise-resolve.js","node_modules/core-js/internals/perform.js","node_modules/core-js/internals/host-report-errors.js","node_modules/core-js/modules/es.string.starts-with.js","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","node_modules/core-js/internals/array-reduce.js","node_modules/core-js/modules/es.array.reduce.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","node_modules/core-js/modules/es.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/load-sprite.js","node_modules/core-js/modules/es.math.trunc.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/internals/math-sign.js","src/js/utils/load-image.js","node_modules/core-js/modules/es.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es.array.splice.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","node_modules/core-js/modules/es.array.find-index.js","node_modules/core-js/internals/array-last-index-of.js","node_modules/core-js/modules/es.array.last-index-of.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/plyr.js","src/js/utils/numbers.js"],"names":["navigator","global","factory","exports","module","define","amd","globalThis","self","Plyr","this","window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","document","createEvent","initCustomEvent","detail","call","Object","defineProperty","get","prototype","Event","commonjsGlobal","createCommonjsModule","fn","check","it","Math","global_1","Function","fails","exec","error","descriptors","nativePropertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor","objectPropertyIsEnumerable","f","1","V","descriptor","enumerable","createPropertyDescriptor","bitmap","value","configurable","writable","toString","classofRaw","slice","split","indexedObject","classof","requireObjectCoercible","undefined","TypeError","toIndexedObject","IndexedObject","isObject","toPrimitive","input","PREFERRED_STRING","val","valueOf","hasOwnProperty","has","key","EXISTS","createElement","documentCreateElement","ie8DomDefine","DESCRIPTORS","a","nativeGetOwnPropertyDescriptor","objectGetOwnPropertyDescriptor","O","P","IE8_DOM_DEFINE","propertyIsEnumerableModule","anObject","String","nativeDefineProperty","objectDefineProperty","Attributes","createNonEnumerableProperty","object","definePropertyModule","setGlobal","SHARED","sharedStore","functionToString","store","inspectSource","set","WeakMap","nativeWeakMap","test","shared","push","version","mode","copyright","id","postfix","random","uid","keys","sharedKey","hiddenKeys","NATIVE_WEAK_MAP","state","wmget","wmhas","wmset","metadata","facade","STATE","objectHas","activeXDocument","internalState","enforce","getterFor","TYPE","type","redefine","getInternalState","InternalStateModule","enforceInternalState","TEMPLATE","options","unsafe","simple","noTargetGet","source","join","path","aFunction","variable","getBuiltIn","namespace","method","arguments","length","ceil","floor","toInteger","argument","isNaN","min","toLength","max","toAbsoluteIndex","index","integer","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayIncludes","includes","indexOf","require$$0","objectKeysInternal","names","i","result","enumBugKeys","concat","objectGetOwnPropertyNames","getOwnPropertyNames","internalObjectKeys","objectGetOwnPropertySymbols","getOwnPropertySymbols","ownKeys","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","copyConstructorProperties","target","getOwnPropertyDescriptorModule","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","replace","toLowerCase","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","sham","nativeSymbol","Symbol","useSymbolAsUid","NATIVE_SYMBOL","iterator","isArray","Array","arg","toObject","objectKeys","objectDefineProperties","defineProperties","Properties","html","IE_PROTO","EmptyConstructor","scriptTag","content","LT","NullProtoObject","domain","ActiveXObject","iframeDocument","iframe","write","close","temp","parentWindow","NullProtoObjectViaActiveX","style","display","appendChild","src","contentWindow","open","F","objectCreate","create","nativeGetOwnPropertyNames","windowNames","objectGetOwnPropertyNamesExternal","getWindowNames","WellKnownSymbolsStore","createWellKnownSymbol","USE_SYMBOL_AS_UID","withoutSetter","wellKnownSymbol","name","wellKnownSymbolWrapped","defineWellKnownSymbol","NAME","wrappedWellKnownSymbolModule","TO_STRING_TAG","setToStringTag","TAG","aFunction$1","functionBindContext","that","b","c","apply","SPECIES","arraySpeciesCreate","originalArray","C","constructor","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","callbackfn","specificCreate","boundFunction","bind","arrayIteration","forEach","map","filter","some","every","find","findIndex","$forEach","HIDDEN","SYMBOL","TO_PRIMITIVE","setInternalState","ObjectPrototype","$Symbol","$stringify","getOwnPropertyNamesExternal","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","QObject","USE_SETTER","findChild","setSymbolDescriptor","nativeObjectCreate","ObjectPrototypeDescriptor","wrap","tag","description","symbol","isSymbol","$defineProperty","$defineProperties","properties","$getOwnPropertySymbols","$propertyIsEnumerable","$getOwnPropertyDescriptor","$getOwnPropertyNames","IS_OBJECT_PROTOTYPE","setter","$","for","keyFor","sym","useSetter","useSimple","FORCED_JSON_STRINGIFY","stringify","replacer","space","$replacer","args","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","symbolPrototype","symbolToString","native","regexp","desc","arrayMethodIsStrict","METHOD_NAME","cache","thrower","arrayMethodUsesToLength","ACCESSORS","argument0","argument1","STRICT_METHOD","USES_TO_LENGTH","arrayForEach","proto","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","UNSCOPABLES","ArrayPrototype","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","addToUnscopables","iterators","correctPrototypeGetter","getPrototypeOf","objectGetPrototypeOf","CORRECT_PROTOTYPE_GETTER","ITERATOR","BUGGY_SAFARI_ITERATORS","iteratorsCore","returnThis","createIteratorConstructor","IteratorConstructor","next","Iterators","objectSetPrototypeOf","setPrototypeOf","CORRECT_SETTER","aPossiblePrototype","__proto__","IteratorsCore","KEYS","VALUES","ENTRIES","defineIterator","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","entries","values","ARRAY_ITERATOR","es_array_iterator","iterated","kind","done","Arguments","nativeJoin","ES3_STRINGS","separator","match","createProperty","propertyKey","engineUserAgent","process","versions","v8","userAgent","engineV8Version","arrayMethodHasSpeciesSupport","V8_VERSION","array","foo","Boolean","HAS_SPECIES_SUPPORT","0","nativeSlice","start","end","Constructor","n","k","fin","toStringTagSupport","CORRECT_ARGUMENTS","TO_STRING_TAG_SUPPORT","tryGet","callee","objectToString","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","s","RegExp","regexpStickyHelpers","UNSUPPORTED_Y","re","lastIndex","BROKEN_CARET","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","re1","re2","stickyHelpers","NPCG_INCLUDED","str","reCopy","flags","charsAdded","strCopy","regexpExec","TO_STRING","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","R","p","rf","CONVERT_TO_STRING","pos","first","second","S","position","size","charCodeAt","charAt","stringMultibyte","codeAt","STRING_ITERATOR","point","REPLACE_SUPPORTS_NAMED_GROUPS","groups","REPLACE_KEEPS_$0","REPLACE","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","fixRegexpWellKnownSymbolLogic","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","stringMethod","regexMethod","advanceStringIndex","regexpExecAbstract","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","fixRegExpWellKnownSymbolLogic","maybeCallNative","reason","UNSAFE_SUBSTITUTE","searchValue","replaceValue","res","rx","functionalReplace","fullUnicode","results","regExpExec","accumulatedResult","nextSourcePosition","matched","captures","j","namedCaptures","replacerArgs","getSubstitution","tailPos","m","symbols","ch","capture","sameValue","is","x","y","SEARCH","nativeSearch","searcher","previousLastIndex","MATCH","isRegexp","isRegExp","speciesConstructor","defaultConstructor","arrayPush","MAX_UINT32","SUPPORTS_Y","SPLIT","nativeSplit","internalSplit","limit","lim","lastLength","output","lastLastIndex","separatorCopy","splitter","unicodeMatching","callRegExpExec","q","A","z","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","COLLECTION_NAME","DOMIterables","Collection","CollectionPrototype","ArrayValues","ArrayIteratorMethods","nativeUrl","url","URL","searchParams","pathname","sort","href","URLSearchParams","username","host","hash","anInstance","nativeAssign","assign","objectAssign","B","alphabet","chr","T","argumentsLength","iteratorClose","returnMethod","callWithSafeIterationClosing","isArrayIteratorMethod","getIteratorMethod","arrayFrom","arrayLike","step","mapfn","mapping","iteratorMethod","maxInt","regexNonASCII","regexSeparators","OVERFLOW_ERROR","stringFromCharCode","fromCharCode","digitToBasic","digit","adapt","delta","numPoints","firstTime","baseMinusTMin","base","encode","currentValue","inputLength","counter","extra","ucs2decode","bias","basicLength","handledCPCount","handledCPCountPlusOne","RangeError","t","qMinusT","baseMinusT","redefineAll","getIterator","$fetch","Headers","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","getInternalIteratorState","plus","sequences","percentSequence","bytes","percentDecode","sequence","decodeURIComponent","deserialize","!","'","(",")","~","%20","serialize","encodeURIComponent","parseSearchParams","query","attribute","entry","attributes","shift","updateSearchParams","validateArgumentsLength","passed","required","URLSearchParamsIterator","URLSearchParamsConstructor","entryIterator","entryNext","init","updateURL","hasOwn","URLSearchParamsPrototype","append","delete","splice","getAll","found","entriesIndex","sliceIndex","callback","USE_NATIVE_URL","fetch","body","headers","EOF","web_urlSearchParams","getState","require$$1","NativeURL","URLSearchParamsModule","getInternalSearchParamsState","getInternalURLState","pow","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","parseHost","codePoints","parseIPv6","isSpecial","label","encoded","labels","toASCII","parseIPv4","percentEncode","C0ControlPercentEncodeSet","partsLength","numbers","part","radix","number","ipv4","parts","pop","parseInt","numbersSeen","ipv4Piece","swaps","swap","address","pieceIndex","compress","pointer","char","serializeHost","ignore0","unshift","ipv6","maxIndex","maxLength","currStart","currLength","findLongestZeroSequence","fragmentPercentEncodeSet"," ","\"","<",">","`","pathPercentEncodeSet","#","?","{","}","userinfoPercentEncodeSet","/",":",";","=","@","[","\\","]","^","|","code","specialSchemes","ftp","file","http","https","ws","wss","scheme","includesCredentials","password","cannotHaveUsernamePasswordPort","cannotBeABaseURL","isWindowsDriveLetter","normalized","startsWithWindowsDriveLetter","third","shortenURLsPath","pathSize","isSingleDot","segment","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","parseURL","stateOverride","bufferCodePoints","failure","buffer","seenAt","seenBracket","seenPasswordToken","port","fragment","codePoint","encodedCodePoints","URLConstructor","baseState","urlString","searchParamsState","serializeURL","origin","getOrigin","protocol","getProtocol","getUsername","getPassword","getHost","hostname","getHostname","getPort","getPathname","search","getSearch","getSearchParams","getHash","URLPrototype","accessorDescriptor","getter","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","blob","_typeof","obj","_classCallCheck","instance","_defineProperties","props","_createClass","protoProps","staticProps","_defineProperty","ownKeys$1","enumerableOnly","_objectSpread2","getOwnPropertyDescriptors","_objectWithoutProperties","excluded","sourceKeys","_objectWithoutPropertiesLoose","sourceSymbolKeys","_slicedToArray","arr","_arrayWithHoles","_arr","_n","_d","_e","_s","_i","err","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayLikeToArray","_arrayWithoutHoles","iter","from","_iterableToArray","_nonIterableSpread","o","minLen","len","arr2","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","serializeParam","deserializeParam","checkIfURLSearchParamsSupported","searchString","typeofSearchString","_fromString","_this","_entries","thisArg","searchArray","polyfillURLSearchParams","u","checkIfURLIsSupported","_URL","baseElement","doc","location","implementation","createHTMLDocument","head","anchorElement","inputElement","checkValidity","enableSearchUpdate","enableSearchParamsUpdate","methodName","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","expectedPort","http:","https:","ftp:","addPortToOrigin","polyfillURL","setInterval","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","E","$filter","$find","FIND","SKIPS_HOLES","SAFE_CLOSING","called","iteratorWithReturn","return","checkCorrectnessOfIteration","SKIP_CLOSING","ITERATION_SUPPORT","INCORRECT_ITERATION","iterable","$includes","$map","inheritIfRequired","dummy","Wrapper","NewTarget","NewTargetPrototype","whitespaces","whitespace","ltrim","rtrim","stringTrim","trim","require$$2","require$$3","NUMBER","NativeNumber","NumberPrototype","BROKEN_CLASSOF","toNumber","maxCode","digits","NaN","NumberWrapper","FAILS_ON_PRIMITIVES","nativeKeys","TO_ENTRIES","objectToArray","$values","notARegexp","correctIsRegexpLogic","error1","error2","correctIsRegExpLogic","notARegExp","freezing","isExtensible","preventExtensions","internalMetadata","METADATA","setMetadata","objectID","weakData","meta","REQUIRED","fastKey","getWeakData","onFreeze","FREEZING","Result","stopped","iterate","unboundFunction","iterFn","AS_ENTRIES","IS_ITERATOR","INTERRUPTED","stop","condition","callFn","internalStateGetterFor","ArrayIterationModule","uncaughtFrozenStore","frozen","UncaughtFrozenStore","findUncaughtFrozen","collectionWeak","getConstructor","wrapper","CONSTRUCTOR_NAME","ADDER","$has","add","$every","InternalWeakMap","enforceIternalState","IS_IE11","$WeakMap","common","IS_WEAK","NativeConstructor","NativePrototype","exported","fixMethod","InternalMetadataModule","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","clear","setStrong","collection","WeakMapPrototype","nativeDelete","nativeHas","nativeGet","nativeSet","$trim","forcedStringTrimMethod","$some","stringRepeat","repeat","count","Infinity","nativeToFixed","toFixed","acc","fractionDigits","thisNumberValue","fractDigits","sign","multiply","c2","divide","dataToString","x2","log","$entries","r","nativeMatch","matcher","matchStr","defaults","addCSS","thumbWidth","watch","matches","querySelectorAll","instanceOf","isNullOrUndefined","isString","isNodeList","Element","round","getDecimalPlaces","parseFloat","defer","channel","RangeTouch","element","querySelector","rangeTouch","config","enabled","userSelect","webKitUserSelect","touchAction","listeners","changedTouches","getAttribute","getBoundingClientRect","width","clientX","left","disabled","dispatchEvent","trigger","MutationObserver","addedNodes","observe","childList","subtree","documentElement","nativePromiseConstructor","Promise","setSpecies","engineIsIos","engineIsNode","setImmediate","clearImmediate","MessageChannel","Dispatch","queue","ONREADYSTATECHANGE","run","runner","listener","post","postMessage","IS_NODE","nextTick","now","IS_IOS","port2","port1","onmessage","addEventListener","importScripts","removeChild","setTimeout","flush","last","notify","toggle","node","promise","then","task","macrotask","WebKitMutationObserver","queueMicrotaskDescriptor","queueMicrotask","parent","exit","enter","createTextNode","characterData","resolve","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","microtask","PromiseCapability","reject","$$resolve","$$reject","newPromiseCapability","promiseResolve","promiseCapability","perform","PROMISE","getInternalPromiseState","PromiseConstructor","NativePromise","newPromiseCapabilityModule","newGenericPromiseCapability","DISPATCH_EVENT","NATIVE_REJECTION_EVENT","PromiseRejectionEvent","UNHANDLED_REJECTION","FakePromise","all","isThenable","isReject","notified","chain","reactions","ok","exited","reaction","handler","fail","rejection","onHandleUnhandled","onUnhandled","initEvent","console","hostReportErrors","isUnhandled","emit","unwrap","internalReject","internalResolve","executor","onFulfilled","onRejected","catch","capability","$promiseResolve","remaining","alreadyCalled","race","nativeStartsWith","startsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","events","isFunction","isEmpty","is$1","Number","nodeType","ownerDocument","KeyboardEvent","TextTrack","transitionEndEvent","WebkitTransition","MozTransition","OTransition","transition","repaint","delay","hidden","offsetHeight","browser","isIE","documentMode","isEdge","isWebkit","isIPhone","platform","isIos","IS_RIGHT","memo","$reduce","right","getDeep","reduce","extend","_len","sources","_key","elements","targets","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","_ref3","_ref4","setAttribute","text","innerText","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","className","class","toggleHidden","hide","toggleClass","force","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","CHROME_VERSION","range","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","removeEventListener","toggleListener","passive","eventListeners","on","off","once","_this2","onceCallback","triggerEvent","plyr","unbindListeners","item","ready","_this3","silencePromise","validateRatio","reduceAspectRatio","ratio","_ratio","height","divider","getDivider","w","h","getAspectRatio","parse","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","getComputedStyle","offset","fullscreen","active","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","setup","player","speed","onChange","_player$media","currentTime","paused","preload","readyState","playbackRate","play","load","cancelRequests","blankVideo","debug","dedupe","NativeRegExp","CORRECT_NEW","RegExpWrapper","pattern","thisIsRegExp","patternIsRegExp","flagsAreUndefined","getFlags","proxy","format","replaceAll","toTitleCase","toUpperCase","substr","toPascalCase","getHTML","innerHTML","resources","youtube","i18n","{seektime}","seekTime","{title}","title","v","Storage","localStorage","getItem","json","JSON","storage","setItem","removeItem","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","prefix","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","trunc","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","toCamelCase","labelPressed","iconPressed","control","button","createRange","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","current","getPercentage","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sorting","setCaptionsMenu","_this7","tracks","getTracks","track","toggled","language","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","popup","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","restore","propertyName","setDownloadUrl","download","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this11","seektime","addProperty","controlPressed","_this$config","parseUrl","safe","parser","buildUrlParams","isYouTube","insertAfter","languages","userLanguage","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","cue","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","providers","types","noop","Console","Fullscreen","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","keyCode","activeElement","shiftKey","forceFallback","requestFullscreen","webkitEnterFullscreen","toggleFallback","navigationUI","webkitExitFullscreen","action","cancelFullScreen","closest","parentElement","trapFocus","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","mathSign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","migrateStyles","getPropertyValue","removeProperty","Listeners","focusTimer","lastKeyDown","timeStamp","wasKeyDown","handleKey","firstTouch","setTabFocus","setPlayerSize","measure","rect","resized","_player$fullscreen","usingNative","isEnter","_setPlayerSize","firstChild","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","togglePlay","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","abs","increaseVolume","lastKey","altKey","ctrlKey","metaKey","decreaseVolume","MAXIMUM_ALLOWED_LENGTH_EXCEEDED","deleteCount","insertCount","actualDeleteCount","to","actualStart","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","executeCallbacks","success","loadFile","numTries","isLegacyIECss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","loadFiles","paths","loadjs","arg1","loadFn","returnPromise","deps","isDefined","loadScript","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","$2","data-poster","thumbnail_url","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","createDocumentFragment","stripHTML","getPaused","seconds","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","Ads","google","ima","manager","destroy","displayContainer","remove","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","handlers","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","$findIndex","FIND_INDEX","nativeLastIndexOf","lastIndexOf","arrayLastIndexOf","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","vttDataString","processedList","thumbnail","frames","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","urlPrefix","substring","tempImage","naturalHeight","percentage","mousePosX","thumb","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","previewPos","_fitRatio","multiplier","top","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","getProviderByUrl","truthy","tabindex","inputIsValid","fauxDuration","realDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","clamp","updateStorage","prev","curr","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"AAAqB,iBAAdA,WAA2B,SAAUC,EAAQC,GAC/B,iBAAZC,SAA0C,oBAAXC,OAAyBA,OAAOD,QAAUD,IAC9D,mBAAXG,QAAyBA,OAAOC,IAAMD,OAAO,OAAQH,IAC3DD,EAA+B,oBAAfM,WAA6BA,WAAaN,GAAUO,MAAaC,KAAOP,IAH1D,CAI/BQ,MAAM,WAAe,cCEvB,WACE,GAAsB,oBAAXC,OAIX,IACE,IAAIC,EAAK,IAAID,OAAOE,YAAY,OAAQ,CAAEC,YAAY,IAEtD,GADAF,EAAGG,kBACyB,IAAxBH,EAAGI,iBAGL,MAAM,IAAIC,MAAM,6BAElB,MAAOC,GACP,IAAIL,EAAc,SAASM,EAAOC,GAChC,IAAIC,EAAKC,EAyBT,OAxBAF,EAASA,GAAU,IACZG,UAAYH,EAAOG,QAC1BH,EAAON,aAAeM,EAAON,YAE7BO,EAAMG,SAASC,YAAY,gBACvBC,gBACFP,EACAC,EAAOG,QACPH,EAAON,WACPM,EAAOO,QAETL,EAAcD,EAAIN,eAClBM,EAAIN,eAAiB,WACnBO,EAAYM,KAAKlB,MACjB,IACEmB,OAAOC,eAAepB,KAAM,mBAAoB,CAC9CqB,IAAK,WACH,OAAO,KAGX,MAAOb,GACPR,KAAKM,kBAAmB,IAGrBK,GAGTR,EAAYmB,UAAYrB,OAAOsB,MAAMD,UACrCrB,OAAOE,YAAcA,GA5CzB,GDoDE,IAAIqB,EAAuC,oBAAf3B,WAA6BA,WAA+B,oBAAXI,OAAyBA,OAA2B,oBAAXV,OAAyBA,OAAyB,oBAATO,KAAuBA,KAAO,GAE7L,SAAS2B,EAAqBC,EAAIhC,GACjC,OAAiCgC,EAA1BhC,EAAS,CAAED,QAAS,IAAiBC,EAAOD,SAAUC,EAAOD,QE7DvE,IAAIkC,EAAQ,SAAUC,GACpB,OAAOA,GAAMA,EAAGC,MAAQA,MAAQD,GAIlCE,EAEEH,EAA2B,iBAAd9B,YAA0BA,aACvC8B,EAAuB,iBAAV1B,QAAsBA,SACnC0B,EAAqB,iBAAR7B,MAAoBA,OACjC6B,EAAuB,iBAAVpC,GAAsBA,IAEnC,WAAe,OAAOS,KAAtB,IAAoC+B,SAAS,cAATA,GCZtCC,EAAiB,SAAUC,GACzB,IACE,QAASA,IACT,MAAOC,GACP,OAAO,ICDXC,GAAkBH,GAAM,WACtB,OAA8E,GAAvEb,OAAOC,eAAe,GAAI,EAAG,CAAEC,IAAK,WAAc,OAAO,KAAQ,MCHtEe,EAA6B,GAAGC,qBAChCC,EAA2BnB,OAAOmB,yBLsGhCC,EAA6B,CAChCC,EKpGeF,IAA6BF,EAA2BlB,KAAK,CAAEuB,EAAG,GAAK,GAI/D,SAA8BC,GACtD,IAAIC,EAAaL,EAAyBtC,KAAM0C,GAChD,QAASC,GAAcA,EAAWC,YAChCR,GCZJS,EAAiB,SAAUC,EAAQC,GACjC,MAAO,CACLH,aAAuB,EAATE,GACdE,eAAyB,EAATF,GAChBG,WAAqB,EAATH,GACZC,MAAOA,ICLPG,EAAW,GAAGA,SAElBC,EAAiB,SAAUvB,GACzB,OAAOsB,EAAShC,KAAKU,GAAIwB,MAAM,GAAI,ICAjCC,EAAQ,GAAGA,MAGfC,EAAiBtB,GAAM,WAGrB,OAAQb,OAAO,KAAKkB,qBAAqB,MACtC,SAAUT,GACb,MAAsB,UAAf2B,EAAQ3B,GAAkByB,EAAMnC,KAAKU,EAAI,IAAMT,OAAOS,IAC3DT,OCVJqC,EAAiB,SAAU5B,GACzB,GAAU6B,MAAN7B,EAAiB,MAAM8B,UAAU,wBAA0B9B,GAC/D,OAAOA,GCAT+B,EAAiB,SAAU/B,GACzB,OAAOgC,EAAcJ,EAAuB5B,KCL9CiC,EAAiB,SAAUjC,GACzB,MAAqB,iBAAPA,EAAyB,OAAPA,EAA4B,mBAAPA,GCKvDkC,EAAiB,SAAUC,EAAOC,GAChC,IAAKH,EAASE,GAAQ,OAAOA,EAC7B,IAAIrC,EAAIuC,EACR,GAAID,GAAoD,mBAAxBtC,EAAKqC,EAAMb,YAA4BW,EAASI,EAAMvC,EAAGR,KAAK6C,IAAS,OAAOE,EAC9G,GAAmC,mBAAvBvC,EAAKqC,EAAMG,WAA2BL,EAASI,EAAMvC,EAAGR,KAAK6C,IAAS,OAAOE,EACzF,IAAKD,GAAoD,mBAAxBtC,EAAKqC,EAAMb,YAA4BW,EAASI,EAAMvC,EAAGR,KAAK6C,IAAS,OAAOE,EAC/G,MAAMP,UAAU,4CCZdS,EAAiB,GAAGA,eAExBC,EAAiB,SAAUxC,EAAIyC,GAC7B,OAAOF,EAAejD,KAAKU,EAAIyC,ICA7BvD,EAAWvB,EAAOuB,SAElBwD,EAAST,EAAS/C,IAAa+C,EAAS/C,EAASyD,eAErDC,EAAiB,SAAU5C,GACzB,OAAO0C,EAASxD,EAASyD,cAAc3C,GAAM,ICH/C6C,GAAkBC,IAAgB1C,GAAM,WACtC,OAEQ,GAFDb,OAAOC,eAAemD,EAAc,OAAQ,IAAK,CACtDlD,IAAK,WAAc,OAAO,KACzBsD,KCADC,EAAiCzD,OAAOmB,yBhBgMtCuC,EAAiC,CACpCrC,EgB7LSkC,EAAcE,EAAiC,SAAkCE,EAAGC,GAG9F,GAFAD,EAAInB,EAAgBmB,GACpBC,EAAIjB,EAAYiB,GAAG,GACfC,EAAgB,IAClB,OAAOJ,EAA+BE,EAAGC,GACzC,MAAO7C,IACT,GAAIkC,EAAIU,EAAGC,GAAI,OAAOlC,GAA0BoC,EAA2BzC,EAAEtB,KAAK4D,EAAGC,GAAID,EAAEC,MChB7FG,EAAiB,SAAUtD,GACzB,IAAKiC,EAASjC,GACZ,MAAM8B,UAAUyB,OAAOvD,GAAM,qBAC7B,OAAOA,GCAPwD,EAAuBjE,OAAOC,elB6N5BiE,EAAuB,CAC1B7C,EkB1NSkC,EAAcU,EAAuB,SAAwBN,EAAGC,EAAGO,GAI7E,GAHAJ,EAASJ,GACTC,EAAIjB,EAAYiB,GAAG,GACnBG,EAASI,GACLN,EAAgB,IAClB,OAAOI,EAAqBN,EAAGC,EAAGO,GAClC,MAAOpD,IACT,GAAI,QAASoD,GAAc,QAASA,EAAY,MAAM5B,UAAU,2BAEhE,MADI,UAAW4B,IAAYR,EAAEC,GAAKO,EAAWvC,OACtC+B,ICdTS,EAAiBb,EAAc,SAAUc,EAAQnB,EAAKtB,GACpD,OAAO0C,EAAqBjD,EAAEgD,EAAQnB,EAAKxB,EAAyB,EAAGE,KACrE,SAAUyC,EAAQnB,EAAKtB,GAEzB,OADAyC,EAAOnB,GAAOtB,EACPyC,GCLTE,EAAiB,SAAUrB,EAAKtB,GAC9B,IACEwC,EAA4BhG,EAAQ8E,EAAKtB,GACzC,MAAOb,GACP3C,EAAO8E,GAAOtB,EACd,OAAOA,GCLP4C,EAAS,qBAGbC,EAFYrG,EAAOoG,IAAWD,EAAUC,EAAQ,ICF5CE,EAAmB9D,SAASmB,SAGE,mBAAvB4C,EAAMC,gBACfD,EAAMC,cAAgB,SAAUnE,GAC9B,OAAOiE,EAAiB3E,KAAKU,KAIjC,ICDIoE,EAAK3E,EAAK+C,EDCd2B,EAAiBD,EAAMC,cERnBE,EAAU1G,EAAO0G,QAErBC,EAAoC,mBAAZD,GAA0B,cAAcE,KAAKJ,EAAcE,IxBsQ7EG,EAAS3E,GAAqB,SAAU/B,IyBxQ7CA,EAAAD,QAAiB,SAAU4E,EAAKtB,GAC/B,OAAO+C,EAAMzB,KAASyB,EAAMzB,QAAiBZ,IAAVV,EAAsBA,EAAQ,MAChE,WAAY,IAAIsD,KAAK,CACtBC,QAAS,QACTC,KAAyB,SACzBC,UAAW,4CCRTC,EAAK,EACLC,EAAU7E,KAAK8E,SAEnBC,EAAiB,SAAUvC,GACzB,MAAO,UAAYc,YAAe1B,IAARY,EAAoB,GAAKA,GAAO,QAAUoC,EAAKC,GAASxD,SAAS,KCDzF2D,EAAOT,EAAO,QAElBU,EAAiB,SAAUzC,GACzB,OAAOwC,EAAKxC,KAASwC,EAAKxC,GAAOuC,EAAIvC,KCNvC0C,EAAiB,GLSbd,EAAU1G,EAAO0G,QAgBrB,GAAIe,EAAiB,CACnB,IAAIlB,EAAQM,EAAOa,QAAUb,EAAOa,MAAQ,IAAIhB,GAC5CiB,EAAQpB,EAAMzE,IACd8F,EAAQrB,EAAM1B,IACdgD,EAAQtB,EAAME,IAClBA,EAAM,SAAUpE,EAAIyF,GAGlB,OAFAA,EAASC,OAAS1F,EAClBwF,EAAMlG,KAAK4E,EAAOlE,EAAIyF,GACfA,GAEThG,EAAM,SAAUO,GACd,OAAOsF,EAAMhG,KAAK4E,EAAOlE,IAAO,IAElCwC,EAAM,SAAUxC,GACd,OAAOuF,EAAMjG,KAAK4E,EAAOlE,QAEtB,CACL,IAAI2F,EAAQT,EAAU,SACtBC,EAAWQ,IAAS,EACpBvB,EAAM,SAAUpE,EAAIyF,GAGlB,OAFAA,EAASC,OAAS1F,EAClB2D,EAA4B3D,EAAI2F,EAAOF,GAChCA,GAEThG,EAAM,SAAUO,GACd,OAAO4F,EAAU5F,EAAI2F,GAAS3F,EAAG2F,GAAS,IAE5CnD,EAAM,SAAUxC,GACd,OAAO4F,EAAU5F,EAAI2F,IAIzB,IMNIE,ENMJC,GAAiB,CACf1B,IAAKA,EACL3E,IAAKA,EACL+C,IAAKA,EACLuD,QAjDY,SAAU/F,GACtB,OAAOwC,EAAIxC,GAAMP,EAAIO,GAAMoE,EAAIpE,EAAI,KAiDnCgG,UA9Cc,SAAUC,GACxB,OAAO,SAAUjG,GACf,IAAIqF,EACJ,IAAKpD,EAASjC,KAAQqF,EAAQ5F,EAAIO,IAAKkG,OAASD,EAC9C,MAAMnE,UAAU,0BAA4BmE,EAAO,aACnD,OAAOZ,KvBuUPc,GAAWtG,GAAqB,SAAU/B,G8BrVhD,IAAIsI,EAAmBC,GAAoB5G,IACvC6G,EAAuBD,GAAoBN,QAC3CQ,EAAWhD,OAAOA,QAAQ9B,MAAM,WAEnC3D,EAAAD,QAAiB,SAAUqF,EAAGT,EAAKtB,EAAOqF,GACzC,IAGInB,EAHAoB,IAASD,KAAYA,EAAQC,OAC7BC,IAASF,KAAYA,EAAQxF,WAC7B2F,IAAcH,KAAYA,EAAQG,YAElB,mBAATxF,IACS,iBAAPsB,GAAoBD,EAAIrB,EAAO,SACxCwC,EAA4BxC,EAAO,OAAQsB,IAE7C4C,EAAQiB,EAAqBnF,IAClByF,SACTvB,EAAMuB,OAASL,EAASM,KAAmB,iBAAPpE,EAAkBA,EAAM,MAG5DS,IAAMvF,GAIE8I,GAEAE,GAAezD,EAAET,KAC3BiE,GAAS,UAFFxD,EAAET,GAIPiE,EAAQxD,EAAET,GAAOtB,EAChBwC,EAA4BT,EAAGT,EAAKtB,IATnCuF,EAAQxD,EAAET,GAAOtB,EAChB2C,EAAUrB,EAAKtB,KAUrBhB,SAAST,UAAW,YAAY,WACjC,MAAsB,mBAARtB,MAAsBgI,EAAiBhI,MAAMwI,QAAUzC,EAAc/F,YCpCrF0I,GAAiBnJ,ECCboJ,GAAY,SAAUC,GACxB,MAA0B,mBAAZA,EAAyBA,OAAWnF,GAGpDoF,GAAiB,SAAUC,EAAWC,GACpC,OAAOC,UAAUC,OAAS,EAAIN,GAAUD,GAAKI,KAAeH,GAAUpJ,EAAOuJ,IACzEJ,GAAKI,IAAcJ,GAAKI,GAAWC,IAAWxJ,EAAOuJ,IAAcvJ,EAAOuJ,GAAWC,ICTvFG,GAAOrH,KAAKqH,KACZC,GAAQtH,KAAKsH,MAIjBC,GAAiB,SAAUC,GACzB,OAAOC,MAAMD,GAAYA,GAAY,GAAKA,EAAW,EAAIF,GAAQD,IAAMG,ICJrEE,GAAM1H,KAAK0H,IAIfC,GAAiB,SAAUH,GACzB,OAAOA,EAAW,EAAIE,GAAIH,GAAUC,GAAW,kBAAoB,GCLjEI,GAAM5H,KAAK4H,IACXF,GAAM1H,KAAK0H,IAKfG,GAAiB,SAAUC,EAAOV,GAChC,IAAIW,EAAUR,GAAUO,GACxB,OAAOC,EAAU,EAAIH,GAAIG,EAAUX,EAAQ,GAAKM,GAAIK,EAASX,ICL3DY,GAAe,SAAUC,GAC3B,OAAO,SAAUC,EAAOC,EAAIC,GAC1B,IAGIlH,EAHA+B,EAAInB,EAAgBoG,GACpBd,EAASO,GAAS1E,EAAEmE,QACpBU,EAAQD,GAAgBO,EAAWhB,GAIvC,GAAIa,GAAeE,GAAMA,GAAI,KAAOf,EAASU,GAG3C,IAFA5G,EAAQ+B,EAAE6E,OAEG5G,EAAO,OAAO,OAEtB,KAAMkG,EAASU,EAAOA,IAC3B,IAAKG,GAAeH,KAAS7E,IAAMA,EAAE6E,KAAWK,EAAI,OAAOF,GAAeH,GAAS,EACnF,OAAQG,IAAgB,IAI9BI,GAAiB,CAGfC,SAAUN,IAAa,GAGvBO,QAASP,IAAa,IC5BpBO,GAAUC,GAAuCD,QAGrDE,GAAiB,SAAU9E,EAAQ+E,GACjC,IAGIlG,EAHAS,EAAInB,EAAgB6B,GACpBgF,EAAI,EACJC,EAAS,GAEb,IAAKpG,KAAOS,GAAIV,EAAI2C,EAAY1C,IAAQD,EAAIU,EAAGT,IAAQoG,EAAOpE,KAAKhC,GAEnE,KAAOkG,EAAMtB,OAASuB,GAAOpG,EAAIU,EAAGT,EAAMkG,EAAMC,SAC7CJ,GAAQK,EAAQpG,IAAQoG,EAAOpE,KAAKhC,IAEvC,OAAOoG,GCdTC,GAAiB,CACf,cACA,iBACA,gBACA,uBACA,iBACA,WACA,WCLE3D,GAAa2D,GAAYC,OAAO,SAAU,avCoexCC,GAA4B,CAC/BpI,EuCjeSrB,OAAO0J,qBAAuB,SAA6B/F,GACrE,OAAOgG,GAAmBhG,EAAGiC,MvCqezBgE,GAA8B,CACjCvI,EwC9eSrB,OAAO6J,uBCMnBC,GAAiBpC,GAAW,UAAW,YAAc,SAAiBjH,GACpE,IAAIiF,EAAOqE,GAA0B1I,EAAE0C,EAAStD,IAC5CoJ,EAAwBG,GAA4B3I,EACxD,OAAOwI,EAAwBnE,EAAK8D,OAAOK,EAAsBpJ,IAAOiF,GCJ1EuE,GAAiB,SAAUC,EAAQ7C,GAIjC,IAHA,IAAI3B,EAAOoE,GAAQzC,GACfpH,EAAiBqE,EAAqBjD,EACtCF,EAA2BgJ,EAA+B9I,EACrDgI,EAAI,EAAGA,EAAI3D,EAAKoC,OAAQuB,IAAK,CACpC,IAAInG,EAAMwC,EAAK2D,GACVpG,EAAIiH,EAAQhH,IAAMjD,EAAeiK,EAAQhH,EAAK/B,EAAyBkG,EAAQnE,MCTpFkH,GAAc,kBAEdC,GAAW,SAAUC,EAASC,GAChC,IAAI3I,EAAQ4I,GAAKC,GAAUH,IAC3B,OAAO1I,GAAS8I,IACZ9I,GAAS+I,KACW,mBAAbJ,EAA0B1J,EAAM0J,KACrCA,IAGJE,GAAYJ,GAASI,UAAY,SAAUG,GAC7C,OAAO5G,OAAO4G,GAAQC,QAAQT,GAAa,KAAKU,eAG9CN,GAAOH,GAASG,KAAO,GACvBG,GAASN,GAASM,OAAS,IAC3BD,GAAWL,GAASK,SAAW,IAEnCK,GAAiBV,GCnBblJ,GAA2B+H,EAA2D7H,EAqB1F2J,GAAiB,SAAU/D,EAASI,GAClC,IAGY6C,EAAQhH,EAAK+H,EAAgBC,EAAgB1J,EAHrD2J,EAASlE,EAAQiD,OACjBkB,EAASnE,EAAQ7I,OACjBiN,EAASpE,EAAQqE,KASrB,GANEpB,EADEkB,EACOhN,EACAiN,EACAjN,EAAO+M,IAAW5G,EAAU4G,EAAQ,KAEnC/M,EAAO+M,IAAW,IAAIhL,UAEtB,IAAK+C,KAAOmE,EAAQ,CAQ9B,GAPA6D,EAAiB7D,EAAOnE,GAGtB+H,EAFEhE,EAAQG,aACV5F,EAAaL,GAAyB+I,EAAQhH,KACf1B,EAAWI,MACpBsI,EAAOhH,IACtBmH,GAASe,EAASlI,EAAMiI,GAAUE,EAAS,IAAM,KAAOnI,EAAK+D,EAAQsE,cAE5CjJ,IAAnB2I,EAA8B,CAC3C,UAAWC,UAA0BD,EAAgB,SACrDhB,GAA0BiB,EAAgBD,IAGxChE,EAAQuE,MAASP,GAAkBA,EAAeO,OACpDpH,EAA4B8G,EAAgB,QAAQ,GAGtDtE,GAASsD,EAAQhH,EAAKgI,EAAgBjE,KCjD1CwE,KAAmBzL,OAAO6J,wBAA0BhJ,GAAM,WAGxD,OAAQmD,OAAO0H,aCHjBC,GAAiBC,KAEXF,OAAOF,MAEkB,iBAAnBE,OAAOG,SCFnBC,GAAiBC,MAAMD,SAAW,SAAiBE,GACjD,MAAuB,SAAhB5J,EAAQ4J,ICDjBC,GAAiB,SAAU/D,GACzB,OAAOlI,OAAOqC,EAAuB6F,KCAvCgE,GAAiBlM,OAAO0F,MAAQ,SAAc/B,GAC5C,OAAOgG,GAAmBhG,EAAG4F,KCC/B4C,GAAiB5I,EAAcvD,OAAOoM,iBAAmB,SAA0BzI,EAAG0I,GACpFtI,EAASJ,GAKT,IAJA,IAGIT,EAHAwC,EAAOwG,GAAWG,GAClBvE,EAASpC,EAAKoC,OACdU,EAAQ,EAELV,EAASU,GAAOlE,EAAqBjD,EAAEsC,EAAGT,EAAMwC,EAAK8C,KAAU6D,EAAWnJ,IACjF,OAAOS,GCZT2I,GAAiB5E,GAAW,WAAY,mBtBUpC6E,GAAW5G,EAAU,YAErB6G,GAAmB,aAEnBC,GAAY,SAAUC,GACxB,MAAOC,WAAmBD,EAAnBC,KAAAA,WAmCLC,GAAkB,WACpB,IAEEtG,EAAkB3G,SAASkN,QAAU,IAAIC,cAAc,YACvD,MAAO/L,IA1BoB,IAIzBgM,EAFAC,EAyBJJ,GAAkBtG,EApCY,SAAUA,GACxCA,EAAgB2G,MAAMR,GAAU,KAChCnG,EAAgB4G,QAChB,IAAIC,EAAO7G,EAAgB8G,aAAapN,OAExC,OADAsG,EAAkB,KACX6G,EA+B6BE,CAA0B/G,KAzB1D0G,EAAS3J,EAAsB,WAG5BiK,MAAMC,QAAU,OACvBjB,GAAKkB,YAAYR,GAEjBA,EAAOS,IAAMzJ,OALJ,gBAMT+I,EAAiBC,EAAOU,cAAc/N,UACvBgO,OACfZ,EAAeE,MAAMR,GAAU,sBAC/BM,EAAeG,QACRH,EAAea,GAgBtB,IADA,IAAI9F,EAASyB,GAAYzB,OAClBA,YAAiB8E,GAAyB,UAAErD,GAAYzB,IAC/D,OAAO8E,MAGThH,EAAW2G,KAAY,EAIvB,IAAAsB,GAAiB7N,OAAO8N,QAAU,SAAgBnK,EAAG0I,GACnD,IAAI/C,EAQJ,OAPU,OAAN3F,GACF6I,GAA0B,UAAIzI,EAASJ,GACvC2F,EAAS,IAAIkD,GACbA,GAA0B,UAAI,KAE9BlD,EAAOiD,IAAY5I,GACd2F,EAASsD,UACMtK,IAAf+J,EAA2B/C,EAAS8C,GAAiB9C,EAAQ+C,IuB3ElE0B,GAA4B7E,GAAsD7H,EAElFU,GAAW,GAAGA,SAEdiM,GAA+B,iBAAVlP,QAAsBA,QAAUkB,OAAO0J,oBAC5D1J,OAAO0J,oBAAoB5K,QAAU,GpD+sBnCmP,GAAoC,CACvC5M,EoDrsBgB,SAA6BZ,GAC9C,OAAOuN,IAAoC,mBAArBjM,GAAShC,KAAKU,GAVjB,SAAUA,GAC7B,IACE,OAAOsN,GAA0BtN,GACjC,MAAOM,GACP,OAAOiN,GAAY/L,SAOjBiM,CAAezN,GACfsN,GAA0BvL,EAAgB/B,MCb5C0N,GAAwBlJ,EAAO,OAC/ByG,GAAStN,EAAOsN,OAChB0C,GAAwBC,GAAoB3C,GAASA,IAAUA,GAAO4C,eAAiB7I,EAE3F8I,GAAiB,SAAUC,GAIvB,OAHGvL,EAAIkL,GAAuBK,KAC1B5C,IAAiB3I,EAAIyI,GAAQ8C,GAAOL,GAAsBK,GAAQ9C,GAAO8C,GACxEL,GAAsBK,GAAQJ,GAAsB,UAAYI,IAC9DL,GAAsBK,IrDutB3BC,GAAyB,CAC5BpN,EsDruBSkN,ICCRtO,GAAiBiJ,EAA+C7H,EAEpEqN,GAAiB,SAAUC,GACzB,IAAIjD,EAASnE,GAAKmE,SAAWnE,GAAKmE,OAAS,IACtCzI,EAAIyI,EAAQiD,IAAO1O,GAAeyL,EAAQiD,EAAM,CACnD/M,MAAOgN,GAA6BvN,EAAEsN,MCRtC1O,GAAiBiJ,EAA+C7H,EAIhEwN,GAAgBN,GAAgB,eAEpCO,GAAiB,SAAUrO,EAAIsO,EAAK1D,GAC9B5K,IAAOwC,EAAIxC,EAAK4K,EAAS5K,EAAKA,EAAGN,UAAW0O,KAC9C5O,GAAeQ,EAAIoO,GAAe,CAAEhN,cAAc,EAAMD,MAAOmN,KCRnEC,GAAiB,SAAUvO,GACzB,GAAiB,mBAANA,EACT,MAAM8B,UAAUyB,OAAOvD,GAAM,sBAC7B,OAAOA,GCAXwO,GAAiB,SAAU1O,EAAI2O,EAAMpH,GAEnC,GADAN,GAAUjH,QACG+B,IAAT4M,EAAoB,OAAO3O,EAC/B,OAAQuH,GACN,KAAK,EAAG,OAAO,WACb,OAAOvH,EAAGR,KAAKmP,IAEjB,KAAK,EAAG,OAAO,SAAU1L,GACvB,OAAOjD,EAAGR,KAAKmP,EAAM1L,IAEvB,KAAK,EAAG,OAAO,SAAUA,EAAG2L,GAC1B,OAAO5O,EAAGR,KAAKmP,EAAM1L,EAAG2L,IAE1B,KAAK,EAAG,OAAO,SAAU3L,EAAG2L,EAAGC,GAC7B,OAAO7O,EAAGR,KAAKmP,EAAM1L,EAAG2L,EAAGC,IAG/B,OAAO,WACL,OAAO7O,EAAG8O,MAAMH,EAAMrH,aCjBtByH,GAAUf,GAAgB,WAI9BgB,GAAiB,SAAUC,EAAe1H,GACxC,IAAI2H,EASF,OARE3D,GAAQ0D,KAGM,mBAFhBC,EAAID,EAAcE,cAEaD,IAAM1D,QAASD,GAAQ2D,EAAEtP,WAC/CuC,EAAS+M,IAEN,QADVA,EAAIA,EAAEH,OACUG,OAAInN,GAH+CmN,OAAInN,GAKlE,SAAWA,IAANmN,EAAkB1D,MAAQ0D,GAAc,IAAX3H,EAAe,EAAIA,ICZ5D5C,GAAO,GAAGA,KAGVwD,GAAe,SAAUhC,GAC3B,IAAIiJ,EAAiB,GAARjJ,EACTkJ,EAAoB,GAARlJ,EACZmJ,EAAkB,GAARnJ,EACVoJ,EAAmB,GAARpJ,EACXqJ,EAAwB,GAARrJ,EAChBsJ,EAAmB,GAARtJ,GAAaqJ,EAC5B,OAAO,SAAUnH,EAAOqH,EAAYf,EAAMgB,GASxC,IARA,IAOItO,EAAO0H,EAPP3F,EAAIsI,GAASrD,GACbjK,EAAO8D,EAAckB,GACrBwM,EAAgBC,GAAKH,EAAYf,EAAM,GACvCpH,EAASO,GAAS1J,EAAKmJ,QACvBU,EAAQ,EACRsF,EAASoC,GAAkBX,GAC3BrF,EAASyF,EAAS7B,EAAOlF,EAAOd,GAAU8H,EAAY9B,EAAOlF,EAAO,QAAKtG,EAEvEwF,EAASU,EAAOA,IAAS,IAAIwH,GAAYxH,KAAS7J,KAEtD2K,EAAS6G,EADTvO,EAAQjD,EAAK6J,GACiBA,EAAO7E,GACjC+C,GACF,GAAIiJ,EAAQzF,EAAO1B,GAASc,OACvB,GAAIA,EAAQ,OAAQ5C,GACvB,KAAK,EAAG,OAAO,EACf,KAAK,EAAG,OAAO9E,EACf,KAAK,EAAG,OAAO4G,EACf,KAAK,EAAGtD,GAAKnF,KAAKmK,EAAQtI,QACrB,GAAIkO,EAAU,OAAO,EAGhC,OAAOC,GAAiB,EAAIF,GAAWC,EAAWA,EAAW5F,IAIjEmG,GAAiB,CAGfC,QAAS5H,GAAa,GAGtB6H,IAAK7H,GAAa,GAGlB8H,OAAQ9H,GAAa,GAGrB+H,KAAM/H,GAAa,GAGnBgI,MAAOhI,GAAa,GAGpBiI,KAAMjI,GAAa,GAGnBkI,UAAWlI,GAAa,IC3BtBmI,GAAW3H,GAAwCoH,QAEnDQ,GAASnL,EAAU,UACnBoL,GAAS,SAETC,GAAezC,GAAgB,eAC/B0C,GAAmBnK,GAAoBjC,IACvCgC,GAAmBC,GAAoBL,UAAUsK,IACjDG,GAAkBlR,OAAgB,UAClCmR,GAAU/S,EAAOsN,OACjB0F,GAAa1J,GAAW,OAAQ,aAChCjE,GAAiC0G,EAA+B9I,EAChE4C,GAAuBK,EAAqBjD,EAC5C0M,GAA4BsD,GAA4BhQ,EACxDJ,GAA6B6C,EAA2BzC,EACxDiQ,GAAarM,EAAO,WACpBsM,GAAyBtM,EAAO,cAChCuM,GAAyBvM,EAAO,6BAChCwM,GAAyBxM,EAAO,6BAChCkJ,GAAwBlJ,EAAO,OAC/ByM,GAAUtT,EAAOsT,QAEjBC,IAAcD,KAAYA,GAAiB,YAAMA,GAAiB,UAAEE,UAGpEC,GAAsBtO,GAAe1C,GAAM,WAC7C,OAES,GAFFiR,GAAmB7N,GAAqB,GAAI,IAAK,CACtD/D,IAAK,WAAc,OAAO+D,GAAqBpF,KAAM,IAAK,CAAE+C,MAAO,IAAK4B,MACtEA,KACD,SAAUG,EAAGC,EAAGO,GACnB,IAAI4N,EAA4BtO,GAA+ByN,GAAiBtN,GAC5EmO,UAAkCb,GAAgBtN,GACtDK,GAAqBN,EAAGC,EAAGO,GACvB4N,GAA6BpO,IAAMuN,IACrCjN,GAAqBiN,GAAiBtN,EAAGmO,IAEzC9N,GAEA+N,GAAO,SAAUC,EAAKC,GACxB,IAAIC,EAASb,GAAWW,GAAOH,GAAmBX,GAAiB,WAOnE,OANAF,GAAiBkB,EAAQ,CACvBxL,KAAMoK,GACNkB,IAAKA,EACLC,YAAaA,IAEV3O,IAAa4O,EAAOD,YAAcA,GAChCC,GAGLC,GAAW/D,GAAoB,SAAU5N,GAC3C,MAAoB,iBAANA,GACZ,SAAUA,GACZ,OAAOT,OAAOS,aAAe0Q,IAG3BkB,GAAkB,SAAwB1O,EAAGC,EAAGO,GAC9CR,IAAMuN,IAAiBmB,GAAgBd,GAAwB3N,EAAGO,GACtEJ,EAASJ,GACT,IAAIT,EAAMP,EAAYiB,GAAG,GAEzB,OADAG,EAASI,GACLlB,EAAIqO,GAAYpO,IACbiB,EAAW1C,YAIVwB,EAAIU,EAAGmN,KAAWnN,EAAEmN,IAAQ5N,KAAMS,EAAEmN,IAAQ5N,IAAO,GACvDiB,EAAa2N,GAAmB3N,EAAY,CAAE1C,WAAYC,EAAyB,GAAG,OAJjFuB,EAAIU,EAAGmN,KAAS7M,GAAqBN,EAAGmN,GAAQpP,EAAyB,EAAG,KACjFiC,EAAEmN,IAAQ5N,IAAO,GAIV2O,GAAoBlO,EAAGT,EAAKiB,IAC9BF,GAAqBN,EAAGT,EAAKiB,IAGpCmO,GAAoB,SAA0B3O,EAAG0I,GACnDtI,EAASJ,GACT,IAAI4O,EAAa/P,EAAgB6J,GAC7B3G,EAAOwG,GAAWqG,GAAY/I,OAAOgJ,GAAuBD,IAIhE,OAHA1B,GAASnL,GAAM,SAAUxC,GAClBK,IAAekP,GAAsB1S,KAAKwS,EAAYrP,IAAMmP,GAAgB1O,EAAGT,EAAKqP,EAAWrP,OAE/FS,GAOL8O,GAAwB,SAA8BlR,GACxD,IAAIqC,EAAIjB,EAAYpB,GAAG,GACnBE,EAAaR,GAA2BlB,KAAKlB,KAAM+E,GACvD,QAAI/E,OAASqS,IAAmBjO,EAAIqO,GAAY1N,KAAOX,EAAIsO,GAAwB3N,QAC5EnC,IAAewB,EAAIpE,KAAM+E,KAAOX,EAAIqO,GAAY1N,IAAMX,EAAIpE,KAAMiS,KAAWjS,KAAKiS,IAAQlN,KAAKnC,IAGlGiR,GAA4B,SAAkC/O,EAAGC,GACnE,IAAInD,EAAK+B,EAAgBmB,GACrBT,EAAMP,EAAYiB,GAAG,GACzB,GAAInD,IAAOyQ,KAAmBjO,EAAIqO,GAAYpO,IAASD,EAAIsO,GAAwBrO,GAAnF,CACA,IAAI1B,EAAaiC,GAA+BhD,EAAIyC,GAIpD,OAHI1B,IAAcyB,EAAIqO,GAAYpO,IAAUD,EAAIxC,EAAIqQ,KAAWrQ,EAAGqQ,IAAQ5N,KACxE1B,EAAWC,YAAa,GAEnBD,IAGLmR,GAAuB,SAA6BhP,GACtD,IAAIyF,EAAQ2E,GAA0BvL,EAAgBmB,IAClD2F,EAAS,GAIb,OAHAuH,GAASzH,GAAO,SAAUlG,GACnBD,EAAIqO,GAAYpO,IAASD,EAAI2C,EAAY1C,IAAMoG,EAAOpE,KAAKhC,MAE3DoG,GAGLkJ,GAAyB,SAA+B7O,GAC1D,IAAIiP,EAAsBjP,IAAMuN,GAC5B9H,EAAQ2E,GAA0B6E,EAAsBrB,GAAyB/O,EAAgBmB,IACjG2F,EAAS,GAMb,OALAuH,GAASzH,GAAO,SAAUlG,IACpBD,EAAIqO,GAAYpO,IAAU0P,IAAuB3P,EAAIiO,GAAiBhO,IACxEoG,EAAOpE,KAAKoM,GAAWpO,OAGpBoG,GAkHT,GA7GKsC,KAcHhF,IAbAuK,GAAU,WACR,GAAItS,gBAAgBsS,GAAS,MAAM5O,UAAU,+BAC7C,IAAI2P,EAAerK,UAAUC,aAA2BxF,IAAjBuF,UAAU,GAA+B7D,OAAO6D,UAAU,SAA7BvF,EAChE2P,EAAMxM,EAAIyM,GACVW,EAAS,SAAUjR,GACjB/C,OAASqS,IAAiB2B,EAAO9S,KAAKwR,GAAwB3P,GAC9DqB,EAAIpE,KAAMiS,KAAW7N,EAAIpE,KAAKiS,IAASmB,KAAMpT,KAAKiS,IAAQmB,IAAO,GACrEJ,GAAoBhT,KAAMoT,EAAKvQ,EAAyB,EAAGE,KAG7D,OADI2B,GAAeoO,IAAYE,GAAoBX,GAAiBe,EAAK,CAAEpQ,cAAc,EAAMgD,IAAKgO,IAC7Fb,GAAKC,EAAKC,KAGO,UAAG,YAAY,WACvC,OAAOrL,GAAiBhI,MAAMoT,OAGhCrL,GAASuK,GAAS,iBAAiB,SAAUe,GAC3C,OAAOF,GAAKvM,EAAIyM,GAAcA,MAGhCpO,EAA2BzC,EAAIoR,GAC/BnO,EAAqBjD,EAAIgR,GACzBlI,EAA+B9I,EAAIqR,GACnC3I,GAA0B1I,EAAIgQ,GAA4BhQ,EAAIsR,GAC9D3I,GAA4B3I,EAAImR,GAEhC5D,GAA6BvN,EAAI,SAAUmN,GACzC,OAAOwD,GAAKzD,GAAgBC,GAAOA,IAGjCjL,IAEFU,GAAqBkN,GAAiB,UAAG,cAAe,CACtDtP,cAAc,EACd3B,IAAK,WACH,OAAO2G,GAAiBhI,MAAMqT,eAIhCtL,GAASsK,GAAiB,uBAAwBuB,GAAuB,CAAEvL,QAAQ,MAKzF4L,GAAE,CAAE1U,QAAQ,EAAM4T,MAAM,EAAMzG,QAASK,GAAeJ,MAAOI,IAAiB,CAC5EF,OAAQyF,KAGVN,GAAS3E,GAAWiC,KAAwB,SAAUK,GACpDE,GAAsBF,MAGxBsE,GAAE,CAAE5I,OAAQ6G,GAAQzF,MAAM,EAAMC,QAASK,IAAiB,CAGxDmH,IAAO,SAAU7P,GACf,IAAI0H,EAAS5G,OAAOd,GACpB,GAAID,EAAIuO,GAAwB5G,GAAS,OAAO4G,GAAuB5G,GACvE,IAAIuH,EAAShB,GAAQvG,GAGrB,OAFA4G,GAAuB5G,GAAUuH,EACjCV,GAAuBU,GAAUvH,EAC1BuH,GAITa,OAAQ,SAAgBC,GACtB,IAAKb,GAASa,GAAM,MAAM1Q,UAAU0Q,EAAM,oBAC1C,GAAIhQ,EAAIwO,GAAwBwB,GAAM,OAAOxB,GAAuBwB,IAEtEC,UAAW,WAAcvB,IAAa,GACtCwB,UAAW,WAAcxB,IAAa,KAGxCmB,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,EAAMC,QAASK,GAAeJ,MAAOjI,GAAe,CAG9EuK,OA3HY,SAAgBnK,EAAG0I,GAC/B,YAAsB/J,IAAf+J,EAA2ByF,GAAmBnO,GAAK2O,GAAkBR,GAAmBnO,GAAI0I,IA6HnGpM,eAAgBoS,GAGhBjG,iBAAkBkG,GAGlBnR,yBAA0BuR,KAG5BI,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,EAAMC,QAASK,IAAiB,CAG1DlC,oBAAqBiJ,GAGrB9I,sBAAuB2I,KAKzBM,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,EAAMC,OAAQ1K,GAAM,WAAcmJ,GAA4B3I,EAAE,OAAU,CACpGwI,sBAAuB,SAA+BpJ,GACpD,OAAOuJ,GAA4B3I,EAAE4K,GAASxL,OAM9C2Q,GAAY,CACd,IAAIgC,IAAyBxH,IAAiB/K,GAAM,WAClD,IAAIsR,EAAShB,KAEb,MAA+B,UAAxBC,GAAW,CAACe,KAEe,MAA7Bf,GAAW,CAAE5N,EAAG2O,KAEc,MAA9Bf,GAAWpR,OAAOmS,OAGzBW,GAAE,CAAE5I,OAAQ,OAAQoB,MAAM,EAAMC,OAAQ6H,IAAyB,CAE/DC,UAAW,SAAmB5S,EAAI6S,EAAUC,GAI1C,IAHA,IAEIC,EAFAC,EAAO,CAAChT,GACR+H,EAAQ,EAELX,UAAUC,OAASU,GAAOiL,EAAKvO,KAAK2C,UAAUW,MAErD,GADAgL,EAAYF,GACP5Q,EAAS4Q,SAAoBhR,IAAP7B,KAAoB2R,GAAS3R,GAMxD,OALKqL,GAAQwH,KAAWA,EAAW,SAAUpQ,EAAKtB,GAEhD,GADwB,mBAAb4R,IAAyB5R,EAAQ4R,EAAUzT,KAAKlB,KAAMqE,EAAKtB,KACjEwQ,GAASxQ,GAAQ,OAAOA,IAE/B6R,EAAK,GAAKH,EACHlC,GAAW/B,MAAM,KAAMoE,MAO/BtC,GAAiB,UAAEH,KACtB5M,EAA4B+M,GAAiB,UAAGH,GAAcG,GAAiB,UAAEpO,SAInF+L,GAAeqC,GAASJ,IAExBnL,EAAWkL,KAAU,EC9SrB,IAAI7Q,GAAiBiJ,EAA+C7H,EAGhEqS,GAAetV,EAAOsN,OAE1B,GAAInI,GAAsC,mBAAhBmQ,OAAiC,gBAAiBA,GAAavT,iBAExDmC,IAA/BoR,KAAexB,aACd,CACD,IAAIyB,GAA8B,GAE9BC,GAAgB,WAClB,IAAI1B,EAAcrK,UAAUC,OAAS,QAAsBxF,IAAjBuF,UAAU,QAAmBvF,EAAY0B,OAAO6D,UAAU,IAChGyB,EAASzK,gBAAgB+U,GACzB,IAAIF,GAAaxB,QAED5P,IAAhB4P,EAA4BwB,KAAiBA,GAAaxB,GAE9D,MADoB,KAAhBA,IAAoByB,GAA4BrK,IAAU,GACvDA,GAETW,GAA0B2J,GAAeF,IACzC,IAAIG,GAAkBD,GAAczT,UAAYuT,GAAavT,UAC7D0T,GAAgBnE,YAAckE,GAE9B,IAAIE,GAAiBD,GAAgB9R,SACjCgS,GAAyC,gBAAhC/P,OAAO0P,GAAa,SAC7BM,GAAS,wBACb/T,GAAe4T,GAAiB,cAAe,CAC7ChS,cAAc,EACd3B,IAAK,WACH,IAAIiS,EAASzP,EAAS7D,MAAQA,KAAKkE,UAAYlE,KAC3C+L,EAASkJ,GAAe/T,KAAKoS,GACjC,GAAIlP,EAAI0Q,GAA6BxB,GAAS,MAAO,GACrD,IAAI8B,EAAOF,GAASnJ,EAAO3I,MAAM,GAAI,GAAK2I,EAAOC,QAAQmJ,GAAQ,MACjE,MAAgB,KAATC,OAAc3R,EAAY2R,KAIrCnB,GAAE,CAAE1U,QAAQ,EAAMmN,QAAQ,GAAQ,CAChCG,OAAQkI,KC3CZlF,GAAsB,YCDtB,IAAAwF,GAAiB,SAAUC,EAAajM,GACtC,IAAIN,EAAS,GAAGuM,GAChB,QAASvM,GAAU/G,GAAM,WAEvB+G,EAAO7H,KAAK,KAAMmI,GAAY,WAAc,MAAM,GAAM,OCHxDjI,GAAiBD,OAAOC,eACxBmU,GAAQ,GAERC,GAAU,SAAU5T,GAAM,MAAMA,GAEpC6T,GAAiB,SAAUH,EAAalN,GACtC,GAAIhE,EAAImR,GAAOD,GAAc,OAAOC,GAAMD,GACrClN,IAASA,EAAU,IACxB,IAAIW,EAAS,GAAGuM,GACZI,IAAYtR,EAAIgE,EAAS,cAAeA,EAAQsN,UAChDC,EAAYvR,EAAIgE,EAAS,GAAKA,EAAQ,GAAKoN,GAC3CI,EAAYxR,EAAIgE,EAAS,GAAKA,EAAQ,QAAK3E,EAE/C,OAAO8R,GAAMD,KAAiBvM,IAAW/G,GAAM,WAC7C,GAAI0T,IAAchR,EAAa,OAAO,EACtC,IAAII,EAAI,CAAEmE,QAAS,GAEfyM,EAAWtU,GAAe0D,EAAG,EAAG,CAAElC,YAAY,EAAMvB,IAAKmU,KACxD1Q,EAAE,GAAK,EAEZiE,EAAO7H,KAAK4D,EAAG6Q,EAAWC,OCvB1B5D,GAAW3H,GAAwCoH,QAInDoE,GAAgBR,GAAoB,WACpCS,GAAiBL,GAAwB,WAI7CM,GAAmBF,IAAkBC,GAEjC,GAAGrE,QAFgD,SAAiBL,GACtE,OAAOY,GAAShS,KAAMoR,EAAYpI,UAAUC,OAAS,EAAID,UAAU,QAAKvF,ICL1EwQ,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,OAAQ,GAAG+E,SAAWA,IAAW,CACjEA,QAASA,KCLX,IAAIwE,GAAW5L,GAAuCD,QAIlD8L,GAAgB,GAAG9L,QAEnB+L,KAAkBD,IAAiB,EAAI,CAAC,GAAG9L,QAAQ,GAAI,GAAK,EAC5DyL,GAAgBR,GAAoB,WACpCS,GAAiBL,GAAwB,UAAW,CAAEC,WAAW,EAAMjT,EAAG,IAI9EwR,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,OAAQyJ,KAAkBN,KAAkBC,IAAkB,CAC9F1L,QAAS,SAAiBgM,GACxB,OAAOD,GAEHD,GAAc1F,MAAMxQ,KAAMgJ,YAAc,EACxCiN,GAASjW,KAAMoW,EAAepN,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MCf5E,IAAI4S,GAAc3G,GAAgB,eAC9B4G,GAAiBpJ,MAAM5L,UAIQmC,MAA/B6S,GAAeD,KACjB5Q,EAAqBjD,EAAE8T,GAAgBD,GAAa,CAClDrT,cAAc,EACdD,MAAOkM,GAAO,QAKlB,ICHIsH,GAAmBC,GAAmCC,GDG1DC,GAAiB,SAAUrS,GACzBiS,GAAeD,IAAahS,IAAO,GElBrCsS,GAAiB,GCEjBC,IAAkB5U,GAAM,WACtB,SAAS+M,KAET,OADAA,EAAEzN,UAAUuP,YAAc,KACnB1P,OAAO0V,eAAe,IAAI9H,KAASA,EAAEzN,aCA1CoM,GAAW5G,EAAU,YACrBuL,GAAkBlR,OAAOG,UAI7BwV,GAAiBC,GAA2B5V,OAAO0V,eAAiB,SAAU/R,GAE5E,OADAA,EAAIsI,GAAStI,GACTV,EAAIU,EAAG4I,IAAkB5I,EAAE4I,IACH,mBAAjB5I,EAAE+L,aAA6B/L,aAAaA,EAAE+L,YAChD/L,EAAE+L,YAAYvP,UACdwD,aAAa3D,OAASkR,GAAkB,MHR/C2E,GAAWtH,GAAgB,YAC3BuH,IAAyB,EAQzB,GAAGpQ,OAGC,SAFN4P,GAAgB,GAAG5P,SAIjB2P,GAAoCK,GAAeA,GAAeJ,QACxBtV,OAAOG,YAAWiV,GAAoBC,IAHlDS,IAAyB,GAOlCxT,MAArB8S,KAAgCA,GAAoB,IAGvCnS,EAAImS,GAAmBS,KACtCzR,EAA4BgR,GAAmBS,IApBhC,WAAc,OAAOhX,QAuBtC,IAAAkX,GAAiB,CACfX,kBAAmBA,GACnBU,uBAAwBA,IIlCtBV,GAAoBlM,GAAuCkM,kBAM3DY,GAAa,WAAc,OAAOnX,MAEtCoX,GAAiB,SAAUC,EAAqBvH,EAAMwH,GACpD,IAAItH,EAAgBF,EAAO,YAI3B,OAHAuH,EAAoB/V,UAAY2N,GAAOsH,GAAmB,CAAEe,KAAMzU,EAAyB,EAAGyU,KAC9FrH,GAAeoH,EAAqBrH,GAAe,GACnDuH,GAAUvH,GAAiBmH,GACpBE,GCPTG,GAAiBrW,OAAOsW,iBAAmB,aAAe,GAAK,WAC7D,IAEIzD,EAFA0D,GAAiB,EACjBvR,EAAO,GAEX,KACE6N,EAAS7S,OAAOmB,yBAAyBnB,OAAOG,UAAW,aAAa0E,KACjE9E,KAAKiF,EAAM,IAClBuR,EAAiBvR,aAAgB+G,MACjC,MAAOhL,IACT,OAAO,SAAwB4C,EAAGkR,GAKhC,OAJA9Q,EAASJ,GCfI,SAAUlD,GACzB,IAAKiC,EAASjC,IAAc,OAAPA,EACnB,MAAM8B,UAAU,aAAeyB,OAAOvD,GAAM,mBDc5C+V,CAAmB3B,GACf0B,EAAgB1D,EAAO9S,KAAK4D,EAAGkR,GAC9BlR,EAAE8S,UAAY5B,EACZlR,GAdoD,QAgBzDrB,GEVF8S,GAAoBsB,GAActB,kBAClCU,GAAyBY,GAAcZ,uBACvCD,GAAWtH,GAAgB,YAC3BoI,GAAO,OACPC,GAAS,SACTC,GAAU,UAEVb,GAAa,WAAc,OAAOnX,MAEtCiY,GAAiB,SAAUC,EAAUpI,EAAMuH,EAAqBC,EAAMa,EAASC,EAAQC,GACrFjB,GAA0BC,EAAqBvH,EAAMwH,GAErD,IAkBIgB,EAA0BC,EAASC,EAlBnCC,EAAqB,SAAUC,GACjC,GAAIA,IAASP,GAAWQ,EAAiB,OAAOA,EAChD,IAAK1B,IAA0ByB,KAAQE,EAAmB,OAAOA,EAAkBF,GACnF,OAAQA,GACN,KAAKZ,GACL,KAAKC,GACL,KAAKC,GAAS,OAAO,WAAqB,OAAO,IAAIX,EAAoBrX,KAAM0Y,IAC/E,OAAO,WAAc,OAAO,IAAIrB,EAAoBrX,QAGpDgQ,EAAgBF,EAAO,YACvB+I,GAAwB,EACxBD,EAAoBV,EAAS5W,UAC7BwX,EAAiBF,EAAkB5B,KAClC4B,EAAkB,eAClBT,GAAWS,EAAkBT,GAC9BQ,GAAmB1B,IAA0B6B,GAAkBL,EAAmBN,GAClFY,EAA4B,SAARjJ,GAAkB8I,EAAkBI,SAA4BF,EAiCxF,GA7BIC,IACFT,EAA2BzB,GAAekC,EAAkB7X,KAAK,IAAIgX,IACjE3B,KAAsBpV,OAAOG,WAAagX,EAAyBhB,OACrDT,GAAeyB,KAA8B/B,KACvDkB,GACFA,GAAea,EAA0B/B,IACa,mBAAtC+B,EAAyBtB,KACzCzR,EAA4B+S,EAA0BtB,GAAUG,KAIpElH,GAAeqI,EAA0BtI,GAAe,KAMxDmI,GAAWJ,IAAUe,GAAkBA,EAAenJ,OAASoI,KACjEc,GAAwB,EACxBF,EAAkB,WAAoB,OAAOG,EAAe5X,KAAKlB,QAIvC4Y,EAAkB5B,MAAc2B,GAC1DpT,EAA4BqT,EAAmB5B,GAAU2B,GAE3DpB,GAAUzH,GAAQ6I,EAGdR,EAMF,GALAI,EAAU,CACRU,OAAQR,EAAmBV,IAC3BlR,KAAMuR,EAASO,EAAkBF,EAAmBX,IACpDkB,QAASP,EAAmBT,KAE1BK,EAAQ,IAAKG,KAAOD,GAClBtB,IAA0B4B,KAA2BL,KAAOI,KAC9D7Q,GAAS6Q,EAAmBJ,EAAKD,EAAQC,SAEtCvE,GAAE,CAAE5I,OAAQyE,EAAMkG,OAAO,EAAMtJ,OAAQuK,IAA0B4B,GAAyBN,GAGnG,OAAOA,GCjFLW,GAAiB,iBACjB9G,GAAmBnK,GAAoBjC,IACvCgC,GAAmBC,GAAoBL,UAAUsR,IAYrDC,GAAiBlB,GAAe/K,MAAO,SAAS,SAAUkM,EAAUC,GAClEjH,GAAiBpS,KAAM,CACrB8H,KAAMoR,GACN7N,OAAQ1H,EAAgByV,GACxBzP,MAAO,EACP0P,KAAMA,OAIP,WACD,IAAIpS,EAAQe,GAAiBhI,MACzBqL,EAASpE,EAAMoE,OACfgO,EAAOpS,EAAMoS,KACb1P,EAAQ1C,EAAM0C,QAClB,OAAK0B,GAAU1B,GAAS0B,EAAOpC,QAC7BhC,EAAMoE,YAAS5H,EACR,CAAEV,WAAOU,EAAW6V,MAAM,IAEvB,QAARD,EAAuB,CAAEtW,MAAO4G,EAAO2P,MAAM,GACrC,UAARD,EAAyB,CAAEtW,MAAOsI,EAAO1B,GAAQ2P,MAAM,GACpD,CAAEvW,MAAO,CAAC4G,EAAO0B,EAAO1B,IAAS2P,MAAM,KAC7C,UAKH/B,GAAUgC,UAAYhC,GAAUrK,MAGhCwJ,GAAiB,QACjBA,GAAiB,UACjBA,GAAiB,WC9CjB,IAAI8C,GAAa,GAAG/Q,KAEhBgR,GAAc7V,GAAiBzC,OAC/B0U,GAAgBR,GAAoB,OAAQ,KAIhDpB,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,OAAQ+M,KAAgB5D,IAAiB,CACzEpN,KAAM,SAAciR,GAClB,OAAOF,GAAWtY,KAAKyC,EAAgB3D,WAAqByD,IAAdiW,EAA0B,IAAMA,MCVlF,ICCIC,GAAOrT,GDDXsT,GAAiB,SAAUpU,EAAQnB,EAAKtB,GACtC,IAAI8W,EAAc/V,EAAYO,GAC1BwV,KAAerU,EAAQC,EAAqBjD,EAAEgD,EAAQqU,EAAahX,EAAyB,EAAGE,IAC9FyC,EAAOqU,GAAe9W,GEN7B+W,GAAiBjR,GAAW,YAAa,cAAgB,GDCrDkR,GAAUxa,EAAOwa,QACjBC,GAAWD,IAAWA,GAAQC,SAC9BC,GAAKD,IAAYA,GAASC,GAG1BA,GAEF3T,IADAqT,GAAQM,GAAG5W,MAAM,MACD,GAAKsW,GAAM,GAClBO,OACTP,GAAQO,GAAUP,MAAM,iBACVA,GAAM,IAAM,MACxBA,GAAQO,GAAUP,MAAM,oBACbrT,GAAUqT,GAAM,IAI/B,IAAAQ,GAAiB7T,KAAYA,GEfzBmK,GAAUf,GAAgB,WAE9B0K,GAAiB,SAAU9E,GAIzB,OAAO+E,IAAc,KAAOrY,GAAM,WAChC,IAAIsY,EAAQ,GAKZ,OAJkBA,EAAMzJ,YAAc,IAC1BJ,IAAW,WACrB,MAAO,CAAE8J,IAAK,IAE2B,IAApCD,EAAMhF,GAAakF,SAASD,QCJnCE,GAAsBL,GAA6B,SACnDtE,GAAiBL,GAAwB,QAAS,CAAEC,WAAW,EAAMgF,EAAG,EAAGjY,EAAG,IAE9EgO,GAAUf,GAAgB,WAC1BiL,GAAc,GAAGvX,MACjBqG,GAAM5H,KAAK4H,IAKfwK,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QAAS+N,KAAwB3E,IAAkB,CACnF1S,MAAO,SAAewX,EAAOC,GAC3B,IAKIC,EAAarQ,EAAQsQ,EALrBjW,EAAInB,EAAgB3D,MACpBiJ,EAASO,GAAS1E,EAAEmE,QACpB+R,EAAItR,GAAgBkR,EAAO3R,GAC3BgS,EAAMvR,QAAwBjG,IAARoX,EAAoB5R,EAAS4R,EAAK5R,GAG5D,GAAIgE,GAAQnI,KAGgB,mBAF1BgW,EAAchW,EAAE+L,cAEyBiK,IAAgB5N,QAASD,GAAQ6N,EAAYxZ,WAE3EuC,EAASiX,IAEE,QADpBA,EAAcA,EAAYrK,OACAqK,OAAcrX,GAHxCqX,OAAcrX,EAKZqX,IAAgB5N,YAAyBzJ,IAAhBqX,GAC3B,OAAOH,GAAYzZ,KAAK4D,EAAGkW,EAAGC,GAIlC,IADAxQ,EAAS,SAAqBhH,IAAhBqX,EAA4B5N,MAAQ4N,GAAarR,GAAIwR,EAAMD,EAAG,IACvED,EAAI,EAAGC,EAAIC,EAAKD,IAAKD,IAASC,KAAKlW,GAAG8U,GAAenP,EAAQsQ,EAAGjW,EAAEkW,IAEvE,OADAvQ,EAAOxB,OAAS8R,EACTtQ,KC5CX,IACItE,GAAO,GAEXA,GAHoBuJ,GAAgB,gBAGd,IAEtB,IAAAwL,GAAkC,eAAjB/V,OAAOgB,ICHpB6J,GAAgBN,GAAgB,eAEhCyL,GAAuE,aAAnDhY,EAAW,WAAc,OAAO6F,UAArB,IAUnCzF,GAAiB6X,GAAwBjY,EAAa,SAAUvB,GAC9D,IAAIkD,EAAGsO,EAAK3I,EACZ,YAAchH,IAAP7B,EAAmB,YAAqB,OAAPA,EAAc,OAEM,iBAAhDwR,EAXD,SAAUxR,EAAIyC,GACzB,IACE,OAAOzC,EAAGyC,GACV,MAAOnC,KAQSmZ,CAAOvW,EAAI3D,OAAOS,GAAKoO,KAA8BoD,EAEnE+H,GAAoBhY,EAAW2B,GAEH,WAA3B2F,EAAStH,EAAW2B,KAAsC,mBAAZA,EAAEwW,OAAuB,YAAc7Q,GClB5F8Q,GAAiBH,GAAwB,GAAGlY,SAAW,WACrD,MAAO,WAAaK,GAAQvD,MAAQ,KCDjCob,IACHrT,GAAS5G,OAAOG,UAAW,WAAY4B,GAAU,CAAEmF,QAAQ,ICF7D,IAAAmT,GAAiB,WACf,IAAInL,EAAOnL,EAASlF,MAChByK,EAAS,GAOb,OANI4F,EAAK9Q,SAAQkL,GAAU,KACvB4F,EAAKoL,aAAYhR,GAAU,KAC3B4F,EAAKqL,YAAWjR,GAAU,KAC1B4F,EAAKsL,SAAQlR,GAAU,KACvB4F,EAAKuL,UAASnR,GAAU,KACxB4F,EAAKwL,SAAQpR,GAAU,KACpBA,GCRT,SAASqR,GAAGC,EAAGvZ,GACb,OAAOwZ,OAAOD,EAAGvZ,GAGnB,I1FgoDMyZ,GAAsB,CACzBC,c0FjoDqBla,GAAM,WAE5B,IAAIma,EAAKL,GAAG,IAAK,KAEjB,OADAK,EAAGC,UAAY,EACW,MAAnBD,EAAGla,KAAK,W1F8nDdoa,a0F3nDoBra,GAAM,WAE3B,IAAIma,EAAKL,GAAG,KAAM,MAElB,OADAK,EAAGC,UAAY,EACU,MAAlBD,EAAGla,KAAK,WCjBbqa,GAAaN,OAAO1a,UAAUW,KAI9Bsa,GAAgBpX,OAAO7D,UAAU0K,QAEjCwQ,GAAcF,GAEdG,GAA2B,WAC7B,IAAIC,EAAM,IACNC,EAAM,MAGV,OAFAL,GAAWpb,KAAKwb,EAAK,KACrBJ,GAAWpb,KAAKyb,EAAK,KACI,IAAlBD,EAAIN,WAAqC,IAAlBO,EAAIP,UALL,GAQ3BF,GAAgBU,GAAcV,eAAiBU,GAAcP,aAG7DQ,QAAuCpZ,IAAvB,OAAOxB,KAAK,IAAI,IAExBwa,IAA4BI,IAAiBX,MAGvDM,GAAc,SAAcM,GAC1B,IACIV,EAAWW,EAAQpD,EAAOnP,EAD1B2R,EAAKnc,KAEL6b,EAASK,IAAiBC,EAAGN,OAC7BmB,EAAQxB,GAAYta,KAAKib,GACzB3T,EAAS2T,EAAG3T,OACZyU,EAAa,EACbC,EAAUJ,EA+Cd,OA7CIjB,KAE0B,KAD5BmB,EAAQA,EAAMhR,QAAQ,IAAK,KACjB5B,QAAQ,OAChB4S,GAAS,KAGXE,EAAU/X,OAAO2X,GAAK1Z,MAAM+Y,EAAGC,WAE3BD,EAAGC,UAAY,KAAOD,EAAGT,WAAaS,EAAGT,WAAuC,OAA1BoB,EAAIX,EAAGC,UAAY,MAC3E5T,EAAS,OAASA,EAAS,IAC3B0U,EAAU,IAAMA,EAChBD,KAIFF,EAAS,IAAIf,OAAO,OAASxT,EAAS,IAAKwU,IAGzCH,KACFE,EAAS,IAAIf,OAAO,IAAMxT,EAAS,WAAYwU,IAE7CP,KAA0BL,EAAYD,EAAGC,WAE7CzC,EAAQ2C,GAAWpb,KAAK2a,EAASkB,EAASZ,EAAIe,GAE1CrB,EACElC,GACFA,EAAM5V,MAAQ4V,EAAM5V,MAAMX,MAAM6Z,GAChCtD,EAAM,GAAKA,EAAM,GAAGvW,MAAM6Z,GAC1BtD,EAAMhQ,MAAQwS,EAAGC,UACjBD,EAAGC,WAAazC,EAAM,GAAG1Q,QACpBkT,EAAGC,UAAY,EACbK,IAA4B9C,IACrCwC,EAAGC,UAAYD,EAAG5c,OAASoa,EAAMhQ,MAAQgQ,EAAM,GAAG1Q,OAASmT,GAEzDS,IAAiBlD,GAASA,EAAM1Q,OAAS,GAG3CsT,GAAcrb,KAAKyY,EAAM,GAAIoD,GAAQ,WACnC,IAAKvS,EAAI,EAAGA,EAAIxB,UAAUC,OAAS,EAAGuB,SACf/G,IAAjBuF,UAAUwB,KAAkBmP,EAAMnP,QAAK/G,MAK1CkW,IAIX,IAAAwD,GAAiBX,GClFjBvI,GAAE,CAAE5I,OAAQ,SAAU2K,OAAO,EAAMtJ,OAAQ,IAAIzK,OAASA,IAAQ,CAC9DA,KAAMA,KCCR,IAAImb,GAAY,WACZC,GAAkBrB,OAAO1a,UACzBgc,GAAiBD,GAAyB,SAE1CE,GAAcvb,GAAM,WAAc,MAA2D,QAApDsb,GAAepc,KAAK,CAAEsH,OAAQ,IAAKwU,MAAO,SAEnFQ,GAAiBF,GAAe3N,MAAQyN,IAIxCG,IAAeC,KACjBzV,GAASiU,OAAO1a,UAAW8b,IAAW,WACpC,IAAIK,EAAIvY,EAASlF,MACb0d,EAAIvY,OAAOsY,EAAEjV,QACbmV,EAAKF,EAAET,MAEX,MAAO,IAAMU,EAAI,IADTvY,YAAc1B,IAAPka,GAAoBF,aAAazB,UAAY,UAAWqB,IAAmBL,GAAM9b,KAAKuc,GAAKE,KAEzG,CAAEtV,QAAQ,ICnBf,IAAIwB,GAAe,SAAU+T,GAC3B,OAAO,SAAU7T,EAAO8T,GACtB,IAGIC,EAAOC,EAHPC,EAAI7Y,OAAO3B,EAAuBuG,IAClCkU,EAAW7U,GAAUyU,GACrBK,EAAOF,EAAE/U,OAEb,OAAIgV,EAAW,GAAKA,GAAYC,EAAaN,EAAoB,QAAKna,GACtEqa,EAAQE,EAAEG,WAAWF,IACN,OAAUH,EAAQ,OAAUG,EAAW,IAAMC,IACtDH,EAASC,EAAEG,WAAWF,EAAW,IAAM,OAAUF,EAAS,MAC1DH,EAAoBI,EAAEI,OAAOH,GAAYH,EACzCF,EAAoBI,EAAE5a,MAAM6a,EAAUA,EAAW,GAA+BF,EAAS,OAAlCD,EAAQ,OAAU,IAA0B,QAI7GO,GAAiB,CAGfC,OAAQzU,IAAa,GAGrBuU,OAAQvU,IAAa,ICxBnBuU,GAAS/T,GAAyC+T,OAIlDG,GAAkB,kBAClBnM,GAAmBnK,GAAoBjC,IACvCgC,GAAmBC,GAAoBL,UAAU2W,IAIrDtG,GAAe9S,OAAQ,UAAU,SAAUiU,GACzChH,GAAiBpS,KAAM,CACrB8H,KAAMyW,GACNxS,OAAQ5G,OAAOiU,GACfzP,MAAO,OAIR,WACD,IAGI6U,EAHAvX,EAAQe,GAAiBhI,MACzB+L,EAAS9E,EAAM8E,OACfpC,EAAQ1C,EAAM0C,MAElB,OAAIA,GAASoC,EAAO9C,OAAe,CAAElG,WAAOU,EAAW6V,MAAM,IAC7DkF,EAAQJ,GAAOrS,EAAQpC,GACvB1C,EAAM0C,OAAS6U,EAAMvV,OACd,CAAElG,MAAOyb,EAAOlF,MAAM,OClB/B,IAAI7I,GAAUf,GAAgB,WAE1B+O,IAAiCzc,GAAM,WAIzC,IAAIma,EAAK,IAMT,OALAA,EAAGla,KAAO,WACR,IAAIwI,EAAS,GAEb,OADAA,EAAOiU,OAAS,CAAE/Z,EAAG,KACd8F,GAEyB,MAA3B,GAAGuB,QAAQmQ,EAAI,WAKpBwC,GACgC,OAA3B,IAAI3S,QAAQ,IAAK,MAGtB4S,GAAUlP,GAAgB,WAE1BmP,KACE,IAAID,KAC6B,KAA5B,IAAIA,IAAS,IAAK,MAOzBE,IAAqC9c,GAAM,WAC7C,IAAIma,EAAK,OACL4C,EAAe5C,EAAGla,KACtBka,EAAGla,KAAO,WAAc,OAAO8c,EAAavO,MAAMxQ,KAAMgJ,YACxD,IAAIyB,EAAS,KAAKpH,MAAM8Y,GACxB,OAAyB,IAAlB1R,EAAOxB,QAA8B,MAAdwB,EAAO,IAA4B,MAAdA,EAAO,MAG5DuU,GAAiB,SAAUxG,EAAKvP,EAAQhH,EAAM0K,GAC5C,IAAIuF,EAASxC,GAAgB8I,GAEzByG,GAAuBjd,GAAM,WAE/B,IAAI8C,EAAI,GAER,OADAA,EAAEoN,GAAU,WAAc,OAAO,GACZ,GAAd,GAAGsG,GAAK1T,MAGboa,EAAoBD,IAAwBjd,GAAM,WAEpD,IAAImd,GAAa,EACbhD,EAAK,IAkBT,MAhBY,UAAR3D,KAIF2D,EAAK,IAGFtL,YAAc,GACjBsL,EAAGtL,YAAYJ,IAAW,WAAc,OAAO0L,GAC/CA,EAAGa,MAAQ,GACXb,EAAGjK,GAAU,IAAIA,IAGnBiK,EAAGla,KAAO,WAAiC,OAAnBkd,GAAa,EAAa,MAElDhD,EAAGjK,GAAQ,KACHiN,KAGV,IACGF,IACAC,GACQ,YAAR1G,KACCiG,KACAE,IACCE,KAEM,UAARrG,IAAoBsG,GACrB,CACA,IAAIM,EAAqB,IAAIlN,GACzBqG,EAAUtW,EAAKiQ,EAAQ,GAAGsG,IAAM,SAAU6G,EAAclK,EAAQ2H,EAAKwC,EAAMC,GAC7E,OAAIpK,EAAOlT,OAASkb,GACd8B,IAAwBM,EAInB,CAAEjG,MAAM,EAAMvW,MAAOqc,EAAmBle,KAAKiU,EAAQ2H,EAAKwC,IAE5D,CAAEhG,MAAM,EAAMvW,MAAOsc,EAAane,KAAK4b,EAAK3H,EAAQmK,IAEtD,CAAEhG,MAAM,KACd,CACDqF,iBAAkBA,GAClBE,6CAA8CA,KAE5CW,EAAejH,EAAQ,GACvBkH,EAAclH,EAAQ,GAE1BxQ,GAAS5C,OAAO7D,UAAWkX,EAAKgH,GAChCzX,GAASiU,OAAO1a,UAAW4Q,EAAkB,GAAVjJ,EAG/B,SAAU8C,EAAQoB,GAAO,OAAOsS,EAAYve,KAAK6K,EAAQ/L,KAAMmN,IAG/D,SAAUpB,GAAU,OAAO0T,EAAYve,KAAK6K,EAAQ/L,QAItD2M,GAAMpH,EAA4ByW,OAAO1a,UAAU4Q,GAAS,QAAQ,IC1HtEkM,GAAS/T,GAAyC+T,OAItDsB,GAAiB,SAAU1B,EAAGrU,EAAOiS,GACnC,OAAOjS,GAASiS,EAAUwC,GAAOJ,EAAGrU,GAAOV,OAAS,ICDtD0W,GAAiB,SAAUlC,EAAGO,GAC5B,IAAI/b,EAAOwb,EAAExb,KACb,GAAoB,mBAATA,EAAqB,CAC9B,IAAIwI,EAASxI,EAAKf,KAAKuc,EAAGO,GAC1B,GAAsB,iBAAXvT,EACT,MAAM/G,UAAU,sEAElB,OAAO+G,EAGT,GAAmB,WAAflH,EAAQka,GACV,MAAM/Z,UAAU,+CAGlB,OAAOyZ,GAAWjc,KAAKuc,EAAGO,ICTxBvU,GAAM5H,KAAK4H,IACXF,GAAM1H,KAAK0H,IACXJ,GAAQtH,KAAKsH,MACbyW,GAAuB,4BACvBC,GAAgC,oBAOpCC,GAA8B,UAAW,GAAG,SAAUlB,EAASrC,EAAewD,EAAiBC,GAC7F,IAAInB,EAA+CmB,EAAOnB,6CACtDF,EAAmBqB,EAAOrB,iBAC1BsB,EAAoBpB,EAA+C,IAAM,KAE7E,MAAO,CAGL,SAAiBqB,EAAaC,GAC5B,IAAIrb,EAAItB,EAAuBxD,MAC3ByU,EAA0BhR,MAAfyc,OAA2Bzc,EAAYyc,EAAYtB,GAClE,YAAoBnb,IAAbgR,EACHA,EAASvT,KAAKgf,EAAapb,EAAGqb,GAC9B5D,EAAcrb,KAAKiE,OAAOL,GAAIob,EAAaC,IAIjD,SAAUhL,EAAQgL,GAChB,IACItB,GAAgDF,GACzB,iBAAjBwB,IAA0E,IAA7CA,EAAa/V,QAAQ6V,GAC1D,CACA,IAAIG,EAAML,EAAgBxD,EAAepH,EAAQnV,KAAMmgB,GACvD,GAAIC,EAAI9G,KAAM,OAAO8G,EAAIrd,MAG3B,IAAIsd,EAAKnb,EAASiQ,GACd6I,EAAI7Y,OAAOnF,MAEXsgB,EAA4C,mBAAjBH,EAC1BG,IAAmBH,EAAehb,OAAOgb,IAE9C,IAAI5gB,EAAS8gB,EAAG9gB,OAChB,GAAIA,EAAQ,CACV,IAAIghB,EAAcF,EAAGzE,QACrByE,EAAGjE,UAAY,EAGjB,IADA,IAAIoE,EAAU,KACD,CACX,IAAI/V,EAASgW,GAAWJ,EAAIrC,GAC5B,GAAe,OAAXvT,EAAiB,MAGrB,GADA+V,EAAQna,KAAKoE,IACRlL,EAAQ,MAGI,KADF4F,OAAOsF,EAAO,MACR4V,EAAGjE,UAAYsD,GAAmB1B,EAAGxU,GAAS6W,EAAGjE,WAAYmE,IAKpF,IAFA,IAtDwB3e,EAsDpB8e,EAAoB,GACpBC,EAAqB,EAChBnW,EAAI,EAAGA,EAAIgW,EAAQvX,OAAQuB,IAAK,CACvCC,EAAS+V,EAAQhW,GAUjB,IARA,IAAIoW,EAAUzb,OAAOsF,EAAO,IACxBwT,EAAWxU,GAAIF,GAAIH,GAAUqB,EAAOd,OAAQqU,EAAE/U,QAAS,GACvD4X,EAAW,GAMNC,EAAI,EAAGA,EAAIrW,EAAOxB,OAAQ6X,IAAKD,EAASxa,UAlEzC5C,KADc7B,EAmE8C6I,EAAOqW,IAlEvDlf,EAAKuD,OAAOvD,IAmEhC,IAAImf,EAAgBtW,EAAOiU,OAC3B,GAAI4B,EAAmB,CACrB,IAAIU,EAAe,CAACJ,GAASjW,OAAOkW,EAAU5C,EAAUD,QAClCva,IAAlBsd,GAA6BC,EAAa3a,KAAK0a,GACnD,IAAIxV,EAAcpG,OAAOgb,EAAa3P,WAAM/M,EAAWud,SAEvDzV,EAAc0V,EAAgBL,EAAS5C,EAAGC,EAAU4C,EAAUE,EAAeZ,GAE3ElC,GAAY0C,IACdD,GAAqB1C,EAAE5a,MAAMud,EAAoB1C,GAAY1S,EAC7DoV,EAAqB1C,EAAW2C,EAAQ3X,QAG5C,OAAOyX,EAAoB1C,EAAE5a,MAAMud,KAKvC,SAASM,EAAgBL,EAAS9D,EAAKmB,EAAU4C,EAAUE,EAAexV,GACxE,IAAI2V,EAAUjD,EAAW2C,EAAQ3X,OAC7BkY,EAAIN,EAAS5X,OACbmY,EAAUvB,GAKd,YAJsBpc,IAAlBsd,IACFA,EAAgB3T,GAAS2T,GACzBK,EAAUxB,IAELrD,EAAcrb,KAAKqK,EAAa6V,GAAS,SAAUzH,EAAO0H,GAC/D,IAAIC,EACJ,OAAQD,EAAGjD,OAAO,IAChB,IAAK,IAAK,MAAO,IACjB,IAAK,IAAK,OAAOwC,EACjB,IAAK,IAAK,OAAO9D,EAAI1Z,MAAM,EAAG6a,GAC9B,IAAK,IAAK,OAAOnB,EAAI1Z,MAAM8d,GAC3B,IAAK,IACHI,EAAUP,EAAcM,EAAGje,MAAM,GAAI,IACrC,MACF,QACE,IAAI2X,GAAKsG,EACT,GAAU,IAANtG,EAAS,OAAOpB,EACpB,GAAIoB,EAAIoG,EAAG,CACT,IAAI3e,EAAI2G,GAAM4R,EAAI,IAClB,OAAU,IAANvY,EAAgBmX,EAChBnX,GAAK2e,OAA8B1d,IAApBod,EAASre,EAAI,GAAmB6e,EAAGjD,OAAO,GAAKyC,EAASre,EAAI,GAAK6e,EAAGjD,OAAO,GACvFzE,EAET2H,EAAUT,EAAS9F,EAAI,GAE3B,YAAmBtX,IAAZ6d,EAAwB,GAAKA,SCjI1C,IAAAC,GAAiBpgB,OAAOqgB,IAAM,SAAYC,EAAGC,GAE3C,OAAOD,IAAMC,EAAU,IAAND,GAAW,EAAIA,GAAM,EAAIC,EAAID,GAAKA,GAAKC,GAAKA,GCI/D5B,GAA8B,SAAU,GAAG,SAAU6B,EAAQC,EAAc7B,GACzE,MAAO,CAGL,SAAgB5K,GACd,IAAIrQ,EAAItB,EAAuBxD,MAC3B6hB,EAAqBpe,MAAV0R,OAAsB1R,EAAY0R,EAAOwM,GACxD,YAAoBle,IAAboe,EAAyBA,EAAS3gB,KAAKiU,EAAQrQ,GAAK,IAAIkX,OAAO7G,GAAQwM,GAAQxc,OAAOL,KAI/F,SAAUqQ,GACR,IAAIiL,EAAML,EAAgB6B,EAAczM,EAAQnV,MAChD,GAAIogB,EAAI9G,KAAM,OAAO8G,EAAIrd,MAEzB,IAAIsd,EAAKnb,EAASiQ,GACd6I,EAAI7Y,OAAOnF,MAEX8hB,EAAoBzB,EAAGjE,UACtBmF,GAAUO,EAAmB,KAAIzB,EAAGjE,UAAY,GACrD,IAAI3R,EAASgW,GAAWJ,EAAIrC,GAE5B,OADKuD,GAAUlB,EAAGjE,UAAW0F,KAAoBzB,EAAGjE,UAAY0F,GAC9C,OAAXrX,GAAmB,EAAIA,EAAOd,WC1B3C,IAAIoY,GAAQrS,GAAgB,SAI5BsS,GAAiB,SAAUpgB,GACzB,IAAIqgB,EACJ,OAAOpe,EAASjC,UAAmC6B,KAA1Bwe,EAAWrgB,EAAGmgB,OAA0BE,EAA0B,UAAf1e,EAAQ3B,KCNlF6O,GAAUf,GAAgB,WAI9BwS,GAAiB,SAAUpd,EAAGqd,GAC5B,IACInE,EADApN,EAAI1L,EAASJ,GAAG+L,YAEpB,YAAapN,IAANmN,GAAiDnN,OAA7Bua,EAAI9Y,EAAS0L,GAAGH,KAAyB0R,EAAqBxZ,GAAUqV,ICCjGoE,GAAY,GAAG/b,KACfkD,GAAM1H,KAAK0H,IACX8Y,GAAa,WAGbC,IAActgB,GAAM,WAAc,OAAQga,OAAOqG,GAAY,QAGjEvC,GAA8B,QAAS,GAAG,SAAUyC,EAAOC,EAAazC,GACtE,IAAI0C,EAmDJ,OAzCEA,EAR2B,KAA3B,OAAOpf,MAAM,QAAQ,IACc,GAAnC,OAAOA,MAAM,QAAS,GAAG4F,QACO,GAAhC,KAAK5F,MAAM,WAAW4F,QACU,GAAhC,IAAI5F,MAAM,YAAY4F,QACtB,IAAI5F,MAAM,QAAQ4F,OAAS,GAC3B,GAAG5F,MAAM,MAAM4F,OAGC,SAAUyQ,EAAWgJ,GACnC,IAAI3W,EAAS5G,OAAO3B,EAAuBxD,OACvC2iB,OAAgBlf,IAAVif,EAAsBL,GAAaK,IAAU,EACvD,GAAY,IAARC,EAAW,MAAO,GACtB,QAAkBlf,IAAdiW,EAAyB,MAAO,CAAC3N,GAErC,IAAKkW,GAASvI,GACZ,OAAO8I,EAAYthB,KAAK6K,EAAQ2N,EAAWiJ,GAW7C,IATA,IAQIhJ,EAAOyC,EAAWwG,EARlBC,EAAS,GACT7F,GAAStD,EAAU+B,WAAa,IAAM,KAC7B/B,EAAUgC,UAAY,IAAM,KAC5BhC,EAAUkC,QAAU,IAAM,KAC1BlC,EAAUmC,OAAS,IAAM,IAClCiH,EAAgB,EAEhBC,EAAgB,IAAI/G,OAAOtC,EAAUlR,OAAQwU,EAAQ,MAElDrD,EAAQwD,GAAWjc,KAAK6hB,EAAehX,QAC5CqQ,EAAY2G,EAAc3G,WACV0G,IACdD,EAAOxc,KAAK0F,EAAO3I,MAAM0f,EAAenJ,EAAMhQ,QAC1CgQ,EAAM1Q,OAAS,GAAK0Q,EAAMhQ,MAAQoC,EAAO9C,QAAQmZ,GAAU5R,MAAMqS,EAAQlJ,EAAMvW,MAAM,IACzFwf,EAAajJ,EAAM,GAAG1Q,OACtB6Z,EAAgB1G,EACZyG,EAAO5Z,QAAU0Z,KAEnBI,EAAc3G,YAAczC,EAAMhQ,OAAOoZ,EAAc3G,YAK7D,OAHI0G,IAAkB/W,EAAO9C,QACvB2Z,GAAeG,EAAc5c,KAAK,KAAK0c,EAAOxc,KAAK,IAClDwc,EAAOxc,KAAK0F,EAAO3I,MAAM0f,IACzBD,EAAO5Z,OAAS0Z,EAAME,EAAOzf,MAAM,EAAGuf,GAAOE,GAG7C,IAAIxf,WAAMI,EAAW,GAAGwF,OACjB,SAAUyQ,EAAWgJ,GACnC,YAAqBjf,IAAdiW,GAAqC,IAAVgJ,EAAc,GAAKF,EAAYthB,KAAKlB,KAAM0Z,EAAWgJ,IAEpEF,EAEhB,CAGL,SAAe9I,EAAWgJ,GACxB,IAAI5d,EAAItB,EAAuBxD,MAC3BgjB,EAAwBvf,MAAbiW,OAAyBjW,EAAYiW,EAAU6I,GAC9D,YAAoB9e,IAAbuf,EACHA,EAAS9hB,KAAKwY,EAAW5U,EAAG4d,GAC5BD,EAAcvhB,KAAKiE,OAAOL,GAAI4U,EAAWgJ,IAO/C,SAAUvN,EAAQuN,GAChB,IAAItC,EAAML,EAAgB0C,EAAetN,EAAQnV,KAAM0iB,EAAOD,IAAkBD,GAChF,GAAIpC,EAAI9G,KAAM,OAAO8G,EAAIrd,MAEzB,IAAIsd,EAAKnb,EAASiQ,GACd6I,EAAI7Y,OAAOnF,MACX4Q,EAAIsR,GAAmB7B,EAAIrE,QAE3BiH,EAAkB5C,EAAGzE,QACrBoB,GAASqD,EAAG5E,WAAa,IAAM,KACtB4E,EAAG3E,UAAY,IAAM,KACrB2E,EAAGzE,QAAU,IAAM,KACnB0G,GAAa,IAAM,KAI5BU,EAAW,IAAIpS,EAAE0R,GAAajC,EAAK,OAASA,EAAG7X,OAAS,IAAKwU,GAC7D2F,OAAgBlf,IAAVif,EAAsBL,GAAaK,IAAU,EACvD,GAAY,IAARC,EAAW,MAAO,GACtB,GAAiB,IAAb3E,EAAE/U,OAAc,OAAuC,OAAhCia,GAAeF,EAAUhF,GAAc,CAACA,GAAK,GAIxE,IAHA,IAAIN,EAAI,EACJyF,EAAI,EACJC,EAAI,GACDD,EAAInF,EAAE/U,QAAQ,CACnB+Z,EAAS5G,UAAYkG,GAAaa,EAAI,EACtC,IACI3iB,EADA6iB,EAAIH,GAAeF,EAAUV,GAAatE,EAAIA,EAAE5a,MAAM+f,IAE1D,GACQ,OAANE,IACC7iB,EAAI+I,GAAIC,GAASwZ,EAAS5G,WAAakG,GAAa,EAAIa,IAAKnF,EAAE/U,WAAayU,EAE7EyF,EAAIzD,GAAmB1B,EAAGmF,EAAGF,OACxB,CAEL,GADAG,EAAE/c,KAAK2X,EAAE5a,MAAMsa,EAAGyF,IACdC,EAAEna,SAAW0Z,EAAK,OAAOS,EAC7B,IAAK,IAAI5Y,EAAI,EAAGA,GAAK6Y,EAAEpa,OAAS,EAAGuB,IAEjC,GADA4Y,EAAE/c,KAAKgd,EAAE7Y,IACL4Y,EAAEna,SAAW0Z,EAAK,OAAOS,EAE/BD,EAAIzF,EAAIld,GAIZ,OADA4iB,EAAE/c,KAAK2X,EAAE5a,MAAMsa,IACR0F,OAGTd,ICnIJ,IAAAgB,GAAiB,CACfC,YAAa,EACbC,oBAAqB,EACrBC,aAAc,EACdC,eAAgB,EAChBC,YAAa,EACbC,cAAe,EACfC,aAAc,EACdC,qBAAsB,EACtBC,SAAU,EACVC,kBAAmB,EACnBC,eAAgB,EAChBC,gBAAiB,EACjBC,kBAAmB,EACnBC,UAAW,EACXC,cAAe,EACfC,aAAc,EACdC,SAAU,EACVC,iBAAkB,EAClBC,OAAQ,EACRC,YAAa,EACbC,cAAe,EACfC,cAAe,EACfC,eAAgB,EAChBC,aAAc,EACdC,cAAe,EACfC,iBAAkB,EAClBC,iBAAkB,EAClBC,eAAgB,EAChBC,iBAAkB,EAClBC,cAAe,EACfC,UAAW,GC5Bb,IAAK,IAAIC,MAAmBC,GAAc,CACxC,IAAIC,GAAajmB,EAAO+lB,IACpBG,GAAsBD,IAAcA,GAAWlkB,UAEnD,GAAImkB,IAAuBA,GAAoBhU,UAAYA,GAAS,IAClElM,EAA4BkgB,GAAqB,UAAWhU,IAC5D,MAAOvP,GACPujB,GAAoBhU,QAAUA,ICNlC,IAAIuF,GAAWtH,GAAgB,YAC3BM,GAAgBN,GAAgB,eAChCgW,GAAcC,GAAqB1M,OAEvC,IAAK,IAAIqM,MAAmBC,GAAc,CACxC,IAAIC,GAAajmB,EAAO+lB,IACpBG,GAAsBD,IAAcA,GAAWlkB,UACnD,GAAImkB,GAAqB,CAEvB,GAAIA,GAAoBzO,MAAc0O,GAAa,IACjDngB,EAA4BkgB,GAAqBzO,GAAU0O,IAC3D,MAAOxjB,GACPujB,GAAoBzO,IAAY0O,GAKlC,GAHKD,GAAoBzV,KACvBzK,EAA4BkgB,GAAqBzV,GAAesV,IAE9DC,GAAaD,IAAkB,IAAK,IAAIhQ,MAAeqQ,GAEzD,GAAIF,GAAoBnQ,MAAiBqQ,GAAqBrQ,IAAc,IAC1E/P,EAA4BkgB,GAAqBnQ,GAAaqQ,GAAqBrQ,KACnF,MAAOpT,GACPujB,GAAoBnQ,IAAeqQ,GAAqBrQ,MCxBhE,IAAI0B,GAAWtH,GAAgB,YAE/BkW,IAAkB5jB,GAAM,WACtB,IAAI6jB,EAAM,IAAIC,IAAI,gBAAiB,YAC/BC,EAAeF,EAAIE,aACnBtb,EAAS,GAMb,OALAob,EAAIG,SAAW,QACfD,EAAatU,SAAQ,SAAU1O,EAAOsB,GACpC0hB,EAAqB,OAAE,KACvBtb,GAAUpG,EAAMtB,MAGZgjB,EAAaE,MACD,2BAAbJ,EAAIK,MACsB,MAA1BH,EAAa1kB,IAAI,MACuB,QAAxC8D,OAAO,IAAIghB,gBAAgB,WAC1BJ,EAAa/O,KAEsB,MAApC,IAAI8O,IAAI,eAAeM,UACsC,MAA7D,IAAID,gBAAgB,IAAIA,gBAAgB,QAAQ9kB,IAAI,MAEpB,eAAhC,IAAIykB,IAAI,eAAeO,MAEQ,YAA/B,IAAIP,IAAI,cAAcQ,MAEX,SAAX7b,GAEwC,MAAxC,IAAIqb,IAAI,gBAAYriB,GAAW4iB,QC/BtCE,GAAiB,SAAU3kB,EAAIkZ,EAAanL,GAC1C,KAAM/N,aAAckZ,GAClB,MAAMpX,UAAU,cAAgBiM,EAAOA,EAAO,IAAM,IAAM,cAC1D,OAAO/N,GCMP4kB,GAAerlB,OAAOslB,OACtBrlB,GAAiBD,OAAOC,eAI5BslB,IAAkBF,IAAgBxkB,GAAM,WAEtC,GAAI0C,GAQiB,IARF8hB,GAAa,CAAElW,EAAG,GAAKkW,GAAaplB,GAAe,GAAI,IAAK,CAC7EwB,YAAY,EACZvB,IAAK,WACHD,GAAepB,KAAM,IAAK,CACxB+C,MAAO,EACPH,YAAY,OAGd,CAAE0N,EAAG,KAAMA,EAAS,OAAO,EAE/B,IAAI8S,EAAI,GACJuD,EAAI,GAEJrT,EAASzG,SACT+Z,EAAW,uBAGf,OAFAxD,EAAE9P,GAAU,EACZsT,EAASvjB,MAAM,IAAIoO,SAAQ,SAAUoV,GAAOF,EAAEE,GAAOA,KACf,GAA/BL,GAAa,GAAIpD,GAAG9P,IAAgBjG,GAAWmZ,GAAa,GAAIG,IAAIle,KAAK,KAAOme,KACpF,SAAgBvb,EAAQ7C,GAM3B,IALA,IAAIse,EAAI1Z,GAAS/B,GACb0b,EAAkB/d,UAAUC,OAC5BU,EAAQ,EACRqB,EAAwBG,GAA4B3I,EACpDH,EAAuB4C,EAA2BzC,EAC/CukB,EAAkBpd,GAMvB,IALA,IAIItF,EAJA2Z,EAAIpa,EAAcoF,UAAUW,MAC5B9C,EAAOmE,EAAwBqC,GAAW2Q,GAAGrT,OAAOK,EAAsBgT,IAAM3Q,GAAW2Q,GAC3F/U,EAASpC,EAAKoC,OACd6X,EAAI,EAED7X,EAAS6X,GACdzc,EAAMwC,EAAKia,KACNpc,IAAerC,EAAqBnB,KAAK8c,EAAG3Z,KAAMyiB,EAAEziB,GAAO2Z,EAAE3Z,IAEpE,OAAOyiB,GACPN,GCjDJQ,GAAiB,SAAUha,GACzB,IAAIia,EAAeja,EAAiB,OACpC,QAAqBvJ,IAAjBwjB,EACF,OAAO/hB,EAAS+hB,EAAa/lB,KAAK8L,IAAWjK,OCDjDmkB,GAAiB,SAAUla,EAAUtL,EAAIqB,EAAOiV,GAC9C,IACE,OAAOA,EAAUtW,EAAGwD,EAASnC,GAAO,GAAIA,EAAM,IAAMrB,EAAGqB,GAEvD,MAAOb,GAEP,MADA8kB,GAAcha,GACR9K,ICPN8U,GAAWtH,GAAgB,YAC3B4G,GAAiBpJ,MAAM5L,UAG3B6lB,GAAiB,SAAUvlB,GACzB,YAAc6B,IAAP7B,IAAqB2V,GAAUrK,QAAUtL,GAAM0U,GAAeU,MAAcpV,ICJjFoV,GAAWtH,GAAgB,YAE/B0X,GAAiB,SAAUxlB,GACzB,GAAU6B,MAAN7B,EAAiB,OAAOA,EAAGoV,KAC1BpV,EAAG,eACH2V,GAAUhU,GAAQ3B,KCEzBylB,GAAiB,SAAcC,GAC7B,IAOIre,EAAQwB,EAAQ8c,EAAMva,EAAUsK,EAAMvU,EAPtC+B,EAAIsI,GAASka,GACb1W,EAAmB,mBAAR5Q,KAAqBA,KAAOkN,MACvC6Z,EAAkB/d,UAAUC,OAC5Bue,EAAQT,EAAkB,EAAI/d,UAAU,QAAKvF,EAC7CgkB,OAAoBhkB,IAAV+jB,EACVE,EAAiBN,GAAkBtiB,GACnC6E,EAAQ,EAIZ,GAFI8d,IAASD,EAAQjW,GAAKiW,EAAOT,EAAkB,EAAI/d,UAAU,QAAKvF,EAAW,IAE3DA,MAAlBikB,GAAiC9W,GAAK1D,OAASia,GAAsBO,GAWvE,IADAjd,EAAS,IAAImG,EADb3H,EAASO,GAAS1E,EAAEmE,SAEdA,EAASU,EAAOA,IACpB5G,EAAQ0kB,EAAUD,EAAM1iB,EAAE6E,GAAQA,GAAS7E,EAAE6E,GAC7CiQ,GAAenP,EAAQd,EAAO5G,QAThC,IAFAuU,GADAtK,EAAW0a,EAAexmB,KAAK4D,IACfwS,KAChB7M,EAAS,IAAImG,IACL2W,EAAOjQ,EAAKpW,KAAK8L,IAAWsM,KAAM3P,IACxC5G,EAAQ0kB,EAAUP,GAA6Bla,EAAUwa,EAAO,CAACD,EAAKxkB,MAAO4G,IAAQ,GAAQ4d,EAAKxkB,MAClG6W,GAAenP,EAAQd,EAAO5G,GAWlC,OADA0H,EAAOxB,OAASU,EACTc,GCrCLkd,GAAS,WASTC,GAAgB,eAChBC,GAAkB,yBAClBC,GAAiB,kDAEjB3e,GAAQtH,KAAKsH,MACb4e,GAAqB5iB,OAAO6iB,aAoC5BC,GAAe,SAAUC,GAG3B,OAAOA,EAAQ,GAAK,IAAMA,EAAQ,KAOhCC,GAAQ,SAAUC,EAAOC,EAAWC,GACtC,IAAItN,EAAI,EAGR,IAFAoN,EAAQE,EAAYnf,GAAMif,EAzDjB,KAyDiCA,GAAS,EACnDA,GAASjf,GAAMif,EAAQC,GAChBD,EAAQG,IAA2BvN,GA/DjC,GAgEPoN,EAAQjf,GAAMif,EArDEI,IAuDlB,OAAOrf,GAAM6R,EAAI,GAAsBoN,GAASA,EA/DvC,MAuEPK,GAAS,SAAU1kB,GACrB,IAYIyG,EAAGke,EAZH7F,EAAS,GAMT8F,GAHJ5kB,EAxDe,SAAUgI,GAIzB,IAHA,IAAI8W,EAAS,GACT+F,EAAU,EACV3f,EAAS8C,EAAO9C,OACb2f,EAAU3f,GAAQ,CACvB,IAAIlG,EAAQgJ,EAAOoS,WAAWyK,KAC9B,GAAI7lB,GAAS,OAAUA,GAAS,OAAU6lB,EAAU3f,EAAQ,CAE1D,IAAI4f,EAAQ9c,EAAOoS,WAAWyK,KACN,QAAX,MAARC,GACHhG,EAAOxc,OAAe,KAARtD,IAAkB,KAAe,KAAR8lB,GAAiB,QAIxDhG,EAAOxc,KAAKtD,GACZ6lB,UAGF/F,EAAOxc,KAAKtD,GAGhB,OAAO8f,EAmCCiG,CAAW/kB,IAGKkF,OAGpB8R,EA9ES,IA+ETqN,EAAQ,EACRW,EAjFY,GAqFhB,IAAKve,EAAI,EAAGA,EAAIzG,EAAMkF,OAAQuB,KAC5Bke,EAAe3kB,EAAMyG,IACF,KACjBqY,EAAOxc,KAAK0hB,GAAmBW,IAInC,IAAIM,EAAcnG,EAAO5Z,OACrBggB,EAAiBD,EAQrB,IALIA,GACFnG,EAAOxc,KA/FK,KAmGP4iB,EAAiBN,GAAa,CAEnC,IAAIxH,EAAIwG,GACR,IAAKnd,EAAI,EAAGA,EAAIzG,EAAMkF,OAAQuB,KAC5Bke,EAAe3kB,EAAMyG,KACDuQ,GAAK2N,EAAevH,IACtCA,EAAIuH,GAKR,IAAIQ,EAAwBD,EAAiB,EAC7C,GAAI9H,EAAIpG,EAAI5R,IAAOwe,GAASS,GAASc,GACnC,MAAMC,WAAWrB,IAMnB,IAHAM,IAAUjH,EAAIpG,GAAKmO,EACnBnO,EAAIoG,EAEC3W,EAAI,EAAGA,EAAIzG,EAAMkF,OAAQuB,IAAK,CAEjC,IADAke,EAAe3kB,EAAMyG,IACFuQ,KAAOqN,EAAQT,GAChC,MAAMwB,WAAWrB,IAEnB,GAAIY,GAAgB3N,EAAG,CAGrB,IADA,IAAIoI,EAAIiF,EACCpN,EArIN,IAqIoCA,GArIpC,GAqI+C,CAChD,IAAIoO,EAAIpO,GAAK+N,EArIZ,EAqI2B/N,GAAK+N,EApIhC,GAAA,GAoIqD/N,EAAI+N,EAC1D,GAAI5F,EAAIiG,EAAG,MACX,IAAIC,EAAUlG,EAAIiG,EACdE,EAzIH,GAyIuBF,EACxBvG,EAAOxc,KAAK0hB,GAAmBE,GAAamB,EAAIC,EAAUC,KAC1DnG,EAAIha,GAAMkgB,EAAUC,GAGtBzG,EAAOxc,KAAK0hB,GAAmBE,GAAa9E,KAC5C4F,EAAOZ,GAAMC,EAAOc,EAAuBD,GAAkBD,GAC7DZ,EAAQ,IACNa,KAIJb,IACArN,EAEJ,OAAO8H,EAAOpa,KAAK,KCzJrB8gB,GAAiB,SAAUle,EAAQuD,EAAKxG,GACtC,IAAK,IAAI/D,KAAOuK,EAAK7G,GAASsD,EAAQhH,EAAKuK,EAAIvK,GAAM+D,GACrD,OAAOiD,GCDTme,GAAiB,SAAU5nB,GACzB,IAAI8lB,EAAiBN,GAAkBxlB,GACvC,GAA6B,mBAAlB8lB,EACT,MAAMhkB,UAAUyB,OAAOvD,GAAM,oBAC7B,OAAOsD,EAASwiB,EAAexmB,KAAKU,KCgBpC6nB,GAAS5gB,GAAW,SACpB6gB,GAAU7gB,GAAW,WACrBmO,GAAWtH,GAAgB,YAC3Bia,GAAoB,kBACpBC,GAA6BD,0BAC7BvX,GAAmBnK,GAAoBjC,IACvC6jB,GAAyB5hB,GAAoBL,UAAU+hB,IACvDG,GAA2B7hB,GAAoBL,UAAUgiB,IAEzDG,GAAO,MACPC,GAAY9c,MAAM,GAElB+c,GAAkB,SAAUC,GAC9B,OAAOF,GAAUE,EAAQ,KAAOF,GAAUE,EAAQ,GAAKlO,OAAO,qBAAuBkO,EAAQ,KAAM,QAGjGC,GAAgB,SAAUC,GAC5B,IACE,OAAOC,mBAAmBD,GAC1B,MAAOloB,GACP,OAAOkoB,IAIPE,GAAc,SAAU1oB,GAC1B,IAAI6I,EAAS7I,EAAGoK,QAAQ+d,GAAM,KAC1BG,EAAQ,EACZ,IACE,OAAOG,mBAAmB5f,GAC1B,MAAOvI,GACP,KAAOgoB,GACLzf,EAASA,EAAOuB,QAAQie,GAAgBC,KAAUC,IAEpD,OAAO1f,IAIPqH,GAAO,eAEP9F,GAAU,CACZue,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,IAAK,MACLC,MAAO,KAGLnW,GAAW,SAAUkF,GACvB,OAAO3N,GAAQ2N,IAGbkR,GAAY,SAAUjpB,GACxB,OAAOkpB,mBAAmBlpB,GAAIoK,QAAQ8F,GAAM2C,KAG1CsW,GAAoB,SAAUtgB,EAAQugB,GACxC,GAAIA,EAIF,IAHA,IAEIC,EAAWC,EAFXC,EAAaH,EAAM3nB,MAAM,KACzBsG,EAAQ,EAELA,EAAQwhB,EAAWliB,SACxBgiB,EAAYE,EAAWxhB,MACTV,SACZiiB,EAAQD,EAAU5nB,MAAM,KACxBoH,EAAOpE,KAAK,CACVhC,IAAKimB,GAAYY,EAAME,SACvBroB,MAAOunB,GAAYY,EAAMziB,KAAK,UAOpC4iB,GAAqB,SAAUL,GACjChrB,KAAKgZ,QAAQ/P,OAAS,EACtB8hB,GAAkB/qB,KAAKgZ,QAASgS,IAG9BM,GAA0B,SAAUC,EAAQC,GAC9C,GAAID,EAASC,EAAU,MAAM9nB,UAAU,yBAGrC+nB,GAA0BrU,IAA0B,SAAkB1W,EAAQ2Y,GAChFjH,GAAiBpS,KAAM,CACrB8H,KAAM8hB,GACN5c,SAAUwc,GAAYK,GAAuBnpB,GAAQsY,SACrDK,KAAMA,MAEP,YAAY,WACb,IAAIpS,EAAQ6iB,GAAyB9pB,MACjCqZ,EAAOpS,EAAMoS,KACbkO,EAAOtgB,EAAM+F,SAASsK,OACtB4T,EAAQ3D,EAAKxkB,MAGf,OAFGwkB,EAAKjO,OACRiO,EAAKxkB,MAAiB,SAATsW,EAAkB6R,EAAM7mB,IAAe,WAATgV,EAAoB6R,EAAMnoB,MAAQ,CAACmoB,EAAM7mB,IAAK6mB,EAAMnoB,QACxFwkB,KAKPmE,GAA6B,WAC/BnF,GAAWvmB,KAAM0rB,GAA4B/B,IAC7C,IAGIjC,EAAgB1a,EAAUsK,EAAMiQ,EAAMoE,EAAeC,EAAW9N,EAAOC,EAAQ1Z,EAH/EwnB,EAAO7iB,UAAUC,OAAS,EAAID,UAAU,QAAKvF,EAC7C4M,EAAOrQ,KACPgZ,EAAU,GAUd,GAPA5G,GAAiB/B,EAAM,CACrBvI,KAAM6hB,GACN3Q,QAASA,EACT8S,UAAW,aACXT,mBAAoBA,UAGT5nB,IAATooB,EACF,GAAIhoB,EAASgoB,GAEX,GAA8B,mBAD9BnE,EAAiBN,GAAkByE,IAIjC,IADAvU,GADAtK,EAAW0a,EAAexmB,KAAK2qB,IACfvU,OACPiQ,EAAOjQ,EAAKpW,KAAK8L,IAAWsM,MAAM,CAGzC,IACGwE,GAFH8N,GADAD,EAAgBnC,GAAYtkB,EAASqiB,EAAKxkB,SAChBuU,MAELpW,KAAKyqB,IAAgBrS,OACvCyE,EAAS6N,EAAU1qB,KAAKyqB,IAAgBrS,OACxCsS,EAAU1qB,KAAKyqB,GAAerS,KAC/B,MAAM5V,UAAU,mCAClBsV,EAAQ3S,KAAK,CAAEhC,IAAKyZ,EAAM/a,MAAQ,GAAIA,MAAOgb,EAAOhb,MAAQ,UAEzD,IAAKsB,KAAOwnB,EAAUE,EAAOF,EAAMxnB,IAAM2U,EAAQ3S,KAAK,CAAEhC,IAAKA,EAAKtB,MAAO8oB,EAAKxnB,GAAO,UAE5F0mB,GAAkB/R,EAAyB,iBAAT6S,EAAuC,MAAnBA,EAAKzN,OAAO,GAAayN,EAAKzoB,MAAM,GAAKyoB,EAAOA,EAAO,KAK/GG,GAA2BN,GAA2BpqB,UAE1DioB,GAAYyC,GAA0B,CAGpCC,OAAQ,SAAgBtc,EAAM5M,GAC5BuoB,GAAwBtiB,UAAUC,OAAQ,GAC1C,IAAIhC,EAAQ4iB,GAAuB7pB,MACnCiH,EAAM+R,QAAQ3S,KAAK,CAAEhC,IAAKsL,EAAO,GAAI5M,MAAOA,EAAQ,KACpDkE,EAAM6kB,aAIRI,OAAU,SAAUvc,GAClB2b,GAAwBtiB,UAAUC,OAAQ,GAK1C,IAJA,IAAIhC,EAAQ4iB,GAAuB7pB,MAC/BgZ,EAAU/R,EAAM+R,QAChB3U,EAAMsL,EAAO,GACbhG,EAAQ,EACLA,EAAQqP,EAAQ/P,QACjB+P,EAAQrP,GAAOtF,MAAQA,EAAK2U,EAAQmT,OAAOxiB,EAAO,GACjDA,IAEP1C,EAAM6kB,aAIRzqB,IAAK,SAAasO,GAChB2b,GAAwBtiB,UAAUC,OAAQ,GAI1C,IAHA,IAAI+P,EAAU6Q,GAAuB7pB,MAAMgZ,QACvC3U,EAAMsL,EAAO,GACbhG,EAAQ,EACLA,EAAQqP,EAAQ/P,OAAQU,IAC7B,GAAIqP,EAAQrP,GAAOtF,MAAQA,EAAK,OAAO2U,EAAQrP,GAAO5G,MAExD,OAAO,MAITqpB,OAAQ,SAAgBzc,GACtB2b,GAAwBtiB,UAAUC,OAAQ,GAK1C,IAJA,IAAI+P,EAAU6Q,GAAuB7pB,MAAMgZ,QACvC3U,EAAMsL,EAAO,GACblF,EAAS,GACTd,EAAQ,EACLA,EAAQqP,EAAQ/P,OAAQU,IACzBqP,EAAQrP,GAAOtF,MAAQA,GAAKoG,EAAOpE,KAAK2S,EAAQrP,GAAO5G,OAE7D,OAAO0H,GAITrG,IAAK,SAAauL,GAChB2b,GAAwBtiB,UAAUC,OAAQ,GAI1C,IAHA,IAAI+P,EAAU6Q,GAAuB7pB,MAAMgZ,QACvC3U,EAAMsL,EAAO,GACbhG,EAAQ,EACLA,EAAQqP,EAAQ/P,QACrB,GAAI+P,EAAQrP,KAAStF,MAAQA,EAAK,OAAO,EAE3C,OAAO,GAIT2B,IAAK,SAAa2J,EAAM5M,GACtBuoB,GAAwBtiB,UAAUC,OAAQ,GAQ1C,IAPA,IAMIiiB,EANAjkB,EAAQ4iB,GAAuB7pB,MAC/BgZ,EAAU/R,EAAM+R,QAChBqT,GAAQ,EACRhoB,EAAMsL,EAAO,GACb1L,EAAMlB,EAAQ,GACd4G,EAAQ,EAELA,EAAQqP,EAAQ/P,OAAQU,KAC7BuhB,EAAQlS,EAAQrP,IACNtF,MAAQA,IACZgoB,EAAOrT,EAAQmT,OAAOxiB,IAAS,IAEjC0iB,GAAQ,EACRnB,EAAMnoB,MAAQkB,IAIfooB,GAAOrT,EAAQ3S,KAAK,CAAEhC,IAAKA,EAAKtB,MAAOkB,IAC5CgD,EAAM6kB,aAIR7F,KAAM,WACJ,IAIIiF,EAAOoB,EAAcC,EAJrBtlB,EAAQ4iB,GAAuB7pB,MAC/BgZ,EAAU/R,EAAM+R,QAEhB5V,EAAQ4V,EAAQ5V,QAGpB,IADA4V,EAAQ/P,OAAS,EACZsjB,EAAa,EAAGA,EAAanpB,EAAM6F,OAAQsjB,IAAc,CAE5D,IADArB,EAAQ9nB,EAAMmpB,GACTD,EAAe,EAAGA,EAAeC,EAAYD,IAChD,GAAItT,EAAQsT,GAAcjoB,IAAM6mB,EAAM7mB,IAAK,CACzC2U,EAAQmT,OAAOG,EAAc,EAAGpB,GAChC,MAGAoB,IAAiBC,GAAYvT,EAAQ3S,KAAK6kB,GAEhDjkB,EAAM6kB,aAGRra,QAAS,SAAiB+a,GAKxB,IAJA,IAGItB,EAHAlS,EAAU6Q,GAAuB7pB,MAAMgZ,QACvC1H,EAAgBC,GAAKib,EAAUxjB,UAAUC,OAAS,EAAID,UAAU,QAAKvF,EAAW,GAChFkG,EAAQ,EAELA,EAAQqP,EAAQ/P,QAErBqI,GADA4Z,EAAQlS,EAAQrP,MACI5G,MAAOmoB,EAAM7mB,IAAKrE,OAI1C6G,KAAM,WACJ,OAAO,IAAI4kB,GAAwBzrB,KAAM,SAG3CiZ,OAAQ,WACN,OAAO,IAAIwS,GAAwBzrB,KAAM,WAG3CgZ,QAAS,WACP,OAAO,IAAIyS,GAAwBzrB,KAAM,aAE1C,CAAE4C,YAAY,IAGjBmF,GAASikB,GAA0BhV,GAAUgV,GAAyBhT,SAItEjR,GAASikB,GAA0B,YAAY,WAK7C,IAJA,IAGId,EAHAlS,EAAU6Q,GAAuB7pB,MAAMgZ,QACvCvO,EAAS,GACTd,EAAQ,EAELA,EAAQqP,EAAQ/P,QACrBiiB,EAAQlS,EAAQrP,KAChBc,EAAOpE,KAAKwkB,GAAUK,EAAM7mB,KAAO,IAAMwmB,GAAUK,EAAMnoB,QACzD,OAAO0H,EAAOhC,KAAK,OACpB,CAAE7F,YAAY,IAEjBqN,GAAeyb,GAA4B/B,IAE3C1V,GAAE,CAAE1U,QAAQ,EAAMmN,QAAS+f,IAAkB,CAC3CtG,gBAAiBuF,KAKde,IAAmC,mBAAVhD,IAA0C,mBAAXC,IAC3DzV,GAAE,CAAE1U,QAAQ,EAAMqD,YAAY,EAAM8J,QAAQ,GAAQ,CAClDggB,MAAO,SAAe3oB,GACpB,IACI8nB,EAAMc,EAAMC,EADZhY,EAAO,CAAC7Q,GAkBV,OAhBEiF,UAAUC,OAAS,IAEjBpF,EADJgoB,EAAO7iB,UAAU,MAEf2jB,EAAOd,EAAKc,KACRppB,GAAQopB,KAAUhD,MACpBiD,EAAUf,EAAKe,QAAU,IAAIlD,GAAQmC,EAAKe,SAAW,IAAIlD,IAC5CtlB,IAAI,iBACfwoB,EAAQ5mB,IAAI,eAAgB,mDAE9B6lB,EAAO5c,GAAO4c,EAAM,CAClBc,KAAM9pB,EAAyB,EAAGsC,OAAOwnB,IACzCC,QAAS/pB,EAAyB,EAAG+pB,OAI3ChY,EAAKvO,KAAKwlB,IACHpC,GAAOjZ,MAAMxQ,KAAM4U,MAKlC,ICxSIiY,GDwSJC,GAAiB,CACf3G,gBAAiBuF,GACjBqB,SAAUlD,IC5URvL,GAAS0O,GAAyC1O,OAMlD2O,GAAY1tB,EAAOumB,IACnBK,GAAkB+G,GAAsB/G,gBACxCgH,GAA+BD,GAAsBH,SACrD3a,GAAmBnK,GAAoBjC,IACvConB,GAAsBnlB,GAAoBL,UAAU,OACpDuB,GAAQtH,KAAKsH,MACbkkB,GAAMxrB,KAAKwrB,IAGXC,GAAiB,iBACjBC,GAAe,eACfC,GAAe,eAEfC,GAAQ,WACRC,GAAe,gBACfC,GAAQ,KACRC,GAAY,WACZC,GAAM,WACNC,GAAM,QACNC,GAAM,gBAENC,GAA4B,wCAE5BC,GAA8C,uCAE9CC,GAA2C,yCAE3CC,GAAmB,wBAGnBC,GAAY,SAAUvI,EAAK9hB,GAC7B,IAAI0G,EAAQ4jB,EAAY1kB,EACxB,GAAuB,KAAnB5F,EAAMqa,OAAO,GAAW,CAC1B,GAAsC,KAAlCra,EAAMqa,OAAOra,EAAMkF,OAAS,GAAW,OAAOskB,GAElD,KADA9iB,EAAS6jB,GAAUvqB,EAAMX,MAAM,GAAI,KACtB,OAAOmqB,GACpB1H,EAAIQ,KAAO5b,OAEN,GAAK8jB,GAAU1I,GAQf,CAEL,GADA9hB,EJ4Fa,SAAUA,GACzB,IAEIyG,EAAGgkB,EAFHC,EAAU,GACVC,EAAS3qB,EAAMkI,cAAcD,QAAQ6b,GAAiB,KAAUxkB,MAAM,KAE1E,IAAKmH,EAAI,EAAGA,EAAIkkB,EAAOzlB,OAAQuB,IAC7BgkB,EAAQE,EAAOlkB,GACfikB,EAAQpoB,KAAKuhB,GAAczhB,KAAKqoB,GAAS,OAAS/F,GAAO+F,GAASA,GAEpE,OAAOC,EAAQhmB,KAAK,KIpGVkmB,CAAQ5qB,GACZiqB,GAA0B7nB,KAAKpC,GAAQ,OAAOwpB,GAElD,GAAe,QADf9iB,EAASmkB,GAAU7qB,IACE,OAAOwpB,GAC5B1H,EAAIQ,KAAO5b,MAbe,CAC1B,GAAIwjB,GAA4C9nB,KAAKpC,GAAQ,OAAOwpB,GAGpE,IAFA9iB,EAAS,GACT4jB,EAAahH,GAAUtjB,GAClB4F,EAAQ,EAAGA,EAAQ0kB,EAAWplB,OAAQU,IACzCc,GAAUokB,GAAcR,EAAW1kB,GAAQmlB,IAE7CjJ,EAAIQ,KAAO5b,IAUXmkB,GAAY,SAAU7qB,GACxB,IACIgrB,EAAaC,EAASrlB,EAAOslB,EAAMC,EAAOC,EAAQC,EADlDC,EAAQtrB,EAAMV,MAAM,KAMxB,GAJIgsB,EAAMpmB,QAAqC,IAA3BomB,EAAMA,EAAMpmB,OAAS,IACvComB,EAAMC,OAERP,EAAcM,EAAMpmB,QACF,EAAG,OAAOlF,EAE5B,IADAirB,EAAU,GACLrlB,EAAQ,EAAGA,EAAQolB,EAAaplB,IAAS,CAE5C,GAAY,KADZslB,EAAOI,EAAM1lB,IACG,OAAO5F,EAMvB,GALAmrB,EAAQ,GACJD,EAAKhmB,OAAS,GAAuB,KAAlBgmB,EAAK7Q,OAAO,KACjC8Q,EAAQtB,GAAUznB,KAAK8oB,GAAQ,GAAK,EACpCA,EAAOA,EAAK7rB,MAAe,GAAT8rB,EAAa,EAAI,IAExB,KAATD,EACFE,EAAS,MACJ,CACL,KAAe,IAATD,EAAcpB,GAAe,GAAToB,EAAarB,GAAME,IAAK5nB,KAAK8oB,GAAO,OAAOlrB,EACrEorB,EAASI,SAASN,EAAMC,GAE1BF,EAAQ3oB,KAAK8oB,GAEf,IAAKxlB,EAAQ,EAAGA,EAAQolB,EAAaplB,IAEnC,GADAwlB,EAASH,EAAQrlB,GACbA,GAASolB,EAAc,GACzB,GAAII,GAAU9B,GAAI,IAAK,EAAI0B,GAAc,OAAO,UAC3C,GAAII,EAAS,IAAK,OAAO,KAGlC,IADAC,EAAOJ,EAAQM,MACV3lB,EAAQ,EAAGA,EAAQqlB,EAAQ/lB,OAAQU,IACtCylB,GAAQJ,EAAQrlB,GAAS0jB,GAAI,IAAK,EAAI1jB,GAExC,OAAOylB,GAILd,GAAY,SAAUvqB,GACxB,IAIIhB,EAAOkG,EAAQumB,EAAaC,EAAWN,EAAQO,EAAOC,EAJtDC,EAAU,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,GAChCC,EAAa,EACbC,EAAW,KACXC,EAAU,EAGVC,EAAO,WACT,OAAOjsB,EAAMqa,OAAO2R,IAGtB,GAAc,KAAVC,IAAe,CACjB,GAAuB,KAAnBjsB,EAAMqa,OAAO,GAAW,OAC5B2R,GAAW,EAEXD,IADAD,EAGF,KAAOG,KAAQ,CACb,GAAkB,GAAdH,EAAiB,OACrB,GAAc,KAAVG,IAAJ,CAQA,IADAjtB,EAAQkG,EAAS,EACVA,EAAS,GAAK8kB,GAAI5nB,KAAK6pB,MAC5BjtB,EAAgB,GAARA,EAAawsB,SAASS,IAAQ,IACtCD,IACA9mB,IAEF,GAAc,KAAV+mB,IAAe,CACjB,GAAc,GAAV/mB,EAAa,OAEjB,GADA8mB,GAAW9mB,EACP4mB,EAAa,EAAG,OAEpB,IADAL,EAAc,EACPQ,KAAQ,CAEb,GADAP,EAAY,KACRD,EAAc,EAAG,CACnB,KAAc,KAAVQ,KAAiBR,EAAc,GAC9B,OADiCO,IAGxC,IAAKpC,GAAMxnB,KAAK6pB,KAAS,OACzB,KAAOrC,GAAMxnB,KAAK6pB,MAAS,CAEzB,GADAb,EAASI,SAASS,IAAQ,IACR,OAAdP,EAAoBA,EAAYN,MAC/B,CAAA,GAAiB,GAAbM,EAAgB,OACpBA,EAAwB,GAAZA,EAAiBN,EAClC,GAAIM,EAAY,IAAK,OACrBM,IAEFH,EAAQC,GAAoC,IAAtBD,EAAQC,GAAoBJ,EAE/B,KADnBD,GACuC,GAAfA,GAAkBK,IAE5C,GAAmB,GAAfL,EAAkB,OACtB,MACK,GAAc,KAAVQ,KAET,GADAD,KACKC,IAAQ,YACR,GAAIA,IAAQ,OACnBJ,EAAQC,KAAgB9sB,MA3CxB,CACE,GAAiB,OAAb+sB,EAAmB,OACvBC,IAEAD,IADAD,GA0CJ,GAAiB,OAAbC,EAGF,IAFAJ,EAAQG,EAAaC,EACrBD,EAAa,EACQ,GAAdA,GAAmBH,EAAQ,GAChCC,EAAOC,EAAQC,GACfD,EAAQC,KAAgBD,EAAQE,EAAWJ,EAAQ,GACnDE,EAAQE,IAAaJ,GAASC,OAE3B,GAAkB,GAAdE,EAAiB,OAC5B,OAAOD,GA6BLK,GAAgB,SAAU5J,GAC5B,IAAI5b,EAAQd,EAAOmmB,EAAUI,EAE7B,GAAmB,iBAAR7J,EAAkB,CAE3B,IADA5b,EAAS,GACJd,EAAQ,EAAGA,EAAQ,EAAGA,IACzBc,EAAO0lB,QAAQ9J,EAAO,KACtBA,EAAOld,GAAMkd,EAAO,KACpB,OAAO5b,EAAOhC,KAAK,KAEhB,GAAmB,iBAAR4d,EAAkB,CAGlC,IAFA5b,EAAS,GACTqlB,EAtC0B,SAAUM,GAMtC,IALA,IAAIC,EAAW,KACXC,EAAY,EACZC,EAAY,KACZC,EAAa,EACb7mB,EAAQ,EACLA,EAAQ,EAAGA,IACI,IAAhBymB,EAAKzmB,IACH6mB,EAAaF,IACfD,EAAWE,EACXD,EAAYE,GAEdD,EAAY,KACZC,EAAa,IAEK,OAAdD,IAAoBA,EAAY5mB,KAClC6mB,GAON,OAJIA,EAAaF,IACfD,EAAWE,EACXD,EAAYE,GAEPH,EAeMI,CAAwBpK,GAC9B1c,EAAQ,EAAGA,EAAQ,EAAGA,IACrBumB,GAA2B,IAAhB7J,EAAK1c,KAChBumB,IAASA,GAAU,GACnBJ,IAAanmB,GACfc,GAAUd,EAAQ,IAAM,KACxBumB,GAAU,IAEVzlB,GAAU4b,EAAK1c,GAAOzG,SAAS,IAC3ByG,EAAQ,IAAGc,GAAU,OAG7B,MAAO,IAAMA,EAAS,IACtB,OAAO4b,GAGPyI,GAA4B,GAC5B4B,GAA2BjK,GAAO,GAAIqI,GAA2B,CACnE6B,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,IAEnCC,GAAuBvK,GAAO,GAAIiK,GAA0B,CAC9DO,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,IAE3BC,GAA2B5K,GAAO,GAAIuK,GAAsB,CAC9DM,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,KAAM,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,IAG5ElD,GAAgB,SAAUmB,EAAMhqB,GAClC,IAAIgsB,EAAO1T,GAAO0R,EAAM,GACxB,OAAOgC,EAAO,IAAQA,EAAO,MAAS5tB,EAAI4B,EAAKgqB,GAAQA,EAAOlF,mBAAmBkF,IAG/EiC,GAAiB,CACnBC,IAAK,GACLC,KAAM,KACNC,KAAM,GACNC,MAAO,IACPC,GAAI,GACJC,IAAK,KAGHhE,GAAY,SAAU1I,GACxB,OAAOzhB,EAAI6tB,GAAgBpM,EAAI2M,SAG7BC,GAAsB,SAAU5M,GAClC,MAAuB,IAAhBA,EAAIO,UAAkC,IAAhBP,EAAI6M,UAG/BC,GAAiC,SAAU9M,GAC7C,OAAQA,EAAIQ,MAAQR,EAAI+M,kBAAkC,QAAd/M,EAAI2M,QAG9CK,GAAuB,SAAU9mB,EAAQ+mB,GAC3C,IAAI/U,EACJ,OAAwB,GAAjBhS,EAAO9C,QAAewkB,GAAMtnB,KAAK4F,EAAOqS,OAAO,MACjB,MAA9BL,EAAShS,EAAOqS,OAAO,MAAgB0U,GAAwB,KAAV/U,IAG1DgV,GAA+B,SAAUhnB,GAC3C,IAAIinB,EACJ,OAAOjnB,EAAO9C,OAAS,GAAK4pB,GAAqB9mB,EAAO3I,MAAM,EAAG,MAC9C,GAAjB2I,EAAO9C,QACyB,OAA9B+pB,EAAQjnB,EAAOqS,OAAO,KAAyB,OAAV4U,GAA4B,MAAVA,GAA2B,MAAVA,IAI1EC,GAAkB,SAAUpN,GAC9B,IAAInd,EAAOmd,EAAInd,KACXwqB,EAAWxqB,EAAKO,QAChBiqB,GAA2B,QAAdrN,EAAI2M,QAAgC,GAAZU,GAAkBL,GAAqBnqB,EAAK,IAAI,IACvFA,EAAK4mB,OAIL6D,GAAc,SAAUC,GAC1B,MAAmB,MAAZA,GAA6C,QAA1BA,EAAQnnB,eAShConB,GAAe,GACfC,GAAS,GACTC,GAAY,GACZC,GAAgC,GAChCC,GAAoB,GACpBC,GAAW,GACXC,GAAiB,GACjBC,GAA4B,GAC5BC,GAAmC,GACnCC,GAAY,GACZC,GAAO,GACPC,GAAW,GACXC,GAAO,GACPC,GAAO,GACPC,GAAa,GACbC,GAAY,GACZC,GAAa,GACbC,GAAO,GACPC,GAA4B,GAC5BC,GAAQ,GACRC,GAAW,GAGXC,GAAW,SAAU7O,EAAK9hB,EAAO4wB,EAAenM,GAClD,IAMI6F,EAAY2B,EAAM4E,EAAkBC,EApCdzB,EA8BtBnsB,EAAQ0tB,GAAiBtB,GACzBtD,EAAU,EACV+E,EAAS,GACTC,GAAS,EACTC,GAAc,EACdC,GAAoB,EAoBxB,IAjBKN,IACH9O,EAAI2M,OAAS,GACb3M,EAAIO,SAAW,GACfP,EAAI6M,SAAW,GACf7M,EAAIQ,KAAO,KACXR,EAAIqP,KAAO,KACXrP,EAAInd,KAAO,GACXmd,EAAImF,MAAQ,KACZnF,EAAIsP,SAAW,KACftP,EAAI+M,kBAAmB,EACvB7uB,EAAQA,EAAMiI,QAAQkiB,GAA0C,KAGlEnqB,EAAQA,EAAMiI,QAAQmiB,GAAkB,IAExCE,EAAahH,GAAUtjB,GAEhBgsB,GAAW1B,EAAWplB,QAAQ,CAEnC,OADA+mB,EAAO3B,EAAW0B,GACV9oB,GACN,KAAKosB,GACH,IAAIrD,IAAQvC,GAAMtnB,KAAK6pB,GAGhB,CAAA,GAAK2E,EAGL,OAAOrH,GAFZrmB,EAAQssB,GACR,SAJAuB,GAAU9E,EAAK/jB,cACfhF,EAAQqsB,GAKV,MAEF,KAAKA,GACH,GAAItD,IAAStC,GAAavnB,KAAK6pB,IAAiB,KAARA,GAAuB,KAARA,GAAuB,KAARA,GACpE8E,GAAU9E,EAAK/jB,kBACV,CAAA,GAAY,KAAR+jB,EA0BJ,CAAA,GAAK2E,EAKL,OAAOrH,GAJZwH,EAAS,GACT7tB,EAAQssB,GACRxD,EAAU,EACV,SA7BA,GAAI4E,IACDpG,GAAU1I,IAAQzhB,EAAI6tB,GAAgB6C,IAC5B,QAAVA,IAAqBrC,GAAoB5M,IAAqB,OAAbA,EAAIqP,OACvC,QAAdrP,EAAI2M,SAAqB3M,EAAIQ,MAC7B,OAEH,GADAR,EAAI2M,OAASsC,EACTH,EAEF,YADIpG,GAAU1I,IAAQoM,GAAepM,EAAI2M,SAAW3M,EAAIqP,OAAMrP,EAAIqP,KAAO,OAG3EJ,EAAS,GACS,QAAdjP,EAAI2M,OACNvrB,EAAQitB,GACC3F,GAAU1I,IAAQ2C,GAAQA,EAAKgK,QAAU3M,EAAI2M,OACtDvrB,EAAQusB,GACCjF,GAAU1I,GACnB5e,EAAQ2sB,GAC4B,KAA3BvF,EAAW0B,EAAU,IAC9B9oB,EAAQwsB,GACR1D,MAEAlK,EAAI+M,kBAAmB,EACvB/M,EAAInd,KAAKrC,KAAK,IACdY,EAAQstB,IAQZ,MAEF,KAAKhB,GACH,IAAK/K,GAASA,EAAKoK,kBAA4B,KAAR5C,EAAc,OAAO1C,GAC5D,GAAI9E,EAAKoK,kBAA4B,KAAR5C,EAAa,CACxCnK,EAAI2M,OAAShK,EAAKgK,OAClB3M,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrByiB,EAAImF,MAAQxC,EAAKwC,MACjBnF,EAAIsP,SAAW,GACftP,EAAI+M,kBAAmB,EACvB3rB,EAAQwtB,GACR,MAEFxtB,EAAuB,QAAfuhB,EAAKgK,OAAmB0B,GAAOR,GACvC,SAEF,KAAKF,GACH,GAAY,KAARxD,GAA0C,KAA3B3B,EAAW0B,EAAU,GAGjC,CACL9oB,EAAQysB,GACR,SAJAzsB,EAAQ4sB,GACR9D,IAIA,MAEJ,KAAK0D,GACH,GAAY,KAARzD,EAAa,CACf/oB,EAAQ6sB,GACR,MAEA7sB,EAAQqtB,GACR,SAGJ,KAAKZ,GAEH,GADA7N,EAAI2M,OAAShK,EAAKgK,OACdxC,GAAQnD,GACVhH,EAAIO,SAAWoC,EAAKpC,SACpBP,EAAI6M,SAAWlK,EAAKkK,SACpB7M,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAIqP,KAAO1M,EAAK0M,KAChBrP,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrByiB,EAAImF,MAAQxC,EAAKwC,WACZ,GAAY,KAARgF,GAAwB,MAARA,GAAgBzB,GAAU1I,GACnD5e,EAAQ0sB,QACH,GAAY,KAAR3D,EACTnK,EAAIO,SAAWoC,EAAKpC,SACpBP,EAAI6M,SAAWlK,EAAKkK,SACpB7M,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAIqP,KAAO1M,EAAK0M,KAChBrP,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrByiB,EAAImF,MAAQ,GACZ/jB,EAAQutB,OACH,CAAA,GAAY,KAARxE,EASJ,CACLnK,EAAIO,SAAWoC,EAAKpC,SACpBP,EAAI6M,SAAWlK,EAAKkK,SACpB7M,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAIqP,KAAO1M,EAAK0M,KAChBrP,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrByiB,EAAInd,KAAK4mB,MACTroB,EAAQqtB,GACR,SAhBAzO,EAAIO,SAAWoC,EAAKpC,SACpBP,EAAI6M,SAAWlK,EAAKkK,SACpB7M,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAIqP,KAAO1M,EAAK0M,KAChBrP,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrByiB,EAAImF,MAAQxC,EAAKwC,MACjBnF,EAAIsP,SAAW,GACfluB,EAAQwtB,GAUR,MAEJ,KAAKd,GACH,IAAIpF,GAAU1I,IAAiB,KAARmK,GAAuB,MAARA,EAE/B,CAAA,GAAY,KAARA,EAEJ,CACLnK,EAAIO,SAAWoC,EAAKpC,SACpBP,EAAI6M,SAAWlK,EAAKkK,SACpB7M,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAIqP,KAAO1M,EAAK0M,KAChBjuB,EAAQqtB,GACR,SAPArtB,EAAQ6sB,QAFR7sB,EAAQ4sB,GAUR,MAEJ,KAAKD,GAEH,GADA3sB,EAAQ4sB,GACI,KAAR7D,GAA6C,KAA9B8E,EAAO1W,OAAO2R,EAAU,GAAW,SACtDA,IACA,MAEF,KAAK8D,GACH,GAAY,KAAR7D,GAAuB,MAARA,EAAc,CAC/B/oB,EAAQ6sB,GACR,SACA,MAEJ,KAAKA,GACH,GAAY,KAAR9D,EAAa,CACX+E,IAAQD,EAAS,MAAQA,GAC7BC,GAAS,EACTH,EAAmBvN,GAAUyN,GAC7B,IAAK,IAAItqB,EAAI,EAAGA,EAAIoqB,EAAiB3rB,OAAQuB,IAAK,CAChD,IAAI4qB,EAAYR,EAAiBpqB,GACjC,GAAiB,KAAb4qB,GAAqBH,EAAzB,CAIA,IAAII,EAAoBxG,GAAcuG,EAAW/D,IAC7C4D,EAAmBpP,EAAI6M,UAAY2C,EAClCxP,EAAIO,UAAYiP,OALnBJ,GAAoB,EAOxBH,EAAS,QACJ,GACL9E,GAAQnD,IAAe,KAARmD,GAAuB,KAARA,GAAuB,KAARA,GACpC,MAARA,GAAgBzB,GAAU1I,GAC3B,CACA,GAAIkP,GAAoB,IAAVD,EAAc,MArfd,oBAsfd/E,GAAW1I,GAAUyN,GAAQ7rB,OAAS,EACtC6rB,EAAS,GACT7tB,EAAQ8sB,QACHe,GAAU9E,EACjB,MAEF,KAAK+D,GACL,KAAKC,GACH,GAAIW,GAA+B,QAAd9O,EAAI2M,OAAkB,CACzCvrB,EAAQmtB,GACR,SACK,GAAY,KAARpE,GAAgBgF,EAOpB,CAAA,GACLhF,GAAQnD,IAAe,KAARmD,GAAuB,KAARA,GAAuB,KAARA,GACpC,MAARA,GAAgBzB,GAAU1I,GAC3B,CACA,GAAI0I,GAAU1I,IAAkB,IAAViP,EAAc,OAAOvH,GAC3C,GAAIoH,GAA2B,IAAVG,IAAiBrC,GAAoB5M,IAAqB,OAAbA,EAAIqP,MAAgB,OAEtF,GADAL,EAAUzG,GAAUvI,EAAKiP,GACZ,OAAOD,EAGpB,GAFAC,EAAS,GACT7tB,EAAQotB,GACJM,EAAe,OACnB,SAEY,KAAR3E,EAAagF,GAAc,EACd,KAARhF,IAAagF,GAAc,GACpCF,GAAU9E,MAtB4B,CACtC,GAAc,IAAV8E,EAAc,OAAOvH,GAEzB,GADAsH,EAAUzG,GAAUvI,EAAKiP,GACZ,OAAOD,EAGpB,GAFAC,EAAS,GACT7tB,EAAQgtB,GACJU,GAAiBX,GAAU,OAiB/B,MAEJ,KAAKC,GACH,IAAItG,GAAMxnB,KAAK6pB,GAER,CAAA,GACLA,GAAQnD,IAAe,KAARmD,GAAuB,KAARA,GAAuB,KAARA,GACpC,MAARA,GAAgBzB,GAAU1I,IAC3B8O,EACA,CACA,GAAc,IAAVG,EAAc,CAChB,IAAII,EAAO3F,SAASuF,EAAQ,IAC5B,GAAII,EAAO,MAAQ,OAAO1H,GAC1B3H,EAAIqP,KAAQ3G,GAAU1I,IAAQqP,IAASjD,GAAepM,EAAI2M,QAAW,KAAO0C,EAC5EJ,EAAS,GAEX,GAAIH,EAAe,OACnB1tB,EAAQotB,GACR,SACK,OAAO7G,GAfZsH,GAAU9E,EAgBZ,MAEF,KAAKkE,GAEH,GADArO,EAAI2M,OAAS,OACD,KAARxC,GAAuB,MAARA,EAAc/oB,EAAQktB,OACpC,CAAA,IAAI3L,GAAuB,QAAfA,EAAKgK,OAyBf,CACLvrB,EAAQqtB,GACR,SA1BA,GAAItE,GAAQnD,GACVhH,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrByiB,EAAImF,MAAQxC,EAAKwC,WACZ,GAAY,KAARgF,EACTnK,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrByiB,EAAImF,MAAQ,GACZ/jB,EAAQutB,OACH,CAAA,GAAY,KAARxE,EAMJ,CACA+C,GAA6B1E,EAAWjrB,MAAM2sB,GAAStnB,KAAK,OAC/Dod,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrB6vB,GAAgBpN,IAElB5e,EAAQqtB,GACR,SAZAzO,EAAIQ,KAAOmC,EAAKnC,KAChBR,EAAInd,KAAO8f,EAAK9f,KAAKtF,QACrByiB,EAAImF,MAAQxC,EAAKwC,MACjBnF,EAAIsP,SAAW,GACfluB,EAAQwtB,IAaV,MAEJ,KAAKN,GACH,GAAY,KAARnE,GAAuB,MAARA,EAAc,CAC/B/oB,EAAQmtB,GACR,MAEE5L,GAAuB,QAAfA,EAAKgK,SAAqBO,GAA6B1E,EAAWjrB,MAAM2sB,GAAStnB,KAAK,OAC5FoqB,GAAqBrK,EAAK9f,KAAK,IAAI,GAAOmd,EAAInd,KAAKrC,KAAKmiB,EAAK9f,KAAK,IACjEmd,EAAIQ,KAAOmC,EAAKnC,MAEvBpf,EAAQqtB,GACR,SAEF,KAAKF,GACH,GAAIpE,GAAQnD,IAAe,KAARmD,GAAuB,MAARA,GAAwB,KAARA,GAAuB,KAARA,EAAa,CAC5E,IAAK2E,GAAiB9B,GAAqBiC,GACzC7tB,EAAQqtB,QACH,GAAc,IAAVQ,EAAc,CAEvB,GADAjP,EAAIQ,KAAO,GACPsO,EAAe,OACnB1tB,EAAQotB,OACH,CAEL,GADAQ,EAAUzG,GAAUvI,EAAKiP,GACZ,OAAOD,EAEpB,GADgB,aAAZhP,EAAIQ,OAAqBR,EAAIQ,KAAO,IACpCsO,EAAe,OACnBG,EAAS,GACT7tB,EAAQotB,GACR,SACGS,GAAU9E,EACjB,MAEF,KAAKqE,GACH,GAAI9F,GAAU1I,IAEZ,GADA5e,EAAQqtB,GACI,KAARtE,GAAuB,MAARA,EAAc,cAC5B,GAAK2E,GAAyB,KAAR3E,EAGtB,GAAK2E,GAAyB,KAAR3E,GAGtB,GAAIA,GAAQnD,KACjB5lB,EAAQqtB,GACI,KAARtE,GAAa,cAJjBnK,EAAIsP,SAAW,GACfluB,EAAQwtB,QAJR5O,EAAImF,MAAQ,GACZ/jB,EAAQutB,GAOR,MAEJ,KAAKF,GACH,GACEtE,GAAQnD,IAAe,KAARmD,GACN,MAARA,GAAgBzB,GAAU1I,KACzB8O,IAA0B,KAAR3E,GAAuB,KAARA,GACnC,CAkBA,GA3XW,QADnBoD,GAD0BA,EA4WF0B,GA3WN7oB,gBACqB,SAAZmnB,GAAkC,SAAZA,GAAkC,WAAZA,GA2W7DH,GAAgBpN,GACJ,KAARmK,GAAyB,MAARA,GAAgBzB,GAAU1I,IAC7CA,EAAInd,KAAKrC,KAAK,KAEP8sB,GAAY2B,GACT,KAAR9E,GAAyB,MAARA,GAAgBzB,GAAU1I,IAC7CA,EAAInd,KAAKrC,KAAK,KAGE,QAAdwf,EAAI2M,SAAqB3M,EAAInd,KAAKO,QAAU4pB,GAAqBiC,KAC/DjP,EAAIQ,OAAMR,EAAIQ,KAAO,IACzByO,EAASA,EAAO1W,OAAO,GAAK,KAE9ByH,EAAInd,KAAKrC,KAAKyuB,IAEhBA,EAAS,GACS,QAAdjP,EAAI2M,SAAqBxC,GAAQnD,IAAe,KAARmD,GAAuB,KAARA,GACzD,KAAOnK,EAAInd,KAAKO,OAAS,GAAqB,KAAhB4c,EAAInd,KAAK,IACrCmd,EAAInd,KAAK0iB,QAGD,KAAR4E,GACFnK,EAAImF,MAAQ,GACZ/jB,EAAQutB,IACS,KAARxE,IACTnK,EAAIsP,SAAW,GACfluB,EAAQwtB,SAGVK,GAAUjG,GAAcmB,EAAMgB,IAC9B,MAEJ,KAAKuD,GACS,KAARvE,GACFnK,EAAImF,MAAQ,GACZ/jB,EAAQutB,IACS,KAARxE,GACTnK,EAAIsP,SAAW,GACfluB,EAAQwtB,IACCzE,GAAQnD,KACjBhH,EAAInd,KAAK,IAAMmmB,GAAcmB,EAAMlB,KACnC,MAEJ,KAAK0F,GACEG,GAAyB,KAAR3E,EAGXA,GAAQnD,KACL,KAARmD,GAAezB,GAAU1I,GAAMA,EAAImF,OAAS,MAC1BnF,EAAImF,OAAT,KAARgF,EAA0B,MACjBnB,GAAcmB,EAAMlB,MALtCjJ,EAAIsP,SAAW,GACfluB,EAAQwtB,IAKR,MAEJ,KAAKA,GACCzE,GAAQnD,KAAKhH,EAAIsP,UAAYtG,GAAcmB,EAAMU,KAIzDX,MAMAuF,GAAiB,SAAazP,GAChC,IAII0P,EAAWV,EAJXxkB,EAAOkW,GAAWvmB,KAAMs1B,GAAgB,OACxC9M,EAAOxf,UAAUC,OAAS,EAAID,UAAU,QAAKvF,EAC7C+xB,EAAYrwB,OAAO0gB,GACnB5e,EAAQmL,GAAiB/B,EAAM,CAAEvI,KAAM,QAE3C,QAAarE,IAAT+kB,EACF,GAAIA,aAAgB8M,GAAgBC,EAAYnI,GAAoB5E,QAGlE,GADAqM,EAAUH,GAASa,EAAY,GAAIpwB,OAAOqjB,IAC7B,MAAM9kB,UAAUmxB,GAIjC,GADAA,EAAUH,GAASztB,EAAOuuB,EAAW,KAAMD,GAC9B,MAAM7xB,UAAUmxB,GAC7B,IAAI9O,EAAe9e,EAAM8e,aAAe,IAAII,GACxCsP,EAAoBtI,GAA6BpH,GACrD0P,EAAkBpK,mBAAmBpkB,EAAM+jB,OAC3CyK,EAAkB3J,UAAY,WAC5B7kB,EAAM+jB,MAAQ7lB,OAAO4gB,IAAiB,MAEnCrhB,IACH2L,EAAK6V,KAAOwP,GAAax0B,KAAKmP,GAC9BA,EAAKslB,OAASC,GAAU10B,KAAKmP,GAC7BA,EAAKwlB,SAAWC,GAAY50B,KAAKmP,GACjCA,EAAK+V,SAAW2P,GAAY70B,KAAKmP,GACjCA,EAAKqiB,SAAWsD,GAAY90B,KAAKmP,GACjCA,EAAKgW,KAAO4P,GAAQ/0B,KAAKmP,GACzBA,EAAK6lB,SAAWC,GAAYj1B,KAAKmP,GACjCA,EAAK6kB,KAAOkB,GAAQl1B,KAAKmP,GACzBA,EAAK2V,SAAWqQ,GAAYn1B,KAAKmP,GACjCA,EAAKimB,OAASC,GAAUr1B,KAAKmP,GAC7BA,EAAK0V,aAAeyQ,GAAgBt1B,KAAKmP,GACzCA,EAAKiW,KAAOmQ,GAAQv1B,KAAKmP,KAIzBqmB,GAAepB,GAAeh0B,UAE9Bo0B,GAAe,WACjB,IAAI7P,EAAMuH,GAAoBptB,MAC1BwyB,EAAS3M,EAAI2M,OACbpM,EAAWP,EAAIO,SACfsM,EAAW7M,EAAI6M,SACfrM,EAAOR,EAAIQ,KACX6O,EAAOrP,EAAIqP,KACXxsB,EAAOmd,EAAInd,KACXsiB,EAAQnF,EAAImF,MACZmK,EAAWtP,EAAIsP,SACftS,EAAS2P,EAAS,IAYtB,OAXa,OAATnM,GACFxD,GAAU,KACN4P,GAAoB5M,KACtBhD,GAAUuD,GAAYsM,EAAW,IAAMA,EAAW,IAAM,KAE1D7P,GAAUoN,GAAc5J,GACX,OAAT6O,IAAerS,GAAU,IAAMqS,IAChB,QAAV1C,IAAkB3P,GAAU,MACvCA,GAAUgD,EAAI+M,iBAAmBlqB,EAAK,GAAKA,EAAKO,OAAS,IAAMP,EAAKD,KAAK,KAAO,GAClE,OAAVuiB,IAAgBnI,GAAU,IAAMmI,GACnB,OAAbmK,IAAmBtS,GAAU,IAAMsS,GAChCtS,GAGL+S,GAAY,WACd,IAAI/P,EAAMuH,GAAoBptB,MAC1BwyB,EAAS3M,EAAI2M,OACb0C,EAAOrP,EAAIqP,KACf,GAAc,QAAV1C,EAAkB,IACpB,OAAO,IAAI1M,IAAI0M,EAAO9pB,KAAK,IAAIitB,OAC/B,MAAOzzB,GACP,MAAO,OAET,MAAc,QAAVswB,GAAqBjE,GAAU1I,GAC5B2M,EAAS,MAAQvC,GAAcpK,EAAIQ,OAAkB,OAAT6O,EAAgB,IAAMA,EAAO,IADhC,QAI9CY,GAAc,WAChB,OAAO1I,GAAoBptB,MAAMwyB,OAAS,KAGxCuD,GAAc,WAChB,OAAO3I,GAAoBptB,MAAMomB,UAG/B4P,GAAc,WAChB,OAAO5I,GAAoBptB,MAAM0yB,UAG/BuD,GAAU,WACZ,IAAIpQ,EAAMuH,GAAoBptB,MAC1BqmB,EAAOR,EAAIQ,KACX6O,EAAOrP,EAAIqP,KACf,OAAgB,OAAT7O,EAAgB,GACV,OAAT6O,EAAgBjF,GAAc5J,GAC9B4J,GAAc5J,GAAQ,IAAM6O,GAG9BiB,GAAc,WAChB,IAAI9P,EAAO+G,GAAoBptB,MAAMqmB,KACrC,OAAgB,OAATA,EAAgB,GAAK4J,GAAc5J,IAGxC+P,GAAU,WACZ,IAAIlB,EAAO9H,GAAoBptB,MAAMk1B,KACrC,OAAgB,OAATA,EAAgB,GAAK/vB,OAAO+vB,IAGjCmB,GAAc,WAChB,IAAIxQ,EAAMuH,GAAoBptB,MAC1B0I,EAAOmd,EAAInd,KACf,OAAOmd,EAAI+M,iBAAmBlqB,EAAK,GAAKA,EAAKO,OAAS,IAAMP,EAAKD,KAAK,KAAO,IAG3E8tB,GAAY,WACd,IAAIvL,EAAQoC,GAAoBptB,MAAMgrB,MACtC,OAAOA,EAAQ,IAAMA,EAAQ,IAG3BwL,GAAkB,WACpB,OAAOpJ,GAAoBptB,MAAM+lB,cAG/B0Q,GAAU,WACZ,IAAItB,EAAW/H,GAAoBptB,MAAMm1B,SACzC,OAAOA,EAAW,IAAMA,EAAW,IAGjCwB,GAAqB,SAAUC,EAAQ5iB,GACzC,MAAO,CAAE3S,IAAKu1B,EAAQ5wB,IAAKgO,EAAQhR,cAAc,EAAMJ,YAAY,IAyHrE,GAtHI8B,GACF6I,GAAiBmpB,GAAc,CAG7BxQ,KAAMyQ,GAAmBjB,IAAc,SAAUxP,GAC/C,IAAIL,EAAMuH,GAAoBptB,MAC1Bw1B,EAAYrwB,OAAO+gB,GACnB2O,EAAUH,GAAS7O,EAAK2P,GAC5B,GAAIX,EAAS,MAAMnxB,UAAUmxB,GAC7B1H,GAA6BtH,EAAIE,cAAcsF,mBAAmBxF,EAAImF,UAIxE2K,OAAQgB,GAAmBf,IAG3BC,SAAUc,GAAmBb,IAAa,SAAUD,GAClD,IAAIhQ,EAAMuH,GAAoBptB,MAC9B00B,GAAS7O,EAAK1gB,OAAO0wB,GAAY,IAAKxC,OAIxCjN,SAAUuQ,GAAmBZ,IAAa,SAAU3P,GAClD,IAAIP,EAAMuH,GAAoBptB,MAC1BquB,EAAahH,GAAUliB,OAAOihB,IAClC,IAAIuM,GAA+B9M,GAAnC,CACAA,EAAIO,SAAW,GACf,IAAK,IAAI5b,EAAI,EAAGA,EAAI6jB,EAAWplB,OAAQuB,IACrCqb,EAAIO,UAAYyI,GAAcR,EAAW7jB,GAAI6mB,QAKjDqB,SAAUiE,GAAmBX,IAAa,SAAUtD,GAClD,IAAI7M,EAAMuH,GAAoBptB,MAC1BquB,EAAahH,GAAUliB,OAAOutB,IAClC,IAAIC,GAA+B9M,GAAnC,CACAA,EAAI6M,SAAW,GACf,IAAK,IAAIloB,EAAI,EAAGA,EAAI6jB,EAAWplB,OAAQuB,IACrCqb,EAAI6M,UAAY7D,GAAcR,EAAW7jB,GAAI6mB,QAKjDhL,KAAMsQ,GAAmBV,IAAS,SAAU5P,GAC1C,IAAIR,EAAMuH,GAAoBptB,MAC1B6lB,EAAI+M,kBACR8B,GAAS7O,EAAK1gB,OAAOkhB,GAAO0N,OAI9BmC,SAAUS,GAAmBR,IAAa,SAAUD,GAClD,IAAIrQ,EAAMuH,GAAoBptB,MAC1B6lB,EAAI+M,kBACR8B,GAAS7O,EAAK1gB,OAAO+wB,GAAWlC,OAIlCkB,KAAMyB,GAAmBP,IAAS,SAAUlB,GAC1C,IAAIrP,EAAMuH,GAAoBptB,MAC1B2yB,GAA+B9M,KAEvB,KADZqP,EAAO/vB,OAAO+vB,IACErP,EAAIqP,KAAO,KACtBR,GAAS7O,EAAKqP,EAAMjB,QAI3BjO,SAAU2Q,GAAmBN,IAAa,SAAUrQ,GAClD,IAAIH,EAAMuH,GAAoBptB,MAC1B6lB,EAAI+M,mBACR/M,EAAInd,KAAO,GACXgsB,GAAS7O,EAAKG,EAAW,GAAIqO,QAI/BiC,OAAQK,GAAmBJ,IAAW,SAAUD,GAC9C,IAAIzQ,EAAMuH,GAAoBptB,MAEhB,KADds2B,EAASnxB,OAAOmxB,IAEdzQ,EAAImF,MAAQ,MAER,KAAOsL,EAAOlY,OAAO,KAAIkY,EAASA,EAAOlzB,MAAM,IACnDyiB,EAAImF,MAAQ,GACZ0J,GAAS7O,EAAKyQ,EAAQ9B,KAExBrH,GAA6BtH,EAAIE,cAAcsF,mBAAmBxF,EAAImF,UAIxEjF,aAAc4Q,GAAmBH,IAGjClQ,KAAMqQ,GAAmBF,IAAS,SAAUnQ,GAC1C,IAAIT,EAAMuH,GAAoBptB,MAElB,KADZsmB,EAAOnhB,OAAOmhB,KAKV,KAAOA,EAAKlI,OAAO,KAAIkI,EAAOA,EAAKljB,MAAM,IAC7CyiB,EAAIsP,SAAW,GACfT,GAAS7O,EAAKS,EAAMmO,KALlB5O,EAAIsP,SAAW,UAYvBptB,GAAS2uB,GAAc,UAAU,WAC/B,OAAOhB,GAAax0B,KAAKlB,QACxB,CAAE4C,YAAY,IAIjBmF,GAAS2uB,GAAc,YAAY,WACjC,OAAOhB,GAAax0B,KAAKlB,QACxB,CAAE4C,YAAY,IAEbqqB,GAAW,CACb,IAAI4J,GAAwB5J,GAAU6J,gBAClCC,GAAwB9J,GAAU+J,gBAIlCH,IAAuB9uB,GAASutB,GAAgB,mBAAmB,SAAyB2B,GAC9F,OAAOJ,GAAsBrmB,MAAMyc,GAAWjkB,cAK5C+tB,IAAuBhvB,GAASutB,GAAgB,mBAAmB,SAAyBzP,GAC9F,OAAOkR,GAAsBvmB,MAAMyc,GAAWjkB,cxH8+FhD,SAASkuB,GAAQC,GAaf,OATED,GADoB,mBAAXrqB,QAAoD,iBAApBA,OAAOG,SACtC,SAAUmqB,GAClB,cAAcA,GAGN,SAAUA,GAClB,OAAOA,GAAyB,mBAAXtqB,QAAyBsqB,EAAItmB,cAAgBhE,QAAUsqB,IAAQtqB,OAAOvL,UAAY,gBAAkB61B,IAI9GA,GAGjB,SAASC,GAAgBC,EAAUvc,GACjC,KAAMuc,aAAoBvc,GACxB,MAAM,IAAIpX,UAAU,qCAIxB,SAAS4zB,GAAkBjsB,EAAQksB,GACjC,IAAK,IAAI/sB,EAAI,EAAGA,EAAI+sB,EAAMtuB,OAAQuB,IAAK,CACrC,IAAI7H,EAAa40B,EAAM/sB,GACvB7H,EAAWC,WAAaD,EAAWC,aAAc,EACjDD,EAAWK,cAAe,EACtB,UAAWL,IAAYA,EAAWM,UAAW,GACjD9B,OAAOC,eAAeiK,EAAQ1I,EAAW0B,IAAK1B,IAIlD,SAAS60B,GAAa1c,EAAa2c,EAAYC,GAG7C,OAFID,GAAYH,GAAkBxc,EAAYxZ,UAAWm2B,GACrDC,GAAaJ,GAAkBxc,EAAa4c,GACzC5c,EAGT,SAAS6c,GAAgBR,EAAK9yB,EAAKtB,GAYjC,OAXIsB,KAAO8yB,EACTh2B,OAAOC,eAAe+1B,EAAK9yB,EAAK,CAC9BtB,MAAOA,EACPH,YAAY,EACZI,cAAc,EACdC,UAAU,IAGZk0B,EAAI9yB,GAAOtB,EAGNo0B,EAGT,SAASS,GAAUpyB,EAAQqyB,GACzB,IAAIhxB,EAAO1F,OAAO0F,KAAKrB,GAEvB,GAAIrE,OAAO6J,sBAAuB,CAChC,IAAIoW,EAAUjgB,OAAO6J,sBAAsBxF,GACvCqyB,IAAgBzW,EAAUA,EAAQzP,QAAO,SAAUyC,GACrD,OAAOjT,OAAOmB,yBAAyBkD,EAAQ4O,GAAKxR,eAEtDiE,EAAKR,KAAKmK,MAAM3J,EAAMua,GAGxB,OAAOva,EAGT,SAASixB,GAAezsB,GACtB,IAAK,IAAIb,EAAI,EAAGA,EAAIxB,UAAUC,OAAQuB,IAAK,CACzC,IAAIhC,EAAyB,MAAhBQ,UAAUwB,GAAaxB,UAAUwB,GAAK,GAE/CA,EAAI,EACNotB,GAAUz2B,OAAOqH,IAAS,GAAMiJ,SAAQ,SAAUpN,GAChDszB,GAAgBtsB,EAAQhH,EAAKmE,EAAOnE,OAE7BlD,OAAO42B,0BAChB52B,OAAOoM,iBAAiBlC,EAAQlK,OAAO42B,0BAA0BvvB,IAEjEovB,GAAUz2B,OAAOqH,IAASiJ,SAAQ,SAAUpN,GAC1ClD,OAAOC,eAAeiK,EAAQhH,EAAKlD,OAAOmB,yBAAyBkG,EAAQnE,OAKjF,OAAOgH,EAkBT,SAAS2sB,GAAyBxvB,EAAQyvB,GACxC,GAAc,MAAVzvB,EAAgB,MAAO,GAE3B,IAEInE,EAAKmG,EAFLa,EAlBN,SAAuC7C,EAAQyvB,GAC7C,GAAc,MAAVzvB,EAAgB,MAAO,GAC3B,IAEInE,EAAKmG,EAFLa,EAAS,GACT6sB,EAAa/2B,OAAO0F,KAAK2B,GAG7B,IAAKgC,EAAI,EAAGA,EAAI0tB,EAAWjvB,OAAQuB,IACjCnG,EAAM6zB,EAAW1tB,GACbytB,EAAS7tB,QAAQ/F,IAAQ,IAC7BgH,EAAOhH,GAAOmE,EAAOnE,IAGvB,OAAOgH,EAMM8sB,CAA8B3vB,EAAQyvB,GAInD,GAAI92B,OAAO6J,sBAAuB,CAChC,IAAIotB,EAAmBj3B,OAAO6J,sBAAsBxC,GAEpD,IAAKgC,EAAI,EAAGA,EAAI4tB,EAAiBnvB,OAAQuB,IACvCnG,EAAM+zB,EAAiB5tB,GACnBytB,EAAS7tB,QAAQ/F,IAAQ,GACxBlD,OAAOG,UAAUe,qBAAqBnB,KAAKsH,EAAQnE,KACxDgH,EAAOhH,GAAOmE,EAAOnE,IAIzB,OAAOgH,EAGT,SAASgtB,GAAeC,EAAK9tB,GAC3B,OAWF,SAAyB8tB,GACvB,GAAIprB,MAAMD,QAAQqrB,GAAM,OAAOA,EAZxBC,CAAgBD,IAmBzB,SAA+BA,EAAK9tB,GAClC,GAAsB,oBAAXqC,UAA4BA,OAAOG,YAAY7L,OAAOm3B,IAAO,OACxE,IAAIE,EAAO,GACPC,GAAK,EACLC,GAAK,EACLC,OAAKl1B,EAET,IACE,IAAK,IAAiCm1B,EAA7BC,EAAKP,EAAIzrB,OAAOG,cAAmByrB,GAAMG,EAAKC,EAAGvhB,QAAQgC,QAChEkf,EAAKnyB,KAAKuyB,EAAG71B,QAETyH,GAAKguB,EAAKvvB,SAAWuB,GAH8CiuB,GAAK,IAK9E,MAAOK,GACPJ,GAAK,EACLC,EAAKG,EACL,QACA,IACOL,GAAsB,MAAhBI,EAAW,QAAWA,EAAW,SAC5C,QACA,GAAIH,EAAI,MAAMC,GAIlB,OAAOH,EA3CwBO,CAAsBT,EAAK9tB,IAAMwuB,GAA4BV,EAAK9tB,IAmEnG,WACE,MAAM,IAAI9G,UAAU,6IApEmFu1B,GAGzG,SAASC,GAAmBZ,GAC1B,OAGF,SAA4BA,GAC1B,GAAIprB,MAAMD,QAAQqrB,GAAM,OAAOa,GAAkBb,GAJ1Cc,CAAmBd,IAW5B,SAA0Be,GACxB,GAAsB,oBAAXxsB,QAA0BA,OAAOG,YAAY7L,OAAOk4B,GAAO,OAAOnsB,MAAMosB,KAAKD,GAZtDE,CAAiBjB,IAAQU,GAA4BV,IA2DzF,WACE,MAAM,IAAI50B,UAAU,wIA5D2E81B,GA0CjG,SAASR,GAA4BS,EAAGC,GACtC,GAAKD,EAAL,CACA,GAAiB,iBAANA,EAAgB,OAAON,GAAkBM,EAAGC,GACvD,IAAI3e,EAAI5Z,OAAOG,UAAU4B,SAAShC,KAAKu4B,GAAGr2B,MAAM,GAAI,GAEpD,MADU,WAAN2X,GAAkB0e,EAAE5oB,cAAakK,EAAI0e,EAAE5oB,YAAYlB,MAC7C,QAANoL,GAAqB,QAANA,EAAoB7N,MAAMosB,KAAKG,GACxC,cAAN1e,GAAqB,2CAA2C5U,KAAK4U,GAAWoe,GAAkBM,EAAGC,QAAzG,GAGF,SAASP,GAAkBb,EAAKqB,IACnB,MAAPA,GAAeA,EAAMrB,EAAIrvB,UAAQ0wB,EAAMrB,EAAIrvB,QAE/C,IAAK,IAAIuB,EAAI,EAAGovB,EAAO,IAAI1sB,MAAMysB,GAAMnvB,EAAImvB,EAAKnvB,IAAKovB,EAAKpvB,GAAK8tB,EAAI9tB,GAEnE,OAAOovB,EwHlqGX3pB,GAAeqlB,GAAgB,OAE/BrhB,GAAE,CAAE1U,QAAQ,EAAMmN,QAAS+f,GAAgB9f,MAAOjI,GAAe,CAC/DohB,IAAKwP,KC7+BP,SAAU/1B,GAOR,IASIs6B,EAT6B,WAC/B,IACE,QAAShtB,OAAOG,SAChB,MAAO9K,GACP,OAAO,GAKa43B,GAEpBC,EAAiB,SAASC,GAC5B,IAAIhtB,EAAW,CACbsK,KAAM,WACJ,IAAIvU,EAAQi3B,EAAM5O,QAClB,MAAO,CAAE9R,UAAgB,IAAVvW,EAAkBA,MAAOA,KAU5C,OANI82B,IACF7sB,EAASH,OAAOG,UAAY,WAC1B,OAAOA,IAIJA,GAOLitB,EAAiB,SAASl3B,GAC5B,OAAO+nB,mBAAmB/nB,GAAOiJ,QAAQ,OAAQ,MAG/CkuB,EAAmB,SAASn3B,GAC9B,OAAOsnB,mBAAmBllB,OAAOpC,GAAOiJ,QAAQ,MAAO,QA4HnB,WACpC,IACE,IAAIma,EAAkB5mB,EAAO4mB,gBAE7B,MAC8C,QAA3C,IAAIA,EAAgB,QAAQjjB,YACa,mBAAlCijB,EAAgB7kB,UAAU0E,KACY,mBAAtCmgB,EAAgB7kB,UAAU0X,QAEpC,MAAOxY,GACP,OAAO,IAIN25B,IAvIyB,WAE5B,IAAIhU,EAAkB,SAAlBA,EAA2BiU,GAC7Bj5B,OAAOC,eAAepB,KAAM,WAAY,CAAEiD,UAAU,EAAMF,MAAO,KACjE,IAAIs3B,EAAkBnD,GAAUkD,GAEhC,GAA2B,cAAvBC,QAEG,GAA2B,WAAvBA,EACY,KAAjBD,GACFp6B,KAAKs6B,YAAYF,QAEd,GAAIA,aAAwBjU,EAAiB,CAClD,IAAIoU,EAAQv6B,KACZo6B,EAAa3oB,SAAQ,SAAS1O,EAAO4M,GACnC4qB,EAAMtO,OAAOtc,EAAM5M,UAEhB,CAAA,GAAsB,OAAjBq3B,GAAkD,WAAvBC,EAkBrC,MAAM,IAAI32B,UAAU,gDAjBpB,GAAqD,mBAAjDvC,OAAOG,UAAU4B,SAAShC,KAAKk5B,GACjC,IAAK,IAAI5vB,EAAI,EAAGA,EAAI4vB,EAAanxB,OAAQuB,IAAK,CAC5C,IAAI0gB,EAAQkP,EAAa5vB,GACzB,GAA+C,mBAA1CrJ,OAAOG,UAAU4B,SAAShC,KAAKgqB,IAAkD,IAAjBA,EAAMjiB,OAGzE,MAAM,IAAIvF,UAAU,4CAA8C8G,EAAI,+BAFtExK,KAAKisB,OAAOf,EAAM,GAAIA,EAAM,SAMhC,IAAK,IAAI7mB,KAAO+1B,EACVA,EAAaj2B,eAAeE,IAC9BrE,KAAKisB,OAAO5nB,EAAK+1B,EAAa/1B,MASpC2R,EAAQmQ,EAAgB7kB,UAE5B0U,EAAMiW,OAAS,SAAStc,EAAM5M,GACxB4M,KAAQ3P,KAAKw6B,SACfx6B,KAAKw6B,SAAS7qB,GAAMtJ,KAAKlB,OAAOpC,IAEhC/C,KAAKw6B,SAAS7qB,GAAQ,CAACxK,OAAOpC,KAIlCiT,EAAMkW,OAAS,SAASvc,UACf3P,KAAKw6B,SAAS7qB,IAGvBqG,EAAM3U,IAAM,SAASsO,GACnB,OAAQA,KAAQ3P,KAAKw6B,SAAYx6B,KAAKw6B,SAAS7qB,GAAM,GAAK,MAG5DqG,EAAMoW,OAAS,SAASzc,GACtB,OAAQA,KAAQ3P,KAAKw6B,SAAYx6B,KAAKw6B,SAAS7qB,GAAMvM,MAAM,GAAK,IAGlE4S,EAAM5R,IAAM,SAASuL,GACnB,OAAQA,KAAQ3P,KAAKw6B,UAGvBxkB,EAAMhQ,IAAM,SAAS2J,EAAM5M,GACzB/C,KAAKw6B,SAAS7qB,GAAQ,CAACxK,OAAOpC,KAGhCiT,EAAMvE,QAAU,SAAS+a,EAAUiO,GACjC,IAAIzhB,EACJ,IAAK,IAAIrJ,KAAQ3P,KAAKw6B,SACpB,GAAIx6B,KAAKw6B,SAASr2B,eAAewL,GAAO,CACtCqJ,EAAUhZ,KAAKw6B,SAAS7qB,GACxB,IAAK,IAAInF,EAAI,EAAGA,EAAIwO,EAAQ/P,OAAQuB,IAClCgiB,EAAStrB,KAAKu5B,EAASzhB,EAAQxO,GAAImF,EAAM3P,QAMjDgW,EAAMnP,KAAO,WACX,IAAImzB,EAAQ,GAIZ,OAHAh6B,KAAKyR,SAAQ,SAAS1O,EAAO4M,GAC3BqqB,EAAM3zB,KAAKsJ,MAENoqB,EAAeC,IAGxBhkB,EAAMiD,OAAS,WACb,IAAI+gB,EAAQ,GAIZ,OAHAh6B,KAAKyR,SAAQ,SAAS1O,GACpBi3B,EAAM3zB,KAAKtD,MAENg3B,EAAeC,IAGxBhkB,EAAMgD,QAAU,WACd,IAAIghB,EAAQ,GAIZ,OAHAh6B,KAAKyR,SAAQ,SAAS1O,EAAO4M,GAC3BqqB,EAAM3zB,KAAK,CAACsJ,EAAM5M,OAEbg3B,EAAeC,IAGpBH,IACF7jB,EAAMnJ,OAAOG,UAAYgJ,EAAMgD,SAGjChD,EAAM9S,SAAW,WACf,IAAIw3B,EAAc,GAIlB,OAHA16B,KAAKyR,SAAQ,SAAS1O,EAAO4M,GAC3B+qB,EAAYr0B,KAAK4zB,EAAetqB,GAAQ,IAAMsqB,EAAel3B,OAExD23B,EAAYjyB,KAAK,MAI1BlJ,EAAO4mB,gBAAkBA,EAkBzBwU,GAGF,IAAI3kB,EAAQzW,EAAO4mB,gBAAgB7kB,UAET,mBAAf0U,EAAMiQ,OACfjQ,EAAMiQ,KAAO,WACX,IAAIsU,EAAQv6B,KACRg6B,EAAQ,GACZh6B,KAAKyR,SAAQ,SAAS1O,EAAO4M,GAC3BqqB,EAAM3zB,KAAK,CAACsJ,EAAM5M,IACbw3B,EAAMC,UACTD,EAAMrO,OAAOvc,MAGjBqqB,EAAM/T,MAAK,SAASthB,EAAG2L,GACrB,OAAI3L,EAAE,GAAK2L,EAAE,IACH,EACC3L,EAAE,GAAK2L,EAAE,GACX,EAEA,KAGPiqB,EAAMC,WACRD,EAAMC,SAAW,IAEnB,IAAK,IAAIhwB,EAAI,EAAGA,EAAIwvB,EAAM/wB,OAAQuB,IAChCxK,KAAKisB,OAAO+N,EAAMxvB,GAAG,GAAIwvB,EAAMxvB,GAAG,MAKP,mBAAtBwL,EAAMskB,aACfn5B,OAAOC,eAAe4U,EAAO,cAAe,CAC1CpT,YAAY,EACZI,cAAc,EACdC,UAAU,EACVF,MAAO,SAASq3B,GACd,GAAIp6B,KAAKw6B,SACPx6B,KAAKw6B,SAAW,OACX,CACL,IAAI3zB,EAAO,GACX7G,KAAKyR,SAAQ,SAAS1O,EAAO4M,GAC3B9I,EAAKR,KAAKsJ,MAEZ,IAAK,IAAInF,EAAI,EAAGA,EAAI3D,EAAKoC,OAAQuB,IAC/BxK,KAAKksB,OAAOrlB,EAAK2D,IAKrB,IACIygB,EADAE,GADJiP,EAAeA,EAAapuB,QAAQ,MAAO,KACb3I,MAAM,KAEpC,IAASmH,EAAI,EAAGA,EAAI2gB,EAAWliB,OAAQuB,IACrCygB,EAAYE,EAAW3gB,GAAGnH,MAAM,KAChCrD,KAAKisB,OACHiO,EAAiBjP,EAAU,IAC1BA,EAAUhiB,OAAS,EAAKixB,EAAiBjP,EAAU,IAAM,OAjPtE,MA2PqB,IAAX1rB,EAA0BA,EACV,oBAAXU,OAA0BA,OACjB,oBAATH,KAAwBA,KAAOE,GAG9C,SAAUT,GAuNR,GAhN4B,WAC1B,IACE,IAAIq7B,EAAI,IAAIr7B,EAAOumB,IAAI,IAAK,YAE5B,OADA8U,EAAE5U,SAAW,MACM,mBAAX4U,EAAE1U,MAA8B0U,EAAE7U,aAC1C,MAAOvlB,GACP,OAAO,GAsMNq6B,IAjMa,WAChB,IAAIC,EAAOv7B,EAAOumB,IAEdA,EAAM,SAASD,EAAK2C,GACH,iBAAR3C,IAAkBA,EAAM1gB,OAAO0gB,IACtC2C,GAAwB,iBAATA,IAAmBA,EAAOrjB,OAAOqjB,IAGpD,IAAoBuS,EAAhBC,EAAMl6B,SACV,GAAI0nB,SAA6B,IAApBjpB,EAAO07B,UAAuBzS,IAASjpB,EAAO07B,SAAS/U,MAAO,CACzEsC,EAAOA,EAAKvc,eAEZ8uB,GADAC,EAAMl6B,SAASo6B,eAAeC,mBAAmB,KAC/B52B,cAAc,SACpB2hB,KAAOsC,EACnBwS,EAAII,KAAKzsB,YAAYosB,GACrB,IACE,GAAuC,IAAnCA,EAAY7U,KAAK9b,QAAQoe,GAAa,MAAM,IAAIjoB,MAAMw6B,EAAY7U,MACtE,MAAO4S,GACP,MAAM,IAAIv4B,MAAM,0BAA4BioB,EAAO,WAAasQ,IAIpE,IAAIuC,EAAgBL,EAAIz2B,cAAc,KACtC82B,EAAcnV,KAAOL,EACjBkV,IACFC,EAAIrO,KAAKhe,YAAY0sB,GACrBA,EAAcnV,KAAOmV,EAAcnV,MAGrC,IAAIoV,EAAeN,EAAIz2B,cAAc,SAIrC,GAHA+2B,EAAaxzB,KAAO,MACpBwzB,EAAav4B,MAAQ8iB,EAEU,MAA3BwV,EAAcxF,WAAqB,IAAI1vB,KAAKk1B,EAAcnV,QAAWoV,EAAaC,kBAAoB/S,EACxG,MAAM,IAAI9kB,UAAU,eAGtBvC,OAAOC,eAAepB,KAAM,iBAAkB,CAC5C+C,MAAOs4B,IAKT,IAAItV,EAAe,IAAIxmB,EAAO4mB,gBAAgBnmB,KAAKs2B,QAC/CkF,GAAqB,EACrBC,GAA2B,EAC3BlB,EAAQv6B,KACZ,CAAC,SAAU,SAAU,OAAOyR,SAAQ,SAASiqB,GAC3C,IAAI3yB,EAASgd,EAAa2V,GAC1B3V,EAAa2V,GAAc,WACzB3yB,EAAOyH,MAAMuV,EAAc/c,WACvBwyB,IACFC,GAA2B,EAC3BlB,EAAMjE,OAASvQ,EAAa7iB,WAC5Bu4B,GAA2B,OAKjCt6B,OAAOC,eAAepB,KAAM,eAAgB,CAC1C+C,MAAOgjB,EACPnjB,YAAY,IAGd,IAAI0zB,OAAS,EACbn1B,OAAOC,eAAepB,KAAM,sBAAuB,CACjD4C,YAAY,EACZI,cAAc,EACdC,UAAU,EACVF,MAAO,WACD/C,KAAKs2B,SAAWA,IAClBA,EAASt2B,KAAKs2B,OACVmF,IACFD,GAAqB,EACrBx7B,KAAK+lB,aAAauU,YAAYt6B,KAAKs2B,QACnCkF,GAAqB,QAO3BxlB,EAAQ8P,EAAIxkB,UAchB,CAAC,OAAQ,OAAQ,WAAY,OAAQ,YAClCmQ,SAAQ,SAASkqB,IAba,SAASA,GACxCx6B,OAAOC,eAAe4U,EAAO2lB,EAAe,CAC1Ct6B,IAAK,WACH,OAAOrB,KAAK47B,eAAeD,IAE7B31B,IAAK,SAASjD,GACZ/C,KAAK47B,eAAeD,GAAiB54B,GAEvCH,YAAY,IAMZi5B,CAA2BF,MAG/Bx6B,OAAOC,eAAe4U,EAAO,SAAU,CACrC3U,IAAK,WACH,OAAOrB,KAAK47B,eAAL,QAET51B,IAAK,SAASjD,GACZ/C,KAAK47B,eAAL,OAAgC74B,EAChC/C,KAAK87B,uBAEPl5B,YAAY,IAGdzB,OAAOoM,iBAAiByI,EAAO,CAE7B9S,SAAY,CACV7B,IAAK,WACH,IAAIk5B,EAAQv6B,KACZ,OAAO,WACL,OAAOu6B,EAAMrU,QAKnBA,KAAQ,CACN7kB,IAAK,WACH,OAAOrB,KAAK47B,eAAe1V,KAAKla,QAAQ,MAAO,KAEjDhG,IAAK,SAASjD,GACZ/C,KAAK47B,eAAe1V,KAAOnjB,EAC3B/C,KAAK87B,uBAEPl5B,YAAY,GAGdojB,SAAY,CACV3kB,IAAK,WACH,OAAOrB,KAAK47B,eAAe5V,SAASha,QAAQ,SAAU,MAExDhG,IAAK,SAASjD,GACZ/C,KAAK47B,eAAe5V,SAAWjjB,GAEjCH,YAAY,GAGd+yB,OAAU,CACRt0B,IAAK,WAEH,IAAI06B,EAAe,CAAEC,QAAS,GAAIC,SAAU,IAAKC,OAAQ,IAAKl8B,KAAK47B,eAAe/F,UAI9EsG,EAAkBn8B,KAAK47B,eAAe1G,MAAQ6G,GACnB,KAA7B/7B,KAAK47B,eAAe1G,KAEtB,OAAOl1B,KAAK47B,eAAe/F,SACzB,KACA71B,KAAK47B,eAAe1F,UACnBiG,EAAmB,IAAMn8B,KAAK47B,eAAe1G,KAAQ,KAE1DtyB,YAAY,GAGd8vB,SAAY,CACVrxB,IAAK,WACH,MAAO,IAET2E,IAAK,SAASjD,KAEdH,YAAY,GAGdwjB,SAAY,CACV/kB,IAAK,WACH,MAAO,IAET2E,IAAK,SAASjD,KAEdH,YAAY,KAIhBkjB,EAAIgR,gBAAkB,SAASG,GAC7B,OAAO6D,EAAKhE,gBAAgBtmB,MAAMsqB,EAAM9xB,YAG1C8c,EAAIkR,gBAAkB,SAASnR,GAC7B,OAAOiV,EAAK9D,gBAAgBxmB,MAAMsqB,EAAM9xB,YAG1CzJ,EAAOumB,IAAMA,EAKbsW,QAGuB,IAApB78B,EAAO07B,YAA0B,WAAY17B,EAAO07B,UAAW,CAClE,IAAIrF,EAAY,WACd,OAAOr2B,EAAO07B,SAASpF,SAAW,KAAOt2B,EAAO07B,SAAS/E,UAAY32B,EAAO07B,SAAS/F,KAAQ,IAAM31B,EAAO07B,SAAS/F,KAAQ,KAG7H,IACE/zB,OAAOC,eAAe7B,EAAO07B,SAAU,SAAU,CAC/C55B,IAAKu0B,EACLhzB,YAAY,IAEd,MAAOpC,GACP67B,aAAY,WACV98B,EAAO07B,SAAStF,OAASC,MACxB,OApOT,MAyOqB,IAAXr2B,EAA0BA,EACV,oBAAXU,OAA0BA,OACjB,oBAATH,KAAwBA,KAAOE,GC9d9C,IAAIs8B,GAAuB5sB,GAAgB,sBACvC6sB,GAAmB,iBACnBC,GAAiC,iCAKjCC,GAA+BpiB,IAAc,KAAOrY,GAAM,WAC5D,IAAIsY,EAAQ,GAEZ,OADAA,EAAMgiB,KAAwB,EACvBhiB,EAAM3P,SAAS,KAAO2P,KAG3BoiB,GAAkBtiB,GAA6B,UAE/CuiB,GAAqB,SAAU73B,GACjC,IAAKjB,EAASiB,GAAI,OAAO,EACzB,IAAI83B,EAAa93B,EAAEw3B,IACnB,YAAsB74B,IAAfm5B,IAA6BA,EAAa3vB,GAAQnI,IAQ3DmP,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QALpB+vB,KAAiCC,IAKK,CAClD/xB,OAAQ,SAAgBwC,GACtB,IAGI3C,EAAGwQ,EAAG/R,EAAQ0wB,EAAKkD,EAHnB/3B,EAAIsI,GAASpN,MACbojB,EAAI1S,GAAmB5L,EAAG,GAC1BiW,EAAI,EAER,IAAKvQ,GAAK,EAAGvB,EAASD,UAAUC,OAAQuB,EAAIvB,EAAQuB,IAElD,GAAImyB,GADJE,GAAW,IAAPryB,EAAW1F,EAAIkE,UAAUwB,IACF,CAEzB,GAAIuQ,GADJ4e,EAAMnwB,GAASqzB,EAAE5zB,SACHszB,GAAkB,MAAM74B,UAAU84B,IAChD,IAAKxhB,EAAI,EAAGA,EAAI2e,EAAK3e,IAAKD,IAASC,KAAK6hB,GAAGjjB,GAAewJ,EAAGrI,EAAG8hB,EAAE7hB,QAC7D,CACL,GAAID,GAAKwhB,GAAkB,MAAM74B,UAAU84B,IAC3C5iB,GAAewJ,EAAGrI,IAAK8hB,GAI3B,OADAzZ,EAAEna,OAAS8R,EACJqI,KCvDX,IAAI0Z,GAAUzyB,GAAwCsH,OAIlD8I,GAAsBL,GAA6B,UAEnDtE,GAAiBL,GAAwB,UAK7CxB,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QAAS+N,KAAwB3E,IAAkB,CACnFnE,OAAQ,SAAgBP,GACtB,OAAO0rB,GAAQ98B,KAAMoR,EAAYpI,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MCb3E,IAAIs5B,GAAQ1yB,GAAwCyH,KAIhDkrB,GAAO,OACPC,IAAc,EAEdnnB,GAAiBL,GAAwBunB,IAGzCA,KAAQ,IAAI9vB,MAAM,GAAO,MAAE,WAAc+vB,IAAc,KAI3DhpB,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,OAAQuwB,KAAgBnnB,IAAkB,CAC1EhE,KAAM,SAAcV,GAClB,OAAO2rB,GAAM/8B,KAAMoR,EAAYpI,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MAKzEiT,GAAiBsmB,ICrBjB,IAAIhmB,GAAWtH,GAAgB,YAC3BwtB,IAAe,EAEnB,IACE,IAAIC,GAAS,EACTC,GAAqB,CACvB9lB,KAAM,WACJ,MAAO,CAAEgC,OAAQ6jB,OAEnBE,OAAU,WACRH,IAAe,IAGnBE,GAAmBpmB,IAAY,WAC7B,OAAOhX,MAGTkN,MAAMosB,KAAK8D,IAAoB,WAAc,MAAM,KACnD,MAAOl7B,IAET,IAAAo7B,GAAiB,SAAUr7B,EAAMs7B,GAC/B,IAAKA,IAAiBL,GAAc,OAAO,EAC3C,IAAIM,GAAoB,EACxB,IACE,IAAIh4B,EAAS,GACbA,EAAOwR,IAAY,WACjB,MAAO,CACLM,KAAM,WACJ,MAAO,CAAEgC,KAAMkkB,GAAoB,MAIzCv7B,EAAKuD,GACL,MAAOtD,IACT,OAAOs7B,GChCLC,IAAuBH,IAA4B,SAAUI,GAC/DxwB,MAAMosB,KAAKoE,MAKbzpB,GAAE,CAAE5I,OAAQ,QAASoB,MAAM,EAAMC,OAAQ+wB,IAAuB,CAC9DnE,KAAMA,KCTR,IAAIqE,GAAYtzB,GAAuCF,SAInD2L,GAAiBL,GAAwB,UAAW,CAAEC,WAAW,EAAMjT,EAAG,IAI9EwR,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QAASoJ,IAAkB,CAC3D3L,SAAU,SAAkBH,GAC1B,OAAO2zB,GAAU39B,KAAMgK,EAAIhB,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MAKrEiT,GAAiB,YCfjB,IAAIknB,GAAOvzB,GAAwCqH,IAI/C+I,GAAsBL,GAA6B,OAEnDtE,GAAiBL,GAAwB,OAK7CxB,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QAAS+N,KAAwB3E,IAAkB,CACnFpE,IAAK,SAAaN,GAChB,OAAOwsB,GAAK59B,KAAMoR,EAAYpI,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MCXxE,IAAAo6B,GAAiB,SAAU9zB,EAAO+zB,EAAOC,GACvC,IAAIC,EAAWC,EAUf,OAPExmB,IAE0C,mBAAlCumB,EAAYF,EAAMjtB,cAC1BmtB,IAAcD,GACdl6B,EAASo6B,EAAqBD,EAAU18B,YACxC28B,IAAuBF,EAAQz8B,WAC/BmW,GAAe1N,EAAOk0B,GACjBl0B,GCbTm0B,GAAiB,gDCCbC,GAAa,IAAMD,GAAc,IACjCE,GAAQpiB,OAAO,IAAMmiB,GAAaA,GAAa,KAC/CE,GAAQriB,OAAOmiB,GAAaA,GAAa,MAGzCt0B,GAAe,SAAUhC,GAC3B,OAAO,SAAUkC,GACf,IAAIgC,EAAS5G,OAAO3B,EAAuBuG,IAG3C,OAFW,EAAPlC,IAAUkE,EAASA,EAAOC,QAAQoyB,GAAO,KAClC,EAAPv2B,IAAUkE,EAASA,EAAOC,QAAQqyB,GAAO,KACtCtyB,IAIXuyB,GAAiB,CAGf1jB,MAAO/Q,GAAa,GAGpBgR,IAAKhR,GAAa,GAGlB00B,KAAM10B,GAAa,ICfjBgB,GAAsBR,GAAsD7H,EAC5EF,GAA2B0qB,EAA2DxqB,EACtFpB,GAAiBo9B,EAA+Ch8B,EAChE+7B,GAAOE,GAAoCF,KAE3CG,GAAS,SACTC,GAAep/B,EAAa,OAC5Bq/B,GAAkBD,GAAar9B,UAG/Bu9B,GAAiBt7B,EAAQ0L,GAAO2vB,MAAqBF,GAIrDI,GAAW,SAAUz1B,GACvB,IACIyU,EAAOkV,EAAO9D,EAAO6P,EAASC,EAAQ/1B,EAAQU,EAAOqoB,EADrDpwB,EAAKkC,EAAYuF,GAAU,GAE/B,GAAiB,iBAANzH,GAAkBA,EAAGqH,OAAS,EAGvC,GAAc,MADd6U,GADAlc,EAAK28B,GAAK38B,IACCuc,WAAW,KACQ,KAAVL,GAElB,GAAc,MADdkV,EAAQpxB,EAAGuc,WAAW,KACQ,MAAV6U,EAAe,OAAOiM,SACrC,GAAc,KAAVnhB,EAAc,CACvB,OAAQlc,EAAGuc,WAAW,IACpB,KAAK,GAAI,KAAK,GAAI+Q,EAAQ,EAAG6P,EAAU,GAAI,MAC3C,KAAK,GAAI,KAAK,IAAK7P,EAAQ,EAAG6P,EAAU,GAAI,MAC5C,QAAS,OAAQn9B,EAInB,IADAqH,GADA+1B,EAASp9B,EAAGwB,MAAM,IACF6F,OACXU,EAAQ,EAAGA,EAAQV,EAAQU,IAI9B,IAHAqoB,EAAOgN,EAAO7gB,WAAWxU,IAGd,IAAMqoB,EAAO+M,EAAS,OAAOE,IACxC,OAAO1P,SAASyP,EAAQ9P,GAE5B,OAAQttB,GAKZ,GAAI4J,GAASkzB,IAASC,GAAa,UAAYA,GAAa,QAAUA,GAAa,SAAU,CAS3F,IARA,IAcqBt6B,GAdjB66B,GAAgB,SAAgBn8B,GAClC,IAAInB,EAAKoH,UAAUC,OAAS,EAAI,EAAIlG,EAChC+6B,EAAQ99B,KACZ,OAAO89B,aAAiBoB,KAElBL,GAAiB78B,GAAM,WAAc48B,GAAgB16B,QAAQhD,KAAK48B,MAAav6B,EAAQu6B,IAAUY,IACjGb,GAAkB,IAAIc,GAAaG,GAASl9B,IAAMk8B,EAAOoB,IAAiBJ,GAASl9B,IAElFiF,GAAOnC,EAAcmG,GAAoB8zB,IAAgB,6KAMhEt7B,MAAM,KAAMyd,GAAI,EAAQja,GAAKoC,OAAS6X,GAAGA,KACrC1c,EAAIu6B,GAAct6B,GAAMwC,GAAKia,OAAQ1c,EAAI86B,GAAe76B,KAC1DjD,GAAe89B,GAAe76B,GAAK/B,GAAyBq8B,GAAct6B,KAG9E66B,GAAc59B,UAAYs9B,GAC1BA,GAAgB/tB,YAAcquB,GAC9Bn3B,GAASxI,EAAQm/B,GAAQQ,ICvE3B,IAAIC,GAAsBn9B,GAAM,WAAco9B,GAAW,MAIzDnrB,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,EAAMC,OAAQyyB,IAAuB,CAC/Dt4B,KAAM,SAAcjF,GAClB,OAAOw9B,GAAWhyB,GAASxL,OCR/B,IAAIS,GAAuBgI,EAAsD7H,EAG7EqH,GAAe,SAAUw1B,GAC3B,OAAO,SAAUz9B,GAOf,IANA,IAKIyC,EALAS,EAAInB,EAAgB/B,GACpBiF,EAAOwG,GAAWvI,GAClBmE,EAASpC,EAAKoC,OACduB,EAAI,EACJC,EAAS,GAENxB,EAASuB,GACdnG,EAAMwC,EAAK2D,KACN9F,IAAerC,GAAqBnB,KAAK4D,EAAGT,IAC/CoG,EAAOpE,KAAKg5B,EAAa,CAACh7B,EAAKS,EAAET,IAAQS,EAAET,IAG/C,OAAOoG,IAIX60B,GAAiB,CAGftmB,QAASnP,IAAa,GAGtBoP,OAAQpP,IAAa,IC7BnB01B,GAAUl1B,GAAwC4O,OAItDhF,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,GAAQ,CAClCwM,OAAQ,SAAgBnU,GACtB,OAAOy6B,GAAQz6B,MCLnB,IAAA06B,GAAiB,SAAU59B,GACzB,GAAIqgB,GAASrgB,GACX,MAAM8B,UAAU,iDAChB,OAAO9B,GCHPmgB,GAAQrS,GAAgB,SAE5B+vB,GAAiB,SAAUnqB,GACzB,IAAIH,EAAS,IACb,IACE,MAAMG,GAAaH,GACnB,MAAOuqB,GACP,IAEE,OADAvqB,EAAO4M,KAAS,EACT,MAAMzM,GAAaH,GAC1B,MAAOwqB,KACT,OAAO,GCLX1rB,GAAE,CAAE5I,OAAQ,SAAU2K,OAAO,EAAMtJ,QAASkzB,GAAqB,aAAe,CAC9Ez1B,SAAU,SAAkBiwB,GAC1B,SAAUj1B,OAAO3B,EAAuBxD,OACrCoK,QAAQy1B,GAAWzF,GAAepxB,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MCT/E,IAAAq8B,IAAkB99B,GAAM,WACtB,OAAOb,OAAO4+B,aAAa5+B,OAAO6+B,kBAAkB,Q3Iq+JhDC,GAAmBx+B,GAAqB,SAAU/B,G4Ir+JxD,IAAI0B,EAAiBiJ,EAA+C7H,EAIhE09B,EAAWt5B,EAAI,QACfH,EAAK,EAELs5B,EAAe5+B,OAAO4+B,cAAgB,WACxC,OAAO,GAGLI,EAAc,SAAUv+B,GAC1BR,EAAeQ,EAAIs+B,EAAU,CAAEn9B,MAAO,CACpCq9B,SAAU,OAAQ35B,EAClB45B,SAAU,OAoCVC,EAAO5gC,EAAAD,QAAiB,CAC1B8gC,UAAU,EACVC,QAlCY,SAAU5+B,EAAIqN,GAE1B,IAAKpL,EAASjC,GAAK,MAAoB,iBAANA,EAAiBA,GAAmB,iBAANA,EAAiB,IAAM,KAAOA,EAC7F,IAAKwC,EAAIxC,EAAIs+B,GAAW,CAEtB,IAAKH,EAAan+B,GAAK,MAAO,IAE9B,IAAKqN,EAAQ,MAAO,IAEpBkxB,EAAYv+B,GAEZ,OAAOA,EAAGs+B,GAAUE,UAwBtBK,YArBgB,SAAU7+B,EAAIqN,GAC9B,IAAK7K,EAAIxC,EAAIs+B,GAAW,CAEtB,IAAKH,EAAan+B,GAAK,OAAO,EAE9B,IAAKqN,EAAQ,OAAO,EAEpBkxB,EAAYv+B,GAEZ,OAAOA,EAAGs+B,GAAUG,UAatBK,SATa,SAAU9+B,GAEvB,OADI++B,IAAYL,EAAKC,UAAYR,EAAan+B,KAAQwC,EAAIxC,EAAIs+B,IAAWC,EAAYv+B,GAC9EA,IAUTmF,EAAWm5B,IAAY,KCrDnBU,I7I6hKuBX,GAAiBM,SACjBN,GAAiBO,QACjBP,GAAiBQ,YACjBR,GAAiBS,S6IhiK/B,SAAUG,EAASp2B,GAC9BzK,KAAK6gC,QAAUA,EACf7gC,KAAKyK,OAASA,IAGhBq2B,GAAiB,SAAUpD,EAAUqD,EAAiB34B,GACpD,IAKI4E,EAAUg0B,EAAQr3B,EAAOV,EAAQwB,EAAQ6M,EAAMiQ,EAL/ClX,EAAOjI,GAAWA,EAAQiI,KAC1B4wB,KAAgB74B,IAAWA,EAAQ64B,YACnCC,KAAiB94B,IAAWA,EAAQ84B,aACpCC,KAAiB/4B,IAAWA,EAAQ+4B,aACpCz/B,EAAK6P,GAAKwvB,EAAiB1wB,EAAM,EAAI4wB,EAAaE,GAGlDC,EAAO,SAAUC,GAEnB,OADIr0B,GAAUga,GAAcha,GACrB,IAAI4zB,IAAO,EAAMS,IAGtBC,EAAS,SAAUv+B,GACrB,OAAIk+B,GACF/7B,EAASnC,GACFo+B,EAAcz/B,EAAGqB,EAAM,GAAIA,EAAM,GAAIq+B,GAAQ1/B,EAAGqB,EAAM,GAAIA,EAAM,KAChEo+B,EAAcz/B,EAAGqB,EAAOq+B,GAAQ1/B,EAAGqB,IAG9C,GAAIm+B,EACFl0B,EAAW0wB,MACN,CAEL,GAAqB,mBADrBsD,EAAS5Z,GAAkBsW,IACM,MAAMh6B,UAAU,0BAEjD,GAAIyjB,GAAsB6Z,GAAS,CACjC,IAAKr3B,EAAQ,EAAGV,EAASO,GAASk0B,EAASz0B,QAASA,EAASU,EAAOA,IAElE,IADAc,EAAS62B,EAAO5D,EAAS/zB,MACXc,aAAkBm2B,GAAQ,OAAOn2B,EAC/C,OAAO,IAAIm2B,IAAO,GAEtB5zB,EAAWg0B,EAAO9/B,KAAKw8B,GAIzB,IADApmB,EAAOtK,EAASsK,OACPiQ,EAAOjQ,EAAKpW,KAAK8L,IAAWsM,MAAM,CACzC,IACE7O,EAAS62B,EAAO/Z,EAAKxkB,OACrB,MAAOb,GAEP,MADA8kB,GAAcha,GACR9K,EAER,GAAqB,iBAAVuI,GAAsBA,GAAUA,aAAkBm2B,GAAQ,OAAOn2B,EAC5E,OAAO,IAAIm2B,IAAO,ICtDlBH,GAAcp2B,GAA0Co2B,YASxDruB,GAAmBnK,GAAoBjC,IACvCu7B,GAAyBt5B,GAAoBL,UAC7CkK,GAAO0vB,GAAqB1vB,KAC5BC,GAAYyvB,GAAqBzvB,UACjCtL,GAAK,EAGLg7B,GAAsB,SAAU37B,GAClC,OAAOA,EAAM47B,SAAW57B,EAAM47B,OAAS,IAAIC,KAGzCA,GAAsB,WACxB3hC,KAAKgZ,QAAU,IAGb4oB,GAAqB,SAAU97B,EAAOzB,GACxC,OAAOyN,GAAKhM,EAAMkT,SAAS,SAAUpX,GACnC,OAAOA,EAAG,KAAOyC,MAIrBs9B,GAAoBrgC,UAAY,CAC9BD,IAAK,SAAUgD,GACb,IAAI6mB,EAAQ0W,GAAmB5hC,KAAMqE,GACrC,GAAI6mB,EAAO,OAAOA,EAAM,IAE1B9mB,IAAK,SAAUC,GACb,QAASu9B,GAAmB5hC,KAAMqE,IAEpC2B,IAAK,SAAU3B,EAAKtB,GAClB,IAAImoB,EAAQ0W,GAAmB5hC,KAAMqE,GACjC6mB,EAAOA,EAAM,GAAKnoB,EACjB/C,KAAKgZ,QAAQ3S,KAAK,CAAChC,EAAKtB,KAE/BmpB,OAAU,SAAU7nB,GAClB,IAAIsF,EAAQoI,GAAU/R,KAAKgZ,SAAS,SAAUpX,GAC5C,OAAOA,EAAG,KAAOyC,KAGnB,OADKsF,GAAO3J,KAAKgZ,QAAQmT,OAAOxiB,EAAO,MAC7BA,IAId,IAAAk4B,GAAiB,CACfC,eAAgB,SAAUC,EAASC,EAAkBlxB,EAAQmxB,GAC3D,IAAIrxB,EAAImxB,GAAQ,SAAU1xB,EAAMqtB,GAC9BnX,GAAWlW,EAAMO,EAAGoxB,GACpB5vB,GAAiB/B,EAAM,CACrBvI,KAAMk6B,EACNv7B,GAAIA,KACJi7B,YAAQj+B,IAEMA,MAAZi6B,GAAuBoD,GAAQpD,EAAUrtB,EAAK4xB,GAAQ,CAAE5xB,KAAMA,EAAM4wB,WAAYnwB,OAGlF9I,EAAmBu5B,GAAuBS,GAE1CriC,EAAS,SAAU0Q,EAAMhM,EAAKtB,GAChC,IAAIkE,EAAQe,EAAiBqI,GACzB1E,EAAO80B,GAAYv7B,EAASb,IAAM,GAGtC,OAFa,IAATsH,EAAe81B,GAAoBx6B,GAAOjB,IAAI3B,EAAKtB,GAClD4I,EAAK1E,EAAMR,IAAM1D,EACfsN,GA6CT,OA1CAkZ,GAAY3Y,EAAEtP,UAAW,CAGvB4qB,OAAU,SAAU7nB,GAClB,IAAI4C,EAAQe,EAAiBhI,MAC7B,IAAK6D,EAASQ,GAAM,OAAO,EAC3B,IAAIsH,EAAO80B,GAAYp8B,GACvB,OAAa,IAATsH,EAAsB81B,GAAoBx6B,GAAe,OAAE5C,GACxDsH,GAAQu2B,EAAKv2B,EAAM1E,EAAMR,YAAckF,EAAK1E,EAAMR,KAI3DrC,IAAK,SAAaC,GAChB,IAAI4C,EAAQe,EAAiBhI,MAC7B,IAAK6D,EAASQ,GAAM,OAAO,EAC3B,IAAIsH,EAAO80B,GAAYp8B,GACvB,OAAa,IAATsH,EAAsB81B,GAAoBx6B,GAAO7C,IAAIC,GAClDsH,GAAQu2B,EAAKv2B,EAAM1E,EAAMR,OAIpC8iB,GAAY3Y,EAAEtP,UAAWwP,EAAS,CAEhCzP,IAAK,SAAagD,GAChB,IAAI4C,EAAQe,EAAiBhI,MAC7B,GAAI6D,EAASQ,GAAM,CACjB,IAAIsH,EAAO80B,GAAYp8B,GACvB,OAAa,IAATsH,EAAsB81B,GAAoBx6B,GAAO5F,IAAIgD,GAClDsH,EAAOA,EAAK1E,EAAMR,SAAMhD,IAInCuC,IAAK,SAAa3B,EAAKtB,GACrB,OAAOpD,EAAOK,KAAMqE,EAAKtB,KAEzB,CAEFo/B,IAAK,SAAap/B,GAChB,OAAOpD,EAAOK,KAAM+C,GAAO,MAIxB6N,ICpHPwxB,I/IyyKe3gC,GAAqB,SAAU/B,GgJpyKlD,IAKI2iC,EALAC,EAAsBj4B,GAAuC1C,QAG7D46B,GAAWhjC,EAAO0O,eAAiB,kBAAmB1O,EACtDwgC,EAAe5+B,OAAO4+B,aAGtBgC,EAAU,SAAUlW,GACtB,OAAO,WACL,OAAOA,EAAK7rB,KAAMgJ,UAAUC,OAASD,UAAU,QAAKvF,KAMpD++B,EAAW9iC,EAAAD,QCRE,SAAUuiC,EAAkBD,EAASU,GACpD,IAAI3xB,GAA8C,IAArCkxB,EAAiB53B,QAAQ,OAClCs4B,GAAgD,IAAtCV,EAAiB53B,QAAQ,QACnC63B,EAAQnxB,EAAS,MAAQ,MACzB6xB,EAAoBpjC,EAAOyiC,GAC3BY,EAAkBD,GAAqBA,EAAkBrhC,UACzDwZ,EAAc6nB,EACdE,EAAW,GAEXC,EAAY,SAAUtqB,GACxB,IAAI6G,EAAeujB,EAAgBpqB,GACnCzQ,GAAS66B,EAAiBpqB,EACjB,OAAPA,EAAe,SAAazV,GAE1B,OADAsc,EAAane,KAAKlB,KAAgB,IAAV+C,EAAc,EAAIA,GACnC/C,MACE,UAAPwY,EAAkB,SAAUnU,GAC9B,QAAOq+B,IAAY7+B,EAASQ,KAAegb,EAAane,KAAKlB,KAAc,IAARqE,EAAY,EAAIA,IAC1E,OAAPmU,EAAe,SAAanU,GAC9B,OAAOq+B,IAAY7+B,EAASQ,QAAOZ,EAAY4b,EAAane,KAAKlB,KAAc,IAARqE,EAAY,EAAIA,IAC9E,OAAPmU,EAAe,SAAanU,GAC9B,QAAOq+B,IAAY7+B,EAASQ,KAAegb,EAAane,KAAKlB,KAAc,IAARqE,EAAY,EAAIA,IACjF,SAAaA,EAAKtB,GAEpB,OADAsc,EAAane,KAAKlB,KAAc,IAARqE,EAAY,EAAIA,EAAKtB,GACtC/C,QAMb,GAAIwL,GAASw2B,EAA8C,mBAArBW,KAAqCD,GAAWE,EAAgBnxB,UAAYzP,GAAM,YACtH,IAAI2gC,GAAoB3pB,UAAU1B,YAGlCwD,EAAc2nB,EAAOX,eAAeC,EAASC,EAAkBlxB,EAAQmxB,GACvEc,GAAuBxC,UAAW,OAC7B,GAAI/0B,GAASw2B,GAAkB,GAAO,CAC3C,IAAI3K,EAAW,IAAIvc,EAEfkoB,EAAiB3L,EAAS4K,GAAOS,EAAU,IAAM,EAAG,IAAMrL,EAE1D4L,EAAuBjhC,GAAM,WAAcq1B,EAASjzB,IAAI,MAGxD8+B,EAAmB5F,IAA4B,SAAUI,GAAY,IAAIiF,EAAkBjF,MAE3FyF,GAAcT,GAAW1gC,GAAM,WAIjC,IAFA,IAAIohC,EAAY,IAAIT,EAChBh5B,EAAQ,EACLA,KAASy5B,EAAUnB,GAAOt4B,EAAOA,GACxC,OAAQy5B,EAAUh/B,KAAK,MAGpB8+B,KACHpoB,EAAcinB,GAAQ,SAAUjE,EAAOJ,GACrCnX,GAAWuX,EAAOhjB,EAAaknB,GAC/B,IAAI3xB,EAAOwtB,GAAkB,IAAI8E,EAAqB7E,EAAOhjB,GAE7D,OADgBrX,MAAZi6B,GAAuBoD,GAAQpD,EAAUrtB,EAAK4xB,GAAQ,CAAE5xB,KAAMA,EAAM4wB,WAAYnwB,IAC7ET,MAEG/O,UAAYshC,EACxBA,EAAgB/xB,YAAciK,IAG5BmoB,GAAwBE,KAC1BL,EAAU,UACVA,EAAU,OACVhyB,GAAUgyB,EAAU,SAGlBK,GAAcH,IAAgBF,EAAUb,GAGxCS,GAAWE,EAAgBS,cAAcT,EAAgBS,MAU/D,OAPAR,EAASb,GAAoBlnB,EAC7B7G,GAAE,CAAE1U,QAAQ,EAAMmN,OAAQoO,GAAe6nB,GAAqBE,GAE9D5yB,GAAe6K,EAAaknB,GAEvBU,GAASD,EAAOa,UAAUxoB,EAAaknB,EAAkBlxB,GAEvDgK,ED3EuByoB,CAAW,UAAWxB,EAASF,IAK/D,GAAI76B,GAAmBu7B,EAAS,CAC9BF,EAAkBR,GAAeC,eAAeC,EAAS,WAAW,GACpEgB,GAAuBxC,UAAW,EAClC,IAAIiD,EAAmBhB,EAASlhC,UAC5BmiC,EAAeD,EAAyB,OACxCE,EAAYF,EAAiBp/B,IAC7Bu/B,EAAYH,EAAiBniC,IAC7BuiC,EAAYJ,EAAiBx9B,IACjCujB,GAAYia,EAAkB,CAC5BtX,OAAU,SAAU7nB,GAClB,GAAIR,EAASQ,KAAS07B,EAAa17B,GAAM,CACvC,IAAI4C,EAAQq7B,EAAoBtiC,MAEhC,OADKiH,EAAMy6B,SAAQz6B,EAAMy6B,OAAS,IAAIW,GAC/BoB,EAAaviC,KAAKlB,KAAMqE,IAAQ4C,EAAMy6B,OAAe,OAAEr9B,GAC9D,OAAOo/B,EAAaviC,KAAKlB,KAAMqE,IAEnCD,IAAK,SAAaC,GAChB,GAAIR,EAASQ,KAAS07B,EAAa17B,GAAM,CACvC,IAAI4C,EAAQq7B,EAAoBtiC,MAEhC,OADKiH,EAAMy6B,SAAQz6B,EAAMy6B,OAAS,IAAIW,GAC/BqB,EAAUxiC,KAAKlB,KAAMqE,IAAQ4C,EAAMy6B,OAAOt9B,IAAIC,GACrD,OAAOq/B,EAAUxiC,KAAKlB,KAAMqE,IAEhChD,IAAK,SAAagD,GAChB,GAAIR,EAASQ,KAAS07B,EAAa17B,GAAM,CACvC,IAAI4C,EAAQq7B,EAAoBtiC,MAEhC,OADKiH,EAAMy6B,SAAQz6B,EAAMy6B,OAAS,IAAIW,GAC/BqB,EAAUxiC,KAAKlB,KAAMqE,GAAOs/B,EAAUziC,KAAKlB,KAAMqE,GAAO4C,EAAMy6B,OAAOrgC,IAAIgD,GAChF,OAAOs/B,EAAUziC,KAAKlB,KAAMqE,IAEhC2B,IAAK,SAAa3B,EAAKtB,GACrB,GAAIc,EAASQ,KAAS07B,EAAa17B,GAAM,CACvC,IAAI4C,EAAQq7B,EAAoBtiC,MAC3BiH,EAAMy6B,SAAQz6B,EAAMy6B,OAAS,IAAIW,GACtCqB,EAAUxiC,KAAKlB,KAAMqE,GAAOu/B,EAAU1iC,KAAKlB,KAAMqE,EAAKtB,GAASkE,EAAMy6B,OAAO17B,IAAI3B,EAAKtB,QAChF6gC,EAAU1iC,KAAKlB,KAAMqE,EAAKtB,GACjC,OAAO/C,YD7DAqK,GAAwCwH,OAIjDgE,GAAgBR,GAAoB,SACpCS,GAAiBL,GAAwB,SAI7CxB,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QAASmJ,KAAkBC,IAAkB,CAC7EjE,MAAO,SAAeT,GACpB,OAAOgxB,GAAOpiC,KAAMoR,EAAYpI,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MGR1EwQ,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,EAAMC,OAAQvL,OAAOslB,SAAWA,IAAU,CACpEA,OAAQA,KCHV,ICDIod,GAAQx5B,GAAoCk0B,KAKhDtqB,GAAE,CAAE5I,OAAQ,SAAU2K,OAAO,EAAMtJ,ODAlB,SAAU4I,GACzB,OAAOtT,GAAM,WACX,QAASk8B,GAAY5oB,MANf,OAAA,MAMqCA,MAAyB4oB,GAAY5oB,GAAa3F,OAAS2F,KCF/DwuB,CAAuB,SAAW,CAC3EvF,KAAM,WACJ,OAAOsF,GAAM7jC,SCPjB,IAAI+jC,GAAQ15B,GAAwCuH,KAIhDiE,GAAgBR,GAAoB,QACpCS,GAAiBL,GAAwB,QAI7CxB,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QAASmJ,KAAkBC,IAAkB,CAC7ElE,KAAM,SAAcR,GAClB,OAAO2yB,GAAM/jC,KAAMoR,EAAYpI,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MCTzE,ICEAugC,GAAiB,GAAGC,QAAU,SAAgBC,GAC5C,IAAIpnB,EAAM3X,OAAO3B,EAAuBxD,OACpCyK,EAAS,GACTsQ,EAAI3R,GAAU86B,GAClB,GAAInpB,EAAI,GAAKA,GAAKopB,EAAAA,EAAU,MAAMhb,WAAW,+BAC7C,KAAMpO,EAAI,GAAIA,KAAO,KAAO+B,GAAOA,GAAc,EAAJ/B,IAAOtQ,GAAUqS,GAC9D,OAAOrS,GCLL25B,GAAgB,GAAIC,QACpBl7B,GAAQtH,KAAKsH,MAEbkkB,GAAM,SAAU5L,EAAG1G,EAAGupB,GACxB,OAAa,IAANvpB,EAAUupB,EAAMvpB,EAAI,GAAM,EAAIsS,GAAI5L,EAAG1G,EAAI,EAAGupB,EAAM7iB,GAAK4L,GAAI5L,EAAIA,EAAG1G,EAAI,EAAGupB,IAgB9EjsB,GAAS+rB,KACY,UAAvB,KAAQC,QAAQ,IACG,MAAnB,GAAIA,QAAQ,IACS,SAArB,MAAMA,QAAQ,IACuB,yBAArC,mBAAsBA,QAAQ,MAC1BriC,GAAM,WAEVoiC,GAAcljC,KAAK,OAKrB+S,GAAE,CAAE5I,OAAQ,SAAU2K,OAAO,EAAMtJ,OAAQ2L,IAAU,CAEnDgsB,QAAS,SAAiBE,GACxB,IAKI/jC,EAAG6iB,EAAGvC,EAAG9F,EALTmU,EFtCS,SAAUpsB,GACzB,GAAoB,iBAATA,GAAuC,UAAlBQ,EAAQR,GACtC,MAAMW,UAAU,wBAElB,OAAQX,EEkCOyhC,CAAgBxkC,MACzBykC,EAAcr7B,GAAUm7B,GACxB54B,EAAO,CAAC,EAAG,EAAG,EAAG,EAAG,EAAG,GACvB+4B,EAAO,GACPj6B,EAAS,IAGTk6B,EAAW,SAAU5pB,EAAGxK,GAG1B,IAFA,IAAI5G,GAAS,EACTi7B,EAAKr0B,IACA5G,EAAQ,GACfi7B,GAAM7pB,EAAIpP,EAAKhC,GACfgC,EAAKhC,GAASi7B,EAAK,IACnBA,EAAKz7B,GAAMy7B,EAAK,MAIhBC,EAAS,SAAU9pB,GAGrB,IAFA,IAAIpR,EAAQ,EACR4G,EAAI,IACC5G,GAAS,GAChB4G,GAAK5E,EAAKhC,GACVgC,EAAKhC,GAASR,GAAMoH,EAAIwK,GACxBxK,EAAKA,EAAIwK,EAAK,KAId+pB,EAAe,WAGjB,IAFA,IAAIn7B,EAAQ,EACRoS,EAAI,KACCpS,GAAS,GAChB,GAAU,KAANoS,GAAsB,IAAVpS,GAA+B,IAAhBgC,EAAKhC,GAAc,CAChD,IAAIyf,EAAIjkB,OAAOwG,EAAKhC,IACpBoS,EAAU,KAANA,EAAWqN,EAAIrN,EAAIkoB,GAAO/iC,KAAK,IAAK,EAAIkoB,EAAEngB,QAAUmgB,EAE1D,OAAOrN,GAGX,GAAI0oB,EAAc,GAAKA,EAAc,GAAI,MAAMtb,WAAW,6BAE1D,GAAIgG,GAAUA,EAAQ,MAAO,MAC7B,GAAIA,IAAW,MAAQA,GAAU,KAAM,OAAOhqB,OAAOgqB,GAKrD,GAJIA,EAAS,IACXuV,EAAO,IACPvV,GAAUA,GAERA,EAAS,MAKX,GAHA9L,GADA7iB,EA3EI,SAAUihB,GAGlB,IAFA,IAAI1G,EAAI,EACJgqB,EAAKtjB,EACFsjB,GAAM,MACXhqB,GAAK,GACLgqB,GAAM,KAER,KAAOA,GAAM,GACXhqB,GAAK,EACLgqB,GAAM,EACN,OAAOhqB,EAiEDiqB,CAAI7V,EAAS9B,GAAI,EAAG,GAAI,IAAM,IAC1B,EAAI8B,EAAS9B,GAAI,GAAI7sB,EAAG,GAAK2uB,EAAS9B,GAAI,EAAG7sB,EAAG,GACxD6iB,GAAK,kBACL7iB,EAAI,GAAKA,GACD,EAAG,CAGT,IAFAmkC,EAAS,EAAGthB,GACZvC,EAAI2jB,EACG3jB,GAAK,GACV6jB,EAAS,IAAK,GACd7jB,GAAK,EAIP,IAFA6jB,EAAStX,GAAI,GAAIvM,EAAG,GAAI,GACxBA,EAAItgB,EAAI,EACDsgB,GAAK,IACV+jB,EAAO,GAAK,IACZ/jB,GAAK,GAEP+jB,EAAO,GAAK/jB,GACZ6jB,EAAS,EAAG,GACZE,EAAO,GACPp6B,EAASq6B,SAETH,EAAS,EAAGthB,GACZshB,EAAS,IAAMnkC,EAAG,GAClBiK,EAASq6B,IAAiBb,GAAO/iC,KAAK,IAAKujC,GAU7C,OALAh6B,EAFEg6B,EAAc,EAEPC,IADT1pB,EAAIvQ,EAAOxB,SACWw7B,EAClB,KAAOR,GAAO/iC,KAAK,IAAKujC,EAAczpB,GAAKvQ,EAC3CA,EAAOrH,MAAM,EAAG4X,EAAIypB,GAAe,IAAMh6B,EAAOrH,MAAM4X,EAAIypB,IAErDC,EAAOj6B,KCzHtB,IAAIw6B,GAAW56B,GAAwC2O,QAIvD/E,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,GAAQ,CAClCuM,QAAS,SAAiBlU,GACxB,OAAOmgC,GAASngC,MCHpBmP,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,GAAQ,CAClCnD,MAAO,SAAe6lB,GAEpB,OAAOA,GAAUA,KCJrB,IAAIvqB,GAAiCyF,EAA2D7H,EAG5F28B,GAAsBn9B,GAAM,WAAc4C,GAA+B,MCN+B,SAAS0yB,GAAkB92B,EAAE4oB,GAAG,IAAI,IAAIrO,EAAE,EAAEA,EAAEqO,EAAEngB,OAAO8R,IAAI,CAAC,IAAImqB,EAAE9b,EAAErO,GAAGmqB,EAAEtiC,WAAWsiC,EAAEtiC,aAAY,EAAGsiC,EAAEliC,cAAa,EAAG,UAAUkiC,IAAIA,EAAEjiC,UAAS,GAAI9B,OAAOC,eAAeZ,EAAE0kC,EAAE7gC,IAAI6gC,IAAwG,SAASvN,GAAgBn3B,EAAE4oB,EAAErO,GAAG,OAAOqO,KAAK5oB,EAAEW,OAAOC,eAAeZ,EAAE4oB,EAAE,CAACrmB,MAAMgY,EAAEnY,YAAW,EAAGI,cAAa,EAAGC,UAAS,IAAKzC,EAAE4oB,GAAGrO,EAAEva,EAAE,SAASyK,GAAQzK,EAAE4oB,GAAG,IAAIrO,EAAE5Z,OAAO0F,KAAKrG,GAAG,GAAGW,OAAO6J,sBAAsB,CAAC,IAAIk6B,EAAE/jC,OAAO6J,sBAAsBxK,GAAG4oB,IAAI8b,EAAEA,EAAEvzB,QAAQ,SAASyX,GAAG,OAAOjoB,OAAOmB,yBAAyB9B,EAAE4oB,GAAGxmB,eAAemY,EAAE1U,KAAKmK,MAAMuK,EAAEmqB,GAAG,OAAOnqB,EAAE,SAAS+c,GAAet3B,GAAG,IAAI,IAAI4oB,EAAE,EAAEA,EAAEpgB,UAAUC,OAAOmgB,IAAI,CAAC,IAAIrO,EAAE,MAAM/R,UAAUogB,GAAGpgB,UAAUogB,GAAG,GAAGA,EAAE,EAAEne,GAAQ9J,OAAO4Z,IAAG,GAAItJ,SAAS,SAAS2X,GAAGuO,GAAgBn3B,EAAE4oB,EAAErO,EAAEqO,OAAOjoB,OAAO42B,0BAA0B52B,OAAOoM,iBAAiB/M,EAAEW,OAAO42B,0BAA0Bhd,IAAI9P,GAAQ9J,OAAO4Z,IAAItJ,SAAS,SAAS2X,GAAGjoB,OAAOC,eAAeZ,EAAE4oB,EAAEjoB,OAAOmB,yBAAyByY,EAAEqO,OAAO,OAAO5oB,EDWtnCyT,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,EAAMC,QAJpBhI,GAAey6B,GAIqBxyB,MAAOjI,GAAe,CACtEpC,yBAA0B,SAAkCV,EAAIyC,GAC9D,OAAOO,GAA+BjB,EAAgB/B,GAAKyC,MEJ/D4P,GAAE,CAAE5I,OAAQ,SAAUoB,MAAM,EAAME,MAAOjI,GAAe,CACtDqzB,0BAA2B,SAAmCvyB,GAO5D,IANA,IAKInB,EAAK1B,EALLmC,EAAInB,EAAgB6B,GACpBlD,EAA2BgJ,EAA+B9I,EAC1DqE,EAAOoE,GAAQnG,GACf2F,EAAS,GACTd,EAAQ,EAEL9C,EAAKoC,OAASU,QAEAlG,KADnBd,EAAaL,EAAyBwC,EAAGT,EAAMwC,EAAK8C,QACtBiQ,GAAenP,EAAQpG,EAAK1B,GAE5D,OAAO8H,KCZXqV,GAA8B,QAAS,GAAG,SAAUiC,EAAOojB,EAAaplB,GACtE,MAAO,CAGL,SAAe5K,GACb,IAAIrQ,EAAItB,EAAuBxD,MAC3BolC,EAAoB3hC,MAAV0R,OAAsB1R,EAAY0R,EAAO4M,GACvD,YAAmBte,IAAZ2hC,EAAwBA,EAAQlkC,KAAKiU,EAAQrQ,GAAK,IAAIkX,OAAO7G,GAAQ4M,GAAO5c,OAAOL,KAI5F,SAAUqQ,GACR,IAAIiL,EAAML,EAAgBolB,EAAahwB,EAAQnV,MAC/C,GAAIogB,EAAI9G,KAAM,OAAO8G,EAAIrd,MAEzB,IAAIsd,EAAKnb,EAASiQ,GACd6I,EAAI7Y,OAAOnF,MAEf,IAAKqgB,EAAG9gB,OAAQ,OAAOkhB,GAAWJ,EAAIrC,GAEtC,IAAIuC,EAAcF,EAAGzE,QACrByE,EAAGjE,UAAY,EAIf,IAHA,IAEI3R,EAFA2Y,EAAI,GACJrI,EAAI,EAEgC,QAAhCtQ,EAASgW,GAAWJ,EAAIrC,KAAc,CAC5C,IAAIqnB,EAAWlgC,OAAOsF,EAAO,IAC7B2Y,EAAErI,GAAKsqB,EACU,KAAbA,IAAiBhlB,EAAGjE,UAAYsD,GAAmB1B,EAAGxU,GAAS6W,EAAGjE,WAAYmE,IAClFxF,IAEF,OAAa,IAANA,EAAU,KAAOqI,OFxC0lC,IAAIkiB,GAAS,CAACC,QAAO,EAAGC,WAAW,GAAGC,OAAM,GAAI,SAASC,GAAQllC,EAAE4oB,GAAG,OAAO,WAAW,OAAOlc,MAAMosB,KAAKx4B,SAAS6kC,iBAAiBvc,IAAIjf,SAASnK,OAAOkB,KAAKV,EAAE4oB,GAAsF,IAAI0Y,GAAe,SAASthC,GAAG,OAAO,MAAMA,EAAEA,EAAEqQ,YAAY,MAAM+0B,GAAW,SAASplC,EAAE4oB,GAAG,SAAS5oB,GAAG4oB,GAAG5oB,aAAa4oB,IAAIyc,GAAkB,SAASrlC,GAAG,OAAO,MAAMA,GAAGqD,GAAS,SAASrD,GAAG,OAAOshC,GAAethC,KAAKW,QAAkF2kC,GAAS,SAAStlC,GAAG,OAAOshC,GAAethC,KAAK2E,QAA8H8H,GAAQ,SAASzM,GAAG,OAAO0M,MAAMD,QAAQzM,IAAIulC,GAAW,SAASvlC,GAAG,OAAOolC,GAAWplC,EAAE+jB,WAA0P/C,GAA6EskB,GAA7EtkB,GAAkIvU,GAAlIuU,GAAmJukB,GAAnJvkB,GAArO,SAAShhB,GAAG,OAAOolC,GAAWplC,EAAEwlC,UAAqMxkB,GAAnL,SAAShhB,GAAG,OAAOolC,GAAWplC,EAAEe,QAAmJigB,GAAnI,SAAShhB,GAAG,OAAOqlC,GAAkBrlC,KAAKslC,GAAStlC,IAAIyM,GAAQzM,IAAIulC,GAAWvlC,MAAMA,EAAEyI,QAAQpF,GAASrD,KAAKW,OAAO0F,KAAKrG,GAAGyI,QAA0W,SAASg9B,GAAMzlC,EAAE4oB,GAAG,GAAG,EAAEA,EAAE,CAAC,IAAIrO,EAArL,SAA0Bva,GAAG,IAAI4oB,EAAE,GAAGze,OAAOnK,GAAGmZ,MAAM,oCAAoC,OAAOyP,EAAEvnB,KAAK4H,IAAI,GAAG2f,EAAE,GAAGA,EAAE,GAAGngB,OAAO,IAAImgB,EAAE,IAAIA,EAAE,GAAG,IAAI,EAAoC8c,CAAiB9c,GAAG,OAAO+c,WAAW3lC,EAAE6jC,QAAQtpB,IAAI,OAAOlZ,KAAKokC,MAAMzlC,EAAE4oB,GAAGA,EAAE,IGiBrmFgd,GAAOC,GAASnR,GHjBylFoR,GAAW,WAAW,SAAS9lC,EAAE4oB,EAAErO,IAAhpF,SAAyBva,EAAE4oB,GAAG,KAAK5oB,aAAa4oB,GAAG,MAAM,IAAI1lB,UAAU,sCAA4kF0zB,CAAgBp3B,KAAKQ,GAAGghB,GAAW4H,GAAGppB,KAAKumC,QAAQnd,EAAE5H,GAAU4H,KAAKppB,KAAKumC,QAAQzlC,SAAS0lC,cAAcpd,IAAI5H,GAAWxhB,KAAKumC,UAAU/kB,GAASxhB,KAAKumC,QAAQE,cAAczmC,KAAK0mC,OAAO5O,GAAe,GAAGwN,GAAS,GAAGvqB,GAAG/a,KAAK6rB,QAAQ,OAArlF,SAAsBrrB,EAAE4oB,EAAErO,GAAUqO,GAAGkO,GAAkB92B,EAAEc,UAAU8nB,GAAGrO,GAAGuc,GAAkB92B,EAAEua,GAA6/Eyc,CAAah3B,EAAE,CAAC,CAAC6D,IAAI,OAAOtB,MAAM,WAAWvC,EAAEmmC,UAAU3mC,KAAK0mC,OAAOnB,SAASvlC,KAAKumC,QAAQ93B,MAAMm4B,WAAW,OAAO5mC,KAAKumC,QAAQ93B,MAAMo4B,iBAAiB,OAAO7mC,KAAKumC,QAAQ93B,MAAMq4B,YAAY,gBAAgB9mC,KAAK+mC,WAAU,GAAI/mC,KAAKumC,QAAQE,WAAWzmC,QAAQ,CAACqE,IAAI,UAAUtB,MAAM,WAAWvC,EAAEmmC,UAAU3mC,KAAK0mC,OAAOnB,SAASvlC,KAAKumC,QAAQ93B,MAAMm4B,WAAW,GAAG5mC,KAAKumC,QAAQ93B,MAAMo4B,iBAAiB,GAAG7mC,KAAKumC,QAAQ93B,MAAMq4B,YAAY,IAAI9mC,KAAK+mC,WAAU,GAAI/mC,KAAKumC,QAAQE,WAAW,QAAQ,CAACpiC,IAAI,YAAYtB,MAAM,SAASvC,GAAG,IAAI4oB,EAAEppB,KAAK+a,EAAEva,EAAE,mBAAmB,sBAAsB,CAAC,aAAa,YAAY,YAAYiR,SAAS,SAASjR,GAAG4oB,EAAEmd,QAAQxrB,GAAGva,GAAG,SAASA,GAAG,OAAO4oB,EAAEpjB,IAAIxF,MAAK,QAAS,CAAC6D,IAAI,MAAMtB,MAAM,SAASqmB,GAAG,IAAI5oB,EAAEmmC,UAAUnlB,GAAS4H,GAAG,OAAO,KAAK,IAAIrO,EAAEmqB,EAAE9b,EAAE/d,OAAOb,EAAE4e,EAAE4d,eAAe,GAAGvN,EAAE0M,WAAWjB,EAAE+B,aAAa,SAAS,EAAElrB,EAAEoqB,WAAWjB,EAAE+B,aAAa,SAAS,IAAIrM,EAAEuL,WAAWjB,EAAE+B,aAAa,UAAU,EAAE12B,EAAE20B,EAAEgC,wBAAwBviC,EAAE,IAAI4L,EAAE42B,OAAOnnC,KAAK0mC,OAAOlB,WAAW,GAAG,IAAI,OAAO,GAAGzqB,EAAE,IAAIxK,EAAE42B,OAAO38B,EAAE48B,QAAQ72B,EAAE82B,OAAOtsB,EAAE,EAAE,IAAIA,IAAIA,EAAE,KAAK,GAAGA,EAAEA,IAAI,IAAI,EAAEA,GAAGpW,EAAE,GAAGoW,IAAIA,GAAG,GAAGA,EAAE,IAAIpW,GAAG80B,EAAEwM,GAAMlrB,EAAE,KAAKgB,EAAE0d,GAAGmB,KAAK,CAACv2B,IAAI,MAAMtB,MAAM,SAASqmB,GAAG5oB,EAAEmmC,SAASnlB,GAAS4H,KAAKA,EAAE/d,OAAOi8B,WAAWle,EAAE/oB,iBAAiB+oB,EAAE/d,OAAOtI,MAAM/C,KAAKqB,IAAI+nB,GAApzF,SAAiB5oB,EAAE4oB,GAAG,GAAG5oB,GAAG4oB,EAAE,CAAC,IAAIrO,EAAE,IAAIxZ,MAAM6nB,EAAE,CAACvoB,SAAQ,IAAKL,EAAE+mC,cAAcxsB,IAAwuFysB,CAAQpe,EAAE/d,OAAO,aAAa+d,EAAEthB,KAAK,SAAS,aAAa,CAAC,CAACzD,IAAI,QAAQtB,MAAM,SAASqmB,GAAG,IAAIrO,EAAE,EAAE/R,UAAUC,aAAQ,IAASD,UAAU,GAAGA,UAAU,GAAG,GAAGk8B,EAAE,KAAK,GAAG1jB,GAAS4H,IAAI5H,GAAU4H,GAAG8b,EAAEh4B,MAAMosB,KAAKx4B,SAAS6kC,iBAAiBnkB,GAAU4H,GAAGA,EAAE,wBAAwB5H,GAAW4H,GAAG8b,EAAE,CAAC9b,GAAG5H,GAAY4H,GAAG8b,EAAEh4B,MAAMosB,KAAKlQ,GAAG5H,GAAS4H,KAAK8b,EAAE9b,EAAEzX,OAAO6P,KAAaA,GAAS0jB,GAAG,OAAO,KAAK,IAAI16B,EAAEstB,GAAe,GAAGwN,GAAS,GAAGvqB,GAAG,GAAGyG,GAAU4H,IAAI5e,EAAEi7B,MAAM,CAAC,IAAIhM,EAAE,IAAIgO,kBAAkB,SAAS1sB,GAAG7N,MAAMosB,KAAKve,GAAGtJ,SAAS,SAASsJ,GAAG7N,MAAMosB,KAAKve,EAAE2sB,YAAYj2B,SAAS,SAASsJ,GAAGyG,GAAWzG,IAAI2qB,GAAQ3qB,EAAEqO,IAAI,IAAI5oB,EAAEua,EAAEvQ,YAAYivB,EAAEkO,QAAQ7mC,SAAS6rB,KAAK,CAACib,WAAU,EAAGC,SAAQ,IAAK,OAAO3C,EAAExzB,KAAK,SAAS0X,GAAG,OAAO,IAAI5oB,EAAE4oB,EAAErO,QAAQ,CAAC1W,IAAI,UAAUhD,IAAI,WAAW,MAAM,iBAAiBP,SAASgnC,oBAAoBtnC,EAAxvE,GIExnFunC,GAAiBxoC,EAAOyoC,QCIpBv3B,GAAUf,GAAgB,WAE9Bu4B,GAAiB,SAAUjG,GACzB,IAAIlnB,EAAcjS,GAAWm5B,GACzB5gC,EAAiBqE,EAAqBjD,EAEtCkC,GAAeoW,IAAgBA,EAAYrK,KAC7CrP,EAAe0Z,EAAarK,GAAS,CACnCzN,cAAc,EACd3B,IAAK,WAAc,OAAOrB,SCbhCkoC,GAAiB,mCAAmC/hC,KAAK+T,ICCzDiuB,GAA4C,WAA3B5kC,EAAQhE,EAAOwa,SJK5BkhB,GAAW17B,EAAO07B,SAClBj1B,GAAMzG,EAAO6oC,aACb/E,GAAQ9jC,EAAO8oC,eACftuB,GAAUxa,EAAOwa,QACjBuuB,GAAiB/oC,EAAO+oC,eACxBC,GAAWhpC,EAAOgpC,SAClB3f,GAAU,EACV4f,GAAQ,GACRC,GAAqB,qBAGrBC,GAAM,SAAUjiC,GAElB,GAAI+hC,GAAMrkC,eAAesC,GAAK,CAC5B,IAAI/E,EAAK8mC,GAAM/hC,UACR+hC,GAAM/hC,GACb/E,MAIAinC,GAAS,SAAUliC,GACrB,OAAO,WACLiiC,GAAIjiC,KAIJmiC,GAAW,SAAUnoC,GACvBioC,GAAIjoC,EAAMkL,OAGRk9B,GAAO,SAAUpiC,GAEnBlH,EAAOupC,YAAYriC,EAAK,GAAIw0B,GAASpF,SAAW,KAAOoF,GAAS5U,OAI7DrgB,IAAQq9B,KACXr9B,GAAM,SAAsBtE,GAG1B,IAFA,IAAIkT,EAAO,GACPpK,EAAI,EACDxB,UAAUC,OAASuB,GAAGoK,EAAKvO,KAAK2C,UAAUwB,MAMjD,OALAg+B,KAAQ5f,IAAW,YAEH,mBAANlnB,EAAmBA,EAAKK,SAASL,IAAK8O,WAAM/M,EAAWmR,IAEjEwxB,GAAMxd,IACCA,IAETya,GAAQ,SAAwB58B,UACvB+hC,GAAM/hC,IAGXsiC,GACF3C,GAAQ,SAAU3/B,GAChBsT,GAAQivB,SAASL,GAAOliC,KAGjB8hC,IAAYA,GAASU,IAC9B7C,GAAQ,SAAU3/B,GAChB8hC,GAASU,IAAIN,GAAOliC,KAIb6hC,KAAmBY,IAE5BhU,IADAmR,GAAU,IAAIiC,IACCa,MACf9C,GAAQ+C,MAAMC,UAAYT,GAC1BxC,GAAQ70B,GAAK2jB,GAAK4T,YAAa5T,GAAM,IAIrC31B,EAAO+pC,kBACe,mBAAfR,cACNvpC,EAAOgqC,eACRtO,IAAkC,UAAtBA,GAASpF,WACpB7zB,EAAM6mC,KAEPzC,GAAQyC,GACRtpC,EAAO+pC,iBAAiB,UAAWV,IAAU,IAG7CxC,GADSqC,MAAsBlkC,EAAc,UACrC,SAAUkC,GAChBgH,GAAKkB,YAAYpK,EAAc,WAA6B,mBAAI,WAC9DkJ,GAAK+7B,YAAYxpC,MACjB0oC,GAAIjiC,KAKA,SAAUA,GAChBgjC,WAAWd,GAAOliC,GAAK,KAK7B,IKzFIijC,GAAOtO,GAAMuO,GAAMC,GAAQC,GAAQC,GAAMC,GAASC,GLyFtDC,GAAiB,CACfjkC,IAAKA,GACLq9B,MAAOA,IKxGL/gC,GAA2B+H,EAA2D7H,EACtF0nC,GAAYld,GAA6BhnB,IAIzCyhC,GAAmBloC,EAAOkoC,kBAAoBloC,EAAO4qC,uBACrDrpC,GAAWvB,EAAOuB,SAClBiZ,GAAUxa,EAAOwa,QACjBiuB,GAAUzoC,EAAOyoC,QAEjBoC,GAA2B9nC,GAAyB/C,EAAQ,kBAC5D8qC,GAAiBD,IAA4BA,GAAyBrnC,MAKrEsnC,KACHX,GAAQ,WACN,IAAIY,EAAQ5oC,EAEZ,IADIqnC,KAAYuB,EAASvwB,GAAQ/L,SAASs8B,EAAOC,OAC1CnP,IAAM,CACX15B,EAAK05B,GAAK15B,GACV05B,GAAOA,GAAK9jB,KACZ,IACE5V,IACA,MAAOQ,GAGP,MAFIk5B,GAAMwO,KACLD,QAAOlmC,EACNvB,GAERynC,QAAOlmC,EACL6mC,GAAQA,EAAOE,UAIhBtB,KAAWH,IAAWtB,IAAoB3mC,IAC7C+oC,IAAS,EACTC,GAAOhpC,GAAS2pC,eAAe,IAC/B,IAAIhD,GAAiBiC,IAAO/B,QAAQmC,GAAM,CAAEY,eAAe,IAC3Dd,GAAS,WACPE,GAAKn+B,KAAOk+B,IAAUA,KAGf7B,IAAWA,GAAQ2C,SAE5BZ,GAAU/B,GAAQ2C,aAAQlnC,GAC1BumC,GAAOD,GAAQC,KACfJ,GAAS,WACPI,GAAK9oC,KAAK6oC,GAASL,MAIrBE,GADSb,GACA,WACPhvB,GAAQivB,SAASU,KASV,WAEPQ,GAAUhpC,KAAK3B,EAAQmqC,MAK7B,ICpBIkB,GAAUC,GAAsBC,GAAgBC,GDoBpDC,GAAiBX,IAAkB,SAAU3oC,GAC3C,IAAIuoC,EAAO,CAAEvoC,GAAIA,EAAI4V,UAAM7T,GACvBkmC,KAAMA,GAAKryB,KAAO2yB,GACjB7O,KACHA,GAAO6O,EACPL,MACAD,GAAOM,GEzEPgB,GAAoB,SAAUr6B,GAChC,IAAI+5B,EAASO,EACblrC,KAAK+pC,QAAU,IAAIn5B,GAAE,SAAUu6B,EAAWC,GACxC,QAAgB3nC,IAAZknC,QAAoClnC,IAAXynC,EAAsB,MAAMxnC,UAAU,2BACnEinC,EAAUQ,EACVD,EAASE,KAEXprC,KAAK2qC,QAAUhiC,GAAUgiC,GACzB3qC,KAAKkrC,OAASviC,GAAUuiC,ItKkjMpBG,GAAuB,CAC1B7oC,EsK/iMgB,SAAUoO,GAC3B,OAAO,IAAIq6B,GAAkBr6B,KCZ/B06B,GAAiB,SAAU16B,EAAG6Q,GAE5B,GADAvc,EAAS0L,GACL/M,EAAS4d,IAAMA,EAAE5Q,cAAgBD,EAAG,OAAO6Q,EAC/C,IAAI8pB,EAAoBF,GAAqB7oC,EAAEoO,GAG/C,OADA+5B,EADcY,EAAkBZ,SACxBlpB,GACD8pB,EAAkBxB,SCV3ByB,GAAiB,SAAUvpC,GACzB,IACE,MAAO,CAAEC,OAAO,EAAOa,MAAOd,KAC9B,MAAOC,GACP,MAAO,CAAEA,OAAO,EAAMa,MAAOb,KHa7B+nC,GAAO5/B,GAA6BrE,IAYpCyK,GAAUf,GAAgB,WAC1B+7B,GAAU,UACVzjC,GAAmBC,GAAoB5G,IACvC+Q,GAAmBnK,GAAoBjC,IACvC0lC,GAA0BzjC,GAAoBL,UAAU6jC,IACxDE,GAAqBC,GACrBloC,GAAYnE,EAAOmE,UACnB5C,GAAWvB,EAAOuB,SAClBiZ,GAAUxa,EAAOwa,QACjB0P,GAAS5gB,GAAW,SACpBwiC,GAAuBQ,GAA2BrpC,EAClDspC,GAA8BT,GAC9BU,MAAoBjrC,IAAYA,GAASC,aAAexB,EAAOgoC,eAC/DyE,GAAyD,mBAAzBC,sBAChCC,GAAsB,qBAStB7zB,GAAS7M,GAASigC,IAAS,WAE7B,KAD6B1lC,EAAc4lC,MAAwBxmC,OAAOwmC,KAC7C,CAI3B,GAAmB,KAAftxB,GAAmB,OAAO,EAE9B,IAAK0uB,KAAYiD,GAAwB,OAAO,EAOlD,GAAI3xB,IAAc,IAAM,cAAclU,KAAKwlC,IAAqB,OAAO,EAEvE,IAAI5B,EAAU4B,GAAmBhB,QAAQ,GACrCwB,EAAc,SAAUlqC,GAC1BA,GAAK,eAA6B,gBAIpC,OAFkB8nC,EAAQl5B,YAAc,IAC5BJ,IAAW07B,IACdpC,EAAQC,MAAK,yBAAwCmC,MAG5D1O,GAAsBplB,KAAWilB,IAA4B,SAAUI,GACzEiO,GAAmBS,IAAI1O,GAAiB,OAAE,kBAIxC2O,GAAa,SAAUzqC,GACzB,IAAIooC,EACJ,SAAOnmC,EAASjC,IAAkC,mBAAnBooC,EAAOpoC,EAAGooC,QAAsBA,GAG7DJ,GAAS,SAAU3iC,EAAOqlC,GAC5B,IAAIrlC,EAAMslC,SAAV,CACAtlC,EAAMslC,UAAW,EACjB,IAAIC,EAAQvlC,EAAMwlC,UAClBzB,IAAU,WAKR,IAJA,IAAIjoC,EAAQkE,EAAMlE,MACd2pC,EAhDQ,GAgDHzlC,EAAMA,MACX0C,EAAQ,EAEL6iC,EAAMvjC,OAASU,GAAO,CAC3B,IAKIc,EAAQu/B,EAAM2C,EALdC,EAAWJ,EAAM7iC,KACjBkjC,EAAUH,EAAKE,EAASF,GAAKE,EAASE,KACtCnC,EAAUiC,EAASjC,QACnBO,EAAS0B,EAAS1B,OAClBl9B,EAAS4+B,EAAS5+B,OAEtB,IACM6+B,GACGH,IAzDC,IA0DAzlC,EAAM8lC,WAAyBC,GAAkB/lC,GACrDA,EAAM8lC,UA5DJ,IA8DY,IAAZF,EAAkBpiC,EAAS1H,GAEzBiL,GAAQA,EAAOw8B,QACnB//B,EAASoiC,EAAQ9pC,GACbiL,IACFA,EAAOu8B,OACPoC,GAAS,IAGTliC,IAAWmiC,EAAS7C,QACtBmB,EAAOxnC,GAAU,yBACRsmC,EAAOqC,GAAW5hC,IAC3Bu/B,EAAK9oC,KAAKuJ,EAAQkgC,EAASO,GACtBP,EAAQlgC,IACVygC,EAAOnoC,GACd,MAAOb,GACH8L,IAAW2+B,GAAQ3+B,EAAOu8B,OAC9BW,EAAOhpC,IAGX+E,EAAMwlC,UAAY,GAClBxlC,EAAMslC,UAAW,EACbD,IAAarlC,EAAM8lC,WAAWE,GAAYhmC,QAI9CsgC,GAAgB,SAAU53B,EAAMo6B,EAAS/pB,GAC3C,IAAIvf,EAAOosC,EACPd,KACFtrC,EAAQK,GAASC,YAAY,UACvBgpC,QAAUA,EAChBtpC,EAAMuf,OAASA,EACfvf,EAAMysC,UAAUv9B,GAAM,GAAO,GAC7BpQ,EAAOgoC,cAAc9mC,IAChBA,EAAQ,CAAEspC,QAASA,EAAS/pB,OAAQA,IACtCgsB,KAA2Ba,EAAUttC,EAAO,KAAOoQ,IAAQk9B,EAAQpsC,GAC/DkP,IAASu8B,IIhJH,SAAUvnC,EAAG2L,GAC5B,IAAI68B,EAAU5tC,EAAO4tC,QACjBA,GAAWA,EAAQjrC,QACA,IAArB8G,UAAUC,OAAekkC,EAAQjrC,MAAMyC,GAAKwoC,EAAQjrC,MAAMyC,EAAG2L,IJ6IxB88B,CAAiB,8BAA+BptB,IAGrFitB,GAAc,SAAUhmC,GAC1BgjC,GAAK/oC,KAAK3B,GAAQ,WAChB,IAGIkL,EAHAs/B,EAAU9iC,EAAMK,OAChBvE,EAAQkE,EAAMlE,MAGlB,GAFmBsqC,GAAYpmC,KAG7BwD,EAAS+gC,IAAQ,WACXzC,GACFhvB,GAAQuzB,KAAK,qBAAsBvqC,EAAOgnC,GACrCxC,GAAc2E,GAAqBnC,EAAShnC,MAGrDkE,EAAM8lC,UAAYhE,IAAWsE,GAAYpmC,GAjH/B,EADF,EAmHJwD,EAAOvI,OAAO,MAAMuI,EAAO1H,UAKjCsqC,GAAc,SAAUpmC,GAC1B,OAzHY,IAyHLA,EAAM8lC,YAA0B9lC,EAAMqjC,QAG3C0C,GAAoB,SAAU/lC,GAChCgjC,GAAK/oC,KAAK3B,GAAQ,WAChB,IAAIwqC,EAAU9iC,EAAMK,OAChByhC,GACFhvB,GAAQuzB,KAAK,mBAAoBvD,GAC5BxC,GArIa,mBAqIoBwC,EAAS9iC,EAAMlE,WAIvDwO,GAAO,SAAU7P,EAAIuF,EAAOsmC,GAC9B,OAAO,SAAUxqC,GACfrB,EAAGuF,EAAOlE,EAAOwqC,KAIjBC,GAAiB,SAAUvmC,EAAOlE,EAAOwqC,GACvCtmC,EAAMqS,OACVrS,EAAMqS,MAAO,EACTi0B,IAAQtmC,EAAQsmC,GACpBtmC,EAAMlE,MAAQA,EACdkE,EAAMA,MAjJO,EAkJb2iC,GAAO3iC,GAAO,KAGZwmC,GAAkB,SAAUxmC,EAAOlE,EAAOwqC,GAC5C,IAAItmC,EAAMqS,KAAV,CACArS,EAAMqS,MAAO,EACTi0B,IAAQtmC,EAAQsmC,GACpB,IACE,GAAItmC,EAAMK,SAAWvE,EAAO,MAAMW,GAAU,oCAC5C,IAAIsmC,EAAOqC,GAAWtpC,GAClBinC,EACFgB,IAAU,WACR,IAAIjJ,EAAU,CAAEzoB,MAAM,GACtB,IACE0wB,EAAK9oC,KAAK6B,EACRwO,GAAKk8B,GAAiB1L,EAAS96B,GAC/BsK,GAAKi8B,GAAgBzL,EAAS96B,IAEhC,MAAO/E,GACPsrC,GAAezL,EAAS7/B,EAAO+E,QAInCA,EAAMlE,MAAQA,EACdkE,EAAMA,MA3KI,EA4KV2iC,GAAO3iC,GAAO,IAEhB,MAAO/E,GACPsrC,GAAe,CAAEl0B,MAAM,GAASpX,EAAO+E,MAKvCoR,KAEFszB,GAAqB,SAAiB+B,GACpCnnB,GAAWvmB,KAAM2rC,GAAoBF,IACrC9iC,GAAU+kC,GACV9C,GAAS1pC,KAAKlB,MACd,IAAIiH,EAAQe,GAAiBhI,MAC7B,IACE0tC,EAASn8B,GAAKk8B,GAAiBxmC,GAAQsK,GAAKi8B,GAAgBvmC,IAC5D,MAAO/E,GACPsrC,GAAevmC,EAAO/E,MAI1B0oC,GAAW,SAAiB8C,GAC1Bt7B,GAAiBpS,KAAM,CACrB8H,KAAM2jC,GACNnyB,MAAM,EACNizB,UAAU,EACVjC,QAAQ,EACRmC,UAAW,GACXM,WAAW,EACX9lC,MA3MQ,EA4MRlE,WAAOU,MAGFnC,UAAYioB,GAAYoiB,GAAmBrqC,UAAW,CAG7D0oC,KAAM,SAAc2D,EAAaC,GAC/B,IAAI3mC,EAAQykC,GAAwB1rC,MAChC4sC,EAAWvB,GAAqBnpB,GAAmBliB,KAAM2rC,KAO7D,OANAiB,EAASF,GAA2B,mBAAfiB,GAA4BA,EACjDf,EAASE,KAA4B,mBAAdc,GAA4BA,EACnDhB,EAAS5+B,OAAS+6B,GAAUhvB,GAAQ/L,YAASvK,EAC7CwD,EAAMqjC,QAAS,EACfrjC,EAAMwlC,UAAUpmC,KAAKumC,GAzNb,GA0NJ3lC,EAAMA,OAAkB2iC,GAAO3iC,GAAO,GACnC2lC,EAAS7C,SAIlB8D,MAAS,SAAUD,GACjB,OAAO5tC,KAAKgqC,UAAKvmC,EAAWmqC,MAGhC/C,GAAuB,WACrB,IAAId,EAAU,IAAIa,GACd3jC,EAAQe,GAAiB+hC,GAC7B/pC,KAAK+pC,QAAUA,EACf/pC,KAAK2qC,QAAUp5B,GAAKk8B,GAAiBxmC,GACrCjH,KAAKkrC,OAAS35B,GAAKi8B,GAAgBvmC,IAErC4kC,GAA2BrpC,EAAI6oC,GAAuB,SAAUz6B,GAC9D,OAAOA,IAAM+6B,IAAsB/6B,IAAMk6B,GACrC,IAAID,GAAqBj6B,GACzBk7B,GAA4Bl7B,IAGM,mBAAjBg7B,KACrBb,GAAaa,GAActqC,UAAU0oC,KAGrCjiC,GAAS6jC,GAActqC,UAAW,QAAQ,SAAcqsC,EAAaC,GACnE,IAAIv9B,EAAOrQ,KACX,OAAO,IAAI2rC,IAAmB,SAAUhB,EAASO,GAC/CH,GAAW7pC,KAAKmP,EAAMs6B,EAASO,MAC9BlB,KAAK2D,EAAaC,KAEpB,CAAEvlC,QAAQ,IAGQ,mBAAVohB,IAAsBxV,GAAE,CAAE1U,QAAQ,EAAMqD,YAAY,EAAM8J,QAAQ,GAAQ,CAEnFggB,MAAO,SAAe3oB,GACpB,OAAOunC,GAAeK,GAAoBliB,GAAOjZ,MAAMjR,EAAQyJ,iBAMvEiL,GAAE,CAAE1U,QAAQ,EAAM4T,MAAM,EAAMzG,OAAQ2L,IAAU,CAC9C2vB,QAAS2D,KAGX17B,GAAe07B,GAAoBF,IAAS,GAC5CxD,GAAWwD,IAEXX,GAAiBjiC,GAAW4iC,IAG5Bx3B,GAAE,CAAE5I,OAAQogC,GAASh/B,MAAM,EAAMC,OAAQ2L,IAAU,CAGjD6yB,OAAQ,SAAgBhG,GACtB,IAAI4I,EAAazC,GAAqBrrC,MAEtC,OADA8tC,EAAW5C,OAAOhqC,UAAKuC,EAAWyhC,GAC3B4I,EAAW/D,WAItB91B,GAAE,CAAE5I,OAAQogC,GAASh/B,MAAM,EAAMC,OAAmB2L,IAAU,CAG5DsyB,QAAS,SAAiBlpB,GACxB,OAAO6pB,GAAyEtrC,KAAMyhB,MAI1FxN,GAAE,CAAE5I,OAAQogC,GAASh/B,MAAM,EAAMC,OAAQ+wB,IAAuB,CAG9D2O,IAAK,SAAa1O,GAChB,IAAI9sB,EAAI5Q,KACJ8tC,EAAazC,GAAqBz6B,GAClC+5B,EAAUmD,EAAWnD,QACrBO,EAAS4C,EAAW5C,OACpBzgC,EAAS+gC,IAAQ,WACnB,IAAIuC,EAAkBplC,GAAUiI,EAAE+5B,SAC9B1xB,EAAS,GACT2P,EAAU,EACVolB,EAAY,EAChBlN,GAAQpD,GAAU,SAAUqM,GAC1B,IAAIpgC,EAAQif,IACRqlB,GAAgB,EACpBh1B,EAAO5S,UAAK5C,GACZuqC,IACAD,EAAgB7sC,KAAK0P,EAAGm5B,GAASC,MAAK,SAAUjnC,GAC1CkrC,IACJA,GAAgB,EAChBh1B,EAAOtP,GAAS5G,IACdirC,GAAarD,EAAQ1xB,MACtBiyB,QAEH8C,GAAarD,EAAQ1xB,MAGzB,OADIxO,EAAOvI,OAAOgpC,EAAOzgC,EAAO1H,OACzB+qC,EAAW/D,SAIpBmE,KAAM,SAAcxQ,GAClB,IAAI9sB,EAAI5Q,KACJ8tC,EAAazC,GAAqBz6B,GAClCs6B,EAAS4C,EAAW5C,OACpBzgC,EAAS+gC,IAAQ,WACnB,IAAIuC,EAAkBplC,GAAUiI,EAAE+5B,SAClC7J,GAAQpD,GAAU,SAAUqM,GAC1BgE,EAAgB7sC,KAAK0P,EAAGm5B,GAASC,KAAK8D,EAAWnD,QAASO,SAI9D,OADIzgC,EAAOvI,OAAOgpC,EAAOzgC,EAAO1H,OACzB+qC,EAAW/D,WKxXtB,IAaMpnC,GAbFL,GAA2B+H,EAA2D7H,EAOtF2rC,GAAmB,GAAGC,WACtB7kC,GAAM1H,KAAK0H,IAEX8kC,GAA0BzO,GAAqB,cAE/C0O,KAAgCD,KAC9B1rC,GAAaL,GAAyB6C,OAAO7D,UAAW,eACrDqB,IAAeA,GAAWM,WAKnCgR,GAAE,CAAE5I,OAAQ,SAAU2K,OAAO,EAAMtJ,QAAS4hC,KAAqBD,IAA2B,CAC1FD,WAAY,SAAoBhU,GAC9B,IAAI/pB,EAAOlL,OAAO3B,EAAuBxD,OACzC6/B,GAAWzF,GACX,IAAIzwB,EAAQH,GAASD,GAAIP,UAAUC,OAAS,EAAID,UAAU,QAAKvF,EAAW4M,EAAKpH,SAC3EqtB,EAASnxB,OAAOi1B,GACpB,OAAO+T,GACHA,GAAiBjtC,KAAKmP,EAAMimB,EAAQ3sB,GACpC0G,EAAKjN,MAAMuG,EAAOA,EAAQ2sB,EAAOrtB,UAAYqtB,KCzBrD,ICGQiQ,GAEAgI,GAOAzmC,GDZFg6B,GAAiB,SAAC/9B,GAAD,OAAYA,MAAAA,EAAiDA,EAAM8M,YAAc,MAClG+0B,GAAa,SAAC7hC,EAAO8M,GAAR,OAAwB2J,QAAQzW,GAAS8M,GAAe9M,aAAiB8M,IACtFg1B,GAAoB,SAAC9hC,GAAD,OAAWA,MAAAA,GAC/BF,GAAW,SAACE,GAAD,OAAW+9B,GAAe/9B,KAAW5C,QAEhD2kC,GAAW,SAAC/hC,GAAD,OAAW+9B,GAAe/9B,KAAWoB,QAEhDqpC,GAAa,SAACzqC,GAAD,OAAW+9B,GAAe/9B,KAAWhC,UAClDkL,GAAU,SAAClJ,GAAD,OAAWmJ,MAAMD,QAAQlJ,IAEnCgiC,GAAa,SAAChiC,GAAD,OAAW6hC,GAAW7hC,EAAOwgB,WAe1CkqB,GAAU,SAAC1qC,GAAD,OACd8hC,GAAkB9hC,KAChB+hC,GAAS/hC,IAAUkJ,GAAQlJ,IAAUgiC,GAAWhiC,MAAYA,EAAMkF,QACnEpF,GAASE,KAAW5C,OAAO0F,KAAK9C,GAAOkF,QA0B1CylC,GACmB7I,GADnB6I,GAEU7qC,GAFV6qC,GAlDiB,SAAC3qC,GAAD,OAAW+9B,GAAe/9B,KAAW4qC,SAAWA,OAAOrlC,MAAMvF,IAkD9E2qC,GAIU5I,GAJV4I,GAhDkB,SAAC3qC,GAAD,OAAW+9B,GAAe/9B,KAAWyW,SAgDvDk0B,GAMYF,GANZE,GAOSzhC,GAPTyhC,GASY3I,GATZ2I,GApCkB,SAAC3qC,GAAD,OACN,OAAVA,GACiB,WAAjBmzB,GAAOnzB,IACY,IAAnBA,EAAM6qC,UACiB,WAAvB1X,GAAOnzB,EAAM0K,QACkB,WAA/ByoB,GAAOnzB,EAAM8qC,gBA+BfH,GA1CgB,SAAC3qC,GAAD,OAAW6hC,GAAW7hC,EAAOxC,QA0C7CmtC,GAzCwB,SAAC3qC,GAAD,OAAW6hC,GAAW7hC,EAAO+qC,gBAyCrDJ,GAvCgB,SAAC3qC,GAAD,OAAW6hC,GAAW7hC,EAAOgrC,aAAgBlJ,GAAkB9hC,IAAU+hC,GAAS/hC,EAAMsV,OAuCxGq1B,GAtCkB,SAAC3qC,GAAD,OAAW6hC,GAAW7hC,EAAOikC,UAAYwG,GAAWzqC,EAAMimC,OAsC5E0E,GAxBc,SAAC3qC,GAEb,GAAI6hC,GAAW7hC,EAAO9D,OAAO6lB,KAC3B,OAAO,EAIT,IAAKggB,GAAS/hC,GACZ,OAAO,EAIT,IAAIgI,EAAShI,EACRA,EAAMqqC,WAAW,YAAerqC,EAAMqqC,WAAW,cACpDriC,EAAM,UAAApB,OAAa5G,IAGrB,IACE,OAAQ0qC,GAAQ,IAAI3oB,IAAI/Z,GAAQmqB,UAChC,MAAO11B,GACP,OAAO,IAIXkuC,GAkBSD,GCtEIO,IACLzI,GAAUzlC,SAASyD,cAAc,QAEjCgqC,GAAS,CACbU,iBAAkB,sBAClBC,cAAe,gBACfC,YAAa,gCACbC,WAAY,iBAGRtnC,GAAO3G,OAAO0F,KAAK0nC,IAAQz8B,MAAK,SAACrR,GAAD,YAAoCgD,IAAzB8iC,GAAQ93B,MAAMhO,QAExD+gB,GAAU1Z,KAAQymC,GAAOzmC,KAI3B,SAASunC,GAAQ9I,EAAS+I,GAC/B7F,YAAW,WACT,IAEElD,EAAQgJ,QAAS,EAGjBhJ,EAAQiJ,aAGRjJ,EAAQgJ,QAAS,EACjB,MAAO/uC,OAGR8uC,GC/BL,IAAMG,GAAU,CACdC;;EAAgC5uC,SAAS6uC,aACzCC,OAAQ3vC,OAAOX,UAAU4a,UAAU/P,SAAS,QAC5C0lC,SAAU,qBAAsB/uC,SAASgnC,gBAAgBr5B,QAAU,OAAOtI,KAAK7G,UAAU4a,WACzF41B,SAAU,kBAAkB3pC,KAAK7G,UAAUywC,UAC3CC,MAAO,uBAAuB7pC,KAAK7G,UAAUywC,WCJ3ClmC,GAAe,SAAUomC,GAC3B,OAAO,SAAU5/B,EAAMe,EAAY2V,EAAiBmpB,GAClDvnC,GAAUyI,GACV,IAAItM,EAAIsI,GAASiD,GACbvQ,EAAO8D,EAAckB,GACrBmE,EAASO,GAAS1E,EAAEmE,QACpBU,EAAQsmC,EAAWhnC,EAAS,EAAI,EAChCuB,EAAIylC,GAAY,EAAI,EACxB,GAAIlpB,EAAkB,EAAG,OAAa,CACpC,GAAIpd,KAAS7J,EAAM,CACjBowC,EAAOpwC,EAAK6J,GACZA,GAASa,EACT,MAGF,GADAb,GAASa,EACLylC,EAAWtmC,EAAQ,EAAIV,GAAUU,EACnC,MAAMjG,UAAU,+CAGpB,KAAMusC,EAAWtmC,GAAS,EAAIV,EAASU,EAAOA,GAASa,EAAOb,KAAS7J,IACrEowC,EAAO9+B,EAAW8+B,EAAMpwC,EAAK6J,GAAQA,EAAO7E,IAE9C,OAAOorC,IC1BPC,GD8Ba,CAGf9I,KAAMx9B,IAAa,GAGnBumC,MAAOvmC,IAAa,ICpC6Bw9B,KAM/CxxB,GAAgBR,GAAoB,UACpCS,GAAiBL,GAAwB,SAAU,CAAEhT,EAAG,ICGrD,SAAS4tC,GAAQ7qC,EAAQkD,GAC9B,OAAOA,EAAKrF,MAAM,KAAKitC,QAAO,SAACnZ,EAAK9yB,GAAN,OAAc8yB,GAAOA,EAAI9yB,KAAMmB,GAIxD,SAAS+qC,KAAgC,IAAA,IAAzBllC,EAAyBrC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAhB,GAAgBwnC,EAAAxnC,UAAAC,OAATwnC,EAAS,IAAAvjC,MAAAsjC,EAAA,EAAAA,EAAA,EAAA,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAATD,EAASC,EAAA,GAAA1nC,UAAA0nC,GAC9C,IAAKD,EAAQxnC,OACX,OAAOoC,EAGT,IAAM7C,EAASioC,EAAQrlB,QAEvB,OAAK5J,GAAUhZ,IAIfrH,OAAO0F,KAAK2B,GAAQiJ,SAAQ,SAACpN,GACvBmd,GAAUhZ,EAAOnE,KACdlD,OAAO0F,KAAKwE,GAAQlB,SAAS9F,IAChClD,OAAOslB,OAAOpb,EAAdssB,GAAA,GAAyBtzB,EAAM,KAGjCksC,GAAOllC,EAAOhH,GAAMmE,EAAOnE,KAE3BlD,OAAOslB,OAAOpb,EAAdssB,GAAA,GAAyBtzB,EAAMmE,EAAOnE,QAInCksC,GAAM//B,WAAN,EAAA,CAAOnF,GAAPV,OAAkB8lC,KAfhBplC,ECjBJ,SAAS8H,GAAKw9B,EAAU5O,GAE7B,IAAM6O,EAAUD,EAAS1nC,OAAS0nC,EAAW,CAACA,GAI9CzjC,MAAMosB,KAAKsX,GACRC,UACAp/B,SAAQ,SAAC80B,EAAS58B,GACjB,IAAMmnC,EAAQnnC,EAAQ,EAAIo4B,EAAQgP,WAAU,GAAQhP,EAE9CuI,EAAS/D,EAAQyK,WACjBC,EAAU1K,EAAQ2K,YAIxBJ,EAAMniC,YAAY43B,GAKd0K,EACF3G,EAAO6G,aAAaL,EAAOG,GAE3B3G,EAAO37B,YAAYmiC,MAMpB,SAASM,GAAc7K,EAASpb,GAChC3J,GAAW+kB,KAAY/kB,GAAS2J,IAMrChqB,OAAO6X,QAAQmS,GACZxZ,QAAO,SAAA0/B,GAAA,IAAItuC,EAAJs1B,GAAAgZ,EAAA,GAAA,GAAA,OAAgB7vB,GAAmBze,MAC1C0O,SAAQ,SAAA6/B,GAAA,IAAAC,EAAAlZ,GAAAiZ,EAAA,GAAEjtC,EAAFktC,EAAA,GAAOxuC,EAAPwuC,EAAA,GAAA,OAAkBhL,EAAQiL,aAAantC,EAAKtB,MAIlD,SAASwB,GAAcuD,EAAMqjB,EAAYsmB,GAE9C,IAAMlL,EAAUzlC,SAASyD,cAAcuD,GAavC,OAVI0Z,GAAU2J,IACZimB,GAAc7K,EAASpb,GAIrB3J,GAAUiwB,KACZlL,EAAQmL,UAAYD,GAIflL,EAaF,SAASoL,GAAc7pC,EAAMwiC,EAAQnf,EAAYsmB,GACjDjwB,GAAW8oB,IAIhBA,EAAO37B,YAAYpK,GAAcuD,EAAMqjB,EAAYsmB,IAI9C,SAASG,GAAcrL,GACxB/kB,GAAY+kB,IAAY/kB,GAAS+kB,GACnCr5B,MAAMosB,KAAKiN,GAAS90B,QAAQmgC,IAIzBpwB,GAAW+kB,IAAa/kB,GAAW+kB,EAAQyK,aAIhDzK,EAAQyK,WAAWxH,YAAYjD,GAI1B,SAASsL,GAAatL,GAC3B,GAAK/kB,GAAW+kB,GAMhB,IAPoC,IAK9Bt9B,EAAWs9B,EAAQuL,WAAnB7oC,OAECA,EAAS,GACds9B,EAAQiD,YAAYjD,EAAQwL,WAC5B9oC,GAAU,EAKP,SAAS+oC,GAAeC,EAAUC,GACvC,OAAK1wB,GAAW0wB,IAAc1wB,GAAW0wB,EAASlB,aAAgBxvB,GAAWywB,IAI7EC,EAASlB,WAAWmB,aAAaF,EAAUC,GAEpCD,GALE,KASJ,SAASG,GAA0BC,EAAKC,GAM7C,IAAK9wB,GAAU6wB,IAAQ7wB,GAAS6wB,GAC9B,MAAO,GAGT,IAAMlnB,EAAa,GACbonB,EAAWhC,GAAO,GAAI+B,GAwC5B,OAtCAD,EAAIhvC,MAAM,KAAKoO,SAAQ,SAACsK,GAEtB,IAAMy2B,EAAWz2B,EAAEwiB,OACbkU,EAAYD,EAASxmC,QAAQ,IAAK,IAGlCqjB,EAFWmjB,EAASxmC,QAAQ,SAAU,IAErB3I,MAAM,KACtBgB,EAPqBg0B,GAOdhJ,EAPc,GAAA,GAQtBtsB,EAAQssB,EAAMpmB,OAAS,EAAIomB,EAAM,GAAGrjB,QAAQ,QAAS,IAAM,GAIjE,OAFcwmC,EAASp0B,OAAO,IAG5B,IAAK,IAECoD,GAAU+wB,EAASG,OACrBvnB,EAAWunB,MAAX,GAAA/nC,OAAsB4nC,EAASG,MAA/B,KAAA/nC,OAAwC8nC,GAExCtnB,EAAWunB,MAAQD,EAErB,MAEF,IAAK,IAEHtnB,EAAW1kB,GAAK+rC,EAASxmC,QAAQ,IAAK,IACtC,MAEF,IAAK,IAEHmf,EAAW9mB,GAAOtB,MASjBwtC,GAAOgC,EAAUpnB,GAInB,SAASwnB,GAAapM,EAASgJ,GACpC,GAAK/tB,GAAW+kB,GAAhB,CAIA,IAAIqM,EAAOrD,EAEN/tB,GAAWoxB,KACdA,GAAQrM,EAAQgJ,QAIlBhJ,EAAQgJ,OAASqD,GAIZ,SAASC,GAAYtM,EAASkM,EAAWK,GAC9C,GAAItxB,GAAY+kB,GACd,OAAOr5B,MAAMosB,KAAKiN,GAAS70B,KAAI,SAAClR,GAAD,OAAOqyC,GAAYryC,EAAGiyC,EAAWK,MAGlE,GAAItxB,GAAW+kB,GAAU,CACvB,IAAIx9B,EAAS,SAMb,YALqB,IAAV+pC,IACT/pC,EAAS+pC,EAAQ,MAAQ,UAG3BvM,EAAQwM,UAAUhqC,GAAQ0pC,GACnBlM,EAAQwM,UAAUC,SAASP,GAGpC,OAAO,EAIF,SAASQ,GAAS1M,EAASkM,GAChC,OAAOjxB,GAAW+kB,IAAYA,EAAQwM,UAAUC,SAASP,GAIpD,SAAS/M,GAAQa,EAASiM,GAAU,IACjClxC,EAAc0kC,QAAd1kC,UAaR,OANEA,EAAUokC,SACVpkC,EAAU4xC,uBACV5xC,EAAU6xC,oBACV7xC,EAAU8xC,mBARZ,WACE,OAAOlmC,MAAMosB,KAAKx4B,SAAS6kC,iBAAiB6M,IAAWroC,SAASnK,QAUpDkB,KAAKqlC,EAASiM,GAwBvB,SAASa,GAAYb,GAC1B,OAAOxyC,KAAK2wC,SAAS2C,UAAU3N,iBAAiB6M,GAI3C,SAASe,GAAWf,GACzB,OAAOxyC,KAAK2wC,SAAS2C,UAAU9M,cAAcgM,GAIxC,SAASgB,KAA2C,IAAlCjN,EAAkCv9B,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAxB,KAAMyqC,EAAkBzqC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACpDwY,GAAW+kB,KAKhBA,EAAQmN,MAAM,CAAEC,eAAe,IAG3BF,GACFZ,GAAYtM,EAASvmC,KAAK0mC,OAAOkN,WAAWH,WFxQhDx/B,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QAASmJ,KAAkBC,KAJ3CizB,IAAW8K,GAAiB,IAAMA,GAAiB,IAIwB,CAC3FvD,OAAQ,SAAgBl/B,GACtB,OAAO++B,GAAQnwC,KAAMoR,EAAYpI,UAAUC,OAAQD,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MGR7F,IA0FUqwC,GA1FJC,GAAgB,CACpBC,YAAa,SACbC,YAAa,IACbC,aAAc,cACdC,YAAa,yBACbC,YAAa,UAITC,GAAU,CAEdC,MAAO,gBAAiBxzC,SAASyD,cAAc,SAC/CgwC,MAAO,gBAAiBzzC,SAASyD,cAAc,SAI/C5C,MAPc,SAORmG,EAAM0sC,EAAUC,GACpB,IAAMC,EAAgBjF,GAAQK,UAAY2E,GAAeJ,GAAQI,YAC3DE,EAAMN,GAAQvsC,IAAsB,UAAb0sC,EAG7B,MAAO,CACLG,IAAAA,EACAC,GAJSD,GAAON,GAAQQ,aAAwB,UAAT/sC,IAAqB2nC,GAAQK,UAAY4E,KAUpFI,MACMrF,GAAQK,WAMRtuB,GAAYjd,GAAc,SAASwwC,8BAMnCj0C,SAASk0C,yBAA4BzwC,GAAc,SAAS0wC,0BASlEC,QAAS1zB,GAAYvhB,OAAOk1C,uCAI5BV,YAAa,gBAAiB3zC,SAASyD,cAAc,SAKrD6wC,KAnDc,SAmDTrxC,GACH,GAAIyd,GAASzd,GACX,OAAO,EAFC,IAKHsxC,EALGhd,GAKUt0B,EAAMV,MAAM,KALtB,GAAA,GAMNyE,EAAO/D,EAGX,IAAK/D,KAAKs1C,SAAWD,IAAcr1C,KAAK8H,KACtC,OAAO,EAIL3G,OAAO0F,KAAKktC,IAAe5pC,SAASrC,KACtCA,GAAI,aAAA6C,OAAiBopC,GAAchwC,GAA/B,MAGN,IACE,OAAOyW,QAAQ1S,GAAQ9H,KAAKu1C,MAAMC,YAAY1tC,GAAMkE,QAAQ,KAAM,KAClE,MAAOxL,GACP,OAAO,IAKXi1C,WAAY,eAAgB30C,SAASyD,cAAc,SAGnDswC,YACQf,GAAQhzC,SAASyD,cAAc,SACrCuvC,GAAMhsC,KAAO,QACS,UAAfgsC,GAAMhsC,MAKf4tC,MAAO,iBAAkB50C,SAASgnC,gBAGlC6N,aAAoC,IAAvB3G,GAIb4G,cAAe,eAAgB31C,QAAUA,OAAO41C,WAAW,4BAA4BnQ,SCzGnFoQ,GAA4B,WAEhC,IAAIC,GAAY,EAChB,IACE,IAAM3tC,EAAUjH,OAAOC,eAAe,GAAI,UAAW,CACnDC,IADmD,WAGjD,OADA00C,GAAY,EACL,QAGX91C,OAAOqpC,iBAAiB,OAAQ,KAAMlhC,GACtCnI,OAAO+1C,oBAAoB,OAAQ,KAAM5tC,GACzC,MAAO5H,IAIT,OAAOu1C,EAhByB,GAoB3B,SAASE,GAAe1P,EAAS9lC,EAAO+rB,GAA2D,IAAA+N,EAAAv6B,KAAjD6pC,EAAiD7gC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAAjCktC,IAAiCltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAAjBsY,EAAiBtY,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAExG,GAAKu9B,GAAa,qBAAsBA,IAAY/kB,GAAS/gB,IAAW+gB,GAAYgL,GAApF,CAKA,IAAM+hB,EAAS9tC,EAAM4C,MAAM,KAGvB+E,EAAUkZ,EAGVw0B,KACF1tC,EAAU,CAER8tC,QAAAA,EAEA50B,QAAAA,IAKJitB,EAAO98B,SAAQ,SAAC3J,GACVyyB,GAAQA,EAAK4b,gBAAkBtM,GAEjCtP,EAAK4b,eAAe9vC,KAAK,CAAEkgC,QAAAA,EAASz+B,KAAAA,EAAM0kB,SAAAA,EAAUpkB,QAAAA,IAGtDm+B,EAAQsD,EAAS,mBAAqB,uBAAuB/hC,EAAM0kB,EAAUpkB,OAK1E,SAASguC,GAAG7P,GAAiE,IAAxDgI,EAAwDvlC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAA/C,GAAIwjB,EAA2CxjB,UAAAC,OAAA,EAAAD,UAAA,QAAAvF,EAAjCyyC,IAAiCltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAAjBsY,EAAiBtY,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAClFitC,GAAe/0C,KAAKlB,KAAMumC,EAASgI,EAAQ/hB,GAAU,EAAM0pB,EAAS50B,GAI/D,SAAS+0B,GAAI9P,GAAiE,IAAxDgI,EAAwDvlC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAA/C,GAAIwjB,EAA2CxjB,UAAAC,OAAA,EAAAD,UAAA,QAAAvF,EAAjCyyC,IAAiCltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAAjBsY,EAAiBtY,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACnFitC,GAAe/0C,KAAKlB,KAAMumC,EAASgI,EAAQ/hB,GAAU,EAAO0pB,EAAS50B,GAIhE,SAASg1B,GAAK/P,GAAiE,IAAAgQ,EAAAv2C,KAAxDuuC,EAAwDvlC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAA/C,GAAIwjB,EAA2CxjB,UAAAC,OAAA,EAAAD,UAAA,QAAAvF,EAAjCyyC,IAAiCltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAAjBsY,EAAiBtY,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAC9EwtC,EAAe,SAAfA,IACJH,GAAI9P,EAASgI,EAAQiI,EAAcN,EAAS50B,GADZ,IAAA,IAAAkvB,EAAAxnC,UAAAC,OAAT2L,EAAS,IAAA1H,MAAAsjC,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAT97B,EAAS87B,GAAA1nC,UAAA0nC,GAEhClkB,EAAShc,MAAM+lC,EAAM3hC,IAGvBqhC,GAAe/0C,KAAKlB,KAAMumC,EAASgI,EAAQiI,GAAc,EAAMN,EAAS50B,GAInE,SAASm1B,GAAalQ,GAAkD,IAAzCz+B,EAAyCkB,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAlC,GAAInI,EAA8BmI,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAAb/H,EAAa+H,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAJ,GAEzE,GAAKwY,GAAW+kB,KAAY/kB,GAAS1Z,GAArC,CAKA,IAAMrH,EAAQ,IAAIN,YAAY2H,EAAM,CAClCjH,QAAAA,EACAI,OAAM62B,GAAAA,GAAA,GAAO72B,GAAP,GAAA,CAAey1C,KAAM12C,SAI7BumC,EAAQgB,cAAc9mC,IAIjB,SAASk2C,KACV32C,MAAQA,KAAKm2C,iBACfn2C,KAAKm2C,eAAe1kC,SAAQ,SAACmlC,GAAS,IAC5BrQ,EAAqCqQ,EAArCrQ,QAASz+B,EAA4B8uC,EAA5B9uC,KAAM0kB,EAAsBoqB,EAAtBpqB,SAAUpkB,EAAYwuC,EAAZxuC,QACjCm+B,EAAQyP,oBAAoBluC,EAAM0kB,EAAUpkB,MAG9CpI,KAAKm2C,eAAiB,IAKnB,SAASU,KAAQ,IAAAC,EAAA92C,KACtB,OAAO,IAAIgoC,SAAQ,SAAC2C,GAAD,OACjBmM,EAAKD,MAAQpN,WAAWkB,EAAS,GAAKyL,GAAGl1C,KAAK41C,EAAMA,EAAKnG,SAAS2C,UAAW,QAAS3I,MACtFX,MAAK,eC5GF,SAAS+M,GAAeh0C,GACzBye,GAAWze,IACbA,EAAMinC,KAAK,MAAM,eCHd,SAASgN,GAAcjzC,GAC5B,SAAKyd,GAASzd,IAAYyd,GAAUzd,IAAWA,EAAMoG,SAAS,QAIhDqX,GAASzd,GAASA,EAAQA,EAAMV,MAAM,MAEvCqO,IAAIi9B,QAAQ98B,MAAM2P,IAG1B,SAASy1B,GAAkBC,GAChC,IAAK11B,GAAS01B,KAAWA,EAAMrlC,MAAM2P,IACnC,OAAO,KAF8B,IAAA21B,EAAA9e,GAKf6e,EALe,GAKhC/P,EALgCgQ,EAAA,GAKzBC,EALyBD,EAAA,GAOjCE,EADa,SAAbC,EAAcC,EAAGC,GAAJ,OAAiB,IAANA,EAAUD,EAAID,EAAWE,EAAGD,EAAIC,GAC9CF,CAAWnQ,EAAOiQ,GAElC,MAAO,CAACjQ,EAAQkQ,EAASD,EAASC,GAG7B,SAASI,GAAe1zC,GAC7B,IAAM2zC,EAAQ,SAACR,GAAD,OAAYF,GAAcE,GAASA,EAAM7zC,MAAM,KAAKqO,IAAIi9B,QAAU,MAE5EuI,EAAQQ,EAAM3zC,GAalB,GAVc,OAAVmzC,IACFA,EAAQQ,EAAM13C,KAAK0mC,OAAOwQ,QAId,OAAVA,IAAmB11B,GAASxhB,KAAK23C,QAAUn2B,GAASxhB,KAAK23C,MAAMT,SAC9DA,EAAUl3C,KAAK23C,MAAfT,OAIS,OAAVA,GAAkBl3C,KAAKs1C,QAAS,CAAA,IAAAsC,EACE53C,KAAKu1C,MACzC2B,EAAQD,GAAkB,CAFQW,EAC1BC,WAD0BD,EACdE,cAItB,OAAOZ,EAIF,SAASa,GAAeh0C,GAC7B,IAAK/D,KAAKg4C,QACR,MAAO,GAF2B,IAK5BjW,EAAY/hC,KAAK2wC,SAAjB5O,QACFmV,EAAQO,GAAev2C,KAAKlB,KAAM+D,GANJk0C,EAAA5f,GAOrB7W,GAAS01B,GAASA,EAAQ,CAAC,EAAG,GAPT,GAQ9BgB,EAAW,IARmBD,EAAA,GAAAA,EAAA,GAapC,GAHAlW,EAAQtzB,MAAM0pC,cAAd,GAAAxtC,OAAiCutC,EAAjC,KAGIl4C,KAAKo4C,UAAYp4C,KAAK0mC,OAAO2R,MAAMC,SAAWt4C,KAAK+1C,UAAUnB,GAAI,CACnE,IAAMwC,EAAU,IAAMp3C,KAAKu1C,MAAMgD,YAAehpB,SAAStvB,OAAOu4C,iBAAiBx4C,KAAKu1C,OAAO4C,cAAe,IACtGM,GAAUrB,EAASc,IAAYd,EAAS,IAE1Cp3C,KAAK04C,WAAWC,OAClB5W,EAAQtzB,MAAM0pC,cAAgB,KAE9Bn4C,KAAKu1C,MAAM9mC,MAAMmqC,UAAjB,eAAAjuC,OAA4C8tC,EAA5C,WAEOz4C,KAAKs1C,SACdvT,EAAQgR,UAAUlJ,OAAO7pC,KAAK0mC,OAAOkN,WAAWiF,gBAA2B,OAAV3B,GAGnE,MAAO,CAAEgB,QAAAA,EAAShB,MAAAA,GCpEpB,IAAM4B,GAAQ,CACZC,WADY,WACC,IAAAxe,EAAAv6B,KACX,OAAKA,KAAKs1C,QAIMpoC,MAAMosB,KAAKt5B,KAAKu1C,MAAM5P,iBAAiB,WAGxCh0B,QAAO,SAACnJ,GACrB,IAAMV,EAAOU,EAAOy+B,aAAa,QAEjC,QAAIzlB,GAAS1Z,IAINusC,GAAQe,KAAKl0C,KAAKq5B,EAAMzyB,MAbxB,IAkBXkxC,kBArBY,WAuBV,OAAIh5C,KAAK0mC,OAAOuS,QAAQvsC,OACf1M,KAAK0mC,OAAOuS,QAAQ7wC,QAItB0wC,GAAMC,WACV73C,KAAKlB,MACL0R,KAAI,SAAClJ,GAAD,OAAYmmC,OAAOnmC,EAAOy+B,aAAa,YAC3Ct1B,OAAO6I,UAGZ0+B,MAlCY,WAmCV,GAAKl5C,KAAKs1C,QAAV,CAIA,IAAM6D,EAASn5C,KAGfm5C,EAAO/wC,QAAQgxC,MAAQD,EAAOzS,OAAO0S,MAAMhxC,QAGtCoZ,GAASxhB,KAAK0mC,OAAOwQ,QACxBa,GAAe72C,KAAKi4C,GAItBh4C,OAAOC,eAAe+3C,EAAO5D,MAAO,UAAW,CAC7Cl0C,IAD6C,WAG3C,IACMmH,EADUswC,GAAMC,WAAW73C,KAAKi4C,GACfrnC,MAAK,SAACiK,GAAD,OAAOA,EAAEkrB,aAAa,SAAWkS,EAAO3wC,UAGpE,OAAOA,GAAUmmC,OAAOnmC,EAAOy+B,aAAa,UAE9CjhC,IAT6C,SASzCjC,GACF,GAAIo1C,EAAOF,UAAYl1C,EAAvB,CAKA,GAAIo1C,EAAOzS,OAAOuS,QAAQvsC,QAAU8U,GAAY23B,EAAOzS,OAAOuS,QAAQI,UACpEF,EAAOzS,OAAOuS,QAAQI,SAASt1C,OAC1B,CAEL,IAEMyE,EAFUswC,GAAMC,WAAW73C,KAAKi4C,GAEfrnC,MAAK,SAACiK,GAAD,OAAO4yB,OAAO5yB,EAAEkrB,aAAa,WAAaljC,KAGtE,IAAKyE,EACH,OARG,IAAA8wC,EAY8DH,EAAO5D,MAAlEgE,EAZHD,EAYGC,YAAaC,EAZhBF,EAYgBE,OAAQC,EAZxBH,EAYwBG,QAASC,EAZjCJ,EAYiCI,WAAYC,EAZ7CL,EAY6CK,aAGlDR,EAAO5D,MAAM3mC,IAAMpG,EAAOy+B,aAAa,QAGvB,SAAZwS,GAAsBC,KAExBP,EAAO7C,KAAK,kBAAkB,WAC5B6C,EAAOC,MAAQO,EACfR,EAAOI,YAAcA,EAGhBC,GACHzC,GAAeoC,EAAOS,WAK1BT,EAAO5D,MAAMsE,QAKjBpD,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,iBAAiB,EAAO,CAC9D0D,QAASl1C,UAQjB+1C,eAhHY,WAiHL95C,KAAKs1C,UAKV1D,GAAckH,GAAMC,WAAW73C,KAAKlB,OAKpCA,KAAKu1C,MAAM/D,aAAa,MAAOxxC,KAAK0mC,OAAOqT,YAK3C/5C,KAAKu1C,MAAMsE,OAGX75C,KAAKg6C,MAAMhV,IAAI,iCCvIZ,SAASiV,GAAO3/B,GACrB,OAAKkH,GAASlH,GAIPA,EAAM3I,QAAO,SAACilC,EAAMjtC,GAAP,OAAiB2Q,EAAMlQ,QAAQwsC,KAAUjtC,KAHpD2Q,ECLX,IAAIlZ,GAAiBiJ,EAA+C7H,EAChEqI,GAAsBmiB,GAAsDxqB,EAM5E4P,GAAmBosB,GAAuCx4B,IAI1D+b,GAAQrS,GAAgB,SACxBwqC,GAAe36C,EAAOyc,OACtBqB,GAAkB68B,GAAa54C,UAC/Bob,GAAM,KACNC,GAAM,KAGNw9B,GAAc,IAAID,GAAax9B,MAASA,GAExCR,GAAgBU,GAAcV,cAUlC,GARaxX,GAAe8G,GAAS,UAAY2uC,IAAej+B,IAAiBla,GAAM,WAGrF,OAFA2a,GAAIoF,KAAS,EAENm4B,GAAax9B,KAAQA,IAAOw9B,GAAav9B,KAAQA,IAAiC,QAA1Bu9B,GAAax9B,GAAK,SAKvE,CA0CV,IAzCA,IAAI09B,GAAgB,SAAgBC,EAASr9B,GAC3C,IAGInB,EAHAy+B,EAAet6C,gBAAgBo6C,GAC/BG,EAAkBt4B,GAASo4B,GAC3BG,OAA8B/2C,IAAVuZ,EAGxB,IAAKs9B,GAAgBC,GAAmBF,EAAQxpC,cAAgBupC,IAAiBI,EAC/E,OAAOH,EAGLF,GACEI,IAAoBC,IAAmBH,EAAUA,EAAQ7xC,QACpD6xC,aAAmBD,KACxBI,IAAmBx9B,EAAQy9B,GAASv5C,KAAKm5C,IAC7CA,EAAUA,EAAQ7xC,QAGhB0T,KACFL,IAAWmB,GAASA,EAAM5S,QAAQ,MAAQ,KAC9B4S,EAAQA,EAAMhR,QAAQ,KAAM,KAG1C,IAAIvB,EAASozB,GACXsc,GAAc,IAAID,GAAaG,EAASr9B,GAASk9B,GAAaG,EAASr9B,GACvEs9B,EAAet6C,KAAOqd,GACtB+8B,IAKF,OAFIl+B,IAAiBL,GAAQzJ,GAAiB3H,EAAQ,CAAEoR,OAAQA,IAEzDpR,GAELiwC,GAAQ,SAAUr2C,GACpBA,KAAO+1C,IAAiBh5C,GAAeg5C,GAAe/1C,EAAK,CACzDrB,cAAc,EACd3B,IAAK,WAAc,OAAO64C,GAAa71C,IACvC2B,IAAK,SAAUpE,GAAMs4C,GAAa71C,GAAOzC,MAGzCiF,GAAOgE,GAAoBqvC,IAC3BvwC,GAAQ,EACL9C,GAAKoC,OAASU,IAAO+wC,GAAM7zC,GAAK8C,OACvC0T,GAAgBxM,YAAcupC,GAC9BA,GAAc94C,UAAY+b,GAC1BtV,GAASxI,EAAQ,SAAU66C,ICnEtB,SAASO,GAAO52C,GAAgB,IAAA,IAAAysC,EAAAxnC,UAAAC,OAAN2L,EAAM,IAAA1H,MAAAsjC,EAAA,EAAAA,EAAA,EAAA,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAN97B,EAAM87B,EAAA,GAAA1nC,UAAA0nC,GACrC,OAAIlvB,GAASzd,GACJA,EAGFA,EAAMb,WAAW8I,QAAQ,YAAY,SAAC2N,EAAOnP,GAAR,OAAcoK,EAAKpK,GAAGtH,cDkEpE+kC,GAAW,UCrDJ,IAAM2S,GAAa,WAAA,IAAC72C,EAADiF,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAS,GAAI8I,EAAb9I,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAoB,GAAIgD,EAAxBhD,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAkC,GAAlC,OACxBjF,EAAMiI,QAAQ,IAAIgQ,OAAOlK,EAAK5O,WAAW8I,QAAQ,4BAA6B,QAAS,KAAMA,EAAQ9I,aAG1F23C,GAAc,WAAA,IAAC92C,EAADiF,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAS,GAAT,OACzBjF,EAAMb,WAAW8I,QAAQ,UAAU,SAACylC,GAAD,OAAUA,EAAKrzB,OAAO,GAAG08B,cAAgBrJ,EAAKsJ,OAAO,GAAG9uC,kBAGtF,SAAS+uC,KAAyB,IAAZj3C,EAAYiF,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAJ,GAC/B+C,EAAShI,EAAMb,WAYnB,OATA6I,EAAS6uC,GAAW7uC,EAAQ,IAAK,KAGjCA,EAAS6uC,GAAW7uC,EAAQ,IAAK,KAGjCA,EAAS8uC,GAAY9uC,GAGd6uC,GAAW7uC,EAAQ,IAAK,IAwB1B,SAASkvC,GAAQ1U,GACtB,IAAMxE,EAAUjhC,SAASyD,cAAc,OAEvC,OADAw9B,EAAQpzB,YAAY43B,GACbxE,EAAQmZ,UCrEjB,IAAMC,GAAY,CAChBrG,IAAK,MACLI,QAAS,UACT4D,MAAO,QACPT,MAAO,QACP+C,QAAS,WAGLC,GAAO,WACgB,IAAvBh3C,EAAuB2E,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAjB,GAAI09B,EAAa19B,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAJ,GACrB,GAAIwY,GAASnd,IAAQmd,GAASklB,GAC5B,MAAO,GAGT,IAAI36B,EAASskC,GAAQ3J,EAAO2U,KAAMh3C,GAElC,GAAImd,GAASzV,GACX,OAAI5K,OAAO0F,KAAKs0C,IAAWhxC,SAAS9F,GAC3B82C,GAAU92C,GAGZ,GAGT,IAAM2H,EAAU,CACdsvC,aAAc5U,EAAO6U,SACrBC,UAAW9U,EAAO+U,OAOpB,OAJAt6C,OAAO6X,QAAQhN,GAASyF,SAAQ,SAAA4/B,GAAY,IAAA4G,EAAA5f,GAAAgZ,EAAA,GAAVr2B,EAAUi9B,EAAA,GAAPyD,EAAOzD,EAAA,GAC1ClsC,EAAS6uC,GAAW7uC,EAAQiP,EAAG0gC,MAG1B3vC,GCnCL4vC,GAAAA,WACJ,SAAAA,EAAYxC,GAAQ,IAAA5e,EAAAv6B,KAAAo3B,GAAAp3B,KAAA27C,GAAAhkB,GAAA33B,KAAA,OAyBd,SAACqE,GACL,IAAKs3C,EAAQ5F,YAAcxb,EAAKoM,QAC9B,OAAO,KAGT,IAAM7gC,EAAQ7F,OAAO27C,aAAaC,QAAQthB,EAAKl2B,KAE/C,GAAImd,GAAS1b,GACX,OAAO,KAGT,IAAMg2C,EAAOC,KAAKrE,MAAM5xC,GAExB,OAAO0b,GAAUnd,IAAQA,EAAI4E,OAAS6yC,EAAKz3C,GAAOy3C,KAtChCnkB,GAAA33B,KAAA,OAyCd,SAACwF,GAEL,GAAKm2C,EAAQ5F,WAAcxb,EAAKoM,SAK3BnlB,GAAUhc,GAAf,CAKA,IAAIw2C,EAAUzhB,EAAKl5B,MAGfmgB,GAASw6B,KACXA,EAAU,IAIZzL,GAAOyL,EAASx2C,GAGhBvF,OAAO27C,aAAaK,QAAQ1hB,EAAKl2B,IAAK03C,KAAKvnC,UAAUwnC,QA/DrDh8C,KAAK2mC,QAAUwS,EAAOzS,OAAOsV,QAAQrV,QACrC3mC,KAAKqE,IAAM80C,EAAOzS,OAAOsV,QAAQ33C,I3L+tPjC,OApBAmzB,GAAamkB,EAAS,KAAM,CAAC,CAC3Bt3C,IAAK,YACLhD,IAAK,W2LxsPP,IACE,KAAM,iBAAkBpB,QACtB,OAAO,EAGT,IAAMkG,EAAO,UAOb,OAHAlG,OAAO27C,aAAaK,QAAQ91C,EAAMA,GAClClG,OAAO27C,aAAaM,WAAW/1C,IAExB,EACP,MAAO3F,GACP,OAAO,O3L4sPFm7C,E2LluPLA,GCFS,SAASjvB,GAAM7G,GAA4B,IAAvBs2B,EAAuBnzC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAR,OAChD,OAAO,IAAIg/B,SAAQ,SAAC2C,EAASO,GAC3B,IACE,IAAMkR,EAAU,IAAIC,eAGpB,KAAM,oBAAqBD,GACzB,OAGFA,EAAQ9S,iBAAiB,QAAQ,WAC/B,GAAqB,SAAjB6S,EACF,IACExR,EAAQoR,KAAKrE,MAAM0E,EAAQE,eAC3B,MAAO97C,GACPmqC,EAAQyR,EAAQE,mBAGlB3R,EAAQyR,EAAQG,aAIpBH,EAAQ9S,iBAAiB,SAAS,WAChC,MAAM,IAAI/oC,MAAM67C,EAAQI,WAG1BJ,EAAQttC,KAAK,MAAO+W,GAAK,GAGzBu2B,EAAQD,aAAeA,EAEvBC,EAAQK,OACR,MAAOj8C,GACP0qC,EAAO1qC,OC7BE,SAASk8C,GAAW72B,EAAKpf,GACtC,GAAK+a,GAAUqE,GAAf,CAIA,IAAM82B,EAAS,QACTC,EAAQp7B,GAAU/a,GAElBo2C,EAAS,WAAA,OAAsC,OAAhC/7C,SAASg8C,eAAer2C,IAEvCs2C,EAAS,SAACzJ,EAAW3nC,GAEzB2nC,EAAU4H,UAAYvvC,EAGlBixC,GAASC,KAKb/7C,SAAS6rB,KAAKqwB,sBAAsB,aAAc1J,IAIpD,IAAKsJ,IAAUC,IAAU,CACvB,IAAMI,EAAatB,GAAQ5F,UAErBzC,EAAYxyC,SAASyD,cAAc,OAQzC,GAPA+uC,EAAU9B,aAAa,SAAU,IAE7BoL,GACFtJ,EAAU9B,aAAa,KAAM/qC,GAI3Bw2C,EAAY,CACd,IAAMC,EAASj9C,OAAO27C,aAAaC,QAApB,GAAAlxC,OAA+BgyC,EAA/B,KAAAhyC,OAAyClE,IAGxD,GAFsB,OAAXy2C,EAEG,CACZ,IAAMvxC,EAAOowC,KAAKrE,MAAMwF,GACxBH,EAAOzJ,EAAW3nC,EAAKkC,UAK3B6e,GAAM7G,GACHmkB,MAAK,SAACv/B,GACD+W,GAAS/W,KAITwyC,GACFh9C,OAAO27C,aAAaK,QAApB,GAAAtxC,OACKgyC,EADL,KAAAhyC,OACelE,GACbs1C,KAAKvnC,UAAU,CACb3G,QAASpD,KAKfsyC,EAAOzJ,EAAW7oC,OAEnBojC,OAAM,iBCtEb,IAAI3kC,GAAOrH,KAAKqH,KACZC,GAAQtH,KAAKsH,MAIjB8K,GAAE,CAAE5I,OAAQ,OAAQoB,MAAM,GAAQ,CAChC0wC,MAAO,SAAev7C,GACpB,OAAQA,EAAK,EAAIuH,GAAQD,IAAMtH,MCF5B,IAAMw7C,GAAW,SAACr6C,GAAD,OAAWlB,KAAKs7C,MAAOp6C,EAAQ,GAAK,GAAM,GAAI,KACzDs6C,GAAa,SAACt6C,GAAD,OAAWlB,KAAKs7C,MAAOp6C,EAAQ,GAAM,GAAI,KACtDu6C,GAAa,SAACv6C,GAAD,OAAWlB,KAAKs7C,MAAMp6C,EAAQ,GAAI,KAGrD,SAASw6C,KAA6D,IAAlDC,EAAkDx0C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAA3C,EAAGy0C,EAAwCz0C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAAlB00C,EAAkB10C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAE3E,IAAKwY,GAAUg8B,GACb,OAAOD,QAAW95C,EAAWg6C,EAAcC,GAI7C,IAAM/C,EAAS,SAAC53C,GAAD,MAAW,IAAA4H,OAAI5H,GAAQK,OAAO,IAEzCu6C,EAAQP,GAASI,GACfI,EAAOP,GAAWG,GAClBK,EAAOP,GAAWE,GAUxB,OANEG,EADEF,GAAgBE,EAAQ,EACrB,GAAAhzC,OAAMgzC,EAAN,KAEG,GAIV,GAAAhzC,OAAU+yC,GAAYF,EAAO,EAAI,IAAM,IAAvC7yC,OAA4CgzC,GAA5ChzC,OAAoDgwC,EAAOiD,GAA3D,KAAAjzC,OAAoEgwC,EAAOkD,ICG7E,IAAMC,GAAW,CAEfC,WAFe,WAGb,IACMC,EADM,IAAIl4B,IAAI9lB,KAAK0mC,OAAOuX,QAASh+C,OAAOg7B,UAC/B5U,OAASpmB,OAAOg7B,SAAS5U,MAASopB,GAAQC,OAASzvC,OAAOi+C,cAE3E,MAAO,CACLr4B,IAAK7lB,KAAK0mC,OAAOuX,QACjBD,KAAAA,IAKJG,aAbe,WAcb,IAuCE,OAtCAn+C,KAAK2wC,SAASmN,SAAWvK,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUN,SAAS/b,SAG9E/hC,KAAK2wC,SAAS0N,QAAU,CACtBzE,KAAMvG,GAAYnyC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQzE,MAC3D0E,MAAO/K,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQC,OAC3DC,QAAShL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQE,SAC7DC,OAAQjL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQG,QAC5DC,YAAalL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQI,aACjEC,KAAMnL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQK,MAC1D5J,IAAKvB,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQvJ,KACzDI,QAAS3B,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQnJ,SAC7DyJ,SAAUpL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQM,UAC9DC,SAAUrL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQO,UAC9DlG,WAAYnF,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUC,QAAQ3F,aAIlE14C,KAAK2wC,SAASkO,SAAWtL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUS,UAGrE7+C,KAAK2wC,SAASmO,OAAS,CACrBC,KAAMxL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUU,OAAOC,MACzDC,OAAQzL,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAUU,OAAOE,SAI7Dh/C,KAAK2wC,SAASjiC,QAAU,CACtBomB,OAAQye,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAU1vC,QAAQomB,QAC5DykB,YAAahG,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAU1vC,QAAQ6qC,aACjE0F,SAAU1L,GAAWryC,KAAKlB,KAAMA,KAAK0mC,OAAO0X,UAAU1vC,QAAQuwC,WAI5Dz9B,GAAWxhB,KAAK2wC,SAASkO,YAC3B7+C,KAAK2wC,SAASjiC,QAAQwwC,YAAcl/C,KAAK2wC,SAASkO,SAASrY,cAAvB,IAAA77B,OAAyC3K,KAAK0mC,OAAOkN,WAAWuL,YAG/F,EACP,MAAOj9C,GAOP,OALAlC,KAAKg6C,MAAMoF,KAAK,kEAAmEl9C,GAGnFlC,KAAKq/C,sBAAqB,IAEnB,IAKXC,WAlEe,SAkEJx3C,EAAMqjB,GACf,IAAMriB,EAAY,6BACZm1C,EAAUH,GAASC,WAAW78C,KAAKlB,MACnCu/C,EAAQ,GAAA50C,OAAOszC,EAAQD,KAAqB,GAAdC,EAAQp4B,IAA9B,KAAAlb,OAA0C3K,KAAK0mC,OAAO8Y,YAE9DC,EAAO3+C,SAAS4+C,gBAAgB52C,EAAW,OACjDsoC,GACEqO,EACAlP,GAAOplB,EAAY,CACjBw0B,cAAe,OACfC,UAAW,WAKf,IAAMC,EAAM/+C,SAAS4+C,gBAAgB52C,EAAW,OAC1CJ,EAAI,GAAAiC,OAAM40C,EAAN,KAAA50C,OAAkB7C,GAe5B,MAVI,SAAU+3C,GACZA,EAAIC,eAAe,+BAAgC,OAAQp3C,GAI7Dm3C,EAAIC,eAAe,+BAAgC,aAAcp3C,GAGjE+2C,EAAK9wC,YAAYkxC,GAEVJ,GAITM,YArGe,SAqGH17C,GAAgB,IAAX27C,EAAWh3C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAJ,GAChByoC,EAAO4J,GAASh3C,EAAKrE,KAAK0mC,QAC1Bvb,EAAU2M,GAAAA,GAAA,GAAQkoB,GAAR,GAAA,CAActN,MAAO,CAACsN,EAAKtN,MAAO1yC,KAAK0mC,OAAOkN,WAAWrE,QAAQ59B,OAAO6I,SAAS/R,KAAK,OAEtG,OAAOlE,GAAc,OAAQ4mB,EAAYsmB,IAI3CwO,YA7Ge,SA6GHxO,GACV,GAAIjwB,GAASiwB,GACX,OAAO,KAGT,IAAMyO,EAAQ37C,GAAc,OAAQ,CAClCmuC,MAAO1yC,KAAK0mC,OAAOkN,WAAWuM,KAAKp9C,QAarC,OAVAm9C,EAAMvxC,YACJpK,GACE,OACA,CACEmuC,MAAO1yC,KAAK0mC,OAAOkN,WAAWuM,KAAKD,OAErCzO,IAIGyO,GAITE,aApIe,SAoIFC,EAAYL,GAAM,IAAAzlB,EAAAv6B,KACvBmrB,EAAaolB,GAAO,GAAIyP,GAC1Bl4C,EPnHD,WAAiC,IAClCiE,GADkC/C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAJ,IACf9F,WAMnB,OAHA6I,EAASivC,GAAajvC,IAGRqS,OAAO,GAAGnS,cAAgBF,EAAO3I,MAAM,GO4GxCk9C,CAAYD,GAEjB9oB,EAAQ,CACZgP,QAAS,SACTsD,QAAQ,EACRrb,MAAO,KACPixB,KAAM,KACNc,aAAc,KACdC,YAAa,MA2Bf,OAxBA,CAAC,UAAW,OAAQ,SAAS/uC,SAAQ,SAACpN,GAChClD,OAAO0F,KAAKskB,GAAYhhB,SAAS9F,KACnCkzB,EAAMlzB,GAAO8mB,EAAW9mB,UACjB8mB,EAAW9mB,OAKA,WAAlBkzB,EAAMgP,SAAyBplC,OAAO0F,KAAKskB,GAAYhhB,SAAS,UAClEghB,EAAWrjB,KAAO,UAIhB3G,OAAO0F,KAAKskB,GAAYhhB,SAAS,SAC9BghB,EAAWunB,MAAMrvC,MAAM,KAAKuO,MAAK,SAACrB,GAAD,OAAOA,IAAMgqB,EAAKmM,OAAOkN,WAAW6M,YACxElQ,GAAOplB,EAAY,CACjBunB,MAAK,GAAA/nC,OAAKwgB,EAAWunB,MAAhB,KAAA/nC,OAAyB3K,KAAK0mC,OAAOkN,WAAW6M,WAIzDt1B,EAAWunB,MAAQ1yC,KAAK0mC,OAAOkN,WAAW6M,QAIpCJ,GACN,IAAK,OACH9oB,EAAMsS,QAAS,EACftS,EAAM/I,MAAQ,OACd+I,EAAMgpB,aAAe,QACrBhpB,EAAMkoB,KAAO,OACbloB,EAAMipB,YAAc,QACpB,MAEF,IAAK,OACHjpB,EAAMsS,QAAS,EACftS,EAAM/I,MAAQ,OACd+I,EAAMgpB,aAAe,SACrBhpB,EAAMkoB,KAAO,SACbloB,EAAMipB,YAAc,QACpB,MAEF,IAAK,WACHjpB,EAAMsS,QAAS,EACftS,EAAM/I,MAAQ,iBACd+I,EAAMgpB,aAAe,kBACrBhpB,EAAMkoB,KAAO,eACbloB,EAAMipB,YAAc,cACpB,MAEF,IAAK,aACHjpB,EAAMsS,QAAS,EACftS,EAAM/I,MAAQ,kBACd+I,EAAMgpB,aAAe,iBACrBhpB,EAAMkoB,KAAO,mBACbloB,EAAMipB,YAAc,kBACpB,MAEF,IAAK,aACHr1B,EAAWunB,OAAX,IAAA/nC,OAAwB3K,KAAK0mC,OAAOkN,WAAW6M,QAA/C,cACA34C,EAAO,OACPyvB,EAAM/I,MAAQ,OACd+I,EAAMkoB,KAAO,OACb,MAEF,QACMj+B,GAAS+V,EAAM/I,SACjB+I,EAAM/I,MAAQ1mB,GAEZ0Z,GAAS+V,EAAMkoB,QACjBloB,EAAMkoB,KAAOY,GAInB,IAAMK,EAASn8C,GAAcgzB,EAAMgP,SA+CnC,OA5CIhP,EAAMsS,QAER6W,EAAO/xC,YACLmvC,GAASwB,WAAWp+C,KAAKlB,KAAMu3B,EAAMipB,YAAa,CAChD9N,MAAO,mBAGXgO,EAAO/xC,YACLmvC,GAASwB,WAAWp+C,KAAKlB,KAAMu3B,EAAMkoB,KAAM,CACzC/M,MAAO,uBAKXgO,EAAO/xC,YACLmvC,GAASiC,YAAY7+C,KAAKlB,KAAMu3B,EAAMgpB,aAAc,CAClD7N,MAAO,oBAGXgO,EAAO/xC,YACLmvC,GAASiC,YAAY7+C,KAAKlB,KAAMu3B,EAAM/I,MAAO,CAC3CkkB,MAAO,0BAIXgO,EAAO/xC,YAAYmvC,GAASwB,WAAWp+C,KAAKlB,KAAMu3B,EAAMkoB,OACxDiB,EAAO/xC,YAAYmvC,GAASiC,YAAY7+C,KAAKlB,KAAMu3B,EAAM/I,SAI3D+hB,GAAOplB,EAAYinB,GAA0BpyC,KAAK0mC,OAAO0X,UAAUC,QAAQv2C,GAAOqjB,IAClFimB,GAAcsP,EAAQv1B,GAGT,SAATrjB,GACG0Z,GAASxhB,KAAK2wC,SAAS0N,QAAQv2C,MAClC9H,KAAK2wC,SAAS0N,QAAQv2C,GAAQ,IAGhC9H,KAAK2wC,SAAS0N,QAAQv2C,GAAMzB,KAAKq6C,IAEjC1gD,KAAK2wC,SAAS0N,QAAQv2C,GAAQ44C,EAGzBA,GAITC,YA7Qe,SA6QH74C,EAAMqjB,GAEhB,IAAMpnB,EAAQQ,GACZ,QACAgsC,GACE6B,GAA0BpyC,KAAK0mC,OAAO0X,UAAUU,OAAOh3C,IACvD,CACEA,KAAM,QACNyB,IAAK,EACLE,IAAK,IACL8d,KAAM,IACNxkB,MAAO,EACP69C,aAAc,MAEdC,KAAM,SACNC,aAAczF,GAASvzC,EAAM9H,KAAK0mC,QAClCqa,gBAAiB,EACjBC,gBAAiB,IACjBC,gBAAiB,GAEnB91B,IAYJ,OARAnrB,KAAK2wC,SAASmO,OAAOh3C,GAAQ/D,EAG7B+5C,GAASoD,gBAAgBhgD,KAAKlB,KAAM+D,GAGpCuiC,GAAW4S,MAAMn1C,GAEVA,GAITo9C,eAjTe,SAiTAr5C,EAAMqjB,GACnB,IAAM0zB,EAAWt6C,GACf,WACAgsC,GACE6B,GAA0BpyC,KAAK0mC,OAAO0X,UAAU1vC,QAAQ5G,IACxD,CACEyB,IAAK,EACLE,IAAK,IACL1G,MAAO,EACP89C,KAAM,cACNlB,eAAe,GAEjBx0B,IAKJ,GAAa,WAATrjB,EAAmB,CACrB+2C,EAASlwC,YAAYpK,GAAc,OAAQ,KAAM,MAEjD,IAAM68C,EAAY,CAChBC,OAAQ,SACRvsB,OAAQ,YACRhtB,GACIw5C,EAASF,EAAY/F,GAAS+F,EAAWphD,KAAK0mC,QAAU,GAE9DmY,EAASnN,UAAT,KAAA/mC,OAA0B22C,EAAOr1C,eAKnC,OAFAjM,KAAK2wC,SAASjiC,QAAQ5G,GAAQ+2C,EAEvBA,GAIT0C,WApVe,SAoVJz5C,EAAM05C,GACf,IAAMr2B,EAAainB,GAA0BpyC,KAAK0mC,OAAO0X,UAAU1vC,QAAQ5G,GAAO05C,GAE5ElO,EAAY/uC,GAChB,MACAgsC,GAAOplB,EAAY,CACjBunB,MAAO,GAAA/nC,OAAGwgB,EAAWunB,MAAQvnB,EAAWunB,MAAQ,GAAzC,KAAA/nC,OAA+C3K,KAAK0mC,OAAOkN,WAAWllC,QAAQ8uC,KAA9E,KAAsFjf,OAC7FuiB,aAAczF,GAASvzC,EAAM9H,KAAK0mC,UAEpC,SAMF,OAFA1mC,KAAK2wC,SAASjiC,QAAQ5G,GAAQwrC,EAEvBA,GAMTmO,sBAzWe,SAyWOC,EAAU55C,GAAM,IAAAyuC,EAAAv2C,KAEpCo2C,GAAGl1C,KACDlB,KACA0hD,EACA,iBACA,SAACjhD,GAEC,GAAK,CAAC,GAAI,GAAI,GAAI,IAAI0J,SAAS1J,EAAMkhD,SAKrClhD,EAAMJ,iBACNI,EAAMmhD,kBAGa,YAAfnhD,EAAMqH,MAAV,CAIA,IAMMuD,EANAw2C,EAAgBnc,GAAQgc,EAAU,0BAGxC,IAAKG,GAAiB,CAAC,GAAI,IAAI13C,SAAS1J,EAAMkhD,OAC5C7D,GAASgE,cAAc5gD,KAAKq1C,EAAMzuC,GAAM,QAIpB,KAAhBrH,EAAMkhD,QACY,KAAhBlhD,EAAMkhD,OAAiBE,GAAiC,KAAhBphD,EAAMkhD,OAChDt2C,EAASq2C,EAASK,mBAEbvgC,GAAWnW,KACdA,EAASq2C,EAAS1Q,WAAWgR,qBAG/B32C,EAASq2C,EAASO,uBAEbzgC,GAAWnW,KACdA,EAASq2C,EAAS1Q,WAAWkR,mBAIjC1O,GAAStyC,KAAKq1C,EAAMlrC,GAAQ,QAIlC,GAKF+qC,GAAGl1C,KAAKlB,KAAM0hD,EAAU,SAAS,SAACjhD,GACZ,KAAhBA,EAAMkhD,OAIV7D,GAASqE,mBAAmBjhD,KAAKq1C,EAAM,MAAM,OAKjD6L,eAxae,SAAA/Q,GAwa6D,IAAAyF,EAAA92C,KAA3D+C,EAA2DsuC,EAA3DtuC,MAAOs/C,EAAoDhR,EAApDgR,KAAMv6C,EAA8CupC,EAA9CvpC,KAAM2zC,EAAwCpK,EAAxCoK,MAAwC6G,EAAAjR,EAAjC6O,MAAAA,OAAiC,IAAAoC,EAAzB,KAAyBA,EAAAC,EAAAlR,EAAnBmR,QAAAA,OAAmB,IAAAD,GAAAA,EACpEp3B,EAAainB,GAA0BpyC,KAAK0mC,OAAO0X,UAAUU,OAAOh3C,IAEpE45C,EAAWn9C,GACf,SACAgsC,GAAOplB,EAAY,CACjBrjB,KAAM,SACN+4C,KAAM,gBACNnO,MAAO,GAAA/nC,OAAG3K,KAAK0mC,OAAOkN,WAAW6M,QAA1B,KAAA91C,OAAqCwgB,EAAWunB,MAAQvnB,EAAWunB,MAAQ,IAAKnU,OACvFkkB,eAAgBD,EAChBz/C,MAAAA,KAIE2/C,EAAOn+C,GAAc,QAG3Bm+C,EAAKxH,UAAYO,EAEbj6B,GAAW0+B,IACbwC,EAAK/zC,YAAYuxC,GAGnBwB,EAAS/yC,YAAY+zC,GAGrBvhD,OAAOC,eAAesgD,EAAU,UAAW,CACzC9+C,YAAY,EACZvB,IAFyC,WAGvC,MAAiD,SAA1CqgD,EAASza,aAAa,iBAE/BjhC,IALyC,SAKrCrE,GAEEA,GACFuL,MAAMosB,KAAKooB,EAAS1Q,WAAW2R,UAC5BhxC,QAAO,SAACm4B,GAAD,OAAUpE,GAAQoE,EAAM,6BAC/Br4B,SAAQ,SAACq4B,GAAD,OAAUA,EAAK0H,aAAa,eAAgB,YAGzDkQ,EAASlQ,aAAa,eAAgB7vC,EAAQ,OAAS,YAI3D3B,KAAK+mC,UAAUx1B,KACbmwC,EACA,eACA,SAACjhD,GACC,IAAI+gB,GAAiB/gB,IAA0B,KAAhBA,EAAMkhD,MAArC,CASA,OALAlhD,EAAMJ,iBACNI,EAAMmhD,kBAENF,EAASc,SAAU,EAEX16C,GACN,IAAK,WACHgvC,EAAK8L,aAAejU,OAAO5rC,GAC3B,MAEF,IAAK,UACH+zC,EAAKmC,QAAUl2C,EACf,MAEF,IAAK,QACH+zC,EAAKsC,MAAQjT,WAAWpjC,GAO5B+6C,GAASgE,cAAc5gD,KAAK41C,EAAM,OAAQt1B,GAAiB/gB,OAE7DqH,GACA,GAGFg2C,GAAS2D,sBAAsBvgD,KAAKlB,KAAM0hD,EAAU55C,GAEpDu6C,EAAK1zC,YAAY+yC,IAInBnE,WA7fe,WA6fwB,IAA5BC,EAA4Bx0C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAArB,EAAG00C,EAAkB10C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAErC,IAAKwY,GAAUg8B,GACb,OAAOA,EAIT,IAAMqF,EAAazF,GAASp9C,KAAKi/C,UAAY,EAE7C,OAAO1B,GAAWC,EAAMqF,EAAYnF,IAItCoF,kBA1gBe,WA0gB8C,IAA3Cz3C,EAA2CrC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAlC,KAAMw0C,EAA4Bx0C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAArB,EAAG00C,EAAkB10C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAEtDwY,GAAWnW,IAAYmW,GAAUg8B,KAKtCnyC,EAAOqmC,UAAYoM,GAASP,WAAWC,EAAME,KAI/CqF,aArhBe,WAshBR/iD,KAAK+1C,UAAUnB,KAKhBpzB,GAAWxhB,KAAK2wC,SAASmO,OAAOE,SAClClB,GAASkF,SAAS9hD,KAAKlB,KAAMA,KAAK2wC,SAASmO,OAAOE,OAAQh/C,KAAKijD,MAAQ,EAAIjjD,KAAKg/C,QAI9Ex9B,GAAWxhB,KAAK2wC,SAAS0N,QAAQK,QACnC1+C,KAAK2wC,SAAS0N,QAAQK,KAAKwE,QAAUljD,KAAKijD,OAAyB,IAAhBjjD,KAAKg/C,UAK5DgE,SAtiBe,SAsiBN33C,GAAmB,IAAXtI,EAAWiG,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAH,EAClBwY,GAAWnW,KAKhBA,EAAOtI,MAAQA,EAGf+6C,GAASoD,gBAAgBhgD,KAAKlB,KAAMqL,KAItC83C,eAnjBe,SAmjBA1iD,GAAO,IAAA2iD,EAAApjD,KACpB,GAAKA,KAAK+1C,UAAUnB,IAAOpzB,GAAS/gB,GAApC,CAIA,IAAIsC,EAAQ,EAkBZ,GAAItC,EACF,OAAQA,EAAMqH,MAEZ,IAAK,aACL,IAAK,UACL,IAAK,SACH/E,EP/lBH,SAAuBsgD,EAAS55C,GACrC,OAAgB,IAAZ45C,GAAyB,IAAR55C,GAAaklC,OAAOrlC,MAAM+5C,IAAY1U,OAAOrlC,MAAMG,GAC/D,GAGA45C,EAAU55C,EAAO,KAAK46B,QAAQ,GO0lBvBif,CAActjD,KAAKu5C,YAAav5C,KAAKi/C,UAG1B,eAAfx+C,EAAMqH,MACRg2C,GAASkF,SAAS9hD,KAAKlB,KAAMA,KAAK2wC,SAASmO,OAAOC,KAAMh8C,GAG1D,MAGF,IAAK,UACL,IAAK,YAjCW,SAACsI,EAAQtH,GAC3B,IAAME,EAAMud,GAAUzd,GAASA,EAAQ,EACjC86C,EAAWr9B,GAAWnW,GAAUA,EAAS+3C,EAAKzS,SAASjiC,QAAQomB,OAGrE,GAAItT,GAAWq9B,GAAW,CACxBA,EAAS97C,MAAQkB,EAGjB,IAAMuqB,EAAQqwB,EAAS0E,qBAAqB,QAAQ,GAChD/hC,GAAWgN,KACbA,EAAMsjB,WAAW,GAAG0R,UAAYv/C,IAuBhCw/C,CAAYzjD,KAAK2wC,SAASjiC,QAAQomB,OAAwB,IAAhB90B,KAAK0jD,aAWvDxC,gBAvmBe,SAumBC71C,GAEd,IAAMyoC,EAAQtyB,GAASnW,GAAUA,EAAOA,OAASA,EAGjD,GAAKmW,GAAWsyB,IAAyC,UAA/BA,EAAM7M,aAAa,QAA7C,CAKA,GAAIvB,GAAQoO,EAAO9zC,KAAK0mC,OAAO0X,UAAUU,OAAOC,MAAO,CACrDjL,EAAMtC,aAAa,gBAAiBxxC,KAAKu5C,aACzC,IAAMA,EAAcuE,GAASP,WAAWv9C,KAAKu5C,aACvC0F,EAAWnB,GAASP,WAAWv9C,KAAKi/C,UACpCtE,EAASU,GAAS,YAAar7C,KAAK0mC,QAC1CoN,EAAMtC,aACJ,iBACAmJ,EAAO3uC,QAAQ,gBAAiButC,GAAavtC,QAAQ,aAAcizC,SAEhE,GAAIvZ,GAAQoO,EAAO9zC,KAAK0mC,OAAO0X,UAAUU,OAAOE,QAAS,CAC9D,IAAM2E,EAAwB,IAAd7P,EAAM/wC,MACtB+wC,EAAMtC,aAAa,gBAAiBmS,GACpC7P,EAAMtC,aAAa,iBAAnB,GAAA7mC,OAAwCg5C,EAAQtf,QAAQ,GAAxD,WAEAyP,EAAMtC,aAAa,gBAAiBsC,EAAM/wC,OAIvC0sC,GAAQI,UAKbiE,EAAMrlC,MAAMm1C,YAAY,UAAxB,GAAAj5C,OAAuCmpC,EAAM/wC,MAAQ+wC,EAAMrqC,IAAO,IAAlE,QAIFo6C,kBA5oBe,SA4oBGpjD,GAAO,IAAAqjD,EAAA9jD,KAEvB,GACGA,KAAK0mC,OAAOqd,SAAShF,MACrBv9B,GAAWxhB,KAAK2wC,SAASmO,OAAOC,OAChCv9B,GAAWxhB,KAAK2wC,SAASjiC,QAAQwwC,cAChB,IAAlBl/C,KAAKi/C,SAJP,CASA,IAAM+E,EAAO,GAAAr5C,OAAM3K,KAAK0mC,OAAOkN,WAAWuL,QAA7B,aACPtV,EAAS,SAACoa,GAAD,OAAUpR,GAAYiR,EAAKnT,SAASjiC,QAAQwwC,YAAa8E,EAASC,IAGjF,GAAIjkD,KAAK01C,MACP7L,GAAO,OADT,CAMA,IAAI8Z,EAAU,EACRO,EAAalkD,KAAK2wC,SAASkO,SAAS3X,wBAE1C,GAAI1lB,GAAS/gB,GACXkjD,EAAW,IAAMO,EAAW/c,OAAU1mC,EAAM0jD,MAAQD,EAAW7c,UAC1D,CAAA,IAAI4L,GAASjzC,KAAK2wC,SAASjiC,QAAQwwC,YAAa8E,GAGrD,OAFAL,EAAUxd,WAAWnmC,KAAK2wC,SAASjiC,QAAQwwC,YAAYzwC,MAAM44B,KAAM,IAMjEsc,EAAU,EACZA,EAAU,EACDA,EAAU,MACnBA,EAAU,KAIZ7F,GAASgF,kBAAkB5hD,KAAKlB,KAAMA,KAAK2wC,SAASjiC,QAAQwwC,YAAcl/C,KAAKi/C,SAAW,IAAO0E,GAGjG3jD,KAAK2wC,SAASjiC,QAAQwwC,YAAYzwC,MAAM44B,KAAxC,GAAA18B,OAAkDg5C,EAAlD,KAIIniC,GAAS/gB,IAAU,CAAC,aAAc,cAAc0J,SAAS1J,EAAMqH,OACjE+hC,EAAsB,eAAfppC,EAAMqH,SAKjBs8C,WAjsBe,SAisBJ3jD,GAET,IAAM4jD,GAAU7iC,GAAWxhB,KAAK2wC,SAASjiC,QAAQuwC,WAAaj/C,KAAK0mC,OAAO4d,WAG1ExG,GAASgF,kBAAkB5hD,KACzBlB,KACAA,KAAK2wC,SAASjiC,QAAQ6qC,YACtB8K,EAASrkD,KAAKi/C,SAAWj/C,KAAKu5C,YAAcv5C,KAAKu5C,YACjD8K,GAIE5jD,GAAwB,eAAfA,EAAMqH,MAAyB9H,KAAKu1C,MAAMgP,SAKvDzG,GAASqF,eAAejiD,KAAKlB,KAAMS,IAIrC+jD,eAvtBe,WAytBb,GAAKxkD,KAAK+1C,UAAUnB,KAAQ50C,KAAK0mC,OAAO4d,aAActkD,KAAKu5C,aAA3D,CAQA,GAAIv5C,KAAKi/C,UAALp9C,KAAAwrB,IAAiB,EAAK,IAGxB,OAFAslB,GAAa3yC,KAAK2wC,SAASjiC,QAAQ6qC,aAAa,QAChD5G,GAAa3yC,KAAK2wC,SAASkO,UAAU,GAKnCr9B,GAAWxhB,KAAK2wC,SAASmO,OAAOC,OAClC/+C,KAAK2wC,SAASmO,OAAOC,KAAKvN,aAAa,gBAAiBxxC,KAAKi/C,UAI/D,IAAMwF,EAAcjjC,GAAWxhB,KAAK2wC,SAASjiC,QAAQuwC,WAGhDwF,GAAezkD,KAAK0mC,OAAOge,iBAAmB1kD,KAAKw5C,QACtDsE,GAASgF,kBAAkB5hD,KAAKlB,KAAMA,KAAK2wC,SAASjiC,QAAQ6qC,YAAav5C,KAAKi/C,UAI5EwF,GACF3G,GAASgF,kBAAkB5hD,KAAKlB,KAAMA,KAAK2wC,SAASjiC,QAAQuwC,SAAUj/C,KAAKi/C,UAI7EnB,GAAS+F,kBAAkB3iD,KAAKlB,QAIlC2kD,iBA9vBe,SA8vBEC,EAAS/a,GACxB8I,GAAa3yC,KAAK2wC,SAASgO,SAASN,QAAQuG,IAAW/a,IAIzDgb,cAnwBe,SAmwBDD,EAAStR,EAAWvvC,GAChC,IAAM+gD,EAAO9kD,KAAK2wC,SAASgO,SAASoG,OAAOH,GACvC7hD,EAAQ,KACRs/C,EAAO/O,EAEX,GAAgB,aAAZsR,EACF7hD,EAAQ/C,KAAK4iD,iBACR,CASL,GARA7/C,EAASye,GAASzd,GAAiB/D,KAAK4kD,GAAb7gD,EAGvByd,GAASze,KACXA,EAAQ/C,KAAK0mC,OAAOke,GAASI,UAI1BxjC,GAASxhB,KAAKoI,QAAQw8C,MAAc5kD,KAAKoI,QAAQw8C,GAASz6C,SAASpH,GAEtE,YADA/C,KAAKg6C,MAAMoF,KAAX,yBAAAz0C,OAAyC5H,EAAzC,UAAA4H,OAAuDi6C,IAKzD,IAAK5kD,KAAK0mC,OAAOke,GAASx8C,QAAQ+B,SAASpH,GAEzC,YADA/C,KAAKg6C,MAAMoF,KAAX,sBAAAz0C,OAAsC5H,EAAtC,UAAA4H,OAAoDi6C,IAWxD,GALKpjC,GAAW6gC,KACdA,EAAOyC,GAAQA,EAAKte,cAAc,kBAI/BhlB,GAAW6gC,GAAhB,CAKcriD,KAAK2wC,SAASgO,SAASN,QAAQuG,GAASpe,cAAxC,IAAA77B,OAA0D3K,KAAK0mC,OAAOkN,WAAWuM,KAAKp9C,QAC9Fm4C,UAAY4C,GAASmH,SAAS/jD,KAAKlB,KAAM4kD,EAAS7hD,GAGxD,IAAMsI,EAASg3C,GAAQA,EAAK7b,cAAL,WAAA77B,OAA8B5H,EAA9B,OAEnBye,GAAWnW,KACbA,EAAOm3C,SAAU,KAKrByC,SAtzBe,SAszBNL,EAAS7hD,GAChB,OAAQ6hD,GACN,IAAK,QACH,OAAiB,IAAV7hD,EAAcs4C,GAAS,SAAUr7C,KAAK0mC,QAAtC,GAAA/7B,OAAmD5H,EAAnD,WAET,IAAK,UACH,GAAIye,GAAUze,GAAQ,CACpB,IAAMyrB,EAAQ6sB,GAAA,gBAAA1wC,OAAyB5H,GAAS/C,KAAK0mC,QAErD,OAAKlY,EAAMvlB,OAIJulB,EAHL,GAAA7jB,OAAU5H,EAAV,KAMJ,OAAO83C,GAAY93C,GAErB,IAAK,WACH,OAAO67C,GAASqG,SAAS/jD,KAAKlB,MAEhC,QACE,OAAO,OAKbklD,eAj1Be,SAi1BA98C,GAAS,IAAA+8C,EAAAnlD,KAEtB,GAAKwhB,GAAWxhB,KAAK2wC,SAASgO,SAASoG,OAAO9L,SAA9C,CAIA,IAAMnxC,EAAO,UACPu6C,EAAOriD,KAAK2wC,SAASgO,SAASoG,OAAO9L,QAAQzS,cAAc,iBAG7DhlB,GAASpZ,KACXpI,KAAKoI,QAAQ6wC,QAAUgB,GAAO7xC,GAASuJ,QAAO,SAACsnC,GAAD,OAAakM,EAAKze,OAAOuS,QAAQ7wC,QAAQ+B,SAAS8uC,OAIlG,IAAMpP,GAAUroB,GAASxhB,KAAKoI,QAAQ6wC,UAAYj5C,KAAKoI,QAAQ6wC,QAAQhwC,OAAS,EAUhF,GATA60C,GAAS6G,iBAAiBzjD,KAAKlB,KAAM8H,EAAM+hC,GAG3CgI,GAAawQ,GAGbvE,GAASsH,UAAUlkD,KAAKlB,MAGnB6pC,EAAL,CAKA,IAAMwb,EAAW,SAACpM,GAChB,IAAMzqB,EAAQ6sB,GAAA,gBAAA1wC,OAAyBsuC,GAAWkM,EAAKze,QAEvD,OAAKlY,EAAMvlB,OAIJ60C,GAASmC,YAAY/+C,KAAKikD,EAAM32B,GAH9B,MAOXxuB,KAAKoI,QAAQ6wC,QACVhzB,MAAK,SAACthB,EAAG2L,GACR,IAAMg1C,EAAUH,EAAKze,OAAOuS,QAAQ7wC,QACpC,OAAOk9C,EAAQl7C,QAAQzF,GAAK2gD,EAAQl7C,QAAQkG,GAAK,GAAK,KAEvDmB,SAAQ,SAACwnC,GACR6E,GAASsE,eAAelhD,KAAKikD,EAAM,CACjCpiD,MAAOk2C,EACPoJ,KAAAA,EACAv6C,KAAAA,EACA2zC,MAAOqC,GAASmH,SAAS/jD,KAAKikD,EAAM,UAAWlM,GAC/CiH,MAAOmF,EAASpM,QAItB6E,GAAS+G,cAAc3jD,KAAKlB,KAAM8H,EAAMu6C,MAmD1CkD,gBA57Be,WA47BG,IAAAC,EAAAxlD,KAEhB,GAAKwhB,GAAWxhB,KAAK2wC,SAASgO,SAASoG,OAAOnG,UAA9C,CAKA,IAAM92C,EAAO,WACPu6C,EAAOriD,KAAK2wC,SAASgO,SAASoG,OAAOnG,SAASpY,cAAc,iBAC5Dif,EAAS7G,GAAS8G,UAAUxkD,KAAKlB,MACjC6pC,EAASrvB,QAAQirC,EAAOx8C,QAY9B,GATA60C,GAAS6G,iBAAiBzjD,KAAKlB,KAAM8H,EAAM+hC,GAG3CgI,GAAawQ,GAGbvE,GAASsH,UAAUlkD,KAAKlB,MAGnB6pC,EAAL,CAKA,IAAMzhC,EAAUq9C,EAAO/zC,KAAI,SAACi0C,EAAO5iD,GAAR,MAAmB,CAC5CA,MAAAA,EACAy/C,QAASgD,EAAK5G,SAASgH,SAAWJ,EAAK5C,eAAiB7/C,EACxD04C,MAAOmD,GAASqG,SAAS/jD,KAAKskD,EAAMG,GACpCzF,MAAOyF,EAAME,UAAY/H,GAASmC,YAAY/+C,KAAKskD,EAAMG,EAAME,SAAS/K,eACxEuH,KAAAA,EACAv6C,KAAM,eAIRM,EAAQ+nB,QAAQ,CACdptB,OAAQ,EACRy/C,SAAUxiD,KAAK4+C,SAASgH,QACxBnK,MAAOJ,GAAS,WAAYr7C,KAAK0mC,QACjC2b,KAAAA,EACAv6C,KAAM,aAIRM,EAAQqJ,QAAQqsC,GAASsE,eAAe7wC,KAAKvR,OAE7C89C,GAAS+G,cAAc3jD,KAAKlB,KAAM8H,EAAMu6C,MAI1CyD,aAh/Be,WAg/BA,IAAAC,EAAA/lD,KAEb,GAAKwhB,GAAWxhB,KAAK2wC,SAASgO,SAASoG,OAAO3L,OAA9C,CAIA,IAAMtxC,EAAO,QACPu6C,EAAOriD,KAAK2wC,SAASgO,SAASoG,OAAO3L,MAAM5S,cAAc,iBAG/DxmC,KAAKoI,QAAQgxC,MAAQp5C,KAAKoI,QAAQgxC,MAAMznC,QAAO,SAAC8nB,GAAD,OAAOA,GAAKssB,EAAKC,cAAgBvsB,GAAKssB,EAAKE,gBAG1F,IAAMpc,GAAUroB,GAASxhB,KAAKoI,QAAQgxC,QAAUp5C,KAAKoI,QAAQgxC,MAAMnwC,OAAS,EAC5E60C,GAAS6G,iBAAiBzjD,KAAKlB,KAAM8H,EAAM+hC,GAG3CgI,GAAawQ,GAGbvE,GAASsH,UAAUlkD,KAAKlB,MAGnB6pC,IAKL7pC,KAAKoI,QAAQgxC,MAAM3nC,SAAQ,SAAC2nC,GAC1B0E,GAASsE,eAAelhD,KAAK6kD,EAAM,CACjChjD,MAAOq2C,EACPiJ,KAAAA,EACAv6C,KAAAA,EACA2zC,MAAOqC,GAASmH,SAAS/jD,KAAK6kD,EAAM,QAAS3M,QAIjD0E,GAAS+G,cAAc3jD,KAAKlB,KAAM8H,EAAMu6C,MAI1C+C,UAzhCe,WAyhCH,IACF/G,EAAYr+C,KAAK2wC,SAASgO,SAA1BN,QACF2F,GAAWxiC,GAAS68B,IAAYl9C,OAAO8X,OAAOolC,GAASzsC,MAAK,SAAC8uC,GAAD,OAAaA,EAAOnR,UAEtFoD,GAAa3yC,KAAK2wC,SAASgO,SAASwB,MAAO6D,IAI7C7B,mBAjiCe,SAiiCI2C,GAAwB,IAAlBrR,EAAkBzqC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACzC,IAAIhJ,KAAK2wC,SAASgO,SAASuH,MAAM3W,OAAjC,CAIA,IAAIlkC,EAASy5C,EAERtjC,GAAWnW,KACdA,EAASlK,OAAO8X,OAAOjZ,KAAK2wC,SAASgO,SAASoG,QAAQjzC,MAAK,SAAC4L,GAAD,OAAQA,EAAE6xB,WAGvE,IAAM4W,EAAY96C,EAAOm7B,cAAc,sBAEvCgN,GAAStyC,KAAKlB,KAAMmmD,EAAW1S,KAIjC2S,WAljCe,SAkjCJriD,GAAO,IACRmiD,EAAUlmD,KAAK2wC,SAASgO,SAAxBuH,MACFxF,EAAS1gD,KAAK2wC,SAAS0N,QAAQM,SAGrC,GAAKn9B,GAAW0kC,IAAW1kC,GAAWk/B,GAAtC,CALgB,IAURnR,EAAW2W,EAAX3W,OACJ0U,EAAO1U,EAEX,GAAI/tB,GAAWzd,GACbkgD,EAAOlgD,OACF,GAAIyd,GAAiBzd,IAA0B,KAAhBA,EAAM49C,MAC1CsC,GAAO,OACF,GAAIziC,GAASzd,GAAQ,CAG1B,IAAMsH,EAASmW,GAAYzd,EAAMsiD,cAAgBtiD,EAAMsiD,eAAe,GAAKtiD,EAAMsH,OAC3Ei7C,EAAaJ,EAAMlT,SAAS3nC,GAKlC,GAAIi7C,IAAgBA,GAAcviD,EAAMsH,SAAWq1C,GAAUuD,EAC3D,OAKJvD,EAAOlP,aAAa,gBAAiByS,GAGrCtR,GAAauT,GAAQjC,GAGrBpR,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAWuM,KAAKrxC,KAAMm1C,GAGnEA,GAAQziC,GAAiBzd,GAC3B+5C,GAASqE,mBAAmBjhD,KAAKlB,KAAM,MAAM,GACnCikD,GAAS1U,GAEnBiE,GAAStyC,KAAKlB,KAAM0gD,EAAQl/B,GAAiBzd,MAKjDwiD,YApmCe,SAomCHC,GACV,IAAMC,EAAQD,EAAIzV,WAAU,GAC5B0V,EAAMh4C,MAAMwP,SAAW,WACvBwoC,EAAMh4C,MAAMi4C,QAAU,EACtBD,EAAME,gBAAgB,UAGtBH,EAAIxV,WAAWriC,YAAY83C,GAG3B,IAAMtf,EAAQsf,EAAMG,YACdxP,EAASqP,EAAMI,aAKrB,OAFAjV,GAAc6U,GAEP,CACLtf,MAAAA,EACAiQ,OAAAA,IAKJ0K,cA3nCe,WA2nC4B,IAAAgF,EAAA9mD,KAA7B8H,EAA6BkB,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAtB,GAAIyqC,EAAkBzqC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACnCqC,EAASrL,KAAK2wC,SAAS2C,UAAU9M,cAAxB,kBAAA77B,OAAwD3K,KAAKyG,GAA7D,KAAAkE,OAAmE7C,IAGlF,GAAK0Z,GAAWnW,GAAhB,CAKA,IAAMioC,EAAYjoC,EAAO2lC,WACnBqS,EAAUn2C,MAAMosB,KAAKga,EAAUqP,UAAU7wC,MAAK,SAACg4B,GAAD,OAAWA,EAAKyF,UAGpE,GAAI8E,GAAQsB,cAAgBtB,GAAQuB,cAAe,CAEjDtC,EAAU7kC,MAAM04B,MAAhB,GAAAx8B,OAA2B04C,EAAQuD,YAAnC,MACAtT,EAAU7kC,MAAM2oC,OAAhB,GAAAzsC,OAA4B04C,EAAQwD,aAApC,MAGA,IAAM3oC,EAAO4/B,GAASyI,YAAYrlD,KAAKlB,KAAMqL,GAGvC07C,EAAU,SAAVA,EAAWtmD,GAEXA,EAAM4K,SAAWioC,GAAc,CAAC,QAAS,UAAUnpC,SAAS1J,EAAMumD,gBAKtE1T,EAAU7kC,MAAM04B,MAAQ,GACxBmM,EAAU7kC,MAAM2oC,OAAS,GAGzBf,GAAIn1C,KAAK4lD,EAAMxT,EAAWtE,GAAoB+X,KAIhD3Q,GAAGl1C,KAAKlB,KAAMszC,EAAWtE,GAAoB+X,GAG7CzT,EAAU7kC,MAAM04B,MAAhB,GAAAx8B,OAA2BuT,EAAKipB,MAAhC,MACAmM,EAAU7kC,MAAM2oC,OAAhB,GAAAzsC,OAA4BuT,EAAKk5B,OAAjC,MAIFzE,GAAa0Q,GAAS,GAGtB1Q,GAAatnC,GAAQ,GAGrByyC,GAASqE,mBAAmBjhD,KAAKlB,KAAMqL,EAAQooC,KAIjDwT,eAlrCe,WAmrCb,IAAMvG,EAAS1gD,KAAK2wC,SAAS0N,QAAQ6I,SAGhC1lC,GAAWk/B,IAKhBA,EAAOlP,aAAa,OAAQxxC,KAAKknD,WAInCj4C,OA/rCe,SA+rCRtD,GAAM,IAAAw7C,EAAAnnD,KAETyhD,EAQE3D,GARF2D,sBACArB,EAOEtC,GAPFsC,aACAe,EAMErD,GANFqD,eACAR,EAKE7C,GALF6C,YACAY,EAIEzD,GAJFyD,WACA2D,EAGEpH,GAHFoH,eACAY,EAEEhI,GAFFgI,aACAhE,EACEhE,GADFgE,cAEF9hD,KAAK2wC,SAASmN,SAAW,KAGrBt8B,GAASxhB,KAAK0mC,OAAOoX,WAAa99C,KAAK0mC,OAAOoX,SAAS3zC,SAAS,eAClEnK,KAAK2wC,SAAS2C,UAAU3kC,YAAYyxC,EAAal/C,KAAKlB,KAAM,eAI9D,IAAMszC,EAAY/uC,GAAc,MAAO6tC,GAA0BpyC,KAAK0mC,OAAO0X,UAAUN,SAAS/b,UAChG/hC,KAAK2wC,SAASmN,SAAWxK,EAGzB,IAAM8T,EAAoB,CAAE1U,MAAO,wBA2UnC,OAxUAuH,GAAOz4B,GAASxhB,KAAK0mC,OAAOoX,UAAY99C,KAAK0mC,OAAOoX,SAAW,IAAIrsC,SAAQ,SAACgvC,GAsB1E,GApBgB,YAAZA,GACFnN,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,UAAWC,IAI3C,WAAZ3G,GACFnN,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,SAAUC,IAI1C,SAAZ3G,GACFnN,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,OAAQC,IAIxC,iBAAZ3G,GACFnN,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,eAAgBC,IAIhD,aAAZ3G,EAAwB,CAC1B,IAAM4G,EAAoB9iD,GAAc,MAAO,CAC7CmuC,MAAK,GAAA/nC,OAAKy8C,EAAkB1U,MAAvB,gCAGDmM,EAAWt6C,GAAc,MAAO6tC,GAA0B+U,EAAKzgB,OAAO0X,UAAUS,WAetF,GAZAA,EAASlwC,YACPgyC,EAAYz/C,KAAKimD,EAAM,OAAQ,CAC7B1gD,GAAE,aAAAkE,OAAegB,EAAKlF,OAK1Bo4C,EAASlwC,YAAYwyC,EAAejgD,KAAKimD,EAAM,WAK3CA,EAAKzgB,OAAOqd,SAAShF,KAAM,CAC7B,IAAMI,EAAU56C,GACd,OACA,CACEmuC,MAAOyU,EAAKzgB,OAAOkN,WAAWuL,SAEhC,SAGFN,EAASlwC,YAAYwwC,GACrBgI,EAAKxW,SAASjiC,QAAQwwC,YAAcC,EAGtCgI,EAAKxW,SAASkO,SAAWA,EACzBwI,EAAkB14C,YAAYw4C,EAAKxW,SAASkO,UAC5CvL,EAAU3kC,YAAY04C,GAcxB,GAVgB,iBAAZ5G,GACFnN,EAAU3kC,YAAY4yC,EAAWrgD,KAAKimD,EAAM,cAAeC,IAI7C,aAAZ3G,GACFnN,EAAU3kC,YAAY4yC,EAAWrgD,KAAKimD,EAAM,WAAYC,IAI1C,SAAZ3G,GAAkC,WAAZA,EAAsB,CAAA,IACxCzB,EAAWmI,EAAKxW,SAAhBqO,OAwBN,GArBKx9B,GAAWw9B,IAAY1L,EAAUN,SAASgM,KAC7CA,EAASz6C,GACP,MACAgsC,GAAO,GAAI6W,EAAmB,CAC5B1U,MAAO,GAAA/nC,OAAGy8C,EAAkB1U,MAArB,iBAA0CnU,UAIrD4oB,EAAKxW,SAASqO,OAASA,EAEvB1L,EAAU3kC,YAAYqwC,IAIR,SAAZyB,GACFzB,EAAOrwC,YAAYyxC,EAAal/C,KAAKimD,EAAM,SAM7B,WAAZ1G,IAAyBhR,GAAQO,MAAO,CAE1C,IAAM7kB,EAAa,CACjB1hB,IAAK,EACL8d,KAAM,IACNxkB,MAAOokD,EAAKzgB,OAAOsY,QAIrBA,EAAOrwC,YACLgyC,EAAYz/C,KACVimD,EACA,SACA5W,GAAOplB,EAAY,CACjB1kB,GAAE,eAAAkE,OAAiBgB,EAAKlF,SAalC,GALgB,aAAZg6C,GACFnN,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,WAAYC,IAI5C,aAAZ3G,IAA2Bj/B,GAAS2lC,EAAKzgB,OAAOiY,UAAW,CAC7D,IAAM5c,EAAUx9B,GACd,MACAgsC,GAAO,GAAI6W,EAAmB,CAC5B1U,MAAO,GAAA/nC,OAAGy8C,EAAkB1U,MAArB,eAAwCnU,OAC/CgR,OAAQ,MAIZxN,EAAQpzB,YACNyxC,EAAal/C,KAAKimD,EAAM,WAAY,CAClCG,iBAAiB,EACjBC,gBAAA,iBAAA58C,OAAkCgB,EAAKlF,IACvC+gD,iBAAiB,KAIrB,IAAMtB,EAAQ3hD,GAAc,MAAO,CACjCmuC,MAAO,wBACPjsC,GAAE,iBAAAkE,OAAmBgB,EAAKlF,IAC1B8oC,OAAQ,KAGJkY,EAAQljD,GAAc,OAEtBmjD,EAAOnjD,GAAc,MAAO,CAChCkC,GAAE,iBAAAkE,OAAmBgB,EAAKlF,GAAxB,WAIE05C,EAAO57C,GAAc,MAAO,CAChCs8C,KAAM,SAGR6G,EAAK/4C,YAAYwxC,GACjBsH,EAAM94C,YAAY+4C,GAClBP,EAAKxW,SAASgO,SAASoG,OAAO2C,KAAOA,EAGrCP,EAAKzgB,OAAOiY,SAASltC,SAAQ,SAAC3J,GAE5B,IAAM45C,EAAWn9C,GACf,SACAgsC,GAAO6B,GAA0B+U,EAAKzgB,OAAO0X,UAAUC,QAAQM,UAAW,CACxE72C,KAAM,SACN4qC,MAAK,GAAA/nC,OAAKw8C,EAAKzgB,OAAOkN,WAAW6M,QAA5B,KAAA91C,OAAuCw8C,EAAKzgB,OAAOkN,WAAW6M,QAA9D,aACLI,KAAM,WACNyG,iBAAiB,EACjB/X,OAAQ,MAKZkS,EAAsBvgD,KAAKimD,EAAMzF,EAAU55C,GAG3CsuC,GAAGl1C,KAAKimD,EAAMzF,EAAU,SAAS,WAC/BI,EAAc5gD,KAAKimD,EAAMr/C,GAAM,MAGjC,IAAM46C,EAAOn+C,GAAc,OAAQ,KAAM82C,GAASvzC,EAAMq/C,EAAKzgB,SAEvD3jC,EAAQwB,GAAc,OAAQ,CAClCmuC,MAAOyU,EAAKzgB,OAAOkN,WAAWuM,KAAKp9C,QAIrCA,EAAMm4C,UAAYvvC,EAAK7D,GAEvB46C,EAAK/zC,YAAY5L,GACjB2+C,EAAS/yC,YAAY+zC,GACrBvC,EAAKxxC,YAAY+yC,GAGjB,IAAMoD,EAAOvgD,GAAc,MAAO,CAChCkC,GAAE,iBAAAkE,OAAmBgB,EAAKlF,GAAxB,KAAAkE,OAA8B7C,GAChCynC,OAAQ,KAIJoY,EAAapjD,GAAc,SAAU,CACzCuD,KAAM,SACN4qC,MAAK,GAAA/nC,OAAKw8C,EAAKzgB,OAAOkN,WAAW6M,QAA5B,KAAA91C,OAAuCw8C,EAAKzgB,OAAOkN,WAAW6M,QAA9D,YAIPkH,EAAWh5C,YACTpK,GACE,OACA,CACEo7C,eAAe,GAEjBtE,GAASvzC,EAAMq/C,EAAKzgB,UAKxBihB,EAAWh5C,YACTpK,GACE,OACA,CACEmuC,MAAOyU,EAAKzgB,OAAOkN,WAAWrE,QAEhC8L,GAAS,WAAY8L,EAAKzgB,UAK9B0P,GAAGl1C,KACDimD,EACArC,EACA,WACA,SAACrkD,GAEqB,KAAhBA,EAAMkhD,QAKVlhD,EAAMJ,iBACNI,EAAMmhD,kBAGNE,EAAc5gD,KAAKimD,EAAM,QAAQ,OAEnC,GAIF/Q,GAAGl1C,KAAKimD,EAAMQ,EAAY,SAAS,WACjC7F,EAAc5gD,KAAKimD,EAAM,QAAQ,MAInCrC,EAAKn2C,YAAYg5C,GAGjB7C,EAAKn2C,YACHpK,GAAc,MAAO,CACnBs8C,KAAM,UAIV4G,EAAM94C,YAAYm2C,GAElBqC,EAAKxW,SAASgO,SAASN,QAAQv2C,GAAQ45C,EACvCyF,EAAKxW,SAASgO,SAASoG,OAAOj9C,GAAQg9C,KAGxCoB,EAAMv3C,YAAY84C,GAClB1lB,EAAQpzB,YAAYu3C,GACpB5S,EAAU3kC,YAAYozB,GAEtBolB,EAAKxW,SAASgO,SAASuH,MAAQA,EAC/BiB,EAAKxW,SAASgO,SAASwB,KAAOpe,EAchC,GAVgB,QAAZ0e,GAAqBpM,GAAQS,KAC/BxB,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,MAAOC,IAIvC,YAAZ3G,GAAyBpM,GAAQa,SACnC5B,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,UAAWC,IAI3C,aAAZ3G,EAAwB,CAC1B,IAAMt1B,EAAaolB,GAAO,GAAI6W,EAAmB,CAC/C7gB,QAAS,IACTrgB,KAAMihC,EAAKD,SACX77C,OAAQ,WAIN87C,EAAK7R,UACPnqB,EAAW+7B,SAAW,IATE,IAYlBA,EAAaC,EAAKzgB,OAAOkhB,KAAzBV,UAEH1lC,GAAO0lC,IAAaC,EAAKU,SAC5BtX,GAAOplB,EAAY,CACjBs0B,KAAI,QAAA90C,OAAUw8C,EAAK3S,UACnBhmB,MAAO24B,EAAK3S,WAIhBlB,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,WAAYh8B,IAI5C,eAAZs1B,GACFnN,EAAU3kC,YAAYyxC,EAAal/C,KAAKimD,EAAM,aAAcC,OAK5DpnD,KAAKs1C,SACP4P,EAAehkD,KAAKlB,KAAM84C,GAAME,kBAAkB93C,KAAKlB,OAGzD8lD,EAAa5kD,KAAKlB,MAEXszC,GAITwU,OAriDe,WAqiDN,IAAAC,EAAA/nD,KAEP,GAAIA,KAAK0mC,OAAOgW,WAAY,CAC1B,IAAM+C,EAAO3B,GAASC,WAAW78C,KAAKlB,MAGlCy/C,EAAKzB,MACPtB,GAAW+C,EAAK55B,IAAK,eAKzB7lB,KAAKyG,GAAK5E,KAAKsH,MAAsB,IAAhBtH,KAAK8E,UAG1B,IAAI2sC,EAAY,KAChBtzC,KAAK2wC,SAASmN,SAAW,KAGzB,IAAMvmB,EAAQ,CACZ9wB,GAAIzG,KAAKyG,GACTuhD,SAAUhoD,KAAK0mC,OAAO6U,SACtBE,MAAOz7C,KAAK0mC,OAAO+U,OAEjBsB,GAAS,EAGTv7B,GAAYxhB,KAAK0mC,OAAOoX,YAC1B99C,KAAK0mC,OAAOoX,SAAW99C,KAAK0mC,OAAOoX,SAAS58C,KAAKlB,KAAMu3B,IAIpDv3B,KAAK0mC,OAAOoX,WACf99C,KAAK0mC,OAAOoX,SAAW,IAGrBt8B,GAAWxhB,KAAK0mC,OAAOoX,WAAat8B,GAAUxhB,KAAK0mC,OAAOoX,UAE5DxK,EAAYtzC,KAAK0mC,OAAOoX,UAGxBxK,EAAYwK,GAAS7uC,OAAO/N,KAAKlB,KAAM,CACrCyG,GAAIzG,KAAKyG,GACTuhD,SAAUhoD,KAAK0mC,OAAO6U,SACtBnC,MAAOp5C,KAAKo5C,MACZH,QAASj5C,KAAKi5C,QACd2F,SAAUA,GAASqG,SAAS/jD,KAAKlB,QAInC+8C,GAAS,GAIX,IACMtyC,EAiBFY,EAsBJ,GA7BI0xC,GACEv7B,GAAUxhB,KAAK0mC,OAAOoX,YAXtBrzC,EAYkB6oC,EAVtBnyC,OAAO6X,QAAQue,GAAO9lB,SAAQ,SAAAwmC,GAAkB,IAAA3G,EAAAjZ,GAAA4f,EAAA,GAAhB5zC,EAAgBitC,EAAA,GAAXvuC,EAAWuuC,EAAA,GAC9C7mC,EAASmwC,GAAWnwC,EAAD,IAAAE,OAAatG,EAAb,KAAqBtB,MASxCuwC,EANK7oC,GAcL+W,GAAUxhB,KAAK0mC,OAAO0X,UAAUN,SAASxK,aAC3CjoC,EAASvK,SAAS0lC,cAAcxmC,KAAK0mC,OAAO0X,UAAUN,SAASxK,YAI5D9xB,GAAWnW,KACdA,EAASrL,KAAK2wC,SAAS2C,WAKzBjoC,EADqBmW,GAAW8xB,GAAa,wBAA0B,sBAClD,aAAcA,GAG9B9xB,GAAWxhB,KAAK2wC,SAASmN,WAC5BA,GAASK,aAAaj9C,KAAKlB,OAIxBwhB,GAASxhB,KAAK2wC,SAAS0N,SAAU,CACpC,IAAM4J,EAAc,SAACvH,GACnB,IAAMjO,EAAYsV,EAAKrhB,OAAOkN,WAAWsU,eACzC/mD,OAAOC,eAAes/C,EAAQ,UAAW,CACvC99C,YAAY,EACZvB,IAFuC,WAGrC,OAAO4xC,GAASyN,EAAQjO,IAE1BzsC,IALuC,WAKlB,IAAjBk9C,EAAiBl6C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACnB6pC,GAAY6N,EAAQjO,EAAWyQ,OAMrC/hD,OAAO8X,OAAOjZ,KAAK2wC,SAAS0N,SACzB1sC,OAAO6I,SACP/I,SAAQ,SAACivC,GACJl/B,GAASk/B,IAAWl/B,GAAYk/B,GAClCxzC,MAAMosB,KAAKonB,GAAQ/uC,OAAO6I,SAAS/I,QAAQw2C,GAE3CA,EAAYvH,MAWpB,GALIjR,GAAQG,QACVP,GAAQhkC,GAINrL,KAAK0mC,OAAOqd,SAASjG,SAAU,CAAA,IAAAqK,EACCnoD,KAAK0mC,OAA/BkN,EADyBuU,EACzBvU,WAAYwK,EADa+J,EACb/J,UACd5L,EAAQ,GAAA7nC,OAAMyzC,EAAUN,SAAS/b,QAAzB,KAAAp3B,OAAoCyzC,EAAU1vB,OAA9C,MAAA/jB,OAAyDipC,EAAWrE,QAC5E7gB,EAAS2kB,GAAYnyC,KAAKlB,KAAMwyC,GAEtCtlC,MAAMosB,KAAK5K,GAAQjd,SAAQ,SAAC+c,GAC1BqkB,GAAYrkB,EAAOu5B,EAAKrhB,OAAOkN,WAAWrE,QAAQ,GAClDsD,GAAYrkB,EAAOu5B,EAAKrhB,OAAOkN,WAAWuL,SAAS,SCnsDpD,SAASiJ,GAASrkD,GAAoB,IAAbskD,IAAar/C,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GACvC6c,EAAM9hB,EAEV,GAAIskD,EAAM,CACR,IAAMC,EAASxnD,SAASyD,cAAc,KACtC+jD,EAAOpiC,KAAOL,EACdA,EAAMyiC,EAAOpiC,KAGf,IACE,OAAO,IAAIJ,IAAID,GACf,MAAOrlB,GACP,OAAO,MAKJ,SAAS+nD,GAAexkD,GAC7B,IAAMrD,EAAS,IAAIylB,gBAQnB,OANI3E,GAAUzd,IACZ5C,OAAO6X,QAAQjV,GAAO0N,SAAQ,SAAA4/B,GAAkB,IAAA4G,EAAA5f,GAAAgZ,EAAA,GAAhBhtC,EAAgB4zC,EAAA,GAAXl1C,EAAWk1C,EAAA,GAC9Cv3C,EAAOsF,IAAI3B,EAAKtB,MAIbrC,ECbT,IAAMk+C,GAAW,CAEf1F,MAFe,WAIb,GAAKl5C,KAAK+1C,UAAUnB,GAKpB,IAAK50C,KAAKg4C,SAAWh4C,KAAKwoD,WAAcxoD,KAAKs1C,UAAYjB,GAAQoB,WAG7Dj0B,GAASxhB,KAAK0mC,OAAOoX,WACrB99C,KAAK0mC,OAAOoX,SAAS3zC,SAAS,aAC9BnK,KAAK0mC,OAAOiY,SAASx0C,SAAS,aAE9B2zC,GAASyH,gBAAgBrkD,KAAKlB,UAPlC,CAsBA,GARKwhB,GAAWxhB,KAAK2wC,SAASiO,YAC5B5+C,KAAK2wC,SAASiO,SAAWr6C,GAAc,MAAO6tC,GAA0BpyC,KAAK0mC,OAAO0X,UAAUQ,WjBsB7F,SAAqBrY,EAASl7B,GAC9BmW,GAAW+kB,IAAa/kB,GAAWnW,IAIxCA,EAAO2lC,WAAWG,aAAa5K,EAASl7B,EAAO6lC,aiBzB3CuX,CAAYzoD,KAAK2wC,SAASiO,SAAU5+C,KAAK2wC,SAAS5O,UAKhD0N,GAAQC,MAAQzvC,OAAO6lB,IAAK,CAC9B,IAAM6qB,EAAW3wC,KAAKu1C,MAAM5P,iBAAiB,SAE7Cz4B,MAAMosB,KAAKqX,GAAUl/B,SAAQ,SAACk0C,GAC5B,IAAM/2C,EAAM+2C,EAAM1e,aAAa,OACzBphB,EAAMuiC,GAASx5C,GAGX,OAARiX,GACAA,EAAIqQ,WAAaj2B,OAAOg7B,SAAS/U,KAAKgQ,UACtC,CAAC,QAAS,UAAU/rB,SAAS0b,EAAIgQ,WAEjCnJ,GAAM9d,EAAK,QACRo7B,MAAK,SAAC/S,GACL0uB,EAAMnU,aAAa,MAAOvxC,OAAO6lB,IAAIgR,gBAAgBG,OAEtD4W,OAAM,WACL+D,GAAc+T,SAaxB,IACM+C,EAAYzO,IADO36C,UAAUopD,WAAa,CAACppD,UAAUumD,UAAYvmD,UAAUqpD,cAAgB,OACvDj3C,KAAI,SAACm0C,GAAD,OAAcA,EAASxiD,MAAM,KAAK,OAC5EwiD,GAAY7lD,KAAKg8C,QAAQ36C,IAAI,aAAerB,KAAK0mC,OAAOkY,SAASiH,UAAY,QAAQ55C,cAGzF,GAAiB,SAAb45C,EACDA,EADsBxtB,GACVqwB,EADU,GAAA,GAIzB,IAAI/P,EAAS34C,KAAKg8C,QAAQ36C,IAAI,YAa9B,GAZKmgB,GAAWm3B,KACXA,EAAW34C,KAAK0mC,OAAOkY,SAAvBjG,QAGLx3C,OAAOslB,OAAOzmB,KAAK4+C,SAAU,CAC3BgH,SAAS,EACTjN,OAAAA,EACAkN,SAAAA,EACA6C,UAAAA,IAIE1oD,KAAKs1C,QAAS,CAChB,IAAMsT,EAAc5oD,KAAK0mC,OAAOkY,SAAS7B,OAAS,uBAAyB,cAC3E3G,GAAGl1C,KAAKlB,KAAMA,KAAKu1C,MAAME,WAAYmT,EAAahK,GAAS7B,OAAOxrC,KAAKvR,OAIzEypC,WAAWmV,GAAS7B,OAAOxrC,KAAKvR,MAAO,KAIzC+8C,OA7Fe,WA6FN,IAAAxiB,EAAAv6B,KACDylD,EAAS7G,GAAS8G,UAAUxkD,KAAKlB,MAAM,GADtC6oD,EAG8C7oD,KAAK4+C,SAAlDjG,EAHDkQ,EAGClQ,OAAQkN,EAHTgD,EAGShD,SAAUvlB,EAHnBuoB,EAGmBvoB,KAAMwoB,EAHzBD,EAGyBC,iBAC1BC,EAAiBvuC,QAAQirC,EAAO3zC,MAAK,SAAC6zC,GAAD,OAAWA,EAAME,WAAaA,MAGrE7lD,KAAKs1C,SAAWt1C,KAAKg4C,SACvByN,EACG9zC,QAAO,SAACg0C,GAAD,OAAYrlB,EAAKj/B,IAAIskD,MAC5Bl0C,SAAQ,SAACk0C,GACRprB,EAAKyf,MAAMhV,IAAI,cAAe2gB,GAG9BrlB,EAAKt6B,IAAI2/C,EAAO,CACdX,QAAwB,YAAfW,EAAMp/C,OAOE,YAAfo/C,EAAMp/C,OAERo/C,EAAMp/C,KAAO,UAIf6vC,GAAGl1C,KAAKq5B,EAAMorB,EAAO,aAAa,WAAA,OAAM/G,GAASoK,WAAW9nD,KAAKq5B,UAKlEwuB,GAAkB/oD,KAAK6lD,WAAaA,IAAcJ,EAAOt7C,SAAS2+C,MACrElK,GAASqK,YAAY/nD,KAAKlB,KAAM6lD,GAChCjH,GAAS/U,OAAO3oC,KAAKlB,KAAM24C,GAAUoQ,IAIvClW,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAWgL,SAASjY,SAAUnlB,GAASikC,IAItFjkC,GAASxhB,KAAK0mC,OAAOoX,WACrB99C,KAAK0mC,OAAOoX,SAAS3zC,SAAS,aAC9BnK,KAAK0mC,OAAOiY,SAASx0C,SAAS,aAE9B2zC,GAASyH,gBAAgBrkD,KAAKlB,OAMlC6pC,OAlJe,SAkJR9lC,GAAuB,IAAAwyC,EAAAv2C,KAAhBk2C,IAAgBltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAE5B,GAAKhJ,KAAK+1C,UAAUnB,GAApB,CAF4B,IAMpBgR,EAAY5lD,KAAK4+C,SAAjBgH,QACFsD,EAAclpD,KAAK0mC,OAAOkN,WAAWgL,SAASjG,OAG9CA,EAASn3B,GAAmBzd,IAAU6hD,EAAU7hD,EAGtD,GAAI40C,IAAWiN,EAAS,CAQtB,GANK1P,IACHl2C,KAAK4+C,SAASjG,OAASA,EACvB34C,KAAKg8C,QAAQh2C,IAAI,CAAE44C,SAAUjG,MAI1B34C,KAAK6lD,UAAYlN,IAAWzC,EAAS,CACxC,IAAMuP,EAAS7G,GAAS8G,UAAUxkD,KAAKlB,MACjC2lD,EAAQ/G,GAASuK,UAAUjoD,KAAKlB,KAAxB,CAA+BA,KAAK4+C,SAASiH,UAA7Cl7C,OAAAuuB,GAA0Dl5B,KAAK4+C,SAAS8J,aAAY,GAOlG,OAJA1oD,KAAK4+C,SAASiH,SAAWF,EAAME,cAG/BjH,GAAS54C,IAAI9E,KAAKlB,KAAMylD,EAAOr7C,QAAQu7C,IAKrC3lD,KAAK2wC,SAAS0N,QAAQO,WACxB5+C,KAAK2wC,SAAS0N,QAAQO,SAASsE,QAAUvK,GAI3C9F,GAAY7yC,KAAK2wC,SAAS2C,UAAW4V,EAAavQ,GAElD34C,KAAK4+C,SAASgH,QAAUjN,EAGxBmF,GAAS+G,cAAc3jD,KAAKlB,KAAM,YAGlCy2C,GAAav1C,KAAKlB,KAAMA,KAAKu1C,MAAOoD,EAAS,kBAAoB,oBAKnElP,YAAW,WACLkP,GAAUpC,EAAKqI,SAASgH,UAC1BrP,EAAKqI,SAASkK,iBAAiBviD,KAAO,eAO5CP,IA/Me,SA+MX2D,GAAuB,IAAhBusC,IAAgBltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GACnBy8C,EAAS7G,GAAS8G,UAAUxkD,KAAKlB,MAGvC,IAAe,IAAX2J,EAKJ,GAAK6X,GAAU7X,GAKf,GAAMA,KAAS87C,EAAf,CAKA,GAAIzlD,KAAK4+C,SAASgE,eAAiBj5C,EAAO,CACxC3J,KAAK4+C,SAASgE,aAAej5C,EAC7B,IAAMg8C,EAAQF,EAAO97C,GAFmB0nC,EAGnBsU,GAAS,GAAtBE,EAHgCxU,EAGhCwU,SAGR7lD,KAAK4+C,SAASkK,iBAAmBnD,EAGjC7H,GAAS+G,cAAc3jD,KAAKlB,KAAM,YAG7Bk2C,IACHl2C,KAAK4+C,SAASiH,SAAWA,EACzB7lD,KAAKg8C,QAAQh2C,IAAI,CAAE6/C,SAAAA,KAIjB7lD,KAAKo4C,SACPp4C,KAAK23C,MAAMyR,gBAAgBvD,GAI7BpP,GAAav1C,KAAKlB,KAAMA,KAAKu1C,MAAO,kBAItCqJ,GAAS/U,OAAO3oC,KAAKlB,MAAM,EAAMk2C,GAE7Bl2C,KAAKs1C,SAAWt1C,KAAKg4C,SAEvB4G,GAASoK,WAAW9nD,KAAKlB,WAnCzBA,KAAKg6C,MAAMoF,KAAK,kBAAmBz1C,QALnC3J,KAAKg6C,MAAMoF,KAAK,2BAA4Bz1C,QAL5Ci1C,GAAS/U,OAAO3oC,KAAKlB,MAAM,EAAOk2C,IAmDtC+S,YAvQe,SAuQHllD,GAAuB,IAAhBmyC,IAAgBltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GACjC,GAAKwY,GAAUzd,GAAf,CAKA,IAAM8hD,EAAW9hD,EAAMkI,cACvBjM,KAAK4+C,SAASiH,SAAWA,EAGzB,IAAMJ,EAAS7G,GAAS8G,UAAUxkD,KAAKlB,MACjC2lD,EAAQ/G,GAASuK,UAAUjoD,KAAKlB,KAAM,CAAC6lD,IAC7CjH,GAAS54C,IAAI9E,KAAKlB,KAAMylD,EAAOr7C,QAAQu7C,GAAQzP,QAV7Cl2C,KAAKg6C,MAAMoF,KAAK,4BAA6Br7C,IAgBjD2hD,UAzRe,WAyRW,IAAA5O,EAAA92C,KAAhB+8C,EAAgB/zC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAElBy8C,EAASv4C,MAAMosB,MAAMt5B,KAAKu1C,OAAS,IAAIE,YAAc,IAG3D,OAAOgQ,EACJ9zC,QAAO,SAACg0C,GAAD,OAAY7O,EAAKxB,SAAWyH,GAAUjG,EAAK8H,SAASte,KAAKl8B,IAAIuhD,MACpEh0C,QAAO,SAACg0C,GAAD,MAAW,CAAC,WAAY,aAAax7C,SAASw7C,EAAMtsC,UAIhE8vC,UApSe,SAoSLT,GAA0B,IAI9B/C,EAJ8BvC,EAAApjD,KAAf8yC,EAAe9pC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAC5By8C,EAAS7G,GAAS8G,UAAUxkD,KAAKlB,MACjCqpD,EAAgB,SAAC1D,GAAD,OAAWhX,QAAQyU,EAAKxE,SAASte,KAAKj/B,IAAIskD,IAAU,IAAIX,UACxEsE,EAASp8C,MAAMosB,KAAKmsB,GAAQx/B,MAAK,SAACthB,EAAG2L,GAAJ,OAAU+4C,EAAc/4C,GAAK+4C,EAAc1kD,MASlF,OANA+jD,EAAU72C,OAAM,SAACg0C,GAEf,QADAF,EAAQ2D,EAAOx3C,MAAK,SAACsX,GAAD,OAAOA,EAAEy8B,WAAaA,SAKrCF,IAAU7S,EAAQwW,EAAO,QAAK7lD,IAIvC8lD,gBApTe,WAqTb,OAAO3K,GAAS8G,UAAUxkD,KAAKlB,MAAMA,KAAK4iD,eAI5CqC,SAzTe,SAyTNU,GACP,IAAI/C,EAAe+C,EAMnB,OAJKnkC,GAASohC,IAAiBvO,GAAQoB,YAAcz1C,KAAK4+C,SAASgH,UACjEhD,EAAehE,GAAS2K,gBAAgBroD,KAAKlB,OAG3CwhB,GAASohC,GACNphC,GAASohC,EAAap0B,OAItBhN,GAASohC,EAAaiD,UAIpBxK,GAAS,UAAWr7C,KAAK0mC,QAHvBif,EAAME,SAAS/K,cAJf8H,EAAap0B,MAUjB6sB,GAAS,WAAYr7C,KAAK0mC,SAKnCsiB,WAjVe,SAiVJjlD,GAET,GAAK/D,KAAK+1C,UAAUnB,GAIpB,GAAKpzB,GAAWxhB,KAAK2wC,SAASiO,UAM9B,GAAKp9B,GAAmBzd,IAAWmJ,MAAMD,QAAQlJ,GAAjD,CAKA,IAAIylD,EAAOzlD,EAGX,IAAKylD,EAAM,CACT,IAAM7D,EAAQ/G,GAAS2K,gBAAgBroD,KAAKlB,MAE5CwpD,EAAOt8C,MAAMosB,MAAMqsB,GAAS,IAAI8D,YAAc,IAC3C/3C,KAAI,SAACg4C,GAAD,OAASA,EAAIC,kBACjBj4C,IAAIupC,IAIT,IAAMptC,EAAU27C,EAAK93C,KAAI,SAACk4C,GAAD,OAAaA,EAAQrrB,UAAQ91B,KAAK,MAG3D,GAFgBoF,IAAY7N,KAAK2wC,SAASiO,SAAS1D,UAEtC,CAEXrJ,GAAa7xC,KAAK2wC,SAASiO,UAC3B,IAAMiL,EAAUtlD,GAAc,OAAQ6tC,GAA0BpyC,KAAK0mC,OAAO0X,UAAUyL,UACtFA,EAAQ3O,UAAYrtC,EACpB7N,KAAK2wC,SAASiO,SAASjwC,YAAYk7C,GAGnCpT,GAAav1C,KAAKlB,KAAMA,KAAKu1C,MAAO,mBA3BpCv1C,KAAKg6C,MAAMoF,KAAK,4BAA6Br7C,QAN7C/D,KAAKg6C,MAAMoF,KAAK,sCC5WhB9Z,GAAW,CAEfqB,SAAS,EAGT8U,MAAO,GAGPzB,OAAO,EAGP8P,UAAU,EAGVC,WAAW,EAIXtV,aAAa,EAGb8G,SAAU,GAGVyD,OAAQ,EACRiE,OAAO,EAGPhE,SAAU,KAIVyF,iBAAiB,EAGjBJ,YAAY,EAGZ0F,cAAc,EAId9S,MAAO,KAGP+S,aAAa,EAGbC,cAAc,EAGdC,YAAY,EAGZC,oBAAoB,EAGpB1N,YAAY,EACZ8C,WAAY,OACZvB,QAAS,qCAGTlE,WAAY,uCAGZd,QAAS,CACP+L,QAAS,IAET58C,QAAS,CAAC,KAAM,KAAM,KAAM,KAAM,KAAM,IAAK,IAAK,IAAK,IAAK,KAC5DsE,QAAQ,EACR2sC,SAAU,MAIZgR,KAAM,CACJ1R,QAAQ,GAMVS,MAAO,CACLkR,SAAU,EAEVliD,QAAS,CAAC,GAAK,IAAM,EAAG,KAAM,IAAK,KAAM,EAAG,IAI9CmiD,SAAU,CACRC,SAAS,EACTjrD,QAAQ,GAIVwkD,SAAU,CACRjG,UAAU,EACViB,MAAM,GAIRH,SAAU,CACRjG,QAAQ,EACRkN,SAAU,OAGV9I,QAAQ,GAIVrE,WAAY,CACV/R,SAAS,EACT8jB,UAAU,EACVC,WAAW,GAOb1O,QAAS,CACPrV,SAAS,EACTtiC,IAAK,QAIPy5C,SAAU,CACR,aAGA,OAEA,WACA,eAEA,OACA,SACA,WACA,WACA,MACA,UAEA,cAEFa,SAAU,CAAC,WAAY,UAAW,SAGlCtD,KAAM,CACJkD,QAAS,UACTC,OAAQ,qBACR5E,KAAM,OACN0E,MAAO,QACPG,YAAa,sBACbM,KAAM,OACN4L,UAAW,8BACXtJ,OAAQ,SACRqC,SAAU,WACVnK,YAAa,eACb0F,SAAU,WACVD,OAAQ,SACRN,KAAM,OACNkM,OAAQ,SACRC,eAAgB,kBAChBC,gBAAiB,mBACjB5D,SAAU,WACV6D,gBAAiB,mBACjBC,eAAgB,kBAChBC,WAAY,qBACZrM,SAAU,WACVD,SAAU,WACV7J,IAAK,MACLoW,SAAU,2BACV9R,MAAO,QACP+R,OAAQ,SACRlS,QAAS,UACToR,KAAM,OACNzvC,MAAO,QACPC,IAAK,MACLuxB,IAAK,MACLgf,MAAO,QACP9jB,SAAU,WACVX,QAAS,UACT0kB,cAAe,KACfC,aAAc,CACZC,KAAM,KACNC,KAAM,KACNC,KAAM,KACNC,IAAK,KACLC,IAAK,KACLC,IAAK,OAKThE,KAAM,CACJV,SAAU,KACV7O,MAAO,CACLwT,IAAK,yCACL19C,OAAQ,yCACRwmC,IAAK,6CAEPyG,QAAS,CACPyQ,IAAK,qCACLlX,IAAK,qEAEPmX,UAAW,CACTD,IAAK,uDAKT9kB,UAAW,CACTgY,KAAM,KACNnF,KAAM,KACN0E,MAAO,KACPC,QAAS,KACTC,OAAQ,KACRC,YAAa,KACbC,KAAM,KACNM,OAAQ,KACRJ,SAAU,KACVsI,SAAU,KACVxO,WAAY,KACZ5D,IAAK,KACLI,QAAS,KACTkE,MAAO,KACPH,QAAS,KACToR,KAAM,KACNxE,SAAU,MAIZtX,OAAQ,CAGN,QACA,WACA,UACA,UACA,UACA,UACA,iBACA,YACA,aACA,iBACA,aACA,eACA,OACA,QACA,QACA,UACA,SACA,UACA,aACA,YAGA,WACA,kBACA,iBACA,kBACA,mBACA,iBACA,iBACA,gBACA,QAGA,cAGA,gBAGA,YACA,kBACA,mBACA,YACA,cACA,cACA,iBACA,gBACA,YAKF6P,UAAW,CACT2N,SAAU,6CACVzY,UAAW,QACXwK,SAAU,CACRxK,UAAW,KACXvR,QAAS,mBAEXrT,OAAQ,cACR2vB,QAAS,CACPzE,KAAM,qBACN0E,MAAO,sBACPC,QAAS,wBACTC,OAAQ,uBACRC,YAAa,6BACbC,KAAM,qBACNE,SAAU,yBACVsI,SAAU,yBACVxO,WAAY,2BACZ5D,IAAK,oBACLI,QAAS,wBACTyJ,SAAU,yBACV0L,KAAM,sBAERvL,OAAQ,CACNC,KAAM,qBACNC,OAAQ,uBACR5F,MAAO,sBACPyM,SAAU,yBACV5M,QAAS,yBAEXvqC,QAAS,CACP6qC,YAAa,uBACb0F,SAAU,wBACVnqB,OAAQ,0BACRu1B,KAAM,wBACNrL,OAAQ,0BAEVH,SAAU,kBACVD,SAAU,kBACViL,QAAS,kBAIXjW,WAAY,CACV9rC,KAAM,YACN0sC,SAAU,YACVD,MAAO,sBACPoD,MAAO,oBACPkB,gBAAiB,mCACjBmT,eAAgB,+BAChBC,OAAQ,eACRC,cAAe,uBACfC,IAAK,YACL1L,QAAS,gBACTyH,eAAgB,yBAChBkE,QAAS,gBACT5S,OAAQ,eACR3Y,QAAS,gBACTwrB,QAAS,gBACTC,MAAO,cACPnN,QAAS,gBACTqK,KAAM,aACNja,OAAQ,gBACR2a,aAAc,sBACdla,MAAO,eACPuc,QAAS,iBACTC,YAAa,gBACbC,aAAc,sBACd/9C,QAAS,CACP8uC,KAAM,cAER2C,KAAM,CACJp9C,MAAO,oBACPm9C,MAAO,cACPpxC,KAAM,mBAER8vC,SAAU,CACRjY,QAAS,yBACTgS,OAAQ,yBAEVD,WAAY,CACV/R,QAAS,2BACT8jB,SAAU,6BAEZ3V,IAAK,CACHiB,UAAW,sBACX4C,OAAQ,oBAEVzD,QAAS,CACPa,UAAW,0BACX4C,OAAQ,wBAEVlF,SAAU,kBACViZ,kBAAmB,CAEjBC,eAAgB,sBAChBC,oBAAqB,gCACrBC,eAAgB,uCAChBC,cAAe,sCAEfC,mBAAoB,0BACpBC,wBAAyB,sCAK7B7hC,WAAY,CACVwsB,MAAO,CACLnD,SAAU,qBACV/tC,GAAI,uBAMR0lD,IAAK,CACHxlB,SAAS,EACTsmB,YAAa,GACbC,OAAQ,IAIVR,kBAAmB,CACjB/lB,SAAS,EACT/3B,IAAK,IAIPypC,MAAO,CACL8U,QAAQ,EACRC,UAAU,EACV3R,OAAO,EACPrC,OAAO,EACPiU,aAAa,EAEbC,gBAAgB,EAChBC,eAAgB,KAGhBjV,SAAS,GAIX8C,QAAS,CACPoS,IAAK,EACLC,SAAU,EACVC,eAAgB,EAChBC,eAAgB,EAEhBL,gBAAgB,EAChBM,UAAU,ICpbD9Y,GACH,qBADGA,GAED,SCFC+Y,GAAY,CACvB/U,MAAO,QACPsC,QAAS,UACT/C,MAAO,SAGIyV,GACJ,QADIA,GAEJ,QCRT,IAAMC,GAAO,aAEQC,GAAAA,WACnB,SAAAA,IAA6B,IAAjBrnB,EAAiB39B,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAAAouB,GAAAp3B,KAAAguD,GAC3BhuD,KAAK2mC,QAAU1mC,OAAOktC,SAAWxG,EAE7B3mC,KAAK2mC,SACP3mC,KAAKglC,IAAI,qBtMqqUX,OApBAxN,GAAaw2B,EAAS,CAAC,CACrB3pD,IAAK,MACLhD,IAAK,WsM7oUP,OAAOrB,KAAK2mC,QAAU5kC,SAAST,UAAUiQ,KAAKrQ,KAAKisC,QAAQnI,IAAKmI,SAAW4gB,KtMipUxE,CACD1pD,IAAK,OACLhD,IAAK,WsM9oUP,OAAOrB,KAAK2mC,QAAU5kC,SAAST,UAAUiQ,KAAKrQ,KAAKisC,QAAQiS,KAAMjS,SAAW4gB,KtMkpUzE,CACD1pD,IAAK,QACLhD,IAAK,WsM/oUP,OAAOrB,KAAK2mC,QAAU5kC,SAAST,UAAUiQ,KAAKrQ,KAAKisC,QAAQjrC,MAAOirC,SAAW4gB,OtMqpUtEC,EsM1qUUA,GCMfC,GAAAA,WACJ,SAAAA,EAAY9U,GAAQ,IAAA5e,EAAAv6B,KAAAo3B,GAAAp3B,KAAAiuD,GAAAt2B,GAAA33B,KAAA,YA6HT,WACT,GAAKu6B,EAAKoM,QAAV,CAKA,IAAM+Z,EAASnmB,EAAK4e,OAAOxI,SAAS0N,QAAQ3F,WACxCl3B,GAAWk/B,KACbA,EAAOwC,QAAU3oB,EAAKoe,QAIxB,IAAMttC,EAASkvB,EAAKlvB,SAAWkvB,EAAK4e,OAAO5D,MAAQhb,EAAKlvB,OAASkvB,EAAK4e,OAAOxI,SAAS2C,UAEtFmD,GAAav1C,KAAKq5B,EAAK4e,OAAQ9tC,EAAQkvB,EAAKoe,OAAS,kBAAoB,kBAAkB,OA3IzEhhB,GAAA33B,KAAA,kBA8IH,WAAoB,IAAnB6pC,EAAmB7gC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAkBnC,GAhBI6gC,EACFtP,EAAK2zB,eAAiB,CACpBzsC,EAAGxhB,OAAOkuD,SAAW,EACrBzsC,EAAGzhB,OAAOmuD,SAAW,GAGvBnuD,OAAOouD,SAAS9zB,EAAK2zB,eAAezsC,EAAG8Y,EAAK2zB,eAAexsC,GAI7D5gB,SAAS6rB,KAAKle,MAAM6/C,SAAWzkB,EAAS,SAAW,GAGnDgJ,GAAYtY,EAAKlvB,OAAQkvB,EAAK4e,OAAOzS,OAAOkN,WAAW8E,WAAW+R,SAAU5gB,GAGxE4F,GAAQO,MAAO,CACjB,IAAIue,EAAWztD,SAASs6B,KAAKoL,cAAc,yBACrCgoB,EAAW,qBAGZD,IACHA,EAAWztD,SAASyD,cAAc,SACzBitC,aAAa,OAAQ,YAIhC,IAAMid,EAAcjtC,GAAU+sC,EAAS1gD,UAAY0gD,EAAS1gD,QAAQ1D,SAASqkD,GAEzE3kB,GACFtP,EAAKm0B,iBAAmBD,EAEnBA,IACHF,EAAS1gD,SAAT,IAAAlD,OAAwB6jD,KAEjBj0B,EAAKm0B,kBACdH,EAAS1gD,QAAU0gD,EAAS1gD,QACzBxK,MAAM,KACNsO,QAAO,SAACsd,GAAD,OAAUA,EAAKsP,SAAWiwB,KACjC/lD,KAAK,MAKZ8xB,EAAK8e,cA5La1hB,GAAA33B,KAAA,aAgMR,SAACS,GAEX,IAAIgvC,GAAQO,OAAUzV,EAAKoe,QAAwB,QAAdl4C,EAAM4D,KAAmC,IAAlB5D,EAAMkuD,QAAlE,CAKA,IAAMnE,EAAU1pD,SAAS8tD,cACnBhP,EAAYvM,GAAYnyC,KAAKq5B,EAAK4e,OAAQ,oEACzCr7B,EATcua,GASLunB,EATK,GAAA,GAUfjW,EAAOiW,EAAUA,EAAU32C,OAAS,GAEtCuhD,IAAY7gB,GAASlpC,EAAMouD,SAIpBrE,IAAY1sC,GAASrd,EAAMouD,WAEpCllB,EAAK+J,QACLjzC,EAAMJ,mBALNyd,EAAM41B,QACNjzC,EAAMJ,sBA/MUs3B,GAAA33B,KAAA,UAwNX,WAEL,IAAIuG,EADFg0B,EAAKoM,SAILpgC,EADEg0B,EAAKu0B,cACA,oBACEb,EAAW/4C,OACb,SAEA,WAGTqlB,EAAK4e,OAAOa,MAAMhV,IAAlB,GAAAr6B,OAAyBpE,EAAzB,yBAEAg0B,EAAK4e,OAAOa,MAAMhV,IAAI,kDAIxB6N,GAAYtY,EAAK4e,OAAOxI,SAAS2C,UAAW/Y,EAAK4e,OAAOzS,OAAOkN,WAAW8E,WAAW/R,QAASpM,EAAKoM,YA1OjFhP,GAAA33B,KAAA,SA8OZ,WACDu6B,EAAKoM,UAKN8I,GAAQO,OAASzV,EAAK4e,OAAOzS,OAAOgS,WAAWgS,UAC7CnwB,EAAK4e,OAAOf,QACd7d,EAAK4e,OAAOxB,MAAMoX,oBAElBx0B,EAAKlvB,OAAO2jD,yBAEJf,EAAW/4C,QAAUqlB,EAAKu0B,cACpCv0B,EAAK00B,gBAAe,GACV10B,EAAKoiB,OAELn7B,GAAS+Y,EAAKoiB,SACxBpiB,EAAKlvB,OAAL,GAAAV,OAAe4vB,EAAKoiB,OAApB,WAAAhyC,OAAoC4vB,EAAKi0B,aAFzCj0B,EAAKlvB,OAAO0jD,kBAAkB,CAAEG,aAAc,aA7P9Bv3B,GAAA33B,KAAA,QAoQb,WACL,GAAKu6B,EAAKoM,QAKV,GAAI8I,GAAQO,OAASzV,EAAK4e,OAAOzS,OAAOgS,WAAWgS,UACjDnwB,EAAKlvB,OAAO8jD,uBACZpY,GAAexc,EAAK4e,OAAOS,aACtB,IAAKqU,EAAW/4C,QAAUqlB,EAAKu0B,cACpCv0B,EAAK00B,gBAAe,QACf,GAAK10B,EAAKoiB,QAEV,IAAKn7B,GAAS+Y,EAAKoiB,QAAS,CACjC,IAAMyS,EAAyB,QAAhB70B,EAAKoiB,OAAmB,SAAW,OAClD77C,SAAQ,GAAA6J,OAAI4vB,EAAKoiB,QAAThyC,OAAkBykD,GAAlBzkD,OAA2B4vB,EAAKi0B,mBAHvC1tD,SAASuuD,kBAAoBvuD,SAASkqD,gBAAgB9pD,KAAKJ,aAhR5C62B,GAAA33B,KAAA,UAwRX,WACFu6B,EAAKoe,OAGRpe,EAAKgQ,OAFLhQ,EAAKiQ,WAxRPxqC,KAAKm5C,OAASA,EAGdn5C,KAAK28C,OAASsR,EAAWtR,OACzB38C,KAAKwuD,SAAWP,EAAWO,SAG3BxuD,KAAKkuD,eAAiB,CAAEzsC,EAAG,EAAGC,EAAG,GAGjC1hB,KAAK8uD,cAAsD,UAAtC3V,EAAOzS,OAAOgS,WAAW+R,SAI9CzqD,KAAKm5C,OAAOxI,SAAS+H,WACnBS,EAAOzS,OAAOgS,WAAWpF,WtBkNxB,SAAiB/M,EAASiM,GAgB/B,OAfsBxM,QAAd1kC,UAaiBguD,SAVzB,WACE,IAAItlD,EAAKhK,KAET,EAAG,CACD,GAAI0lC,GAAQA,QAAQ17B,EAAIwoC,GAAW,OAAOxoC,EAC1CA,EAAKA,EAAGulD,eAAiBvlD,EAAGgnC,iBACd,OAAPhnC,GAA+B,IAAhBA,EAAG4kC,UAC3B,OAAO,OAKK1tC,KAAKqlC,EAASiM,GsBlOc8c,CAAQtvD,KAAKm5C,OAAOxI,SAAS2C,UAAW6F,EAAOzS,OAAOgS,WAAWpF,WAIzG8C,GAAGl1C,KACDlB,KAAKm5C,OACLr4C,SACgB,OAAhBd,KAAK28C,OAAkB,qBAAvB,GAAAhyC,OAAiD3K,KAAK28C,OAAtD,qBACA,WAEEpiB,EAAK8e,cAKTjD,GAAGl1C,KAAKlB,KAAKm5C,OAAQn5C,KAAKm5C,OAAOxI,SAAS2C,UAAW,YAAY,SAAC7yC,GAE5D+gB,GAAW+Y,EAAK4e,OAAOxI,SAASmN,WAAavjB,EAAK4e,OAAOxI,SAASmN,SAAS9K,SAASvyC,EAAM4K,SAI9FkvB,EAAK4e,OAAOpS,UAAU2T,MAAMj6C,EAAO85B,EAAKsP,OAAQ,iBAIlDuM,GAAGl1C,KAAKlB,KAAMA,KAAKm5C,OAAOxI,SAAS2C,UAAW,WAAW,SAAC7yC,GAAD,OAAW85B,EAAKi1B,UAAU/uD,MAGnFT,KAAK+8C,SvM64UL,OApEAvlB,GAAay2B,EAAY,CAAC,CACxB5pD,IAAK,cAELhD,IAAK,WuM3zUP,OAAO4sD,EAAW/4C,SAAWlV,KAAK8uD,gBvM+zU/B,CACDzqD,IAAK,UAELhD,IAAK,WuMlyUP,OACG4sD,EAAW/4C,QAAUlV,KAAKm5C,OAAOzS,OAAOgS,WAAW+R,WACpDzqD,KAAKm5C,OAAOzS,OAAOgS,WAAW/R,SAC9B3mC,KAAKm5C,OAAOpD,UAAUnB,IACtB50C,KAAKm5C,OAAOnB,UvMkyUX,CACD3zC,IAAK,SACLhD,IAAK,WuM9xUP,IAAKrB,KAAK2mC,QACR,OAAO,EAIT,IAAKsnB,EAAW/4C,QAAUlV,KAAK8uD,cAC7B,OAAO7b,GAASjzC,KAAKqL,OAAQrL,KAAKm5C,OAAOzS,OAAOkN,WAAW8E,WAAW+R,UAGxE,IAAMlkB,EAAWvmC,KAAK28C,OAAsC77C,SAAQ,GAAA6J,OAAI3K,KAAK28C,QAAThyC,OAAkB3K,KAAKwuD,SAAvB,YAArC1tD,SAAS2uD,kBAExC,OAAOlpB,GAAWA,EAAQmpB,WAAanpB,IAAYvmC,KAAKqL,OAAOskD,cAActpC,KAAOkgB,IAAYvmC,KAAKqL,SvMiyUlG,CACDhH,IAAK,SACLhD,IAAK,WuM9xUP,OAAOouC,GAAQO,OAAShwC,KAAKm5C,OAAOzS,OAAOgS,WAAWgS,UAClD1qD,KAAKm5C,OAAO5D,MACZv1C,KAAKm5C,OAAOxI,SAAS+H,YAAc14C,KAAKm5C,OAAOxI,SAAS2C,avM+xUxD,CAAC,CACHjvC,IAAK,SACLhD,IAAK,WuMv2UP,SACEP,SAAS8uD,mBACT9uD,SAAS+uD,yBACT/uD,SAASgvD,sBACThvD,SAASivD,uBvMs2UR,CACD1rD,IAAK,SACLhD,IAAK,WuM51UP,GAAImgB,GAAY1gB,SAASkqD,gBACvB,MAAO,GAIT,IAAIjoD,EAAQ,GAYZ,MAXiB,CAAC,SAAU,MAAO,MAE1B6O,MAAK,SAACo+C,GACb,SAAIxuC,GAAY1gB,SAAQ,GAAA6J,OAAIqlD,EAAJ,sBAA6BxuC,GAAY1gB,SAAQ,GAAA6J,OAAIqlD,EAAJ,yBACvEjtD,EAAQitD,GACD,MAMJjtD,IvM81UJ,CACDsB,IAAK,WACLhD,IAAK,WuM51UP,MAAuB,QAAhBrB,KAAK28C,OAAmB,aAAe,iBvMi2UvCsR,EuM37ULA,GCVNgC,GAAiBpuD,KAAK6iC,MAAQ,SAAcjjB,GAE1C,OAAmB,IAAXA,GAAKA,IAAWA,GAAKA,EAAIA,EAAIA,EAAI,GAAK,EAAI,GCErC,SAASyuC,GAAUthD,GAAmB,IAAduhD,EAAcnnD,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAH,EAChD,OAAO,IAAIg/B,SAAQ,SAAC2C,EAASO,GAC3B,IAAMklB,EAAQ,IAAIC,MAEZxjB,EAAU,kBACPujB,EAAME,cACNF,EAAMG,SACZH,EAAMI,cAAgBL,EAAWxlB,EAAUO,GAAQklB,IAGtDjvD,OAAOslB,OAAO2pC,EAAO,CAAEE,OAAQzjB,EAAS0jB,QAAS1jB,EAASj+B,IAAAA,OCX9DqF,GAAE,CAAE5I,OAAQ,OAAQoB,MAAM,GAAQ,CAChCi4B,KAAMA,KCQR,IAAMkQ,GAAK,CACT6b,aADS,WAEP5d,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAO0X,UAAU9K,UAAUtnC,QAAQ,IAAK,KAAK,GACvF6mC,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAW4Y,YAAaxsD,KAAK+1C,UAAUnB,KAI1FyK,qBAPS,WAO4B,IAAhBxV,EAAgB7gC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAC/B6gC,GAAU7pC,KAAKs1C,QACjBt1C,KAAKu1C,MAAM/D,aAAa,WAAY,IAEpCxxC,KAAKu1C,MAAMoR,gBAAgB,aAK/B+J,MAhBS,WAgBD,IAAAn2B,EAAAv6B,KAMN,GAHAA,KAAK+mC,UAAUwO,SAGVv1C,KAAK+1C,UAAUnB,GAOlB,OANA50C,KAAKg6C,MAAMoF,KAAX,0BAAAz0C,OAA0C3K,KAAKw0C,SAA/C,KAAA7pC,OAA2D3K,KAAK8H,YAGhE8sC,GAAGyK,qBAAqBn+C,KAAKlB,MAAM,GAOhCwhB,GAAWxhB,KAAK2wC,SAASmN,YAE5BA,GAASgK,OAAO5mD,KAAKlB,MAGrBA,KAAK+mC,UAAU+W,YAIjBlJ,GAAGyK,qBAAqBn+C,KAAKlB,MAGzBA,KAAKs1C,SACPsJ,GAAS1F,MAAMh4C,KAAKlB,MAItBA,KAAKg/C,OAAS,KAGdh/C,KAAKijD,MAAQ,KAGbjjD,KAAKqqD,KAAO,KAGZrqD,KAAKi5C,QAAU,KAGfj5C,KAAKo5C,MAAQ,KAGb0E,GAASiF,aAAa7hD,KAAKlB,MAG3B89C,GAASsG,WAAWljD,KAAKlB,MAGzB40C,GAAG+b,aAAazvD,KAAKlB,MAGrB6yC,GACE7yC,KAAK2wC,SAAS2C,UACdtzC,KAAK0mC,OAAOkN,WAAWkB,IAAIiB,UAC3B1B,GAAQS,KAAO90C,KAAKs1C,SAAWt1C,KAAKg4C,SAItCnF,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAWsB,QAAQa,UAAW1B,GAAQa,SAAWl1C,KAAKs1C,SAGvGzC,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAW5D,MAAOP,GAAQO,OAG3E6C,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAW2Y,QAASvsD,KAAK01C,OAG1E11C,KAAK62C,OAAQ,EAGbpN,YAAW,WACTgN,GAAav1C,KAAKq5B,EAAMA,EAAKgb,MAAO,WACnC,GAGHX,GAAGgc,SAAS1vD,KAAKlB,MAGbA,KAAKisD,QACPrX,GAAGic,UAAU3vD,KAAKlB,KAAMA,KAAKisD,QAAQ,GAAOpe,OAAM,eAKhD7tC,KAAK0mC,OAAOuY,UACdnB,GAAS0G,eAAetjD,KAAKlB,OAKjC4wD,SAjHS,WAmHP,IAAIpiC,EAAQ6sB,GAAS,OAAQr7C,KAAK0mC,QAclC,GAXIllB,GAAUxhB,KAAK0mC,OAAO+U,SAAWj6B,GAASxhB,KAAK0mC,OAAO+U,SACxDjtB,GAAK,KAAA7jB,OAAS3K,KAAK0mC,OAAO+U,QAI5BvuC,MAAMosB,KAAKt5B,KAAK2wC,SAAS0N,QAAQzE,MAAQ,IAAInoC,SAAQ,SAACivC,GACpDA,EAAOlP,aAAa,aAAchjB,MAKhCxuB,KAAK6nD,QAAS,CAChB,IAAM15C,EAASolC,GAAWryC,KAAKlB,KAAM,UAErC,IAAKwhB,GAAWrT,GACd,OAIF,IAAMstC,EAASj6B,GAASxhB,KAAK0mC,OAAO+U,OAA6B,QAApBz7C,KAAK0mC,OAAO+U,MACnDd,EAASU,GAAS,aAAcr7C,KAAK0mC,QAE3Cv4B,EAAOqjC,aAAa,QAASmJ,EAAO3uC,QAAQ,UAAWyvC,MAK3DqV,aAjJS,SAiJIC,GACXle,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAWsY,cAAe6E,IAK7EF,UAvJS,SAuJC5E,GAAwB,IAAA1V,EAAAv2C,KAAhBk2C,IAAgBltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAEhC,OAAIktC,GAAWl2C,KAAKisD,OACXjkB,QAAQkD,OAAO,IAAI3qC,MAAM,wBAIlCP,KAAKu1C,MAAM/D,aAAa,cAAeya,GAGvCjsD,KAAK2wC,SAASsb,OAAOtF,gBAAgB,UAInC9P,GACG31C,KAAKlB,MAELgqC,MAAK,WAAA,OAAMkmB,GAAUjE,MACrBpe,OAAM,SAAC/U,GAMN,MAJImzB,IAAW1V,EAAK0V,QAClBrX,GAAGkc,aAAa5vD,KAAKq1C,GAAM,GAGvBzd,KAEPkR,MAAK,WAEJ,GAAIiiB,IAAW1V,EAAK0V,OAClB,MAAM,IAAI1rD,MAAM,qDAGnBypC,MAAK,WASJ,OARA7oC,OAAOslB,OAAO8vB,EAAK5F,SAASsb,OAAOx9C,MAAO,CACxCuiD,gBAAe,QAAArmD,OAAUshD,EAAV,MAEfgF,eAAgB,KAGlBrc,GAAGkc,aAAa5vD,KAAKq1C,GAAM,GAEpB0V,OAMf0E,aAtMS,SAsMIlwD,GAAO,IAAAq2C,EAAA92C,KAElB6yC,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAWwY,QAASpsD,KAAKosD,SAC1EvZ,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAW4F,OAAQx5C,KAAKw5C,QACzE3G,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAW/S,QAAS7gC,KAAK6gC,SAG1E3zB,MAAMosB,KAAKt5B,KAAK2wC,SAAS0N,QAAQzE,MAAQ,IAAInoC,SAAQ,SAACpG,GACpDlK,OAAOslB,OAAOpb,EAAQ,CAAE63C,QAASpM,EAAKsV,UACtC/gD,EAAOmmC,aAAa,aAAc6J,GAASvE,EAAKsV,QAAU,QAAU,OAAQtV,EAAKpQ,YAI/EllB,GAAS/gB,IAAyB,eAAfA,EAAMqH,MAK7B8sC,GAAGsc,eAAehwD,KAAKlB,OAIzBmxD,aA5NS,SA4NI1wD,GAAO,IAAA2iD,EAAApjD,KAClBA,KAAKqsD,QAAU,CAAC,UAAW,WAAWliD,SAAS1J,EAAMqH,MAGrDspD,aAAapxD,KAAKqxD,OAAOhF,SAGzBrsD,KAAKqxD,OAAOhF,QAAU5iB,YACpB,WAEEoJ,GAAYuQ,EAAKzS,SAAS2C,UAAW8P,EAAK1c,OAAOkN,WAAWyY,QAASjJ,EAAKiJ,SAG1EzX,GAAGsc,eAAehwD,KAAKkiD,KAEzBpjD,KAAKqsD,QAAU,IAAM,IAKzB6E,eAhPS,SAgPMpe,GAAO,IACFwe,EAAoBtxD,KAAK2wC,SAAnCmN,SAER,GAAIwT,GAAmBtxD,KAAK0mC,OAAOwjB,aAAc,CAE/C,IAAMqH,EAAkBvxD,KAAK01C,OAAS11C,KAAKwxD,aAAe,IAAOC,KAAKxoB,MAGtEjpC,KAAKkxD,eACH12C,QACEs4B,GAAS9yC,KAAKqsD,SAAWrsD,KAAKw5C,QAAU8X,EAAgBpO,SAAWoO,EAAgBhF,OAASiF,MAOpGG,cAjQS,WAiQO,IAAA5N,EAAA9jD,KAEdmB,OAAO8X,OAAP6e,GAAA,GAAmB93B,KAAKu1C,MAAM9mC,QAE3BkD,QAAO,SAACtN,GAAD,OAAUmd,GAASnd,IAAQmd,GAAUnd,IAAQA,EAAI+pC,WAAW,aACnE38B,SAAQ,SAACpN,GAERy/C,EAAKnT,SAAS2C,UAAU7kC,MAAMm1C,YAAYv/C,EAAKy/C,EAAKvO,MAAM9mC,MAAMkjD,iBAAiBttD,IAGjFy/C,EAAKvO,MAAM9mC,MAAMmjD,eAAevtD,MAIhCmd,GAASxhB,KAAKu1C,MAAM9mC,QACtBzO,KAAKu1C,MAAMoR,gBAAgB,WChR3BkL,GAAAA,WACJ,SAAAA,EAAY1Y,GAAQ,IAAA5e,EAAAv6B,KAAAo3B,GAAAp3B,KAAA6xD,GAAAl6B,GAAA33B,KAAA,cA0KP,WAAM,IACTm5C,EAAW5e,EAAX4e,OACAxI,EAAawI,EAAbxI,SAERwI,EAAOzD,OAAQ,EAGf7C,GAAYlC,EAAS2C,UAAW6F,EAAOzS,OAAOkN,WAAW2Y,SAAS,MAjLhD50B,GAAA33B,KAAA,eAoLN,SAACS,GAAU,IACf04C,EAAW5e,EAAX4e,OACAxI,EAAawI,EAAbxI,SAKR,GAHAygB,aAAa72B,EAAKu3B,YAGC,YAAfrxD,EAAMqH,MAAsC,IAAhBrH,EAAMkhD,MAAtC,CAKmB,YAAflhD,EAAMqH,OACRyyB,EAAKw3B,YAActxD,EAAMuxD,WAI3B,IACQvf,EAMFwf,EAAaxxD,EAAMuxD,UAAYz3B,EAAKw3B,aAAe,GAGzD,GAAmB,UAAftxD,EAAMqH,MAAqBmqD,EATvBxf,EAAY0G,EAAOzS,OAAOkN,WAAWH,SAE3CZ,GADgBQ,GAAYnyC,KAAKi4C,EAAjB,IAAAxuC,OAA6B8nC,IACxBA,GAAW,GAgBf,aAAfhyC,EAAMqH,OACRyyB,EAAKu3B,WAAaroB,YAAW,WAC3B,IAAM+gB,EAAU1pD,SAAS8tD,cAGpBje,EAAS2C,UAAUN,SAASwX,IAIjC3X,GAAY/xC,SAAS8tD,cAAezV,EAAOzS,OAAOkN,WAAWH,UAAU,KACtE,SAlOa9b,GAAA33B,KAAA,UAuOX,WAAmB,IAAlB6pC,IAAkB7gC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAClBmwC,EAAW5e,EAAX4e,OAGJA,EAAOzS,OAAO6jB,SAAShrD,QACzB02C,GAAe/0C,KAAKi4C,EAAQl5C,OAAQ,gBAAiBs6B,EAAK23B,UAAWroB,GAAQ,GAI/EoM,GAAe/0C,KAAKi4C,EAAQr4C,SAAS6rB,KAAM,QAAS4N,EAAK6rB,WAAYvc,GAGrEyM,GAAKp1C,KAAKi4C,EAAQr4C,SAAS6rB,KAAM,aAAc4N,EAAK43B,YAGpDlc,GAAe/0C,KAAKi4C,EAAQr4C,SAAS6rB,KAAM,8BAA+B4N,EAAK63B,YAAavoB,GAAQ,GAAO,MAtPzFlS,GAAA33B,KAAA,aA0PR,WAAM,IACRm5C,EAAW5e,EAAX4e,OACAzS,EAA6ByS,EAA7BzS,OAAQiK,EAAqBwI,EAArBxI,SAAU0gB,EAAWlY,EAAXkY,QAGrB3qB,EAAO6jB,SAAShrD,QAAUmnC,EAAO6jB,SAASC,SAC7CpU,GAAGl1C,KAAKi4C,EAAQxI,EAAS2C,UAAW,gBAAiB/Y,EAAK23B,WAAW,GAIvE9b,GAAGl1C,KACDi4C,EACAxI,EAAS2C,UACT,4EACA,SAAC7yC,GAAU,IACS6wD,EAAoB3gB,EAA9BmN,SAGJwT,GAAkC,oBAAf7wD,EAAMqH,OAC3BwpD,EAAgBpO,SAAU,EAC1BoO,EAAgBhF,OAAQ,GAI1B,IACIhd,EAAQ,EADC,CAAC,aAAc,YAAa,aAAanlC,SAAS1J,EAAMqH,QAInE8sC,GAAGsc,eAAehwD,KAAKi4C,GAAQ,GAE/B7J,EAAQ6J,EAAOzD,MAAQ,IAAO,KAIhC0b,aAAaC,EAAOvT,UAGpBuT,EAAOvT,SAAWrU,YAAW,WAAA,OAAMmL,GAAGsc,eAAehwD,KAAKi4C,GAAQ,KAAQ7J,MAK9E,IAcM+iB,EAAgB,SAACC,GAErB,IAAKA,EACH,OAAOva,GAAe72C,KAAKi4C,GAG7B,IAAMoZ,EAAO5hB,EAAS2C,UAAUpM,wBACxBC,EAAkBorB,EAAlBprB,MAAOiQ,EAAWmb,EAAXnb,OAEf,OAAOW,GAAe72C,KAAKi4C,EAApB,GAAAxuC,OAA+Bw8B,EAA/B,KAAAx8B,OAAwCysC,KAG3Cob,EAAU,WACdpB,aAAaC,EAAOmB,SACpBnB,EAAOmB,QAAU/oB,WAAW4oB,EAAe,KAG7Cjc,GAAGl1C,KAAKi4C,EAAQxI,EAAS2C,UAAW,kCAAkC,SAAC7yC,GAAU,IAAAgyD,EAC/CtZ,EAAOT,WAA/BrtC,EADuEonD,EACvEpnD,OAAQqnD,EAD+DD,EAC/DC,YAGhB,GAAIrnD,IAAWslC,EAAS2C,YAKnB6F,EAAO0O,UAAWrmC,GAAS23B,EAAOzS,OAAOwQ,QAA9C,CAIA,IAAMyb,EAAyB,oBAAflyD,EAAMqH,KAbyD8qD,EAepDP,EAAcM,GAfsCC,EAevE1a,SA9CQ,SAAChB,EAAOgB,EAASrO,GACjC,GAAKsP,EAAOf,UAAWe,EAAOzS,OAAO2R,MAAMC,QAA3C,CAIA,IAAMjtC,EAAS8tC,EAAOxI,SAAS5O,QAAQ8wB,WAC9BnxC,EANmC2W,GAM9B6e,EAN8B,GAAA,GAAA4b,EAAAz6B,GAOnBof,GAAev2C,KAAKi4C,GAPD,GAOrC4Z,EAPqCD,EAAA,GAO7BE,EAP6BF,EAAA,GAS5CznD,EAAOoD,MAAMwkD,SAAWppB,EAAM,GAAAl/B,OAAO+W,EAAIsxC,EAAUD,EAArB,MAAkC,KAChE1nD,EAAOoD,MAAMykD,OAASrpB,EAAS,SAAW,MAuC1CspB,CAlB+EP,EAe9D1b,MAGAgB,EAASya,GAGtBA,GACFlpB,YAAW,WAAA,OAAM4F,GAAQsB,EAAS2C,aAAY,KAI3Cof,IACCC,EACFvc,GAAGl1C,KAAKi4C,EAAQl5C,OAAQ,SAAUuyD,GAElCnc,GAAIn1C,KAAKi4C,EAAQl5C,OAAQ,SAAUuyD,WAjWvB76B,GAAA33B,KAAA,SAwWZ,WAAM,IACJm5C,EAAW5e,EAAX4e,OACAxI,EAAawI,EAAbxI,SAuCR,GApCAyF,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,6BAA6B,SAAC90C,GAAD,OAAWq9C,GAASsG,WAAWljD,KAAKi4C,EAAQ14C,MAGvG21C,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,4CAA4C,SAAC90C,GAAD,OACxEq9C,GAAS0G,eAAetjD,KAAKi4C,EAAQ14C,MAIvC21C,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,SAAS,WAEjC4D,EAAO7D,SAAW6D,EAAOnB,SAAWmB,EAAOzS,OAAOyjB,aAEpDhR,EAAOoF,UAGPpF,EAAOmF,YAKXlI,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,mCAAmC,SAAC90C,GAAD,OAC/Dq9C,GAASqF,eAAejiD,KAAKi4C,EAAQ14C,MAIvC21C,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,gBAAgB,SAAC90C,GAAD,OAAWq9C,GAASiF,aAAa7hD,KAAKi4C,EAAQ14C,MAG5F21C,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,+CAA+C,SAAC90C,GAAD,OAC3Em0C,GAAG+b,aAAazvD,KAAKi4C,EAAQ14C,MAI/B21C,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,kCAAkC,SAAC90C,GAAD,OAAWm0C,GAAGuc,aAAajwD,KAAKi4C,EAAQ14C,MAGpG04C,EAAOpD,UAAUnB,IAAMuE,EAAOzS,OAAOujB,cAAgB9Q,EAAOia,QAAS,CAEvE,IAAMrxB,EAAUwR,GAAWryC,KAAKi4C,EAAhB,IAAAxuC,OAA4BwuC,EAAOzS,OAAOkN,WAAWW,QAGrE,IAAK/yB,GAAWugB,GACd,OAIFqU,GAAGl1C,KAAKi4C,EAAQxI,EAAS2C,UAAW,SAAS,SAAC7yC,IAC5B,CAACkwC,EAAS2C,UAAWvR,GAGxB53B,SAAS1J,EAAM4K,SAAY02B,EAAQiR,SAASvyC,EAAM4K,WAK3D8tC,EAAOzD,OAASyD,EAAOzS,OAAOwjB,eAI9B/Q,EAAOka,OACT94B,EAAKmgB,MAAMj6C,EAAO04C,EAAOoF,QAAS,WAClChkB,EAAKmgB,MACHj6C,GACA,WACEs2C,GAAeoC,EAAOS,UAExB,SAGFrf,EAAKmgB,MACHj6C,GACA,WACEs2C,GAAeoC,EAAOma,gBAExB,aAOJna,EAAOpD,UAAUnB,IAAMuE,EAAOzS,OAAO0jB,oBACvChU,GAAGl1C,KACDi4C,EACAxI,EAAS5O,QACT,eACA,SAACthC,GACCA,EAAMJ,oBAER,GAKJ+1C,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,gBAAgB,WAE5C4D,EAAO6C,QAAQh2C,IAAI,CACjBg5C,OAAQ7F,EAAO6F,OACfiE,MAAO9J,EAAO8J,WAKlB7M,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,cAAc,WAE1CuI,GAAS+G,cAAc3jD,KAAKi4C,EAAQ,SAGpCA,EAAO6C,QAAQh2C,IAAI,CAAEozC,MAAOD,EAAOC,WAIrChD,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,iBAAiB,SAAC90C,GAE9Cq9C,GAAS+G,cAAc3jD,KAAKi4C,EAAQ,UAAW,KAAM14C,EAAMQ,OAAOg4C,YAIpE7C,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAO,uBAAuB,WACnDuI,GAASmJ,eAAe/lD,KAAKi4C,MAK/B,IAAMoa,EAAcpa,EAAOzS,OAAO6H,OAAO5jC,OAAO,CAAC,QAAS,YAAYlC,KAAK,KAE3E2tC,GAAGl1C,KAAKi4C,EAAQA,EAAO5D,MAAOge,GAAa,SAAC9yD,GAAU,IAAA+yD,EAC9B/yD,EAAhBQ,OAAAA,OAD8C,IAAAuyD,EACrC,GADqCA,EAIjC,UAAf/yD,EAAMqH,OACR7G,EAASk4C,EAAO5D,MAAMrzC,OAGxBu0C,GAAav1C,KAAKi4C,EAAQxI,EAAS2C,UAAW7yC,EAAMqH,MAAM,EAAM7G,SAnfhD02B,GAAA33B,KAAA,SAwfZ,SAACS,EAAOgzD,EAAgBC,GAAqB,IAC3Cva,EAAW5e,EAAX4e,OACFwa,EAAgBxa,EAAOzS,OAAOK,UAAU2sB,GAE1CE,GAAW,EADUpyC,GAAYmyC,KAKnCC,EAAWD,EAAczyD,KAAKi4C,EAAQ14C,KAIvB,IAAbmzD,GAAsBpyC,GAAYiyC,IACpCA,EAAevyD,KAAKi4C,EAAQ14C,MArgBZk3B,GAAA33B,KAAA,QA0gBb,SAACumC,EAASz+B,EAAM2rD,EAAgBC,GAAqC,IAAnBxd,IAAmBltC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAClEmwC,EAAW5e,EAAX4e,OACFwa,EAAgBxa,EAAOzS,OAAOK,UAAU2sB,GACxCG,EAAmBryC,GAAYmyC,GAErCvd,GAAGl1C,KACDi4C,EACA5S,EACAz+B,GACA,SAACrH,GAAD,OAAW85B,EAAKmgB,MAAMj6C,EAAOgzD,EAAgBC,KAC7Cxd,IAAY2d,MAphBIl8B,GAAA33B,KAAA,YAyhBT,WAAM,IACPm5C,EAAW5e,EAAX4e,OACAxI,EAAawI,EAAbxI,SAEFmjB,EAAarkB,GAAQC,KAAO,SAAW,QAsL7C,GAnLIiB,EAAS0N,QAAQzE,MACnB1sC,MAAMosB,KAAKqX,EAAS0N,QAAQzE,MAAMnoC,SAAQ,SAACivC,GACzCnmB,EAAKhpB,KACHmvC,EACA,SACA,WACE3J,GAAeoC,EAAOma,gBAExB,WAMN/4B,EAAKhpB,KAAKo/B,EAAS0N,QAAQE,QAAS,QAASpF,EAAOoF,QAAS,WAG7DhkB,EAAKhpB,KACHo/B,EAAS0N,QAAQG,OACjB,SACA,WAEErF,EAAOqY,aAAeC,KAAKxoB,MAC3BkQ,EAAOqF,WAET,UAIFjkB,EAAKhpB,KACHo/B,EAAS0N,QAAQI,YACjB,SACA,WAEEtF,EAAOqY,aAAeC,KAAKxoB,MAC3BkQ,EAAO4a,YAET,eAIFx5B,EAAKhpB,KACHo/B,EAAS0N,QAAQK,KACjB,SACA,WACEvF,EAAO8J,OAAS9J,EAAO8J,QAEzB,QAIF1oB,EAAKhpB,KAAKo/B,EAAS0N,QAAQO,SAAU,SAAS,WAAA,OAAMzF,EAAO6a,oBAG3Dz5B,EAAKhpB,KACHo/B,EAAS0N,QAAQ6I,SACjB,SACA,WACEzQ,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,cAE1C,YAIFhb,EAAKhpB,KACHo/B,EAAS0N,QAAQ3F,WACjB,SACA,WACES,EAAOT,WAAW7O,WAEpB,cAIFtP,EAAKhpB,KACHo/B,EAAS0N,QAAQvJ,IACjB,SACA,WACEqE,EAAOrE,IAAM,WAEf,OAIFva,EAAKhpB,KAAKo/B,EAAS0N,QAAQnJ,QAAS,QAASiE,EAAOjE,QAAS,WAG7D3a,EAAKhpB,KACHo/B,EAAS0N,QAAQM,SACjB,SACA,SAACl+C,GAECA,EAAMmhD,kBACNnhD,EAAMJ,iBAENy9C,GAASsI,WAAWllD,KAAKi4C,EAAQ14C,KAEnC,MACA,GAMF85B,EAAKhpB,KACHo/B,EAAS0N,QAAQM,SACjB,SACA,SAACl+C,GACC,IAAMuxB,EAAOvxB,EAAMkhD,MAGd,CAAC,GAAI,IAAIx3C,SAAS6nB,KAKV,KAATA,GAMJvxB,EAAMJ,iBAGNI,EAAMmhD,kBAGN9D,GAASsI,WAAWllD,KAAKi4C,EAAQ14C,IAX/Bq9C,GAASqE,mBAAmBjhD,KAAKi4C,EAAQ,MAAM,MAanD,MACA,GAIF5e,EAAKhpB,KAAKo/B,EAASgO,SAASwB,KAAM,WAAW,SAAC1/C,GACxB,KAAhBA,EAAMkhD,OACR7D,GAASsI,WAAWllD,KAAKi4C,EAAQ14C,MAKrC85B,EAAKhpB,KAAKo/B,EAASmO,OAAOC,KAAM,uBAAuB,SAACt+C,GACtD,IAAM8xD,EAAO5hB,EAASkO,SAAS3X,wBACzByc,EAAW,IAAM4O,EAAKprB,OAAU1mC,EAAM0jD,MAAQoO,EAAKlrB,MACzD5mC,EAAMwzD,cAAcziB,aAAa,aAAcmS,MAIjDppB,EAAKhpB,KAAKo/B,EAASmO,OAAOC,KAAM,uDAAuD,SAACt+C,GACtF,IAAMs+C,EAAOt+C,EAAMwzD,cACbjiC,EAAOvxB,EAAMkuD,QAAUluD,EAAMkuD,QAAUluD,EAAMkhD,MAC7C12B,EAAY,iBAElB,IAAIzJ,GAAiB/gB,IAAmB,KAATuxB,GAAwB,KAATA,EAA9C,CAKAmnB,EAAOqY,aAAeC,KAAKxoB,MAG3B,IAAM2Q,EAAOmF,EAAKmV,aAAajpC,GAEzB3R,EAAO,CAAC,UAAW,WAAY,SAASnP,SAAS1J,EAAMqH,MAGzD8xC,GAAQtgC,GACVylC,EAAK4H,gBAAgB17B,GACrB8rB,GAAeoC,EAAOS,UACZtgC,GAAQ6/B,EAAOiT,UACzBrN,EAAKvN,aAAavmB,EAAW,IAC7BkuB,EAAOmF,aAOP7O,GAAQO,MAAO,CACjB,IAAM8O,EAASzL,GAAYnyC,KAAKi4C,EAAQ,uBACxCjsC,MAAMosB,KAAKwlB,GAAQrtC,SAAQ,SAAC1N,GAAD,OAAWw2B,EAAKhpB,KAAKxN,EAAO+vD,GAAY,SAACrzD,GAAD,OAAW4uC,GAAQ5uC,EAAM4K,cAI9FkvB,EAAKhpB,KACHo/B,EAASmO,OAAOC,KAChB+U,GACA,SAACrzD,GACC,IAAMs+C,EAAOt+C,EAAMwzD,cAEfE,EAASpV,EAAK9X,aAAa,cAE3BzlB,GAAS2yC,KACXA,EAASpV,EAAKh8C,OAGhBg8C,EAAK4H,gBAAgB,cAErBxN,EAAOI,YAAe4a,EAASpV,EAAKt1C,IAAO0vC,EAAO8F,WAEpD,QAIF1kB,EAAKhpB,KAAKo/B,EAASkO,SAAU,mCAAmC,SAACp+C,GAAD,OAC9Dq9C,GAAS+F,kBAAkB3iD,KAAKi4C,EAAQ14C,MAK1C85B,EAAKhpB,KAAKo/B,EAASkO,SAAU,uBAAuB,SAACp+C,GAAU,IACrDisD,EAAsBvT,EAAtBuT,kBAEJA,GAAqBA,EAAkB0H,QACzC1H,EAAkB2H,UAAU5zD,MAKhC85B,EAAKhpB,KAAKo/B,EAASkO,SAAU,6BAA6B,WAAM,IACtD6N,EAAsBvT,EAAtBuT,kBAEJA,GAAqBA,EAAkB0H,QACzC1H,EAAkB4H,SAAQ,GAAO,MAKrC/5B,EAAKhpB,KAAKo/B,EAASkO,SAAU,wBAAwB,SAACp+C,GAAU,IACtDisD,EAAsBvT,EAAtBuT,kBAEJA,GAAqBA,EAAkB0H,QACzC1H,EAAkB6H,eAAe9zD,MAIrC85B,EAAKhpB,KAAKo/B,EAASkO,SAAU,oBAAoB,SAACp+C,GAAU,IAClDisD,EAAsBvT,EAAtBuT,kBAEJA,GAAqBA,EAAkB0H,QACzC1H,EAAkB8H,aAAa/zD,MAK/BgvC,GAAQI,UACV3iC,MAAMosB,KAAK+Z,GAAYnyC,KAAKi4C,EAAQ,wBAAwB1nC,SAAQ,SAAC80B,GACnEhM,EAAKhpB,KAAKg1B,EAAS,SAAS,SAAC9lC,GAAD,OAAWq9C,GAASoD,gBAAgBhgD,KAAKi4C,EAAQ14C,EAAM4K,cAMnF8tC,EAAOzS,OAAOsjB,eAAiBxoC,GAAWmvB,EAASjiC,QAAQuwC,WAC7D1kB,EAAKhpB,KAAKo/B,EAASjiC,QAAQ6qC,YAAa,SAAS,WAEpB,IAAvBJ,EAAOI,cAIXJ,EAAOzS,OAAO4d,YAAcnL,EAAOzS,OAAO4d,WAE1CxG,GAASsG,WAAWljD,KAAKi4C,OAK7B5e,EAAKhpB,KACHo/B,EAASmO,OAAOE,OAChB8U,GACA,SAACrzD,GACC04C,EAAO6F,OAASv+C,EAAM4K,OAAOtI,QAE/B,UAIFw3B,EAAKhpB,KAAKo/B,EAASmN,SAAU,yBAAyB,SAACr9C,GACrDkwC,EAASmN,SAASwO,OAASnT,EAAOzD,OAAwB,eAAfj1C,EAAMqH,QAI/C6oC,EAAS+H,YACXxrC,MAAMosB,KAAKqX,EAAS+H,WAAWiK,UAC5BhxC,QAAO,SAACpB,GAAD,OAAQA,EAAEyiC,SAASrC,EAAS2C,cACnC7hC,SAAQ,SAACq/B,GACRvW,EAAKhpB,KAAKu/B,EAAO,yBAAyB,SAACrwC,GACzCkwC,EAASmN,SAASwO,OAASnT,EAAOzD,OAAwB,eAAfj1C,EAAMqH,WAMzDyyB,EAAKhpB,KAAKo/B,EAASmN,SAAU,qDAAqD,SAACr9C,GACjFkwC,EAASmN,SAASoF,QAAU,CAAC,YAAa,cAAc/4C,SAAS1J,EAAMqH,SAIzEyyB,EAAKhpB,KAAKo/B,EAASmN,SAAU,WAAW,WAAM,IACpCpX,EAAmByS,EAAnBzS,OAAQ2qB,EAAWlY,EAAXkY,OAGhBxe,GAAYlC,EAASmN,SAAUpX,EAAOkN,WAAW6Y,cAAc,GAG/D7X,GAAGsc,eAAehwD,KAAKi4C,GAAQ,GAG/B1P,YAAW,WACToJ,GAAYlC,EAASmN,SAAUpX,EAAOkN,WAAW6Y,cAAc,KAC9D,GAGH,IAAMnd,EAAQ/U,EAAKmb,MAAQ,IAAO,IAGlC0b,aAAaC,EAAOvT,UAGpBuT,EAAOvT,SAAWrU,YAAW,WAAA,OAAMmL,GAAGsc,eAAehwD,KAAKi4C,GAAQ,KAAQ7J,MAI5E/U,EAAKhpB,KACHo/B,EAASmO,OAAOE,OAChB,SACA,SAACv+C,GAGC,IAAMi9C,EAAWj9C,EAAMg0D,kCAHdC,EAAAr8B,GAKM,CAAC53B,EAAMk0D,QAASl0D,EAAMm0D,QAAQljD,KAAI,SAAC3O,GAAD,OAAY26C,GAAY36C,EAAQA,KALxE,GAKF0e,EALEizC,EAAA,GAKChzC,EALDgzC,EAAA,GAOHG,EAAYhzD,KAAK6iC,KAAK7iC,KAAKizD,IAAIrzC,GAAK5f,KAAKizD,IAAIpzC,GAAKD,EAAIC,GAG5Dy3B,EAAO4b,eAAeF,EAAY,IAVzB,IAaD7V,EAAW7F,EAAO5D,MAAlByJ,QACW,IAAd6V,GAAmB7V,EAAS,IAAsB,IAAf6V,GAAoB7V,EAAS,IACnEv+C,EAAMJ,mBAGV,UACA,MAz3BFL,KAAKm5C,OAASA,EACdn5C,KAAKg1D,QAAU,KACfh1D,KAAK8xD,WAAa,KAClB9xD,KAAK+xD,YAAc,KAEnB/xD,KAAKkyD,UAAYlyD,KAAKkyD,UAAU3gD,KAAKvR,MACrCA,KAAKomD,WAAapmD,KAAKomD,WAAW70C,KAAKvR,MACvCA,KAAKoyD,YAAcpyD,KAAKoyD,YAAY7gD,KAAKvR,MACzCA,KAAKmyD,WAAanyD,KAAKmyD,WAAW5gD,KAAKvR,M5M29WvC,OArJAw3B,GAAaq6B,EAAW,CAAC,CACvBxtD,IAAK,YACLtB,MAAO,S4Mp0WDtC,GAAO,IACP04C,EAAWn5C,KAAXm5C,OACAxI,EAAawI,EAAbxI,SACF3e,EAAOvxB,EAAMkuD,QAAUluD,EAAMkuD,QAAUluD,EAAMkhD,MAC7CuB,EAAyB,YAAfziD,EAAMqH,KAChBm8B,EAASif,GAAWlxB,IAAShyB,KAAKg1D,QAGxC,KAAIv0D,EAAMw0D,QAAUx0D,EAAMy0D,SAAWz0D,EAAM00D,SAAW10D,EAAMouD,WAMvDrtC,GAAUwQ,GAAf,CAYA,GAAIkxB,EAAS,CAIX,IAAMsH,EAAU1pD,SAAS8tD,cACzB,GAAIptC,GAAWgpC,GAAU,CAAA,IACfuB,EAAa5S,EAAOzS,OAAO0X,UAA3B2N,SAGR,GAAIvB,IAFa7Z,EAASmO,OAAlBC,MAEgBrZ,GAAQ8kB,EAASuB,GACvC,OAGF,GAAoB,KAAhBtrD,EAAMkhD,OAAgBjc,GAAQ8kB,EAAS,8BACzC,OAaJ,OARuB,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAGrFrgD,SAAS6nB,KAC1BvxB,EAAMJ,iBACNI,EAAMmhD,mBAGA5vB,GACN,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GACL,KAAK,GAEEiS,IA5CTkV,EAAOI,YAAeJ,EAAO8F,SAAW,IAAOjtB,EAAO,KA+ClD,MAEF,KAAK,GACL,KAAK,GAEEiS,GACH8S,GAAeoC,EAAOma,cAExB,MAEF,KAAK,GAEHna,EAAO4b,eAAe,IACtB,MAEF,KAAK,GAEH5b,EAAOic,eAAe,IACtB,MAEF,KAAK,GAEEnxB,IACHkV,EAAO8J,OAAS9J,EAAO8J,OAEzB,MAEF,KAAK,GAEH9J,EAAO4a,UACP,MAEF,KAAK,GAEH5a,EAAOqF,SACP,MAEF,KAAK,GAEHrF,EAAOT,WAAW7O,SAClB,MAEF,KAAK,GAEE5F,GACHkV,EAAO6a,iBAET,MAEF,KAAK,GAEH7a,EAAOkR,MAAQlR,EAAOkR,KAqBb,KAATr4B,IAAgBmnB,EAAOT,WAAWga,aAAevZ,EAAOT,WAAWC,QACrEQ,EAAOT,WAAW7O,SAIpB7pC,KAAKg1D,QAAUhjC,OAEfhyB,KAAKg1D,QAAU,Q5M4zWd,CACD3wD,IAAK,aACLtB,MAAO,S4MzzWAtC,GACTq9C,GAASsI,WAAWllD,KAAKlB,KAAKm5C,OAAQ14C,O5M8zW/BoxD,E4Mr+WLA,GCHFp3C,GAAsBL,GAA6B,UACnDtE,GAAiBL,GAAwB,SAAU,CAAEC,WAAW,EAAMgF,EAAG,EAAGjY,EAAG,IAE/EgH,GAAM5H,KAAK4H,IACXF,GAAM1H,KAAK0H,IACXgzB,GAAmB,iBACnB84B,GAAkC,kCAKtCphD,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,QAAS+N,KAAwB3E,IAAkB,CACnFqW,OAAQ,SAAgBvR,EAAO06C,GAC7B,IAIIC,EAAaC,EAAmBpyC,EAAGpI,EAAGse,EAAMm8B,EAJ5C3wD,EAAIsI,GAASpN,MACb25B,EAAMnwB,GAAS1E,EAAEmE,QACjBysD,EAAchsD,GAAgBkR,EAAO+e,GACrC5S,EAAkB/d,UAAUC,OAWhC,GATwB,IAApB8d,EACFwuC,EAAcC,EAAoB,EACL,IAApBzuC,GACTwuC,EAAc,EACdC,EAAoB77B,EAAM+7B,IAE1BH,EAAcxuC,EAAkB,EAChCyuC,EAAoBjsD,GAAIE,GAAIL,GAAUksD,GAAc,GAAI37B,EAAM+7B,IAE5D/7B,EAAM47B,EAAcC,EAAoBj5B,GAC1C,MAAM74B,UAAU2xD,IAGlB,IADAjyC,EAAI1S,GAAmB5L,EAAG0wD,GACrBx6C,EAAI,EAAGA,EAAIw6C,EAAmBx6C,KACjCse,EAAOo8B,EAAc16C,KACTlW,GAAG8U,GAAewJ,EAAGpI,EAAGlW,EAAEw0B,IAGxC,GADAlW,EAAEna,OAASusD,EACPD,EAAcC,EAAmB,CACnC,IAAKx6C,EAAI06C,EAAa16C,EAAI2e,EAAM67B,EAAmBx6C,IAEjDy6C,EAAKz6C,EAAIu6C,GADTj8B,EAAOte,EAAIw6C,KAEC1wD,EAAGA,EAAE2wD,GAAM3wD,EAAEw0B,UACbx0B,EAAE2wD,GAEhB,IAAKz6C,EAAI2e,EAAK3e,EAAI2e,EAAM67B,EAAoBD,EAAav6C,WAAYlW,EAAEkW,EAAI,QACtE,GAAIu6C,EAAcC,EACvB,IAAKx6C,EAAI2e,EAAM67B,EAAmBx6C,EAAI06C,EAAa16C,IAEjDy6C,EAAKz6C,EAAIu6C,EAAc,GADvBj8B,EAAOte,EAAIw6C,EAAoB,KAEnB1wD,EAAGA,EAAE2wD,GAAM3wD,EAAEw0B,UACbx0B,EAAE2wD,GAGlB,IAAKz6C,EAAI,EAAGA,EAAIu6C,EAAav6C,IAC3BlW,EAAEkW,EAAI06C,GAAe1sD,UAAUgS,EAAI,GAGrC,OADAlW,EAAEmE,OAAS0wB,EAAM67B,EAAoBD,EAC9BnyC,K7M++WT,IAAIuyC,GAAal0D,GAAqB,SAAU/B,EAAQD,G8M9iXtDC,EAAAA,QAII,WAMR,IAAIk2D,EAAU,aACVC,EAAgB,GAChBC,EAAoB,GACpBC,EAAsB,GAQ1B,SAASC,EAAUC,EAAWC,GAE5BD,EAAYA,EAAU5vD,KAAO4vD,EAAY,CAACA,GAE1C,IAGIv0D,EACAy0D,EACAjxB,EALAkxB,EAAe,GACf5rD,EAAIyrD,EAAUhtD,OACdotD,EAAa7rD,EAejB,IARA9I,EAAK,SAAUy0D,EAAUG,GACnBA,EAAcrtD,QAAQmtD,EAAa/vD,KAAK8vD,KAE5CE,GACiBH,EAAWE,IAIvB5rD,KACL2rD,EAAWF,EAAUzrD,IAGrB06B,EAAI4wB,EAAkBK,IAEpBz0D,EAAGy0D,EAAUjxB,IAKX6wB,EAAoBI,GAAYJ,EAAoBI,IAAa,IACnE9vD,KAAK3E,GAUX,SAAS60D,EAAQJ,EAAUG,GAEzB,GAAKH,EAAL,CAEA,IAAIhzC,EAAI4yC,EAAoBI,GAM5B,GAHAL,EAAkBK,GAAYG,EAGzBnzC,EAGL,KAAOA,EAAEla,QACPka,EAAE,GAAGgzC,EAAUG,GACfnzC,EAAEgJ,OAAO,EAAG,IAUhB,SAASqqC,EAAiB5hD,EAAMwhD,GAE1BxhD,EAAK1T,OAAM0T,EAAO,CAAC6hD,QAAS7hD,IAG5BwhD,EAAantD,QAAS2L,EAAK1S,OAAS0zD,GAASQ,IAC3CxhD,EAAK6hD,SAAWb,GAAShhD,GASjC,SAAS8hD,EAAShuD,EAAMwtD,EAAYthD,EAAM+hD,GACxC,IAMIC,EACAp2D,EAPAw6B,EAAMl6B,SACN+1D,EAAQjiD,EAAKiiD,MACbC,GAAYliD,EAAKmiD,YAAc,GAAK,EACpCC,EAAmBpiD,EAAKqiD,QAAUrB,EAClC5vC,EAAWtd,EAAKsD,QAAQ,YAAa,IACrCkrD,EAAexuD,EAAKsD,QAAQ,cAAe,IAI/C2qD,EAAWA,GAAY,EAEnB,iBAAiBxwD,KAAK6f,KAExBxlB,EAAIw6B,EAAIz2B,cAAc,SACpBipD,IAAM,aACRhtD,EAAE0lB,KAAOgxC,GAGTN,EAAgB,cAAep2D,IAGVA,EAAE22D,UACrBP,EAAgB,EAChBp2D,EAAEgtD,IAAM,UACRhtD,EAAE42D,GAAK,UAEA,oCAAoCjxD,KAAK6f,IAElDxlB,EAAIw6B,EAAIz2B,cAAc,QACpBqK,IAAMsoD,IAGR12D,EAAIw6B,EAAIz2B,cAAc,WACpBqK,IAAMlG,EACRlI,EAAEq2D,WAAkBpzD,IAAVozD,GAA6BA,GAGzCr2D,EAAE8vD,OAAS9vD,EAAE+vD,QAAU/vD,EAAE62D,aAAe,SAAUC,GAChD,IAAI7sD,EAAS6sD,EAAGxvD,KAAK,GAIrB,GAAI8uD,EACF,IACOp2D,EAAE+2D,MAAMC,QAAQvuD,SAAQwB,EAAS,KACtC,MAAOgX,GAGO,IAAVA,EAAEuQ,OAAYvnB,EAAS,KAK/B,GAAc,KAAVA,GAKF,IAHAksD,GAAY,GAGGG,EACb,OAAOJ,EAAShuD,EAAMwtD,EAAYthD,EAAM+hD,QAErC,GAAa,WAATn2D,EAAEgtD,KAA4B,SAARhtD,EAAE42D,GAEjC,OAAO52D,EAAEgtD,IAAM,aAIjB0I,EAAWxtD,EAAM+B,EAAQ6sD,EAAGh3D,oBAII,IAA9B02D,EAAiBtuD,EAAMlI,IAAcw6B,EAAII,KAAKzsB,YAAYnO,GAShE,SAASi3D,EAAUC,EAAOxB,EAAYthD,GAIpC,IAGIlT,EACA8I,EAJA6rD,GAFJqB,EAAQA,EAAMrxD,KAAOqxD,EAAQ,CAACA,IAEPzuD,OACnBwY,EAAI40C,EACJC,EAAgB,GAqBpB,IAhBA50D,EAAK,SAASgH,EAAM+B,EAAQnK,GAM1B,GAJc,KAAVmK,GAAe6rD,EAAcjwD,KAAKqC,GAIxB,KAAV+B,EAAe,CACjB,IAAInK,EACC,OADiBg2D,EAAcjwD,KAAKqC,KAI3C2tD,GACiBH,EAAWI,IAIzB9rD,EAAE,EAAGA,EAAIiX,EAAGjX,IAAKksD,EAASgB,EAAMltD,GAAI9I,EAAIkT,GAa/C,SAAS+iD,EAAOD,EAAOE,EAAMt4C,GAC3B,IAAI62C,EACAvhD,EASJ,GANIgjD,GAAQA,EAAKr5B,OAAM43B,EAAWyB,GAGlChjD,GAAQuhD,EAAW72C,EAAOs4C,IAAS,GAG/BzB,EAAU,CACZ,GAAIA,KAAYN,EACd,KAAM,SAENA,EAAcM,IAAY,EAI9B,SAAS0B,EAAOltB,EAASO,GACvBusB,EAAUC,GAAO,SAAUpB,GAEzBE,EAAiB5hD,EAAM0hD,GAGnB3rB,GACF6rB,EAAiB,CAACC,QAAS9rB,EAASzoC,MAAOgpC,GAASorB,GAItDC,EAAQJ,EAAUG,KACjB1hD,GAGL,GAAIA,EAAKkjD,cAAe,OAAO,IAAI9vB,QAAQ6vB,GACtCA,IAiDP,OAxCAF,EAAO9gB,MAAQ,SAAekhB,EAAMnjD,GAOlC,OALAohD,EAAU+B,GAAM,SAAU3B,GAExBI,EAAiB5hD,EAAMwhD,MAGlBuB,GAQTA,EAAOr+C,KAAO,SAAc68C,GAC1BI,EAAQJ,EAAU,KAOpBwB,EAAOvM,MAAQ,WACbyK,EAAgB,GAChBC,EAAoB,GACpBC,EAAsB,IAQxB4B,EAAOK,UAAY,SAAmB7B,GACpC,OAAOA,KAAYN,GAKd8B,EArTcn4D,MCEN,SAASy4D,GAAWpyC,GACjC,OAAO,IAAImiB,SAAQ,SAAC2C,EAASO,GAC3BysB,GAAO9xC,EAAK,CACV4wC,QAAS9rB,EACTzoC,MAAOgpC,OCqBb,SAASgtB,GAAoBte,GACvBA,IAAS55C,KAAK23C,MAAMwgB,YACtBn4D,KAAK23C,MAAMwgB,WAAY,GAErBn4D,KAAKu1C,MAAMiE,SAAWI,IACxB55C,KAAKu1C,MAAMiE,QAAUI,EACrBnD,GAAav1C,KAAKlB,KAAMA,KAAKu1C,MAAOqE,EAAO,OAAS,UAIxD,IAAMvB,GAAQ,CACZa,MADY,WAEV,IAAMC,EAASn5C,KAGf6yC,GAAYsG,EAAOxI,SAAS5O,QAASoX,EAAOzS,OAAOkN,WAAW+D,OAAO,GAGrEwB,EAAO/wC,QAAQgxC,MAAQD,EAAOzS,OAAO0S,MAAMhxC,QAG3C2vC,GAAe72C,KAAKi4C,GAGf33B,GAAUvhB,OAAOm4D,OASpB/f,GAAMxB,MAAM31C,KAAKi4C,GARjB8e,GAAW9e,EAAOzS,OAAOkhB,KAAKvP,MAAMwT,KACjC7hB,MAAK,WACJqO,GAAMxB,MAAM31C,KAAKi4C,MAElBtL,OAAM,SAAC3rC,GACNi3C,EAAOa,MAAMoF,KAAK,uCAAwCl9C,OAQlE20C,MA5BY,WA4BJ,IAAAtc,EAAAv6B,KACAm5C,EAASn5C,KACT0mC,EAASyS,EAAOzS,OAAO2R,MACrBC,EAA4C5R,EAA5C4R,QAASiV,EAAmC7mB,EAAnC6mB,eAAmB8K,EAH9BrgC,GAG8C0O,EAH9C,CAAA,UAAA,mBAMF4R,GACFn3C,OAAOslB,OAAO4xC,EAAa,CACzBva,UAAU,EACVwa,UAAU,IAKd,IAAM53D,EAAS6nD,GAAczwB,GAAA,CAC3BuyB,KAAMlR,EAAOzS,OAAO2jB,KAAK1R,OACzBmR,SAAU3Q,EAAO2Q,SACjB7G,MAAO9J,EAAO8J,MACdsV,QAAS,QACT9jB,aAAcz0C,KAAK0mC,OAAOgS,WAAWgS,WAClC2N,IAID7vD,EAAS2wC,EAAO5D,MAAMtO,aAAa,OAGnCzlB,GAAShZ,KACXA,EAAS2wC,EAAO5D,MAAMtO,aAAakS,EAAOzS,OAAOvb,WAAWwsB,MAAMlxC,KAGpE,IAnFaof,EAmFPpf,EAlFJ+a,GADWqE,EAmFMrd,GAjFZ,KAGLgZ,GAAUmtB,OAAO9oB,IACZA,EAIFA,EAAIlM,MADG,mCACYqC,OAAOw8C,GAAK3yC,EA2E9B1X,EAAS5J,GAAc,UACvBqK,EAAM+rC,GAAOxB,EAAOzS,OAAOkhB,KAAKvP,MAAMlqC,OAAQ1H,EAAI/F,GAWxD,GAVAyN,EAAOqjC,aAAa,MAAO5iC,GAC3BT,EAAOqjC,aAAa,kBAAmB,IACvCrjC,EAAOqjC,aAAa,QAAS,CAAC,WAAY,aAAc,sBAAsB/oC,KAAK,OAG9E+Y,GAAS+rC,IACZp/C,EAAOqjC,aAAa,iBAAkB+b,GAIpCjV,IAAY5R,EAAO4mB,eACrBn/C,EAAOqjC,aAAa,cAAe2H,EAAO8S,QAC1C9S,EAAO5D,MAAQvD,GAAe7jC,EAAQgrC,EAAO5D,WACxC,CACL,IAAMxT,EAAUx9B,GAAc,MAAO,CACnCmuC,MAAOyG,EAAOzS,OAAOkN,WAAWoY,eAChCyM,cAAetf,EAAO8S,SAExBlqB,EAAQpzB,YAAYR,GACpBgrC,EAAO5D,MAAQvD,GAAejQ,EAASoX,EAAO5D,OAI3C7O,EAAO4mB,gBACV5gC,GAAMiuB,GAAOxB,EAAOzS,OAAOkhB,KAAKvP,MAAM1D,IAAK/lC,IAAMo7B,MAAK,SAACuS,IACjD/6B,GAAS+6B,IAAcA,EAASmc,eAKpC9jB,GAAGic,UAAU3vD,KAAKi4C,EAAQoD,EAASmc,eAAe7qB,OAAM,kBAM5DsL,EAAOxB,MAAQ,IAAI13C,OAAOm4D,MAAMO,OAAOxqD,EAAQ,CAC7C47C,UAAW5Q,EAAOzS,OAAOqjB,UACzB9G,MAAO9J,EAAO8J,QAGhB9J,EAAO5D,MAAMiE,QAAS,EACtBL,EAAO5D,MAAMgE,YAAc,EAGvBJ,EAAOpD,UAAUnB,IACnBuE,EAAOxB,MAAMihB,mBAIfzf,EAAO5D,MAAMqE,KAAO,WAElB,OADAse,GAAoBh3D,KAAKi4C,GAAQ,GAC1BA,EAAOxB,MAAMiC,QAGtBT,EAAO5D,MAAM+I,MAAQ,WAEnB,OADA4Z,GAAoBh3D,KAAKi4C,GAAQ,GAC1BA,EAAOxB,MAAM2G,SAGtBnF,EAAO5D,MAAMnU,KAAO,WAClB+X,EAAOmF,QACPnF,EAAOI,YAAc,GAjGjB,IAqGAA,EAAgBJ,EAAO5D,MAAvBgE,YACNp4C,OAAOC,eAAe+3C,EAAO5D,MAAO,cAAe,CACjDl0C,IADiD,WAE/C,OAAOk4C,GAETvzC,IAJiD,SAI7Cw3C,GAAM,IAIA7F,EAAiCwB,EAAjCxB,MAAOpC,EAA0B4D,EAA1B5D,MAAOiE,EAAmBL,EAAnBK,OAAQwF,EAAW7F,EAAX6F,OACxB6Z,EAAerf,IAAW7B,EAAMwgB,UAGtC5iB,EAAMgP,SAAU,EAChB9N,GAAav1C,KAAKi4C,EAAQ5D,EAAO,WAGjCvN,QAAQ2C,QAAQkuB,GAAgBlhB,EAAMmhB,UAAU,IAE7C9uB,MAAK,WAAA,OAAM2N,EAAMohB,eAAevb,MAEhCxT,MAAK,WAAA,OAAM6uB,GAAgBlhB,EAAM2G,WAEjCtU,MAAK,WAAA,OAAM6uB,GAAgBlhB,EAAMmhB,UAAU9Z,MAC3CnR,OAAM,kBAOb,IAAIuL,EAAQD,EAAOzS,OAAO0S,MAAMkR,SAChCnpD,OAAOC,eAAe+3C,EAAO5D,MAAO,eAAgB,CAClDl0C,IADkD,WAEhD,OAAO+3C,GAETpzC,IAJkD,SAI9CjC,GACFo1C,EAAOxB,MACJqhB,gBAAgBj1D,GAChBimC,MAAK,WACJoP,EAAQr1C,EACR0yC,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,iBAEzC1H,OAAM,WAELsL,EAAO/wC,QAAQgxC,MAAQ,CAAC,SAlJ1B,IAwJA4F,EAAW7F,EAAOzS,OAAlBsY,OACN79C,OAAOC,eAAe+3C,EAAO5D,MAAO,SAAU,CAC5Cl0C,IAD4C,WAE1C,OAAO29C,GAETh5C,IAJ4C,SAIxCjC,GACFo1C,EAAOxB,MAAMmhB,UAAU/0D,GAAOimC,MAAK,WACjCgV,EAASj7C,EACT0yC,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,sBAhKxC,IAsKA0N,EAAU9J,EAAOzS,OAAjBuc,MACN9hD,OAAOC,eAAe+3C,EAAO5D,MAAO,QAAS,CAC3Cl0C,IAD2C,WAEzC,OAAO4hD,GAETj9C,IAJ2C,SAIvCjC,GACF,IAAM8lC,IAASroB,GAAWzd,IAASA,EAEnCo1C,EAAOxB,MAAMmhB,UAAUjvB,EAAS,EAAIsP,EAAOzS,OAAOsY,QAAQhV,MAAK,WAC7DiZ,EAAQpZ,EACR4M,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,sBAhLxC,IAqMF0jB,EAfE5O,EAASlR,EAAOzS,OAAhB2jB,KACNlpD,OAAOC,eAAe+3C,EAAO5D,MAAO,OAAQ,CAC1Cl0C,IAD0C,WAExC,OAAOgpD,GAETrkD,IAJ0C,SAItCjC,GACF,IAAM8lC,EAASroB,GAAWzd,GAASA,EAAQo1C,EAAOzS,OAAO2jB,KAAK1R,OAE9DQ,EAAOxB,MAAMuhB,QAAQrvB,GAAQG,MAAK,WAChCqgB,EAAOxgB,QAObsP,EAAOxB,MACJwhB,cACAnvB,MAAK,SAACjnC,GACLk2D,EAAal2D,EACb+6C,GAASmJ,eAAe/lD,KAAKi4C,MAE9BtL,OAAM,SAAC3rC,GACNq4B,EAAKyf,MAAMoF,KAAKl9C,MAGpBf,OAAOC,eAAe+3C,EAAO5D,MAAO,aAAc,CAChDl0C,IADgD,WAE9C,OAAO43D,KAKX93D,OAAOC,eAAe+3C,EAAO5D,MAAO,QAAS,CAC3Cl0C,IAD2C,WAEzC,OAAO83C,EAAOI,cAAgBJ,EAAO8F,YAKzCjX,QAAQoE,IAAI,CAAC+M,EAAOxB,MAAMyhB,gBAAiBjgB,EAAOxB,MAAM0hB,mBAAmBrvB,MAAK,SAACsvB,GAAe,IAAAC,EAAAlhC,GACtEihC,EADsE,GACvFnyB,EADuFoyB,EAAA,GAChFniB,EADgFmiB,EAAA,GAE9FpgB,EAAOxB,MAAMT,MAAQ,CAAC/P,EAAOiQ,GAC7BW,GAAe72C,KAAKq5B,MAItB4e,EAAOxB,MAAM6hB,aAAargB,EAAOzS,OAAOqjB,WAAW/f,MAAK,SAAC/iC,GACvDkyC,EAAOzS,OAAOqjB,UAAY9iD,KAI5BkyC,EAAOxB,MAAM8hB,gBAAgBzvB,MAAK,SAACyR,GACjCtC,EAAOzS,OAAO+U,MAAQA,EACtB7G,GAAGgc,SAAS1vD,KAAKq5B,MAInB4e,EAAOxB,MAAM+hB,iBAAiB1vB,MAAK,SAACjnC,GAClCw2C,EAAcx2C,EACd0zC,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,iBAI1C4D,EAAOxB,MAAMgiB,cAAc3vB,MAAK,SAACjnC,GAC/Bo2C,EAAO5D,MAAM0J,SAAWl8C,EACxB0zC,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,qBAI1C4D,EAAOxB,MAAMiiB,gBAAgB5vB,MAAK,SAACyb,GACjCtM,EAAO5D,MAAME,WAAagQ,EAC1B7G,GAAS1F,MAAMh4C,KAAKi4C,MAGtBA,EAAOxB,MAAMvB,GAAG,aAAa,SAAA/E,GAAmB,IAAAwoB,EAAAxoB,EAAhBmY,KACxBsQ,QADwC,IAAAD,EAAT,GAASA,GACpBnoD,KAAI,SAACg4C,GAAD,OvBrQ7B,SAAmBlhD,GACxB,IAAM2sB,EAAWr0B,SAASi5D,yBACpBxzB,EAAUzlC,SAASyD,cAAc,OAGvC,OAFA4wB,EAASxmB,YAAY43B,GACrBA,EAAQ2U,UAAY1yC,EACb2sB,EAAS09B,WAAWnhB,UuBgQgBsoB,CAAUtQ,EAAIjY,SACrDmN,GAASoK,WAAW9nD,KAAKi4C,EAAQ2gB,MAGnC3gB,EAAOxB,MAAMvB,GAAG,UAAU,YAExB+C,EAAOxB,MAAMsiB,YAAYjwB,MAAK,SAACwP,GAC7B0e,GAAoBh3D,KAAKi4C,GAASK,GAC7BA,GACH/C,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,cAIxC/zB,GAAW23B,EAAOxB,MAAMpR,UAAY4S,EAAOpD,UAAUnB,KACzCuE,EAAOxB,MAAMpR,QAIrBiL,aAAa,YAAa,MAIpC2H,EAAOxB,MAAMvB,GAAG,eAAe,WAC7BK,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,cAG1C4D,EAAOxB,MAAMvB,GAAG,aAAa,WAC3BK,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,cAG1C4D,EAAOxB,MAAMvB,GAAG,QAAQ,WACtB8hB,GAAoBh3D,KAAKi4C,GAAQ,GACjC1C,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,cAG1C4D,EAAOxB,MAAMvB,GAAG,SAAS,WACvB8hB,GAAoBh3D,KAAKi4C,GAAQ,MAGnCA,EAAOxB,MAAMvB,GAAG,cAAc,SAACzqC,GAC7BwtC,EAAO5D,MAAMgP,SAAU,EACvBhL,EAAc5tC,EAAKuuD,QACnBzjB,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,iBAG1C4D,EAAOxB,MAAMvB,GAAG,YAAY,SAACzqC,GAC3BwtC,EAAO5D,MAAMmO,SAAW/3C,EAAKg4C,QAC7BlN,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,YAGL,IAA/BhmB,SAAS5jB,EAAKg4C,QAAS,KACzBlN,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,kBAK1C4D,EAAOxB,MAAMgiB,cAAc3vB,MAAK,SAACjnC,GAC3BA,IAAUo2C,EAAO5D,MAAM0J,WACzB9F,EAAO5D,MAAM0J,SAAWl8C,EACxB0zC,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,yBAK9C4D,EAAOxB,MAAMvB,GAAG,UAAU,WACxB+C,EAAO5D,MAAMgP,SAAU,EACvB9N,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,aAG1C4D,EAAOxB,MAAMvB,GAAG,SAAS,WACvB+C,EAAO5D,MAAMiE,QAAS,EACtB/C,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,YAG1C4D,EAAOxB,MAAMvB,GAAG,SAAS,SAACn1C,GACxBk4C,EAAO5D,MAAMrzC,MAAQjB,EACrBw1C,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,YAItC7O,EAAO4mB,gBACT7jB,YAAW,WAAA,OAAMmL,GAAG8b,MAAMxvD,KAAKi4C,KAAS,KC9X9C,SAAS+e,GAAoBte,GACvBA,IAAS55C,KAAK23C,MAAMwgB,YACtBn4D,KAAK23C,MAAMwgB,WAAY,GAErBn4D,KAAKu1C,MAAMiE,SAAWI,IACxB55C,KAAKu1C,MAAMiE,QAAUI,EACrBnD,GAAav1C,KAAKlB,KAAMA,KAAKu1C,MAAOqE,EAAO,OAAS,UAIxD,SAAS3jB,GAAQyQ,GACf,OAAIA,EAAOknB,SACF,mCAGwB,UAA7B3tD,OAAOg7B,SAASpF,SACX,8BADT,EAQF,IAAMulB,GAAU,CACdlC,MADc,WACN,IAAA3e,EAAAv6B,KAKN,GAHA6yC,GAAY7yC,KAAK2wC,SAAS5O,QAAS/hC,KAAK0mC,OAAOkN,WAAW+D,OAAO,GAG7Dn2B,GAAUvhB,OAAOk6D,KAAO34C,GAAYvhB,OAAOk6D,GAAGxB,QAChDvd,GAAQvE,MAAM31C,KAAKlB,UACd,CAEL,IAAMwsB,EAAWvsB,OAAOm6D,wBAGxBn6D,OAAOm6D,wBAA0B,WAE3B54C,GAAYgL,IACdA,IAGF4uB,GAAQvE,MAAM31C,KAAKq5B,IAIrB09B,GAAWj4D,KAAK0mC,OAAOkhB,KAAKxM,QAAQyQ,KAAKhe,OAAM,SAAC3rC,GAC9Cq4B,EAAKyf,MAAMoF,KAAK,6BAA8Bl9C,QAMpDm4D,SA9Bc,SA8BLC,GAAS,IAAA/jB,EAAAv2C,KAGhB0sB,GAFYiuB,GAAO36C,KAAK0mC,OAAOkhB,KAAKxM,QAAQzG,IAAK2lB,IAG9CtwB,MAAK,SAACr+B,GACL,GAAI6V,GAAU7V,GAAO,CAAA,IACX8vC,EAAyB9vC,EAAzB8vC,MAAOrE,EAAkBzrC,EAAlByrC,OAAQjQ,EAAUx7B,EAAVw7B,MAGvBoP,EAAK7P,OAAO+U,MAAQA,EACpB7G,GAAGgc,SAAS1vD,KAAKq1C,GAGjBA,EAAKoB,MAAMT,MAAQ,CAAC/P,EAAOiQ,GAG7BW,GAAe72C,KAAKq1C,MAErB1I,OAAM,WAELkK,GAAe72C,KAAKq1C,OAK1BM,MAvDc,WAwDZ,IAAMsC,EAASn5C,KACT0mC,EAASyS,EAAOzS,OAAO0U,QAEvBmf,EAAYphB,EAAO5D,OAAS4D,EAAO5D,MAAMtO,aAAa,MAC5D,GAAKzlB,GAAS+4C,KAAcA,EAAUnsB,WAAW,YAAjD,CAKA,IAAI5lC,EAAS2wC,EAAO5D,MAAMtO,aAAa,OAGnCzlB,GAAShZ,KACXA,EAAS2wC,EAAO5D,MAAMtO,aAAajnC,KAAK0mC,OAAOvb,WAAWwsB,MAAMlxC,KAIlE,IA1Gaof,ExBTU82B,EwBmHjB2d,EAzGJ94C,GADWqE,EA0GWrd,GAxGjB,KAIFqd,EAAIlM,MADG,gEACYqC,OAAOw8C,GAAK3yC,EAuG9BytB,EAAY/uC,GAAc,MAAO,CAAEkC,IxBtHlBk2C,EwBoHDxD,EAAO3E,SxBnH/B,GAAA7pC,OAAUgyC,EAAV,KAAAhyC,OAAoB9I,KAAKsH,MAAsB,IAAhBtH,KAAK8E,YwBqHW8xD,cAAe/xB,EAAO4mB,eAAiBnU,EAAO8S,YAASxoD,IAIpG,GAHA01C,EAAO5D,MAAQvD,GAAesB,EAAW6F,EAAO5D,OAG5C7O,EAAO4mB,eAAgB,CACzB,IAAMkN,EAAY,SAACz+C,GAAD,MAAA,0BAAApR,OAAiC2vD,EAAjC,KAAA3vD,OAA4CoR,EAA5C,gBAGlBm0C,GAAUsK,EAAU,UAAW,KAC5B3sB,OAAM,WAAA,OAAMqiB,GAAUsK,EAAU,MAAO,QACvC3sB,OAAM,WAAA,OAAMqiB,GAAUsK,EAAU,UAChCxwB,MAAK,SAAComB,GAAD,OAAWxb,GAAGic,UAAU3vD,KAAKi4C,EAAQiX,EAAMxhD,QAChDo7B,MAAK,SAACp7B,GAEAA,EAAIzE,SAAS,YAChBgvC,EAAOxI,SAASsb,OAAOx9C,MAAMwiD,eAAiB,YAGjDpjB,OAAM,eAKXsL,EAAOxB,MAAQ,IAAI13C,OAAOk6D,GAAGxB,OAAOxf,EAAO5D,MAAO,CAChD+kB,QAAAA,EACAj0C,KAAM4P,GAAQyQ,GACd+zB,WAAYlqB,GACV,GACA,CAEEuZ,SAAU3Q,EAAOzS,OAAOojB,SAAW,EAAI,EAEvC4Q,GAAIvhB,EAAOzS,OAAOg0B,GAElB5c,SAAU3E,EAAOpD,UAAUnB,IAAMlO,EAAO4mB,eAAiB,EAAI,EAE7DqN,UAAW,EAEXlmB,YAAc0E,EAAOzS,OAAOgS,WAAWgS,UAAgB,EAAJ,EAEnDkQ,eAAgBzhB,EAAOyF,SAASjG,OAAS,EAAI,EAC7CkiB,aAAc1hB,EAAOzS,OAAOkY,SAASiH,SAErCiV,gBAAiB76D,OAASA,OAAOg7B,SAAS/U,KAAO,MAEnDwgB,GAEF6H,OAAQ,CACNwsB,QADM,SACEt6D,GAEN,IAAK04C,EAAO5D,MAAMrzC,MAAO,CACvB,IAAM8vB,EAAOvxB,EAAMkL,KAEbqvD,EACJ,CACEC,EAAG,uOACHC,EAAG,uHACHC,IAAK,qIACLC,IAAK,uFACLC,IAAK,wFACLrpC,IAAS,2BAEbmnB,EAAO5D,MAAMrzC,MAAQ,CAAE8vB,KAAAA,EAAMgpC,QAAAA,GAE7BvkB,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,WAG5C+lB,qBApBM,SAoBe76D,GAEnB,IAAM42B,EAAW52B,EAAM4K,OAGvB8tC,EAAO5D,MAAMoE,aAAetiB,EAASkkC,kBAErC9kB,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,eAE1CimB,QA7BM,SA6BE/6D,GAEN,IAAI+gB,GAAY23B,EAAO5D,MAAMqE,MAA7B,CAIA,IAAMviB,EAAW52B,EAAM4K,OAGvB+vC,GAAQif,SAASn5D,KAAKi4C,EAAQmhB,GAG9BnhB,EAAO5D,MAAMqE,KAAO,WAClBse,GAAoBh3D,KAAKi4C,GAAQ,GACjC9hB,EAASokC,aAGXtiB,EAAO5D,MAAM+I,MAAQ,WACnB4Z,GAAoBh3D,KAAKi4C,GAAQ,GACjC9hB,EAASqkC,cAGXviB,EAAO5D,MAAMnU,KAAO,WAClB/J,EAASskC,aAGXxiB,EAAO5D,MAAM0J,SAAW5nB,EAASsiC,cACjCxgB,EAAO5D,MAAMiE,QAAS,EAGtBL,EAAO5D,MAAMgE,YAAc,EAC3Bp4C,OAAOC,eAAe+3C,EAAO5D,MAAO,cAAe,CACjDl0C,IADiD,WAE/C,OAAOstC,OAAOtX,EAASqiC,mBAEzB1zD,IAJiD,SAI7Cw3C,GAEErE,EAAOK,SAAWL,EAAOxB,MAAMwgB,WACjChf,EAAOxB,MAAM+G,OAIfvF,EAAO5D,MAAMgP,SAAU,EACvB9N,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,WAGxCle,EAAS88B,OAAO3W,MAKpBr8C,OAAOC,eAAe+3C,EAAO5D,MAAO,eAAgB,CAClDl0C,IADkD,WAEhD,OAAOg2B,EAASkkC,mBAElBv1D,IAJkD,SAI9CjC,GACFszB,EAAS2hC,gBAAgBj1D,MAxDhB,IA6DPi7C,EAAW7F,EAAOzS,OAAlBsY,OACN79C,OAAOC,eAAe+3C,EAAO5D,MAAO,SAAU,CAC5Cl0C,IAD4C,WAE1C,OAAO29C,GAETh5C,IAJ4C,SAIxCjC,GACFi7C,EAASj7C,EACTszB,EAASyhC,UAAmB,IAAT9Z,GACnBvI,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,mBArE/B,IA0EP0N,EAAU9J,EAAOzS,OAAjBuc,MACN9hD,OAAOC,eAAe+3C,EAAO5D,MAAO,QAAS,CAC3Cl0C,IAD2C,WAEzC,OAAO4hD,GAETj9C,IAJ2C,SAIvCjC,GACF,IAAM8lC,EAASroB,GAAWzd,GAASA,EAAQk/C,EAC3CA,EAAQpZ,EACRxS,EAASwS,EAAS,OAAS,YAC3BxS,EAASyhC,UAAmB,IAAT9Z,GACnBvI,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,mBAK5Cp0C,OAAOC,eAAe+3C,EAAO5D,MAAO,aAAc,CAChDl0C,IADgD,WAE9C,OAAOg2B,EAAS8hC,iBAKpBh4D,OAAOC,eAAe+3C,EAAO5D,MAAO,QAAS,CAC3Cl0C,IAD2C,WAEzC,OAAO83C,EAAOI,cAAgBJ,EAAO8F,YAKzC,IAAM2c,EAASvkC,EAASwkC,4BAExB1iB,EAAO/wC,QAAQgxC,MAAQwiB,EAAOjqD,QAAO,SAACoK,GAAD,OAAOo9B,EAAOzS,OAAO0S,MAAMhxC,QAAQ+B,SAAS4R,MAG7Eo9B,EAAOpD,UAAUnB,IAAMlO,EAAO4mB,gBAChCnU,EAAO5D,MAAM/D,aAAa,YAAa,GAGzCiF,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,cACxCkB,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,kBAGxCumB,cAAc3iB,EAAOkY,OAAO0K,WAG5B5iB,EAAOkY,OAAO0K,UAAY1/B,aAAY,WAEpC8c,EAAO5D,MAAMmO,SAAWrsB,EAAS2kC,0BAGC,OAA9B7iB,EAAO5D,MAAM0mB,cAAyB9iB,EAAO5D,MAAM0mB,aAAe9iB,EAAO5D,MAAMmO,WACjFjN,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,YAI1C4D,EAAO5D,MAAM0mB,aAAe9iB,EAAO5D,MAAMmO,SAGX,IAA1BvK,EAAO5D,MAAMmO,WACfoY,cAAc3iB,EAAOkY,OAAO0K,WAG5BtlB,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,qBAEzC,KAGC7O,EAAO4mB,gBACT7jB,YAAW,WAAA,OAAMmL,GAAG8b,MAAMxvD,KAAKi4C,KAAS,MAG5C+iB,cA9KM,SA8KQz7D,GAEZ,IAAM42B,EAAW52B,EAAM4K,OAoBvB,OAjBAywD,cAAc3iB,EAAOkY,OAAOjF,SAEbjT,EAAO5D,MAAMgP,SAAW,CAAC,EAAG,GAAGp6C,SAAS1J,EAAMkL,QAI3DwtC,EAAO5D,MAAMgP,SAAU,EACvB9N,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,WAUlC90C,EAAMkL,MACZ,KAAM,EAEJ8qC,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,cAGxC4D,EAAO5D,MAAMmO,SAAWrsB,EAAS2kC,yBACjCvlB,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,YAExC,MAEF,KAAK,EACH2iB,GAAoBh3D,KAAKi4C,GAAQ,GAG7BA,EAAO5D,MAAM8U,MAEfhzB,EAASskC,YACTtkC,EAASokC,aAEThlB,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,SAG1C,MAEF,KAAK,EAEC7O,EAAO4mB,iBAAmBnU,EAAOzS,OAAOojB,UAAY3Q,EAAO5D,MAAMiE,SAAWL,EAAOxB,MAAMwgB,UAC3Fhf,EAAO5D,MAAM+I,SAEb4Z,GAAoBh3D,KAAKi4C,GAAQ,GAEjC1C,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,WAGxC4D,EAAOkY,OAAOjF,QAAU/vB,aAAY,WAClCoa,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,gBACvC,IAKC4D,EAAO5D,MAAM0J,WAAa5nB,EAASsiC,gBACrCxgB,EAAO5D,MAAM0J,SAAW5nB,EAASsiC,cACjCljB,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,oBAI5C,MAEF,KAAK,EAEE4D,EAAO8J,OACV9J,EAAOxB,MAAMwkB,SAEfjE,GAAoBh3D,KAAKi4C,GAAQ,GAEjC,MAEF,KAAK,EAEH1C,GAAav1C,KAAKi4C,EAAQA,EAAO5D,MAAO,WAQ5CkB,GAAav1C,KAAKi4C,EAAQA,EAAOxI,SAAS2C,UAAW,eAAe,EAAO,CACzEthB,KAAMvxB,EAAMkL,cC7alB4pC,GAAQ,CAEZ2D,MAFY,WAILl5C,KAAKu1C,OAMV1C,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAW9rC,KAAKkE,QAAQ,MAAOhM,KAAK8H,OAAO,GAG5F+qC,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAWY,SAASxoC,QAAQ,MAAOhM,KAAKw0C,WAAW,GAIhGx0C,KAAK6nD,SACPhV,GAAY7yC,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAOkN,WAAW9rC,KAAKkE,QAAQ,MAAO,UAAU,GAIxFhM,KAAKg4C,UAEPh4C,KAAK2wC,SAAS5O,QAAUx9B,GAAc,MAAO,CAC3CmuC,MAAO1yC,KAAK0mC,OAAOkN,WAAWW,QAIhCphC,GAAKnT,KAAKu1C,MAAOv1C,KAAK2wC,SAAS5O,SAG/B/hC,KAAK2wC,SAASsb,OAAS1nD,GAAc,MAAO,CAC1CmuC,MAAO1yC,KAAK0mC,OAAOkN,WAAWqY,OAC9B1c,OAAQ,KAGVvvC,KAAK2wC,SAAS5O,QAAQpzB,YAAY3O,KAAK2wC,SAASsb,SAG9CjsD,KAAKs1C,QACPwD,GAAMI,MAAMh4C,KAAKlB,MACRA,KAAKwoD,UACdpN,GAAQlC,MAAMh4C,KAAKlB,MACVA,KAAKo4C,SACdC,GAAMa,MAAMh4C,KAAKlB,OAxCjBA,KAAKg6C,MAAMoF,KAAK,6BCiBhBgd,GAAAA,WAMJ,SAAAA,EAAYjjB,GAAQ,IAAA5e,EAAAv6B,KAAAo3B,GAAAp3B,KAAAo8D,GAAAzkC,GAAA33B,KAAA,QA0Cb,WACAu6B,EAAKoM,UAKLnlB,GAAUvhB,OAAOo8D,SAAY76C,GAAUvhB,OAAOo8D,OAAOC,KAUxD/hC,EAAKsc,QATLohB,GAAW19B,EAAK4e,OAAOzS,OAAOkhB,KAAKkE,UAAUD,KAC1C7hB,MAAK,WACJzP,EAAKsc,WAENhJ,OAAM,WAELtT,EAAKiN,QAAQ,QAAS,IAAIjnC,MAAM,yCAvDpBo3B,GAAA33B,KAAA,SAiEZ,WArFM,IAACq3B,EAuFRkD,EAAKoM,WAvFGtP,EAwFHkD,GAtFCgiC,SACXllC,EAASklC,QAAQC,UAIfnlC,EAASsZ,SAAS8rB,kBACpBplC,EAASsZ,SAAS8rB,iBAAiBD,UAGrCnlC,EAASsZ,SAAS2C,UAAUopB,UAkF1BniC,EAAKoiC,iBAAiB,KAAO,WAG7BpiC,EAAKqiC,eAAe5yB,MAAK,WACvBzP,EAAKsiC,iBAAiB,2BAIxBtiC,EAAKwM,YAGLxM,EAAKuiC,cApFanlC,GAAA33B,KAAA,YAsHT,WAETu6B,EAAKoW,SAAS2C,UAAY/uC,GAAc,MAAO,CAC7CmuC,MAAOnY,EAAK4e,OAAOzS,OAAOkN,WAAWuY,MAGvC5xB,EAAK4e,OAAOxI,SAAS2C,UAAU3kC,YAAY4rB,EAAKoW,SAAS2C,WAGzD+oB,OAAOC,IAAI3d,SAASoe,aAAaV,OAAOC,IAAIU,eAAeC,UAAUC,SAGrEb,OAAOC,IAAI3d,SAASwe,UAAU5iC,EAAK4e,OAAOzS,OAAOylB,IAAItG,UAGrDwW,OAAOC,IAAI3d,SAASye,qCAAqC7iC,EAAK4e,OAAOzS,OAAO+N,aAG5Ela,EAAKoW,SAAS8rB,iBAAmB,IAAIJ,OAAOC,IAAIe,mBAAmB9iC,EAAKoW,SAAS2C,UAAW/Y,EAAK4e,OAAO5D,OAGxGhb,EAAK+iC,OAAS,IAAIjB,OAAOC,IAAIiB,UAAUhjC,EAAKoW,SAAS8rB,kBAGrDliC,EAAK+iC,OAAOh0B,iBACV+yB,OAAOC,IAAIkB,sBAAsBC,KAAKC,oBACtC,SAACj9D,GAAD,OAAW85B,EAAKojC,mBAAmBl9D,MACnC,GAEF85B,EAAK+iC,OAAOh0B,iBAAiB+yB,OAAOC,IAAIsB,aAAaH,KAAKI,UAAU,SAAC37D,GAAD,OAAWq4B,EAAKujC,UAAU57D,MAAQ,GAGtGq4B,EAAKwjC,gBAtJapmC,GAAA33B,KAAA,cA4JP,WAAM,IACTszC,EAAc/Y,EAAK4e,OAAOxI,SAA1B2C,UAER,IAEE,IAAM8I,EAAU,IAAIigB,OAAOC,IAAI0B,WAC/B5hB,EAAQ6hB,SAAW1jC,EAAK2yB,OAIxB9Q,EAAQ8hB,kBAAoB5qB,EAAUiF,YACtC6D,EAAQ+hB,mBAAqB7qB,EAAU9D,aACvC4M,EAAQgiB,qBAAuB9qB,EAAUiF,YACzC6D,EAAQiiB,sBAAwB/qB,EAAU9D,aAG1C4M,EAAQkiB,wBAAyB,EAGjCliB,EAAQmiB,oBAAoBhkC,EAAK4e,OAAO8J,OAExC1oB,EAAK+iC,OAAOS,WAAW3hB,GACvB,MAAO57C,GACP+5B,EAAKujC,UAAUt9D,OAnLCm3B,GAAA33B,KAAA,iBA2LJ,WAAmB,IAAlB4a,EAAkB5R,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACjC,IAAK4R,EAGH,OAFAkhD,cAAcvhC,EAAKikC,qBACnBjkC,EAAKoW,SAAS2C,UAAUqT,gBAAgB,mBAI1C,IAAM5J,EAAS,WACb,IAAMS,EAAOD,GAAW17C,KAAK4H,IAAI8wB,EAAKgiC,QAAQkC,mBAAoB,IAC5DjwC,EAAK,GAAA7jB,OAAM0wC,GAAS,gBAAiB9gB,EAAK4e,OAAOzS,QAA5C,OAAA/7B,OAAyD6yC,GACpEjjB,EAAKoW,SAAS2C,UAAU9B,aAAa,kBAAmBhjB,IAG1D+L,EAAKikC,eAAiBniC,YAAY0gB,EAAQ,QAxMxBplB,GAAA33B,KAAA,sBA+MC,SAACS,GAEpB,GAAK85B,EAAKoM,QAAV,CAKA,IAAMgY,EAAW,IAAI0d,OAAOC,IAAIoC,qBAGhC/f,EAASggB,6CAA8C,EACvDhgB,EAASigB,kBAAmB,EAI5BrkC,EAAKgiC,QAAU97D,EAAMo+D,cAActkC,EAAK4e,OAAQwF,GAGhDpkB,EAAKukC,UAAYvkC,EAAKgiC,QAAQwC,eAI9BxkC,EAAKgiC,QAAQjzB,iBAAiB+yB,OAAOC,IAAIsB,aAAaH,KAAKI,UAAU,SAAC37D,GAAD,OAAWq4B,EAAKujC,UAAU57D,MAG/Ff,OAAO0F,KAAKw1D,OAAOC,IAAI0C,QAAQvB,MAAMhsD,SAAQ,SAAC3J,GAC5CyyB,EAAKgiC,QAAQjzB,iBAAiB+yB,OAAOC,IAAI0C,QAAQvB,KAAK31D,IAAO,SAACtH,GAAD,OAAO+5B,EAAK0kC,UAAUz+D,SAIrF+5B,EAAKiN,QAAQ,cA7OK7P,GAAA33B,KAAA,gBAgPL,WAERwhB,GAAS+Y,EAAKukC,YACjBvkC,EAAKukC,UAAUrtD,SAAQ,SAACytD,GACtB,GAAiB,IAAbA,IAAgC,IAAdA,GAAmBA,EAAW3kC,EAAK4e,OAAO8F,SAAU,CACxE,IAAMkgB,EAAc5kC,EAAK4e,OAAOxI,SAASkO,SAEzC,GAAIr9B,GAAW29C,GAAc,CAC3B,IAAMC,EAAiB,IAAM7kC,EAAK4e,OAAO8F,SAAYigB,EAC/CxV,EAAMnlD,GAAc,OAAQ,CAChCmuC,MAAOnY,EAAK4e,OAAOzS,OAAOkN,WAAW4V,OAGvCE,EAAIj7C,MAAM44B,KAAV,GAAA18B,OAAoBy0D,EAAcl8D,WAAlC,KACAi8D,EAAYxwD,YAAY+6C,WA9Pd/xB,GAAA33B,KAAA,aA2QR,SAACS,GAAU,IACb6yC,EAAc/Y,EAAK4e,OAAOxI,SAA1B2C,UAGF+rB,EAAK5+D,EAAM6+D,QACXC,EAAS9+D,EAAM++D,YAUrB,OAPsB,SAAC13D,GACrB2uC,GAAav1C,KAAKq5B,EAAK4e,OAAQ5e,EAAK4e,OAAO5D,MAA3C,MAAA5qC,OAAwD7C,EAAKkE,QAAQ,KAAM,IAAIC,gBAIjFs7B,CAAc9mC,EAAMqH,MAEZrH,EAAMqH,MACZ,KAAKu0D,OAAOC,IAAI0C,QAAQvB,KAAKgC,OAG3BllC,EAAKiN,QAAQ,UAGbjN,EAAKmlC,eAAc,GAEdL,EAAGM,aAENN,EAAGl4B,MAAQmM,EAAUiF,YACrB8mB,EAAGjoB,OAAS9D,EAAU9D,cAMxB,MAEF,KAAK6sB,OAAOC,IAAI0C,QAAQvB,KAAKmC,QAE3BrlC,EAAKgiC,QAAQzD,UAAUv+B,EAAK4e,OAAO6F,QAEnC,MAEF,KAAKqd,OAAOC,IAAI0C,QAAQvB,KAAKoC,kBA2BvBtlC,EAAK4e,OAAOka,MACd94B,EAAKulC,UAGLvlC,EAAK+iC,OAAOyC,kBAGd,MAEF,KAAK1D,OAAOC,IAAI0C,QAAQvB,KAAKuC,wBAK3BzlC,EAAK0lC,eAEL,MAEF,KAAK5D,OAAOC,IAAI0C,QAAQvB,KAAKyC,yBAM3B3lC,EAAKmlC,gBAELnlC,EAAK4lC,gBAEL,MAEF,KAAK9D,OAAOC,IAAI0C,QAAQvB,KAAK2C,IACvBb,EAAOc,SACT9lC,EAAK4e,OAAOa,MAAMoF,KAAlB,uBAAAz0C,OAA8C40D,EAAOc,QAAQC,mBA/WjD3oC,GAAA33B,KAAA,aA6XR,SAACS,GACX85B,EAAKgmC,SACLhmC,EAAK4e,OAAOa,MAAMoF,KAAK,YAAa3+C,MA/XlBk3B,GAAA33B,KAAA,aAuYR,WAAM,IAEZw9C,EADIlK,EAAc/Y,EAAK4e,OAAOxI,SAA1B2C,UAGR/Y,EAAK4e,OAAO/C,GAAG,WAAW,WACxB7b,EAAKimC,kBAGPjmC,EAAK4e,OAAO/C,GAAG,SAAS,WACtB7b,EAAK+iC,OAAOyC,qBAGdxlC,EAAK4e,OAAO/C,GAAG,cAAc,WAC3BoH,EAAOjjB,EAAK4e,OAAOI,eAGrBhf,EAAK4e,OAAO/C,GAAG,UAAU,WACvB,IAAMqqB,EAAalmC,EAAK4e,OAAOI,YAE3B/3B,GAAS+Y,EAAKukC,YAIlBvkC,EAAKukC,UAAUrtD,SAAQ,SAACytD,EAAUv1D,GAC5B6zC,EAAO0hB,GAAYA,EAAWuB,IAChClmC,EAAKgiC,QAAQmE,iBACbnmC,EAAKukC,UAAU3yC,OAAOxiB,EAAO,UAOnC1J,OAAOqpC,iBAAiB,UAAU,WAC5B/O,EAAKgiC,SACPhiC,EAAKgiC,QAAQoE,OAAOrtB,EAAUiF,YAAajF,EAAU9D,aAAc6sB,OAAOC,IAAIsE,SAASC,cA1azElpC,GAAA33B,KAAA,QAkbb,WAAM,IACHszC,EAAc/Y,EAAK4e,OAAOxI,SAA1B2C,UAEH/Y,EAAKqiC,gBACRriC,EAAK4lC,gBAIP5lC,EAAKqiC,eACF5yB,MAAK,WAEJzP,EAAKgiC,QAAQzD,UAAUv+B,EAAK4e,OAAO6F,QAGnCzkB,EAAKoW,SAAS8rB,iBAAiBqE,aAE/B,IACOvmC,EAAKwmC,cAERxmC,EAAKgiC,QAAQ1wC,KAAKynB,EAAUiF,YAAajF,EAAU9D,aAAc6sB,OAAOC,IAAIsE,SAASC,QAIrFtmC,EAAKgiC,QAAQ3hD,SAGf2f,EAAKwmC,aAAc,EACnB,MAAOV,GAGP9lC,EAAKujC,UAAUuC,OAGlBxyB,OAAM,kBAndSlW,GAAA33B,KAAA,iBAydJ,WAEdu6B,EAAKoW,SAAS2C,UAAU7kC,MAAMuyD,OAAS,GAGvCzmC,EAAK6xB,SAAU,EAGfrV,GAAexc,EAAK4e,OAAO5D,MAAMqE,WAjefjiB,GAAA33B,KAAA,gBAueL,WAEbu6B,EAAKoW,SAAS2C,UAAU7kC,MAAMuyD,OAAS,EAGvCzmC,EAAK6xB,SAAU,EAGf7xB,EAAK4e,OAAO5D,MAAM+I,WA/eA3mB,GAAA33B,KAAA,UAwfX,WAEHu6B,EAAKwmC,aACPxmC,EAAK4lC,gBAIP5lC,EAAKiN,QAAQ,SAGbjN,EAAKulC,aAlgBanoC,GAAA33B,KAAA,WAwgBV,WAERu6B,EAAKqiC,eACF5yB,MAAK,WAEAzP,EAAKgiC,SACPhiC,EAAKgiC,QAAQC,UAIfjiC,EAAKqiC,eAAiB,IAAI50B,SAAQ,SAAC2C,GACjCpQ,EAAK6b,GAAG,SAAUzL,GAClBpQ,EAAK4e,OAAOa,MAAMhV,IAAIzK,EAAKgiC,YAG7BhiC,EAAKwmC,aAAc,EAGnBxmC,EAAKwjC,gBAENlwB,OAAM,kBA5hBSlW,GAAA33B,KAAA,WAmiBV,SAACS,GAAmB,IAAA,IAAA+vC,EAAAxnC,UAAAC,OAAT2L,EAAS,IAAA1H,MAAAsjC,EAAA,EAAAA,EAAA,EAAA,GAAAE,EAAA,EAAAA,EAAAF,EAAAE,IAAT97B,EAAS87B,EAAA,GAAA1nC,UAAA0nC,GAC5B,IAAMuwB,EAAW1mC,EAAKgU,OAAO9tC,GAEzB+gB,GAASy/C,IACXA,EAASxvD,SAAQ,SAACo7B,GACZrrB,GAAYqrB,IACdA,EAAQr8B,MAAM+pB,EAAM3lB,SAziBR+iB,GAAA33B,KAAA,MAqjBf,SAACS,EAAO+rB,GAOX,OANKhL,GAAS+Y,EAAKgU,OAAO9tC,MACxB85B,EAAKgU,OAAO9tC,GAAS,IAGvB85B,EAAKgU,OAAO9tC,GAAO4F,KAAKmmB,GAEjB+N,KA5jBW5C,GAAA33B,KAAA,oBAukBD,SAACw9C,EAAMlkB,GACxBiB,EAAK4e,OAAOa,MAAMhV,IAAlB,8BAAAr6B,OAAoD2uB,IAEpDiB,EAAK2mC,YAAcz3B,YAAW,WAC5BlP,EAAKgmC,SACLhmC,EAAKsiC,iBAAiB,wBACrBrf,MA7kBe7lB,GAAA33B,KAAA,oBAolBD,SAACs5B,GACb9X,GAAmB+Y,EAAK2mC,eAC3B3mC,EAAK4e,OAAOa,MAAMhV,IAAlB,8BAAAr6B,OAAoD2uB,IAEpD83B,aAAa72B,EAAK2mC,aAClB3mC,EAAK2mC,YAAc,SAxlBrBlhE,KAAKm5C,OAASA,EACdn5C,KAAK0mC,OAASyS,EAAOzS,OAAOylB,IAC5BnsD,KAAKosD,SAAU,EACfpsD,KAAK+gE,aAAc,EACnB/gE,KAAK2wC,SAAW,CACd2C,UAAW,KACXmpB,iBAAkB,MAEpBz8D,KAAKu8D,QAAU,KACfv8D,KAAKs9D,OAAS,KACdt9D,KAAK8+D,UAAY,KACjB9+D,KAAKuuC,OAAS,GACdvuC,KAAKkhE,YAAc,KACnBlhE,KAAKw+D,eAAiB,KAGtBx+D,KAAK48D,eAAiB,IAAI50B,SAAQ,SAAC2C,EAASO,GAE1C3Q,EAAK6b,GAAG,SAAUzL,GAGlBpQ,EAAK6b,GAAG,QAASlL,MAGnBlrC,KAAK65C,OnN8maL,OA3CAriB,GAAa4kC,EAAK,CAAC,CACjB/3D,IAAK,UACLhD,IAAK,WmNlkaK,IACJqlC,EAAW1mC,KAAX0mC,OAER,OACE1mC,KAAKm5C,OAAO7D,SACZt1C,KAAKm5C,OAAOnB,SACZtR,EAAOC,WACLnlB,GAASklB,EAAOumB,cAAgBzrC,GAAOklB,EAAOwmB,WnNmka/C,CACD7oD,IAAK,SAELhD,IAAK,WmNjhaI,IACHqlC,EAAW1mC,KAAX0mC,OAER,GAAIllB,GAAOklB,EAAOwmB,QAChB,OAAOxmB,EAAOwmB,OAGhB,IAAMxsD,EAAS,CACbygE,eAAgB,2BAChBC,aAAc,2BACdC,OAAQphE,OAAOg7B,SAAS/E,SACxBorC,GAAI7P,KAAKxoB,MACTs4B,SAAU,IACVC,UAAW,IACXC,SAAU/6B,EAAOumB,aAKnB,MAAA,GAAAtiD,OAFa,6CAEb,KAAAA,OAAkB49C,GAAe7nD,QnN4ha1B07D,EmN7oaLA,GC7BFsF,GAAar3D,GAAwC0H,UAIrD4vD,GAAa,YACb1kC,IAAc,EAEdnnB,GAAiBL,GAAwBksD,IAGzCA,KAAc,IAAIz0D,MAAM,GAAa,WAAE,WAAc+vB,IAAc,KAIvEhpB,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,OAAQuwB,KAAgBnnB,IAAkB,CAC1E/D,UAAW,SAAmBX,GAC5B,OAAOswD,GAAW1hE,KAAMoR,EAAYpI,UAAUC,OAAS,EAAID,UAAU,QAAKvF,MAK9EiT,GAAiBirD,IChBjB,IAAIp4D,GAAM1H,KAAK0H,IACXq4D,GAAoB,GAAGC,YACvB1rD,KAAkByrD,IAAqB,EAAI,CAAC,GAAGC,YAAY,GAAI,GAAK,EACpEhsD,GAAgBR,GAAoB,eAEpCS,GAAiBL,GAAwB,UAAW,CAAEC,WAAW,EAAMjT,EAAG,IAK9Eq/D,GAJa3rD,KAAkBN,KAAkBC,GAIvB,SAAqBM,GAE7C,GAAID,GAAe,OAAOyrD,GAAkBpxD,MAAMxQ,KAAMgJ,YAAc,EACtE,IAAIlE,EAAInB,EAAgB3D,MACpBiJ,EAASO,GAAS1E,EAAEmE,QACpBU,EAAQV,EAAS,EAGrB,IAFID,UAAUC,OAAS,IAAGU,EAAQJ,GAAII,EAAOP,GAAUJ,UAAU,MAC7DW,EAAQ,IAAGA,EAAQV,EAASU,GAC1BA,GAAS,EAAGA,IAAS,GAAIA,KAAS7E,GAAKA,EAAE6E,KAAWyM,EAAe,OAAOzM,GAAS,EACzF,OAAQ,GACNi4D,GCtBJ3tD,GAAE,CAAE5I,OAAQ,QAAS2K,OAAO,EAAMtJ,OAAQm1D,KAAgB,GAAGA,aAAe,CAC1EA,YAAaA,KCCf,IA0DME,GAAW,SAAC7qB,EAAO8qB,GACvB,IACMv3D,EAAS,GASf,OARIysC,EAFgB8qB,EAAM76B,MAAQ66B,EAAM5qB,QAGtC3sC,EAAO08B,MAAQ66B,EAAM76B,MACrB18B,EAAO2sC,OAAU,EAAIF,EAAS8qB,EAAM76B,QAEpC18B,EAAO2sC,OAAS4qB,EAAM5qB,OACtB3sC,EAAO08B,MAAQ+P,EAAQ8qB,EAAM5qB,QAGxB3sC,GAGHw3D,GAAAA,WAMJ,SAAAA,EAAY9oB,GAAQ,IAAA5e,EAAAv6B,KAAAo3B,GAAAp3B,KAAAiiE,GAAAtqC,GAAA33B,KAAA,QAoBb,WAEDu6B,EAAK4e,OAAOxI,SAASjiC,QAAQwwC,cAC/B3kB,EAAK4e,OAAOxI,SAASjiC,QAAQwwC,YAAY3P,OAAShV,EAAKoM,SAGpDpM,EAAKoM,SAIVpM,EAAK2nC,gBAAgBl4B,MAAK,WACnBzP,EAAKoM,UAKVpM,EAAK4nC,SAGL5nC,EAAK6nC,+BAEL7nC,EAAK65B,QAAS,SAzCEz8B,GAAA33B,KAAA,iBA8CJ,WACd,OAAO,IAAIgoC,SAAQ,SAAC2C,GAAY,IACtB/7B,EAAQ2rB,EAAK4e,OAAOzS,OAAOgmB,kBAA3B99C,IAER,GAAI4S,GAAS5S,GACX,MAAM,IAAIrO,MAAM,kDAIlB,IAAM8hE,EAAiB,WAErB9nC,EAAK+nC,WAAWr8C,MAAK,SAACxE,EAAGC,GAAJ,OAAUD,EAAE21B,OAAS11B,EAAE01B,UAE5C7c,EAAK4e,OAAOa,MAAMhV,IAAI,qBAAsBzK,EAAK+nC,YAEjD33B,KAIF,GAAInpB,GAAY5S,GACdA,GAAI,SAAC0zD,GACH/nC,EAAK+nC,WAAaA,EAClBD,WAIC,CAEH,IAEME,GAFO/gD,GAAU5S,GAAO,CAACA,GAAOA,GAEhB8C,KAAI,SAACkpB,GAAD,OAAOL,EAAKioC,aAAa5nC,MAEnDoN,QAAQoE,IAAIm2B,GAAUv4B,KAAKq4B,UA9Eb1qC,GAAA33B,KAAA,gBAoFL,SAAC6lB,GACd,OAAO,IAAImiB,SAAQ,SAAC2C,GAClBje,GAAM7G,GAAKmkB,MAAK,SAACuS,GACf,IArKUkmB,EACVC,EAoKMC,EAAY,CAChBC,QAtKQH,EAsKSlmB,EArKnBmmB,EAAgB,GACPD,EAAcp/D,MAAM,sBAE5BoO,SAAQ,SAACoxD,GACd,IAAMp4D,EAAS,GACDo4D,EAAMx/D,MAAM,cAEpBoO,SAAQ,SAACqxD,GACb,GAAKthD,GAAU/W,EAAOs4D,YAkBf,IAAKvhD,GAASshD,EAAKvkC,SAAW/c,GAAS/W,EAAOgnC,MAAO,CAE1D,IAAMuxB,EAAYF,EAAKvkC,OAAOl7B,MAAM,UAFsB4/D,EAAA5qC,GAG1C2qC,EAH0C,GAM1D,GAHCv4D,EAAOgnC,KAHkDwxB,EAAA,GAMtDD,EAAU,GAAI,CAAA,IAAAE,EAAA7qC,GAC2B2qC,EAAU,GAAG3/D,MAAM,KAD9C,GACfoH,EAAOgX,EADQyhD,EAAA,GACLz4D,EAAOiX,EADFwhD,EAAA,GACKz4D,EAAO8sC,EADZ2rB,EAAA,GACez4D,EAAO+sC,EADtB0rB,EAAA,SAxBc,CAEhC,IAAMC,EAAaL,EAAKnpD,MACtB,2GAGEwpD,IACF14D,EAAOs4D,UACwB,GAA7Bp0B,OAAOw0B,EAAW,IAAM,GAAU,GACV,GAAxBx0B,OAAOw0B,EAAW,IAClBx0B,OAAOw0B,EAAW,IAClBx0B,OAAM,KAAAhkC,OAAMw4D,EAAW,KACzB14D,EAAO24D,QACwB,GAA7Bz0B,OAAOw0B,EAAW,IAAM,GAAU,GACV,GAAxBx0B,OAAOw0B,EAAW,IAClBx0B,OAAOw0B,EAAW,IAClBx0B,OAAM,KAAAhkC,OAAMw4D,EAAW,UAc3B14D,EAAOgnC,MACTixB,EAAcr8D,KAAKoE,MAIhBi4D,GA2HCtrB,OAAQ,KACRisB,UAAW,IAOVV,EAAUC,OAAO,GAAGnxB,KAAKrD,WAAW,MACpCu0B,EAAUC,OAAO,GAAGnxB,KAAKrD,WAAW,YACpCu0B,EAAUC,OAAO,GAAGnxB,KAAKrD,WAAW,cAErCu0B,EAAUU,UAAYx9C,EAAIy9C,UAAU,EAAGz9C,EAAIg8C,YAAY,KAAO,IAIhE,IAAM0B,EAAY,IAAIlT,MAEtBkT,EAAUjT,OAAS,WACjBqS,EAAUvrB,OAASmsB,EAAUC,cAC7Bb,EAAUx7B,MAAQo8B,EAAU/S,aAE5Bj2B,EAAK+nC,WAAWj8D,KAAKs8D,GAErBh4B,KAGF44B,EAAU30D,IAAM+zD,EAAUU,UAAYV,EAAUC,OAAO,GAAGnxB,cApH5C9Z,GAAA33B,KAAA,aAyHR,SAACS,GACX,GAAK85B,EAAK65B,QAIL5yC,GAAS/gB,IAAW,CAAC,YAAa,aAAa0J,SAAS1J,EAAMqH,OAK9DyyB,EAAK4e,OAAO5D,MAAM0J,SAAvB,CAIA,GAAmB,cAAfx+C,EAAMqH,KAERyyB,EAAKghB,SAAWhhB,EAAK4e,OAAO5D,MAAM0J,UAAY1kB,EAAK4e,OAAOxI,SAASmO,OAAOC,KAAKh8C,MAAQ,SAClF,CAEL,IAAMmhD,EAAa3pB,EAAK4e,OAAOxI,SAASkO,SAAS3X,wBAC3Cu8B,EAAc,IAAMvf,EAAW/c,OAAU1mC,EAAM0jD,MAAQD,EAAW7c,MACxE9M,EAAKghB,SAAWhhB,EAAK4e,OAAO5D,MAAM0J,UAAYwkB,EAAa,KAEvDlpC,EAAKghB,SAAW,IAElBhhB,EAAKghB,SAAW,GAGdhhB,EAAKghB,SAAWhhB,EAAK4e,OAAO5D,MAAM0J,SAAW,IAE/C1kB,EAAKghB,SAAWhhB,EAAK4e,OAAO5D,MAAM0J,SAAW,GAG/C1kB,EAAKmpC,UAAYjjE,EAAM0jD,MAGvB5pB,EAAKoW,SAASgzB,MAAMnmB,KAAK9L,UAAY6L,GAAWhjB,EAAKghB,UAIvDhhB,EAAKqpC,6BAjKajsC,GAAA33B,KAAA,WAoKV,WACRu6B,EAAKspC,sBAAqB,GAAO,MArKflsC,GAAA33B,KAAA,kBAwKH,SAACS,IAEZ+gB,GAAmB/gB,EAAMigD,UAA4B,IAAjBjgD,EAAMigD,QAAqC,IAAjBjgD,EAAMigD,UACtEnmB,EAAKupC,WAAY,EAGbvpC,EAAK4e,OAAO5D,MAAM0J,WACpB1kB,EAAKwpC,0BAAyB,GAC9BxpC,EAAKspC,sBAAqB,GAAO,GAGjCtpC,EAAKqpC,8BAnLSjsC,GAAA33B,KAAA,gBAwLL,WACbu6B,EAAKupC,WAAY,EAGbjiE,KAAKqH,KAAKqxB,EAAKypC,YAAcniE,KAAKqH,KAAKqxB,EAAK4e,OAAO5D,MAAMgE,aAE3Dhf,EAAKwpC,0BAAyB,GAG9BztB,GAAKp1C,KAAKq5B,EAAK4e,OAAQ5e,EAAK4e,OAAO5D,MAAO,cAAc,WAEjDhb,EAAKupC,WACRvpC,EAAKwpC,0BAAyB,SApMlBpsC,GAAA33B,KAAA,aA6MR,WAEVu6B,EAAK4e,OAAO/C,GAAG,QAAQ,WACrB7b,EAAKspC,sBAAqB,GAAO,MAGnCtpC,EAAK4e,OAAO/C,GAAG,UAAU,WACvB7b,EAAKspC,sBAAqB,MAG5BtpC,EAAK4e,OAAO/C,GAAG,cAAc,WAC3B7b,EAAKypC,SAAWzpC,EAAK4e,OAAO5D,MAAMgE,kBAxNlB5hB,GAAA33B,KAAA,UA+NX,WAEPu6B,EAAKoW,SAASgzB,MAAMrwB,UAAY/uC,GAAc,MAAO,CACnDmuC,MAAOnY,EAAK4e,OAAOzS,OAAOkN,WAAW8Y,kBAAkBC,iBAIzDpyB,EAAKoW,SAASgzB,MAAM9W,eAAiBtoD,GAAc,MAAO,CACxDmuC,MAAOnY,EAAK4e,OAAOzS,OAAOkN,WAAW8Y,kBAAkBG,iBAEzDtyB,EAAKoW,SAASgzB,MAAMrwB,UAAU3kC,YAAY4rB,EAAKoW,SAASgzB,MAAM9W,gBAG9D,IAAMC,EAAgBvoD,GAAc,MAAO,CACzCmuC,MAAOnY,EAAK4e,OAAOzS,OAAOkN,WAAW8Y,kBAAkBI,gBAGzDvyB,EAAKoW,SAASgzB,MAAMnmB,KAAOj5C,GAAc,OAAQ,GAAI,SACrDuoD,EAAcn+C,YAAY4rB,EAAKoW,SAASgzB,MAAMnmB,MAE9CjjB,EAAKoW,SAASgzB,MAAMrwB,UAAU3kC,YAAYm+C,GAGtCtrC,GAAW+Y,EAAK4e,OAAOxI,SAASkO,WAClCtkB,EAAK4e,OAAOxI,SAASkO,SAASlwC,YAAY4rB,EAAKoW,SAASgzB,MAAMrwB,WAIhE/Y,EAAKoW,SAASszB,UAAU3wB,UAAY/uC,GAAc,MAAO,CACvDmuC,MAAOnY,EAAK4e,OAAOzS,OAAOkN,WAAW8Y,kBAAkBK,qBAGzDxyB,EAAK4e,OAAOxI,SAAS5O,QAAQpzB,YAAY4rB,EAAKoW,SAASszB,UAAU3wB,cA/P/C3b,GAAA33B,KAAA,WAkQV,WACJu6B,EAAKoW,SAASgzB,MAAMrwB,WACtB/Y,EAAKoW,SAASgzB,MAAMrwB,UAAUopB,SAE5BniC,EAAKoW,SAASszB,UAAU3wB,WAC1B/Y,EAAKoW,SAASszB,UAAU3wB,UAAUopB,YAvQlB/kC,GAAA33B,KAAA,0BA2QK,WACnBu6B,EAAKupC,UACPvpC,EAAK2pC,4BAEL3pC,EAAK4pC,8BAKP,IAAMC,EAAW7pC,EAAK+nC,WAAW,GAAGM,OAAO7wD,WACzC,SAAC8wD,GAAD,OAAWtoC,EAAKghB,UAAYsnB,EAAME,WAAaxoC,EAAKghB,UAAYsnB,EAAMO,WAElEiB,EAAWD,GAAY,EACzBE,EAAe,EAGd/pC,EAAKupC,WACRvpC,EAAKspC,qBAAqBQ,GAIvBA,IAKL9pC,EAAK+nC,WAAW7wD,SAAQ,SAACkxD,EAAWh5D,GAC9B4wB,EAAKgqC,aAAap6D,SAASw4D,EAAUC,OAAOwB,GAAU3yB,QACxD6yB,EAAe36D,MAKfy6D,IAAa7pC,EAAKiqC,eACpBjqC,EAAKiqC,aAAeJ,EACpB7pC,EAAK21B,UAAUoU,QA9SC3sC,GAAA33B,KAAA,aAmTR,WAAsB,IAArBskE,EAAqBt7D,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAN,EACpBo7D,EAAW7pC,EAAKiqC,aAChB7B,EAAYpoC,EAAK+nC,WAAWgC,GAC1BjB,EAAcV,EAAdU,UACFR,EAAQF,EAAUC,OAAOwB,GACzBK,EAAgB9B,EAAUC,OAAOwB,GAAU3yB,KAC3CizB,EAAWrB,EAAYoB,EAE7B,GAAKlqC,EAAKoqC,qBAAuBpqC,EAAKoqC,oBAAoBC,QAAQC,WAAaJ,EAwB7ElqC,EAAKuqC,UAAUvqC,EAAKoqC,oBAAqB9B,EAAOyB,EAAcF,EAAUK,GAAe,GACvFlqC,EAAKoqC,oBAAoBC,QAAQj7D,MAAQy6D,EACzC7pC,EAAKwqC,gBAAgBxqC,EAAKoqC,yBA1BkE,CAGxFpqC,EAAKyqC,cAAgBzqC,EAAK0qC,eAC5B1qC,EAAKyqC,aAAa1U,OAAS,MAM7B,IAAM4U,EAAe,IAAI7U,MACzB6U,EAAat2D,IAAM81D,EACnBQ,EAAaN,QAAQj7D,MAAQy6D,EAC7Bc,EAAaN,QAAQC,SAAWJ,EAChClqC,EAAK4qC,qBAAuBV,EAE5BlqC,EAAK4e,OAAOa,MAAMhV,IAAlB,kBAAAr6B,OAAwC+5D,IAGxCQ,EAAa5U,OAAS,WAAA,OAAM/1B,EAAKuqC,UAAUI,EAAcrC,EAAOyB,EAAcF,EAAUK,GAAe,IACvGlqC,EAAKyqC,aAAeE,EACpB3qC,EAAKwqC,gBAAgBG,OAhVLvtC,GAAA33B,KAAA,aAyVR,SAACklE,EAAcrC,EAAOyB,EAAcF,EAAUK,GAAmC,IAApBW,IAAoBp8D,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAC3FuxB,EAAK4e,OAAOa,MAAMhV,IAAlB,kBAAAr6B,OACoB85D,EADpB,WAAA95D,OAC2Cy5D,EAD3C,YAAAz5D,OAC8D25D,EAD9D,cAAA35D,OACuFy6D,IAEvF7qC,EAAK8qC,sBAAsBH,EAAcrC,GAErCuC,IACF7qC,EAAK+qC,sBAAsB32D,YAAYu2D,GACvC3qC,EAAKoqC,oBAAsBO,EAEtB3qC,EAAKgqC,aAAap6D,SAASs6D,IAC9BlqC,EAAKgqC,aAAal+D,KAAKo+D,IAO3BlqC,EAAKgrC,cAAcnB,GAAU,GAC1Bp6B,KAAKzP,EAAKgrC,cAAcnB,GAAU,IAClCp6B,KAAKzP,EAAKirC,iBAAiBlB,EAAcY,EAAcrC,EAAO4B,OA7W/C9sC,GAAA33B,KAAA,mBAiXF,SAACylE,GAEjBv4D,MAAMosB,KAAKiB,EAAK+qC,sBAAsB3iB,UAAUlxC,SAAQ,SAAC2+C,GACvD,GAAoC,QAAhCA,EAAMsV,QAAQz5D,cAAlB,CAIA,IAAM05D,EAAcprC,EAAK0qC,aAAe,IAAM,IAE9C,GAAI7U,EAAMwU,QAAQj7D,QAAU87D,EAAab,QAAQj7D,QAAUymD,EAAMwU,QAAQgB,SAAU,CAIjFxV,EAAMwU,QAAQgB,UAAW,EAJwD,IAOzEN,EAA0B/qC,EAA1B+qC,sBAER77B,YAAW,WACT67B,EAAsB97B,YAAY4mB,GAClC71B,EAAK4e,OAAOa,MAAMhV,IAAlB,mBAAAr6B,OAAyCylD,EAAMwU,QAAQC,aACtDc,WAtYWhuC,GAAA33B,KAAA,iBA6YJ,SAACokE,GAA6B,IAAnBrQ,IAAmB/qD,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,KAAAA,UAAA,GAC5C,OAAO,IAAIg/B,SAAQ,SAAC2C,GAClBlB,YAAW,WACT,IAAMo8B,EAAmBtrC,EAAK+nC,WAAW,GAAGM,OAAOwB,GAAU3yB,KAE7D,GAAIlX,EAAK4qC,uBAAyBU,EAAkB,CAElD,IAAIC,EAEFA,EADE/R,EACgBx5B,EAAK+nC,WAAW,GAAGM,OAAOx/D,MAAMghE,GAEhC7pC,EAAK+nC,WAAW,GAAGM,OAAOx/D,MAAM,EAAGghE,GAAUvzB,UAGjE,IAAIk1B,GAAW,EAEfD,EAAgBr0D,SAAQ,SAACoxD,GACvB,IAAMmD,EAAmBnD,EAAMpxB,KAE/B,GAAIu0B,IAAqBH,IAElBtrC,EAAKgqC,aAAap6D,SAAS67D,GAAmB,CACjDD,GAAW,EACXxrC,EAAK4e,OAAOa,MAAMhV,IAAlB,8BAAAr6B,OAAoDq7D,IAFH,IAK3CC,EADgB1rC,EAAK+nC,WAAW,GAA9Be,UACqB2C,EACvBd,EAAe,IAAI7U,MACzB6U,EAAat2D,IAAMq3D,EACnBf,EAAa5U,OAAS,WACpB/1B,EAAK4e,OAAOa,MAAMhV,IAAlB,6BAAAr6B,OAAmDq7D,IAC9CzrC,EAAKgqC,aAAap6D,SAAS67D,IAAmBzrC,EAAKgqC,aAAal+D,KAAK2/D,GAG1Er7B,SAOHo7B,GACHp7B,OAGH,WA1bahT,GAAA33B,KAAA,oBA+bD,SAACkmE,EAAqBhB,EAAcrC,EAAO4B,GAC5D,GAAIyB,EAAsB3rC,EAAK+nC,WAAWr5D,OAAS,EAAG,CAEpD,IAAIk9D,EAAqBjB,EAAa1B,cAElCjpC,EAAK0qC,eACPkB,EAAqBtD,EAAMrrB,GAGzB2uB,EAAqB5rC,EAAK6rC,sBAE5B38B,YAAW,WAELlP,EAAK4qC,uBAAyBV,IAChClqC,EAAK4e,OAAOa,MAAMhV,IAAlB,qCAAAr6B,OAA2D85D,IAC3DlqC,EAAK21B,UAAUgW,EAAsB,MAEtC,SAhdWvuC,GAAA33B,KAAA,wBA0gBG,WAA0C,IAAzC6pC,EAAyC7gC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GAAzBq9D,EAAyBr9D,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACzDypC,EAAYlY,EAAK4e,OAAOzS,OAAOkN,WAAW8Y,kBAAkBE,oBAClEryB,EAAKoW,SAASgzB,MAAMrwB,UAAUP,UAAUlJ,OAAO4I,EAAW5I,IAErDA,GAAUw8B,IACb9rC,EAAKiqC,aAAe,KACpBjqC,EAAK4qC,qBAAuB,SAhhBZxtC,GAAA33B,KAAA,4BAohBO,WAAoB,IAAnB6pC,EAAmB7gC,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACvCypC,EAAYlY,EAAK4e,OAAOzS,OAAOkN,WAAW8Y,kBAAkBM,wBAClEzyB,EAAKoW,SAASszB,UAAU3wB,UAAUP,UAAUlJ,OAAO4I,EAAW5I,GAEzDA,IACHtP,EAAKiqC,aAAe,KACpBjqC,EAAK4qC,qBAAuB,SA1hBZxtC,GAAA33B,KAAA,gCA8hBW,YACzBu6B,EAAKoW,SAASgzB,MAAM9W,eAAeyZ,aAAe,IAAM/rC,EAAKoW,SAASgzB,MAAM9W,eAAe0Z,YAAc,MAE3GhsC,EAAKisC,oBAAqB,MAjiBV7uC,GAAA33B,KAAA,+BAsiBU,WAC5B,GAAKu6B,EAAKisC,oBAIH,GACLjsC,EAAKoW,SAASgzB,MAAM9W,eAAeyZ,aAAe,IAClD/rC,EAAKoW,SAASgzB,MAAM9W,eAAe0Z,YAAc,GACjD,CACA,IAAM/gC,EAAa3jC,KAAKsH,MAAMoxB,EAAKoW,SAASgzB,MAAM9W,eAAeyZ,aAAe/rC,EAAKksC,kBACrFlsC,EAAKoW,SAASgzB,MAAM9W,eAAep+C,MAAM04B,MAAzC,GAAAx8B,OAAoD66B,EAApD,WACK,GACLjL,EAAKoW,SAASgzB,MAAM9W,eAAeyZ,aAAe,IAClD/rC,EAAKoW,SAASgzB,MAAM9W,eAAe0Z,YAAc,GACjD,CACA,IAAMG,EAAc7kE,KAAKsH,MAAMoxB,EAAKoW,SAASgzB,MAAM9W,eAAe0Z,YAAchsC,EAAKksC,kBACrFlsC,EAAKoW,SAASgzB,MAAM9W,eAAep+C,MAAM2oC,OAAzC,GAAAzsC,OAAqD+7D,EAArD,WAf4B,CAC5B,IAAMlhC,EAAa3jC,KAAKsH,MAAMoxB,EAAK6rC,qBAAuB7rC,EAAKksC,kBAC/DlsC,EAAKoW,SAASgzB,MAAM9W,eAAep+C,MAAM2oC,OAAzC,GAAAzsC,OAAqD4vB,EAAK6rC,qBAA1D,MACA7rC,EAAKoW,SAASgzB,MAAM9W,eAAep+C,MAAM04B,MAAzC,GAAAx8B,OAAoD66B,EAApD,MAeFjL,EAAKosC,0BAzjBahvC,GAAA33B,KAAA,wBA4jBG,WACrB,IAAM4mE,EAAcrsC,EAAK4e,OAAOxI,SAASkO,SAAS3X,wBAC5C2/B,EAAWtsC,EAAK4e,OAAOxI,SAAS2C,UAAUpM,wBACxCoM,EAAc/Y,EAAKoW,SAASgzB,MAA5BrwB,UAEFwzB,EAASD,EAASx/B,KAAOu/B,EAAYv/B,KAAO,GAC5C0/B,EAASF,EAASz2B,MAAQw2B,EAAYv/B,KAAOiM,EAAUizB,YAAc,GAEvES,EAAazsC,EAAKmpC,UAAYkD,EAAYv/B,KAAOiM,EAAUizB,YAAc,EAEzES,EAAaF,IACfE,EAAaF,GAGXE,EAAaD,IACfC,EAAaD,GAGfzzB,EAAU7kC,MAAM44B,KAAhB,GAAA18B,OAA0Bq8D,EAA1B,SA9kBkBrvC,GAAA33B,KAAA,6BAklBQ,WAAM,IAAAinE,EACNlF,GAASxnC,EAAKksC,iBAAkB,CACxDt/B,MAAO5M,EAAK4e,OAAO5D,MAAMgxB,YACzBnvB,OAAQ7c,EAAK4e,OAAO5D,MAAM+wB,eAFpBn/B,EADwB8/B,EACxB9/B,MAAOiQ,EADiB6vB,EACjB7vB,OAIf7c,EAAKoW,SAASszB,UAAU3wB,UAAU7kC,MAAM04B,MAAxC,GAAAx8B,OAAmDw8B,EAAnD,MACA5M,EAAKoW,SAASszB,UAAU3wB,UAAU7kC,MAAM2oC,OAAxC,GAAAzsC,OAAoDysC,EAApD,SAxlBkBzf,GAAA33B,KAAA,yBA4lBI,SAACklE,EAAcrC,GACrC,GAAKtoC,EAAK0qC,aAAV,CAKA,IAAMiC,EAAa3sC,EAAK6rC,qBAAuBvD,EAAMrrB,EAGrD0tB,EAAaz2D,MAAM2oC,OAAnB,GAAAzsC,OAA+Bu6D,EAAa1B,cAAgB0D,EAA5D,MAEAhC,EAAaz2D,MAAM04B,MAAnB,GAAAx8B,OAA8Bu6D,EAAa1U,aAAe0W,EAA1D,MAEAhC,EAAaz2D,MAAM44B,KAAnB,IAAA18B,OAA8Bk4D,EAAMphD,EAAIylD,EAAxC,MAEAhC,EAAaz2D,MAAM04D,IAAnB,IAAAx8D,OAA6Bk4D,EAAMnhD,EAAIwlD,EAAvC,UA1mBAlnE,KAAKm5C,OAASA,EACdn5C,KAAKsiE,WAAa,GAClBtiE,KAAKo0D,QAAS,EACdp0D,KAAKonE,kBAAoB3V,KAAKxoB,MAC9BjpC,KAAK8jE,WAAY,EACjB9jE,KAAKukE,aAAe,GAEpBvkE,KAAK2wC,SAAW,CACdgzB,MAAO,GACPM,UAAW,IAGbjkE,KAAK65C,OvNg0bL,OAlEAriB,GAAayqC,EAAmB,CAAC,CAC/B59D,IAAK,UACLhD,IAAK,WuN5vbP,OAAOrB,KAAKm5C,OAAO7D,SAAWt1C,KAAKm5C,OAAOnB,SAAWh4C,KAAKm5C,OAAOzS,OAAOgmB,kBAAkB/lB,UvN+vbvF,CACDtiC,IAAK,wBACLhD,IAAK,WuN5zaP,OAAIrB,KAAK8jE,UACA9jE,KAAK2wC,SAASszB,UAAU3wB,UAG1BtzC,KAAK2wC,SAASgzB,MAAM9W,iBvN+zaxB,CACDxoD,IAAK,eACLhD,IAAK,WuN7zaP,OAAOF,OAAO0F,KAAK7G,KAAKsiE,WAAW,GAAGM,OAAO,IAAIz4D,SAAS,OvNg0avD,CACD9F,IAAK,mBACLhD,IAAK,WuN9zaP,OAAIrB,KAAKilE,aACAjlE,KAAKsiE,WAAW,GAAGM,OAAO,GAAGrrB,EAAIv3C,KAAKsiE,WAAW,GAAGM,OAAO,GAAGprB,EAGhEx3C,KAAKsiE,WAAW,GAAGn7B,MAAQnnC,KAAKsiE,WAAW,GAAGlrB,SvNi0alD,CACD/yC,IAAK,uBACLhD,IAAK,WuN/zaP,OAAIrB,KAAK8jE,UACY/B,GAAS/hE,KAAKymE,iBAAkB,CACjDt/B,MAAOnnC,KAAKm5C,OAAO5D,MAAMgxB,YACzBnvB,OAAQp3C,KAAKm5C,OAAO5D,MAAM+wB,eAFpBlvB,OAQNp3C,KAAKwmE,mBACAxmE,KAAK2wC,SAASgzB,MAAM9W,eAAeyZ,aAGrCzkE,KAAKsH,MAAMnJ,KAAKm5C,OAAO5D,MAAMgxB,YAAcvmE,KAAKymE,iBAAmB,KvNo0avE,CACDpiE,IAAK,sBACLhD,IAAK,WuNl0aP,OAAIrB,KAAK8jE,UACA9jE,KAAKqnE,6BAGPrnE,KAAKsnE,8BvNq0aVthE,IAAK,SuNl0aeugC,GAClBvmC,KAAK8jE,UACP9jE,KAAKqnE,6BAA+B9gC,EAEpCvmC,KAAKsnE,6BAA+B/gC,MvNu0a/B07B,EuNn1bLA,GCjEAz5D,GAAS,CAEb++D,eAFa,SAEEz/D,EAAMqjB,GAAY,IAAAoP,EAAAv6B,KAC3BwhB,GAAU2J,GACZwmB,GAAc7pC,EAAM9H,KAAKu1C,MAAO,CAC9B3mC,IAAKuc,IAEE3J,GAAS2J,IAClBA,EAAW1Z,SAAQ,SAACwZ,GAClB0mB,GAAc7pC,EAAMyyB,EAAKgb,MAAOtqB,OAOtCu8C,OAhBa,SAgBNzjE,GAAO,IAAAwyC,EAAAv2C,KACPqwC,GAAQtsC,EAAO,mBAMpB+0C,GAAMgB,eAAe54C,KAAKlB,MAG1BA,KAAKw8D,QAAQt7D,KACXlB,MACA,WAEEu2C,EAAKnuC,QAAQ6wC,QAAU,GAGvBrH,GAAc2E,EAAKhB,OACnBgB,EAAKhB,MAAQ,KAGT/zB,GAAW+0B,EAAK5F,SAAS2C,YAC3BiD,EAAK5F,SAAS2C,UAAUqT,gBAAgB,SAVtC,IAcIlW,EAAkB1sC,EAAlB0sC,QAAS3oC,EAAS/D,EAAT+D,KAdb2/D,EAAApvC,GAe0CoY,EAf1C,GAAA,GAAAi3B,EAAAD,EAeKjzB,SAAAA,OAfL,IAAAkzB,EAegB7Z,GAAU/U,MAf1B4uB,EAeiC94D,EAfjC64D,EAeiC74D,IAC/B82D,EAAuB,UAAblxB,EAAuB1sC,EAAO,MACxCqjB,EAA0B,UAAbqpB,EAAuB,GAAK,CAAE5lC,IAAAA,GAEjDzN,OAAOslB,OAAO8vB,EAAM,CAClB/B,SAAAA,EACA1sC,KAAAA,EAEAiuC,UAAW1B,GAAQ1yC,MAAMmG,EAAM0sC,EAAU+B,EAAK7P,OAAO+N,aAErDc,MAAOhxC,GAAcmhE,EAASv6C,KAIhCorB,EAAK5F,SAAS2C,UAAU3kC,YAAY4nC,EAAKhB,OAGrC/zB,GAAWzd,EAAM+lD,YACnBvT,EAAK7P,OAAOojB,SAAW/lD,EAAM+lD,UAI3BvT,EAAKjB,UACHiB,EAAK7P,OAAOihC,aACdpxB,EAAKhB,MAAM/D,aAAa,cAAe,IAErC+E,EAAK7P,OAAOojB,UACdvT,EAAKhB,MAAM/D,aAAa,WAAY,IAEjChwB,GAASzd,EAAMkoD,UAClB1V,EAAK0V,OAASloD,EAAMkoD,QAElB1V,EAAK7P,OAAO2jB,KAAK1R,QACnBpC,EAAKhB,MAAM/D,aAAa,OAAQ,IAE9B+E,EAAK7P,OAAOuc,OACd1M,EAAKhB,MAAM/D,aAAa,QAAS,IAE/B+E,EAAK7P,OAAO+N,aACd8B,EAAKhB,MAAM/D,aAAa,cAAe,KAK3CoD,GAAG6b,aAAavvD,KAAKq1C,GAGjBA,EAAKjB,SACP9sC,GAAO++D,eAAermE,KAAKq1C,EAAM,SAAU9F,GAI7C8F,EAAK7P,OAAO+U,MAAQ13C,EAAM03C,MAG1BlG,GAAM2D,MAAMh4C,KAAKq1C,GAGbA,EAAKjB,SAEHn0C,OAAO0F,KAAK9C,GAAOoG,SAAS,WAC9B3B,GAAO++D,eAAermE,KAAKq1C,EAAM,QAASxyC,EAAM0hD,SAKhDlP,EAAKjB,SAAYiB,EAAKsR,UAAYtR,EAAKR,UAAUnB,KAEnDA,GAAG8b,MAAMxvD,KAAKq1C,GAIZA,EAAKjB,SACPiB,EAAKhB,MAAMsE,OAIRr4B,GAASzd,EAAM2oD,qBAClBvrD,OAAOslB,OAAO8vB,EAAK7P,OAAOgmB,kBAAmB3oD,EAAM2oD,mBAG/CnW,EAAKmW,mBAAqBnW,EAAKmW,kBAAkB0H,SACnD7d,EAAKmW,kBAAkB8P,UACvBjmB,EAAKmW,kBAAoB,MAIvBnW,EAAK7P,OAAOgmB,kBAAkB/lB,UAChC4P,EAAKmW,kBAAoB,IAAIuV,GAAkB1rB,KAKnDA,EAAKmC,WAAWqE,YAElB,IAxHA/8C,KAAKg6C,MAAMoF,KAAK,2BxNgjcpB,IgLzkcwB55C,GyCgCpBzF,GAAAA,WACJ,SAAAA,EAAYsL,EAAQjD,GAAS,IAAAmyB,EAAAv6B,KAoF3B,GApF2Bo3B,GAAAp3B,KAAAD,GAAA43B,GAAA33B,KAAA,QA6TtB,WACL,OAAKwhB,GAAY+Y,EAAKgb,MAAMqE,OAKxBrf,EAAK4xB,KAAO5xB,EAAK4xB,IAAIxlB,SACvBpM,EAAK4xB,IAAIyQ,eAAe5yB,MAAK,WAAA,OAAMzP,EAAK4xB,IAAIvS,UAAQ/L,OAAM,WAAA,OAAMkJ,GAAexc,EAAKgb,MAAMqE,WAIrFrf,EAAKgb,MAAMqE,QATT,QA/TkBjiB,GAAA33B,KAAA,SA8UrB,WACN,OAAKu6B,EAAK6xB,SAAY5qC,GAAY+Y,EAAKgb,MAAM+I,OAItC/jB,EAAKgb,MAAM+I,QAHT,QAhVkB3mB,GAAA33B,KAAA,cAsXhB,SAAC+D,GAIZ,OAFeyd,GAAWzd,GAASA,GAASw2B,EAAK6xB,SAGxC7xB,EAAKqf,OAGPrf,EAAK+jB,WA9Xe3mB,GAAA33B,KAAA,QAoYtB,WACDu6B,EAAK+a,SACP/a,EAAK+jB,QACL/jB,EAAKgkB,WACI/8B,GAAY+Y,EAAKgb,MAAMnU,OAChC7G,EAAKgb,MAAMnU,UAzYczJ,GAAA33B,KAAA,WAgZnB,WACRu6B,EAAKgf,YAAc,KAjZQ5hB,GAAA33B,KAAA,UAwZpB,SAACu7C,GACRhhB,EAAKgf,aAAe/3B,GAAU+5B,GAAYA,EAAWhhB,EAAKmM,OAAO6U,YAzZtC5jB,GAAA33B,KAAA,WAganB,SAACu7C,GACThhB,EAAKgf,aAAe/3B,GAAU+5B,GAAYA,EAAWhhB,EAAKmM,OAAO6U,YAjatC5jB,GAAA33B,KAAA,kBAgiBZ,SAACunB,GAChB,IAAMy3B,EAASzkB,EAAKgb,MAAM0N,MAAQ,EAAI1oB,EAAKykB,OAC3CzkB,EAAKykB,OAASA,GAAUx9B,GAAU+F,GAAQA,EAAO,MAliBtBoQ,GAAA33B,KAAA,kBAyiBZ,SAACunB,GAChBgT,EAAKw6B,gBAAgBxtC,MA1iBMoQ,GAAA33B,KAAA,WAm+BnB,WAEJq0C,GAAQa,SACV3a,EAAKgb,MAAMqyB,oCAt+BcjwC,GAAA33B,KAAA,kBA8+BZ,SAAC6pC,GAEhB,GAAItP,EAAKwb,UAAUnB,KAAOra,EAAK64B,QAAS,CAEtC,IAAMyU,EAAW50B,GAAS1Y,EAAKoW,SAAS2C,UAAW/Y,EAAKmM,OAAOkN,WAAWsW,cAEpEpX,OAA0B,IAAXjJ,OAAyBpmC,GAAaomC,EAErDi+B,EAASj1B,GAAYtY,EAAKoW,SAAS2C,UAAW/Y,EAAKmM,OAAOkN,WAAWsW,aAAcpX,GAazF,GATEg1B,GACAtmD,GAAS+Y,EAAKmM,OAAOoX,WACrBvjB,EAAKmM,OAAOoX,SAAS3zC,SAAS,cAC7BqX,GAAS+Y,EAAKmM,OAAOiY,WAEtBb,GAASsI,WAAWllD,KAAKq5B,GAAM,GAI7ButC,IAAWD,EAAU,CACvB,IAAME,EAAYD,EAAS,iBAAmB,gBAC9CrxB,GAAav1C,KAAKq5B,EAAMA,EAAKgb,MAAOwyB,GAGtC,OAAQD,EAGV,OAAO,KA3gCoBnwC,GAAA33B,KAAA,MAmhCxB,SAACS,EAAO+rB,GACX4pB,GAAGl1C,KAAKq5B,EAAMA,EAAKoW,SAAS2C,UAAW7yC,EAAO+rB,MAphCnBmL,GAAA33B,KAAA,QA4hCtB,SAACS,EAAO+rB,GACb8pB,GAAKp1C,KAAKq5B,EAAMA,EAAKoW,SAAS2C,UAAW7yC,EAAO+rB,MA7hCrBmL,GAAA33B,KAAA,OAqiCvB,SAACS,EAAO+rB,GACZ6pB,GAAI9b,EAAKoW,SAAS2C,UAAW7yC,EAAO+rB,MAtiCTmL,GAAA33B,KAAA,WAgjCnB,SAACwsB,GAA2B,IAAjBw7C,EAAiBh/D,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,IAAAA,UAAA,GACpC,GAAKuxB,EAAKsc,MAAV,CAIA,IAAMv9B,EAAO,WAEXxY,SAAS6rB,KAAKle,MAAM6/C,SAAW,GAG/B/zB,EAAKod,MAAQ,KAGTqwB,GACE7mE,OAAO0F,KAAK0zB,EAAKoW,UAAU1nC,SAE7B2oC,GAAcrX,EAAKoW,SAAS0N,QAAQzE,MACpChI,GAAcrX,EAAKoW,SAASiO,UAC5BhN,GAAcrX,EAAKoW,SAASmN,UAC5BlM,GAAcrX,EAAKoW,SAAS5O,SAG5BxH,EAAKoW,SAAS0N,QAAQzE,KAAO,KAC7Brf,EAAKoW,SAASiO,SAAW,KACzBrkB,EAAKoW,SAASmN,SAAW,KACzBvjB,EAAKoW,SAAS5O,QAAU,MAItBvgB,GAAYgL,IACdA,MAIFmqB,GAAgBz1C,KAAKq5B,GAGrBue,GAAMgB,eAAe54C,KAAKq5B,GAG1ByX,GAAezX,EAAKoW,SAASs3B,SAAU1tC,EAAKoW,SAAS2C,WAGrDmD,GAAav1C,KAAKq5B,EAAMA,EAAKoW,SAASs3B,SAAU,aAAa,GAGzDzmD,GAAYgL,IACdA,EAAStrB,KAAKq5B,EAAKoW,SAASs3B,UAI9B1tC,EAAKsc,OAAQ,EAGbpN,YAAW,WACTlP,EAAKoW,SAAW,KAChBpW,EAAKgb,MAAQ,OACZ,OAKPhb,EAAK6G,OAGLgwB,aAAa72B,EAAK82B,OAAOhF,SACzB+E,aAAa72B,EAAK82B,OAAOvT,UACzBsT,aAAa72B,EAAK82B,OAAOmB,SAGrBj4B,EAAK+a,SAEPV,GAAGyK,qBAAqBn+C,KAAKq5B,GAAM,GAGnCjhB,KACSihB,EAAKiuB,WAEdsT,cAAcvhC,EAAK82B,OAAO0K,WAC1BD,cAAcvhC,EAAK82B,OAAOjF,SAGP,OAAf7xB,EAAKod,OAAkBn2B,GAAY+Y,EAAKod,MAAM6kB,UAChDjiC,EAAKod,MAAM6kB,UAIbljD,KACSihB,EAAK6d,UAGK,OAAf7d,EAAKod,OACPpd,EAAKod,MAAMuwB,SAASl+B,KAAK1wB,GAI3BmwB,WAAWnwB,EAAM,UAhpCQqe,GAAA33B,KAAA,YAwpClB,SAAC8H,GAAD,OAAUusC,GAAQe,KAAKl0C,KAAKq5B,EAAMzyB,MAvpC3C9H,KAAKqxD,OAAS,GAGdrxD,KAAK62C,OAAQ,EACb72C,KAAKqsD,SAAU,EACfrsD,KAAKmoE,QAAS,EAGdnoE,KAAK01C,MAAQrB,GAAQqB,MAGrB11C,KAAKu1C,MAAQlqC,EAGTmW,GAAUxhB,KAAKu1C,SACjBv1C,KAAKu1C,MAAQz0C,SAAS6kC,iBAAiB3lC,KAAKu1C,SAIzCt1C,OAAOmoE,QAAUpoE,KAAKu1C,iBAAiB6yB,QAAW5mD,GAAYxhB,KAAKu1C,QAAU/zB,GAASxhB,KAAKu1C,UAE9Fv1C,KAAKu1C,MAAQv1C,KAAKu1C,MAAM,IAI1Bv1C,KAAK0mC,OAAS6J,GACZ,GACAjL,GACAvlC,EAAKulC,SACLl9B,GAAW,GACV,WACC,IACE,OAAO2zC,KAAKrE,MAAMnd,EAAKgb,MAAMtO,aAAa,qBAC1C,MAAOzmC,GACP,MAAO,IAJV,IAUHR,KAAK2wC,SAAW,CACd2C,UAAW,KACXoF,WAAY,KACZkG,SAAU,KACVP,QAAS,GACT3vC,QAAS,GACTmwC,SAAU,GACVC,OAAQ,GACRH,SAAU,CACRuH,MAAO,KACP/F,KAAM,KACN4E,OAAQ,GACR1G,QAAS,KAKbr+C,KAAK4+C,SAAW,CACdjG,OAAQ,KACRiK,cAAe,EACftiB,KAAM,IAAIr6B,SAIZjG,KAAK04C,WAAa,CAChBC,QAAQ,GAIV34C,KAAKoI,QAAU,CACbgxC,MAAO,GACPH,QAAS,IAKXj5C,KAAKg6C,MAAQ,IAAIgU,GAAQhuD,KAAK0mC,OAAOsT,OAGrCh6C,KAAKg6C,MAAMhV,IAAI,SAAUhlC,KAAK0mC,QAC9B1mC,KAAKg6C,MAAMhV,IAAI,UAAWqP,KAGtB7yB,GAAmBxhB,KAAKu1C,QAAW/zB,GAAWxhB,KAAKu1C,OAMvD,GAAIv1C,KAAKu1C,MAAMmB,KACb12C,KAAKg6C,MAAMoF,KAAK,6BAKlB,GAAKp/C,KAAK0mC,OAAOC,QAOjB,GAAK0N,GAAQ1yC,QAAQgzC,IAArB,CAMA,IAAM8R,EAAQzmD,KAAKu1C,MAAMxE,WAAU,GACnC0V,EAAMqD,UAAW,EACjB9pD,KAAK2wC,SAASs3B,SAAWxhB,EAIzB,IAAM3+C,EAAO9H,KAAKu1C,MAAMmwB,QAAQz5D,cAE5BkC,EAAS,KACT0X,EAAM,KAGV,OAAQ/d,GACN,IAAK,MAKH,GAHAqG,EAASnO,KAAKu1C,MAAM/O,cAAc,UAG9BhlB,GAAWrT,IAab,GAXA0X,EAAMuiC,GAASj6C,EAAO84B,aAAa,QACnCjnC,KAAKw0C,SpBvJR,SAA0B3uB,GAE/B,MAAI,8EAA8E1f,KAAK0f,GAC9EgoC,GAAUzS,QAIf,wDAAwDj1C,KAAK0f,GACxDgoC,GAAUxV,MAGZ,KoB4IiBgwB,CAAiBxiD,EAAI3iB,YAGrClD,KAAK2wC,SAAS2C,UAAYtzC,KAAKu1C,MAC/Bv1C,KAAKu1C,MAAQpnC,EAGbnO,KAAK2wC,SAAS2C,UAAUb,UAAY,GAGhC5sB,EAAIyQ,OAAOrtB,OAAQ,CACrB,IAAMq/D,EAAS,CAAC,IAAK,QAEjBA,EAAOn+D,SAAS0b,EAAIE,aAAa1kB,IAAI,eACvCrB,KAAK0mC,OAAOojB,UAAW,GAErBwe,EAAOn+D,SAAS0b,EAAIE,aAAa1kB,IAAI,WACvCrB,KAAK0mC,OAAO2jB,KAAK1R,QAAS,GAKxB34C,KAAKwoD,WACPxoD,KAAK0mC,OAAO+N,YAAc6zB,EAAOn+D,SAAS0b,EAAIE,aAAa1kB,IAAI,gBAC/DrB,KAAK0mC,OAAO0U,QAAQsf,GAAK70C,EAAIE,aAAa1kB,IAAI,OAE9CrB,KAAK0mC,OAAO+N,aAAc,QAK9Bz0C,KAAKw0C,SAAWx0C,KAAKu1C,MAAMtO,aAAajnC,KAAK0mC,OAAOvb,WAAWwsB,MAAMnD,UAGrEx0C,KAAKu1C,MAAMoR,gBAAgB3mD,KAAK0mC,OAAOvb,WAAWwsB,MAAMnD,UAI1D,GAAIhzB,GAASxhB,KAAKw0C,YAAcrzC,OAAO8X,OAAO40C,IAAW1jD,SAASnK,KAAKw0C,UAErE,YADAx0C,KAAKg6C,MAAM93C,MAAM,kCAKnBlC,KAAK8H,KAAOgmD,GAEZ,MAEF,IAAK,QACL,IAAK,QACH9tD,KAAK8H,KAAOA,EACZ9H,KAAKw0C,SAAWqZ,GAAU/U,MAGtB94C,KAAKu1C,MAAM2e,aAAa,iBAC1Bl0D,KAAK0mC,OAAOihC,aAAc,GAExB3nE,KAAKu1C,MAAM2e,aAAa,cAC1Bl0D,KAAK0mC,OAAOojB,UAAW,IAErB9pD,KAAKu1C,MAAM2e,aAAa,gBAAkBl0D,KAAKu1C,MAAM2e,aAAa,yBACpEl0D,KAAK0mC,OAAO+N,aAAc,GAExBz0C,KAAKu1C,MAAM2e,aAAa,WAC1Bl0D,KAAK0mC,OAAOuc,OAAQ,GAElBjjD,KAAKu1C,MAAM2e,aAAa,UAC1Bl0D,KAAK0mC,OAAO2jB,KAAK1R,QAAS,GAG5B,MAEF,QAEE,YADA34C,KAAKg6C,MAAM93C,MAAM,kCAKrBlC,KAAK+1C,UAAY1B,GAAQ1yC,MAAM3B,KAAK8H,KAAM9H,KAAKw0C,SAAUx0C,KAAK0mC,OAAO+N,aAGhEz0C,KAAK+1C,UAAUpB,KAKpB30C,KAAKm2C,eAAiB,GAGtBn2C,KAAK+mC,UAAY,IAAI8qB,GAAU7xD,MAG/BA,KAAKg8C,QAAU,IAAIL,GAAQ37C,MAG3BA,KAAKu1C,MAAMmB,KAAO12C,KAGbwhB,GAAWxhB,KAAK2wC,SAAS2C,aAC5BtzC,KAAK2wC,SAAS2C,UAAY/uC,GAAc,MAAO,CAAEgkE,SAAU,IAC3Dp1D,GAAKnT,KAAKu1C,MAAOv1C,KAAK2wC,SAAS2C,YAIjCsB,GAAG8c,cAAcxwD,KAAKlB,MAGtB40C,GAAG6b,aAAavvD,KAAKlB,MAGrBu1C,GAAM2D,MAAMh4C,KAAKlB,MAGbA,KAAK0mC,OAAOsT,OACd5D,GAAGl1C,KAAKlB,KAAMA,KAAK2wC,SAAS2C,UAAWtzC,KAAK0mC,OAAO6H,OAAO9lC,KAAK,MAAM,SAAChI,GACpE85B,EAAKyf,MAAMhV,IAAX,UAAAr6B,OAAyBlK,EAAMqH,UAKnC9H,KAAK04C,WAAa,IAAIuV,GAAWjuD,OAI7BA,KAAKs1C,SAAYt1C,KAAK6nD,UAAY7nD,KAAK+1C,UAAUnB,KACnDA,GAAG8b,MAAMxvD,KAAKlB,MAIhBA,KAAK+mC,UAAUuM,YAGftzC,KAAK+mC,UAAUxnC,SAGXS,KAAK0mC,OAAOylB,IAAIxlB,UAClB3mC,KAAKmsD,IAAM,IAAIiQ,GAAIp8D,OAIjBA,KAAKs1C,SAAWt1C,KAAK0mC,OAAOojB,UAC9B9pD,KAAKs2C,KAAK,WAAW,WAAA,OAAMS,GAAexc,EAAKqf,WAIjD55C,KAAKwxD,aAAe,EAGhBxxD,KAAK0mC,OAAOgmB,kBAAkB/lB,UAChC3mC,KAAK0sD,kBAAoB,IAAIuV,GAAkBjiE,QAnE/CA,KAAKg6C,MAAM93C,MAAM,iCA5GjBlC,KAAKg6C,MAAM93C,MAAM,iCAPjBlC,KAAKg6C,MAAM93C,MAAM,yCAZjBlC,KAAKg6C,MAAM93C,MAAM,4CzNknenB,OApsBAs1B,GAAaz3B,EAAM,CAAC,CAClBsE,IAAK,iBAMLtB,MAAO,SyN9nbIgB,GACb66C,GAAS/U,OAAO3oC,KAAKlB,KAAM+D,GAAO,KzNqob/B,CACDM,IAAK,UACLhD,IAAK,WyNjvcP,OAAOrB,KAAKw0C,WAAaqZ,GAAU/U,QzNovchC,CACDz0C,IAAK,UACLhD,IAAK,WyNlvcP,OAAOrB,KAAKwoD,WAAaxoD,KAAKo4C,UzNqvc3B,CACD/zC,IAAK,YACLhD,IAAK,WyNnvcP,OAAOrB,KAAKw0C,WAAaqZ,GAAUzS,UzNsvchC,CACD/2C,IAAK,UACLhD,IAAK,WyNpvcP,OAAOrB,KAAKw0C,WAAaqZ,GAAUxV,QzNuvchC,CACDh0C,IAAK,UACLhD,IAAK,WyNrvcP,OAAOrB,KAAK8H,OAASgmD,KzNwvclB,CACDzpD,IAAK,UACLhD,IAAK,WyNtvcP,OAAOrB,KAAK8H,OAASgmD,KzN6vclB,CACDzpD,IAAK,UAKLhD,IAAK,WyNhucP,OAAOmZ,QAAQxa,KAAK62C,QAAU72C,KAAKw5C,SAAWx5C,KAAKqzD,SzNuuchD,CACDhvD,IAAK,SACLhD,IAAK,WyNlucP,OAAOmZ,QAAQxa,KAAKu1C,MAAMiE,UzNyucvB,CACDn1C,IAAK,UACLhD,IAAK,WyNpucP,OAAOmZ,QAAQxa,KAAKw5C,QAA+B,IAArBx5C,KAAKu5C,ezN2uchC,CACDl1C,IAAK,QACLhD,IAAK,WyNtucP,OAAOmZ,QAAQxa,KAAKu1C,MAAM8d,SzN8ucvB,CACDhvD,IAAK,cAML2B,IAAK,SyN5rcOjC,GAEd,GAAK/D,KAAKi/C,SAAV,CAKA,IAAMupB,EAAehnD,GAAUzd,IAAUA,EAAQ,EAGjD/D,KAAKu1C,MAAMgE,YAAcivB,EAAe3mE,KAAK0H,IAAIxF,EAAO/D,KAAKi/C,UAAY,EAGzEj/C,KAAKg6C,MAAMhV,IAAX,cAAAr6B,OAA6B3K,KAAKu5C,YAAlC,ezNgscEl4C,IAAK,WyNzrcP,OAAOstC,OAAO3uC,KAAKu1C,MAAMgE,ezNgsctB,CACDl1C,IAAK,WACLhD,IAAK,WyN5rcM,IACLqiD,EAAa1jD,KAAKu1C,MAAlBmO,SAGR,OAAIliC,GAAUkiC,GACLA,EAMLA,GAAYA,EAASz6C,QAAUjJ,KAAKi/C,SAAW,EAC1CyE,EAAS7oC,IAAI,GAAK7a,KAAKi/C,SAGzB,IzNiscJ,CACD56C,IAAK,UACLhD,IAAK,WyN5rcP,OAAOmZ,QAAQxa,KAAKu1C,MAAMgP,WzNmscvB,CACDlgD,IAAK,WACLhD,IAAK,WyN7rcP,IAAMonE,EAAetiC,WAAWnmC,KAAK0mC,OAAOuY,UAEtCypB,GAAgB1oE,KAAKu1C,OAAS,IAAI0J,SAClCA,EAAYz9B,GAAUknD,IAAiBA,IAAiBvkC,EAAAA,EAAeukC,EAAJ,EAGzE,OAAOD,GAAgBxpB,IzNqscpB,CACD56C,IAAK,SACL2B,IAAK,SyNhscEjD,GACT,IAAIi8C,EAASj8C,EAITye,GAAUw9B,KACZA,EAASrQ,OAAOqQ,IAIbx9B,GAAUw9B,KACbA,EAASh/C,KAAKg8C,QAAQ36C,IAAI,WAIvBmgB,GAAUw9B,KACVA,EAAWh/C,KAAK0mC,OAAhBsY,QAIDA,EAlBQ,IAmBVA,EAnBU,GAsBRA,EArBQ,IAsBVA,EAtBU,GA0BZh/C,KAAK0mC,OAAOsY,OAASA,EAGrBh/C,KAAKu1C,MAAMyJ,OAASA,GAGfx9B,GAASze,IAAU/C,KAAKijD,OAASjE,EAAS,IAC7Ch/C,KAAKijD,OAAQ,IzNsscb5hD,IAAK,WyN9rcP,OAAOstC,OAAO3uC,KAAKu1C,MAAMyJ,UzNssctB,CACD36C,IAAK,QAML2B,IAAK,SyNrrcC04C,GACR,IAAI7U,EAAS6U,EAGRl9B,GAAWqoB,KACdA,EAAS7pC,KAAKg8C,QAAQ36C,IAAI,UAIvBmgB,GAAWqoB,KACdA,EAAS7pC,KAAK0mC,OAAOuc,OAIvBjjD,KAAK0mC,OAAOuc,MAAQpZ,EAGpB7pC,KAAKu1C,MAAM0N,MAAQpZ,GzNyrcjBxoC,IAAK,WyNlrcP,OAAOmZ,QAAQxa,KAAKu1C,MAAM0N,SzNyrcvB,CACD5+C,IAAK,WACLhD,IAAK,WyNnrcP,OAAKrB,KAAKs1C,YAINt1C,KAAKozD,UAMP54C,QAAQxa,KAAKu1C,MAAMozB,cACnBnuD,QAAQxa,KAAKu1C,MAAMqzB,8BACnBpuD,QAAQxa,KAAKu1C,MAAMszB,aAAe7oE,KAAKu1C,MAAMszB,YAAY5/D,YzNyrcxD,CACD5E,IAAK,QACL2B,IAAK,SyNnrcCjC,GAAO,IAAAwyC,EAAAv2C,KACXo5C,EAAQ,KAER53B,GAAUzd,KACZq1C,EAAQr1C,GAGLyd,GAAU43B,KACbA,EAAQp5C,KAAKg8C,QAAQ36C,IAAI,UAGtBmgB,GAAU43B,KACbA,EAAQp5C,KAAK0mC,OAAO0S,MAAMkR,UAZb,IAgBO/gD,EAA2BvJ,KAAzCgmD,aAAiCv8C,EAAQzJ,KAAtBimD,aAC3B7M,EClpBG,WAA8C,IAA/Br1C,EAA+BiF,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAvB,EAAGO,EAAoBP,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAd,EAAGS,EAAWT,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAL,IAC9C,OAAOnH,KAAK0H,IAAI1H,KAAK4H,IAAI1F,EAAOwF,GAAME,GDipB5Bq/D,CAAM1vB,EAAO7vC,EAAKE,GAG1BzJ,KAAK0mC,OAAO0S,MAAMkR,SAAWlR,EAG7B3P,YAAW,WACT8M,EAAKhB,MAAMoE,aAAeP,IACzB,IzN0rcD/3C,IAAK,WyNnrcP,OAAOstC,OAAO3uC,KAAKu1C,MAAMoE,gBzN0rctB,CACDt1C,IAAK,eACLhD,IAAK,WyNrrcP,OAAIrB,KAAKwoD,UAEA3mD,KAAK0H,IAALiH,MAAA3O,KAAIq3B,GAAQl5B,KAAKoI,QAAQgxC,QAG9Bp5C,KAAKo4C,QAEA,GAIF,QzN4rcJ,CACD/zC,IAAK,eACLhD,IAAK,WyNvrcP,OAAIrB,KAAKwoD,UAEA3mD,KAAK4H,IAAL+G,MAAA3O,KAAIq3B,GAAQl5B,KAAKoI,QAAQgxC,QAG9Bp5C,KAAKo4C,QAEA,EAIF,KzNgscJ,CACD/zC,IAAK,UACL2B,IAAK,SyN1rcGjC,GACV,IAAM2iC,EAAS1mC,KAAK0mC,OAAOuS,QACrB7wC,EAAUpI,KAAKoI,QAAQ6wC,QAE7B,GAAK7wC,EAAQa,OAAb,CAIA,IAAIgwC,EAAU,EACXz3B,GAASzd,IAAU4qC,OAAO5qC,GAC3B/D,KAAKg8C,QAAQ36C,IAAI,WACjBqlC,EAAO4jB,SACP5jB,EAAOse,SACPlzC,KAAK0P,IAEHunD,GAAgB,EAEpB,IAAK3gE,EAAQ+B,SAAS8uC,GAAU,CAC9B,IAAMl2C,ElC3tBL,SAAiBuX,EAAOvX,GAC7B,OAAKye,GAASlH,IAAWA,EAAMrR,OAIxBqR,EAAMg2B,QAAO,SAAC04B,EAAMC,GAAP,OAAiBpnE,KAAKizD,IAAImU,EAAOlmE,GAASlB,KAAKizD,IAAIkU,EAAOjmE,GAASkmE,EAAOD,KAHrF,KkCytBS1Z,CAAQlnD,EAAS6wC,GAC/Bj5C,KAAKg6C,MAAMoF,KAAX,+BAAAz0C,OAA+CsuC,EAA/C,YAAAtuC,OAAiE5H,EAAjE,aACAk2C,EAAUl2C,EAGVgmE,GAAgB,EAIlBriC,EAAO4jB,SAAWrR,EAGlBj5C,KAAKu1C,MAAM0D,QAAUA,EAGjB8vB,GACF/oE,KAAKg8C,QAAQh2C,IAAI,CAAEizC,QAAAA,MzN0rcnB53C,IAAK,WyNlrcP,OAAOrB,KAAKu1C,MAAM0D,UzN2rcf,CACD50C,IAAK,OACL2B,IAAK,SyNrrcAjC,GACP,IAAM8lC,EAASroB,GAAWzd,GAASA,EAAQ/D,KAAK0mC,OAAO2jB,KAAK1R,OAC5D34C,KAAK0mC,OAAO2jB,KAAK1R,OAAS9O,EAC1B7pC,KAAKu1C,MAAM8U,KAAOxgB,GzNguchBxoC,IAAK,WyN9qcP,OAAOmZ,QAAQxa,KAAKu1C,MAAM8U,QzNsrcvB,CACDhmD,IAAK,SACL2B,IAAK,SyNjrcEjC,GACTyE,GAAOg/D,OAAOtmE,KAAKlB,KAAM+D,IzNurcvB1C,IAAK,WyNhrcP,OAAOrB,KAAKu1C,MAAM0jB,azNurcf,CACD50D,IAAK,WACLhD,IAAK,WyNnrcM,IACL6lD,EAAalnD,KAAK0mC,OAAOkhB,KAAzBV,SAER,OAAO1lC,GAAO0lC,GAAYA,EAAWlnD,KAAKwI,QzNwrcxCxC,IAAK,SyNlrcIjC,GACNyd,GAAOzd,KAIZ/D,KAAK0mC,OAAOkhB,KAAKV,SAAWnjD,EAE5B+5C,GAASmJ,eAAe/lD,KAAKlB,SzNwrc1B,CACDqE,IAAK,SACL2B,IAAK,SyNnrcEjC,GACJ/D,KAAKg4C,QAKVpD,GAAGic,UAAU3vD,KAAKlB,KAAM+D,GAAO,GAAO8pC,OAAM,eAJ1C7tC,KAAKg6C,MAAMoF,KAAK,qCzN6rchB/9C,IAAK,WyNlrcP,OAAKrB,KAAKg4C,QAIHh4C,KAAKu1C,MAAMtO,aAAa,WAAajnC,KAAKu1C,MAAMtO,aAAa,eAH3D,OzN4rcN,CACD5iC,IAAK,QACLhD,IAAK,WyNprcP,IAAKrB,KAAKg4C,QACR,OAAO,KAGT,IAAMd,EAAQD,GAAkBQ,GAAev2C,KAAKlB,OAEpD,OAAOwhB,GAAS01B,GAASA,EAAMzuC,KAAK,KAAOyuC,GzN0rczClxC,IAAK,SyNprcCjC,GACH/D,KAAKg4C,QAKLx2B,GAAUzd,IAAWizC,GAAcjzC,IAKxC/D,KAAK0mC,OAAOwQ,MAAQnzC,EAEpBg0C,GAAe72C,KAAKlB,OANlBA,KAAKg6C,MAAM93C,MAAX,mCAAAyI,OAAoD5G,EAApD,MALA/D,KAAKg6C,MAAMoF,KAAK,4CzNqscf,CACD/6C,IAAK,WACL2B,IAAK,SyNrrcIjC,GACX,IAAM8lC,EAASroB,GAAWzd,GAASA,EAAQ/D,KAAK0mC,OAAOojB,SACvD9pD,KAAK0mC,OAAOojB,SAAWjgB,GzN2rcrBxoC,IAAK,WyNprcP,OAAOmZ,QAAQxa,KAAK0mC,OAAOojB,YzNurcxB,CACDzlD,IAAK,eACL2B,IAAK,SyN1qcQjC,GACf66C,GAAS54C,IAAI9E,KAAKlB,KAAM+D,GAAO,IzNgrc7B1C,IAAK,WyN1qcU,IAAAwnD,EACiB7oD,KAAK4+C,SAA/BgH,EADSiD,EACTjD,QAAShD,EADAiG,EACAjG,aACjB,OAAOgD,EAAUhD,GAAgB,IzNorc9B,CACDv+C,IAAK,WACL2B,IAAK,SyN9qcIjC,GACX66C,GAASqK,YAAY/nD,KAAKlB,KAAM+D,GAAO,IzNorcrC1C,IAAK,WyN7qcP,OAAQu9C,GAAS2K,gBAAgBroD,KAAKlB,OAAS,IAAI6lD,WzNsrchD,CACDxhD,IAAK,MACL2B,IAAK,SyNhrcDjC,GAEN,GAAKswC,GAAQS,IAAb,CAKA,IAAMjL,EAASroB,GAAWzd,GAASA,GAAS/D,KAAK80C,IAI7CtzB,GAAYxhB,KAAKu1C,MAAMR,4BACzB/0C,KAAKu1C,MAAMR,0BAA0BlL,EAASiL,GAAaA,IAIzDtzB,GAAYxhB,KAAKu1C,MAAM2zB,4BACpBlpE,KAAK80C,KAAOjL,EACf7pC,KAAKu1C,MAAM2zB,0BACFlpE,KAAK80C,MAAQjL,GACtB/oC,SAASqoE,0BzNurcX9nE,IAAK,WyN9qcP,OAAKgzC,GAAQS,IAKRtzB,GAASxhB,KAAKu1C,MAAM6zB,wBAKlBppE,KAAKu1C,QAAUz0C,SAASuoE,wBAJtBrpE,KAAKu1C,MAAM6zB,yBAA2Bt0B,GALtC,QzN+rcL,CAAC,CACHzwC,IAAK,YAQLtB,MAAO,SyN3/bM+E,EAAM0sC,EAAU80B,GAC/B,OAAOj1B,GAAQ1yC,MAAMmG,EAAM0sC,EAAU80B,KzNmgclC,CACDjlE,IAAK,aACLtB,MAAO,SyN7/bO8iB,EAAKpf,GACrB,OAAOi2C,GAAW72B,EAAKpf,KzNqgcpB,CACDpC,IAAK,QACLtB,MAAO,SyN//bEyvC,GAAwB,IAAdpqC,EAAcY,UAAAC,OAAA,QAAAxF,IAAAuF,UAAA,GAAAA,UAAA,GAAJ,GAC3B4nC,EAAU,KAUd,OARIpvB,GAAUgxB,GACZ5B,EAAU1jC,MAAMosB,KAAKx4B,SAAS6kC,iBAAiB6M,IACtChxB,GAAYgxB,GACrB5B,EAAU1jC,MAAMosB,KAAKkZ,GACZhxB,GAASgxB,KAClB5B,EAAU4B,EAAS7gC,OAAO6P,KAGxBA,GAASovB,GACJ,KAGFA,EAAQl/B,KAAI,SAAC0X,GAAD,OAAO,IAAIrpB,EAAKqpB,EAAGhhB,UzNsgc/BrI,EyNxseLA,GzN+seJ,OyNzgcFA,GAAKulC,UzCtuCqB9/B,GyCsuCA8/B,GzCruCjByW,KAAKrE,MAAMqE,KAAKvnC,UAAUhP,MhL8ue1BzF","file":"plyr.polyfilled.min.js","sourcesContent":["typeof navigator === \"object\" && (function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('Plyr', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Plyr = factory());\n}(this, (function () { 'use strict';\n\n // Polyfill for creating CustomEvents on IE9/10/11\n // code pulled from:\n // https://github.com/d4tocchini/customevent-polyfill\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n (function () {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', {\n cancelable: true\n });\n ce.preventDefault();\n\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 CustomEvent(event, params) {\n var evt, origPrevent;\n params = params || {};\n params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n\n evt.preventDefault = function () {\n origPrevent.call(this);\n\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function get() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n })();\n\n var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\n function createCommonjsModule(fn, module) {\n \treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n }\n\n var check = function (it) {\n return it && it.Math == Math && it;\n };\n\n // https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\n var global_1 =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n\n var fails = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n };\n\n // Thank's IE8 for his funny defineProperty\n var descriptors = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n });\n\n var nativePropertyIsEnumerable = {}.propertyIsEnumerable;\n var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n // Nashorn ~ JDK8 bug\n var NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n // `Object.prototype.propertyIsEnumerable` method implementation\n // https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\n var f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n } : nativePropertyIsEnumerable;\n\n var objectPropertyIsEnumerable = {\n \tf: f\n };\n\n var createPropertyDescriptor = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n };\n\n var toString = {}.toString;\n\n var classofRaw = function (it) {\n return toString.call(it).slice(8, -1);\n };\n\n var split = ''.split;\n\n // fallback for non-array-like ES3 and non-enumerable old V8 strings\n var indexedObject = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n }) ? function (it) {\n return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n } : Object;\n\n // `RequireObjectCoercible` abstract operation\n // https://tc39.github.io/ecma262/#sec-requireobjectcoercible\n var requireObjectCoercible = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n };\n\n // toObject with fallback for non-array-like ES3 strings\n\n\n\n var toIndexedObject = function (it) {\n return indexedObject(requireObjectCoercible(it));\n };\n\n var isObject = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n };\n\n // `ToPrimitive` abstract operation\n // https://tc39.github.io/ecma262/#sec-toprimitive\n // instead of the ES6 spec version, we didn't implement @@toPrimitive case\n // and the second argument - flag - preferred type is a string\n var toPrimitive = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n };\n\n var hasOwnProperty = {}.hasOwnProperty;\n\n var has = function (it, key) {\n return hasOwnProperty.call(it, key);\n };\n\n var document$1 = global_1.document;\n // typeof document.createElement is 'object' in old IE\n var EXISTS = isObject(document$1) && isObject(document$1.createElement);\n\n var documentCreateElement = function (it) {\n return EXISTS ? document$1.createElement(it) : {};\n };\n\n // Thank's IE8 for his funny defineProperty\n var ie8DomDefine = !descriptors && !fails(function () {\n return Object.defineProperty(documentCreateElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n });\n\n var nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n var f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (ie8DomDefine) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n };\n\n var objectGetOwnPropertyDescriptor = {\n \tf: f$1\n };\n\n var anObject = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n };\n\n var nativeDefineProperty = Object.defineProperty;\n\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n var f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (ie8DomDefine) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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\n var objectDefineProperty = {\n \tf: f$2\n };\n\n var createNonEnumerableProperty = descriptors ? function (object, key, value) {\n return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n } : function (object, key, value) {\n object[key] = value;\n return object;\n };\n\n var setGlobal = function (key, value) {\n try {\n createNonEnumerableProperty(global_1, key, value);\n } catch (error) {\n global_1[key] = value;\n } return value;\n };\n\n var SHARED = '__core-js_shared__';\n var store = global_1[SHARED] || setGlobal(SHARED, {});\n\n var sharedStore = store;\n\n var functionToString = Function.toString;\n\n // this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\n if (typeof sharedStore.inspectSource != 'function') {\n sharedStore.inspectSource = function (it) {\n return functionToString.call(it);\n };\n }\n\n var inspectSource = sharedStore.inspectSource;\n\n var WeakMap$1 = global_1.WeakMap;\n\n var nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\n\n var isPure = false;\n\n var shared = createCommonjsModule(function (module) {\n (module.exports = function (key, value) {\n return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\n })('versions', []).push({\n version: '3.7.0',\n mode: 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n });\n });\n\n var id = 0;\n var postfix = Math.random();\n\n var uid = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n };\n\n var keys = shared('keys');\n\n var sharedKey = function (key) {\n return keys[key] || (keys[key] = uid(key));\n };\n\n var hiddenKeys = {};\n\n var WeakMap$2 = global_1.WeakMap;\n var set, get, has$1;\n\n var enforce = function (it) {\n return has$1(it) ? get(it) : set(it, {});\n };\n\n var getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n };\n\n if (nativeWeakMap) {\n var store$1 = sharedStore.state || (sharedStore.state = new WeakMap$2());\n var wmget = store$1.get;\n var wmhas = store$1.has;\n var wmset = store$1.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store$1, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store$1, it) || {};\n };\n has$1 = function (it) {\n return wmhas.call(store$1, it);\n };\n } else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return has(it, STATE) ? it[STATE] : {};\n };\n has$1 = function (it) {\n return has(it, STATE);\n };\n }\n\n var internalState = {\n set: set,\n get: get,\n has: has$1,\n enforce: enforce,\n getterFor: getterFor\n };\n\n var redefine = createCommonjsModule(function (module) {\n var getInternalState = internalState.get;\n var enforceInternalState = internalState.enforce;\n var TEMPLATE = String(String).split('String');\n\n (module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global_1) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n // add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n })(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n });\n });\n\n var path = global_1;\n\n var aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n };\n\n var getBuiltIn = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])\n : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n };\n\n var ceil = Math.ceil;\n var floor = Math.floor;\n\n // `ToInteger` abstract operation\n // https://tc39.github.io/ecma262/#sec-tointeger\n var toInteger = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n };\n\n var min = Math.min;\n\n // `ToLength` abstract operation\n // https://tc39.github.io/ecma262/#sec-tolength\n var toLength = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n };\n\n var max = Math.max;\n var min$1 = Math.min;\n\n // Helper for a popular repeating case of the spec:\n // Let integer be ? ToInteger(index).\n // If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\n var toAbsoluteIndex = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n };\n\n // `Array.prototype.{ indexOf, includes }` methods implementation\n var createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n };\n\n var arrayIncludes = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n };\n\n var indexOf = arrayIncludes.indexOf;\n\n\n var objectKeysInternal = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n };\n\n // IE8- don't enum bug keys\n var enumBugKeys = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n ];\n\n var hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');\n\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n var f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return objectKeysInternal(O, hiddenKeys$1);\n };\n\n var objectGetOwnPropertyNames = {\n \tf: f$3\n };\n\n var f$4 = Object.getOwnPropertySymbols;\n\n var objectGetOwnPropertySymbols = {\n \tf: f$4\n };\n\n // all object keys, includes non-enumerable and symbols\n var ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = objectGetOwnPropertyNames.f(anObject(it));\n var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n };\n\n var copyConstructorProperties = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = objectDefineProperty.f;\n var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n };\n\n var replacement = /#|\\.prototype\\./;\n\n var isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n };\n\n var normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n };\n\n var data = isForced.data = {};\n var NATIVE = isForced.NATIVE = 'N';\n var POLYFILL = isForced.POLYFILL = 'P';\n\n var isForced_1 = isForced;\n\n var getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n /*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n */\n var _export = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global_1;\n } else if (STATIC) {\n target = global_1[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global_1[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor$1(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n };\n\n var nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n });\n\n var useSymbolAsUid = nativeSymbol\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n\n // `IsArray` abstract operation\n // https://tc39.github.io/ecma262/#sec-isarray\n var isArray = Array.isArray || function isArray(arg) {\n return classofRaw(arg) == 'Array';\n };\n\n // `ToObject` abstract operation\n // https://tc39.github.io/ecma262/#sec-toobject\n var toObject = function (argument) {\n return Object(requireObjectCoercible(argument));\n };\n\n // `Object.keys` method\n // https://tc39.github.io/ecma262/#sec-object.keys\n var objectKeys = Object.keys || function keys(O) {\n return objectKeysInternal(O, enumBugKeys);\n };\n\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n var objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\n return O;\n };\n\n var html = getBuiltIn('document', 'documentElement');\n\n var GT = '>';\n var LT = '<';\n var PROTOTYPE = 'prototype';\n var SCRIPT = 'script';\n var IE_PROTO = sharedKey('IE_PROTO');\n\n var EmptyConstructor = function () { /* empty */ };\n\n var scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n };\n\n // Create object with fake `null` prototype: use ActiveX Object with cleared prototype\n var NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n };\n\n // Create object with fake `null` prototype: use iframe Object with cleared prototype\n var NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n };\n\n // Check for document.domain and active x support\n // No need to use active x approach when document.domain is not set\n // see https://github.com/es-shims/es5-shim/issues/150\n // variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n // avoid IE GC bug\n var activeXDocument;\n var NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n };\n\n hiddenKeys[IE_PROTO] = true;\n\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n var objectCreate = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : objectDefineProperties(result, Properties);\n };\n\n var nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;\n\n var toString$1 = {}.toString;\n\n var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\n var getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n };\n\n // fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\n var f$5 = function getOwnPropertyNames(it) {\n return windowNames && toString$1.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n };\n\n var objectGetOwnPropertyNamesExternal = {\n \tf: f$5\n };\n\n var WellKnownSymbolsStore = shared('wks');\n var Symbol$1 = global_1.Symbol;\n var createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\n\n var wellKnownSymbol = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n };\n\n var f$6 = wellKnownSymbol;\n\n var wellKnownSymbolWrapped = {\n \tf: f$6\n };\n\n var defineProperty = objectDefineProperty.f;\n\n var defineWellKnownSymbol = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wellKnownSymbolWrapped.f(NAME)\n });\n };\n\n var defineProperty$1 = objectDefineProperty.f;\n\n\n\n var TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\n var setToStringTag = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty$1(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n };\n\n var aFunction$1 = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n };\n\n // optional / simple context binding\n var functionBindContext = function (fn, that, length) {\n aFunction$1(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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\n var SPECIES = wellKnownSymbol('species');\n\n // `ArraySpeciesCreate` abstract operation\n // https://tc39.github.io/ecma262/#sec-arrayspeciescreate\n var arraySpeciesCreate = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n };\n\n var push = [].push;\n\n // `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n var createMethod$1 = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = indexedObject(O);\n var boundFunction = functionBindContext(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n };\n\n var arrayIteration = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod$1(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod$1(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod$1(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod$1(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod$1(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod$1(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod$1(6)\n };\n\n var $forEach = arrayIteration.forEach;\n\n var HIDDEN = sharedKey('hidden');\n var SYMBOL = 'Symbol';\n var PROTOTYPE$1 = 'prototype';\n var TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\n var setInternalState = internalState.set;\n var getInternalState = internalState.getterFor(SYMBOL);\n var ObjectPrototype = Object[PROTOTYPE$1];\n var $Symbol = global_1.Symbol;\n var $stringify = getBuiltIn('JSON', 'stringify');\n var nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n var nativeDefineProperty$1 = objectDefineProperty.f;\n var nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;\n var nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;\n var AllSymbols = shared('symbols');\n var ObjectPrototypeSymbols = shared('op-symbols');\n var StringToSymbolRegistry = shared('string-to-symbol-registry');\n var SymbolToStringRegistry = shared('symbol-to-string-registry');\n var WellKnownSymbolsStore$1 = shared('wks');\n var QObject = global_1.QObject;\n // Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\n var USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;\n\n // fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\n var setSymbolDescriptor = descriptors && fails(function () {\n return objectCreate(nativeDefineProperty$1({}, 'a', {\n get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }\n })).a != 7;\n }) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty$1(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty$1(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n } : nativeDefineProperty$1;\n\n var wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!descriptors) symbol.description = description;\n return symbol;\n };\n\n var isSymbol = useSymbolAsUid ? function (it) {\n return typeof it == 'symbol';\n } : function (it) {\n return Object(it) instanceof $Symbol;\n };\n\n var $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty$1(O, key, Attributes);\n };\n\n var $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n };\n\n var $create = function create(O, Properties) {\n return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);\n };\n\n var $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable$1.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n };\n\n var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n };\n\n var $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n };\n\n var $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n };\n\n // `Symbol` constructor\n // https://tc39.github.io/ecma262/#sec-symbol-constructor\n if (!nativeSymbol) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n objectPropertyIsEnumerable.f = $propertyIsEnumerable;\n objectDefineProperty.f = $defineProperty;\n objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;\n objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;\n\n wellKnownSymbolWrapped.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (descriptors) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n }\n\n _export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, {\n Symbol: $Symbol\n });\n\n $forEach(objectKeys(WellKnownSymbolsStore$1), function (name) {\n defineWellKnownSymbol(name);\n });\n\n _export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n });\n\n _export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n });\n\n _export({ target: 'Object', stat: true, forced: !nativeSymbol }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n });\n\n // Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n // https://bugs.chromium.org/p/v8/issues/detail?id=3443\n _export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return objectGetOwnPropertySymbols.f(toObject(it));\n }\n });\n\n // `JSON.stringify` method behavior with symbols\n // https://tc39.github.io/ecma262/#sec-json.stringify\n if ($stringify) {\n var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n _export({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n }\n\n // `Symbol.prototype[@@toPrimitive]` method\n // https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\n if (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);\n }\n // `Symbol.prototype[@@toStringTag]` property\n // https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\n setToStringTag($Symbol, SYMBOL);\n\n hiddenKeys[HIDDEN] = true;\n\n var defineProperty$2 = objectDefineProperty.f;\n\n\n var NativeSymbol = global_1.Symbol;\n\n if (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n )) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty$2(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n _export({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n }\n\n // `Symbol.iterator` well-known symbol\n // https://tc39.github.io/ecma262/#sec-symbol.iterator\n defineWellKnownSymbol('iterator');\n\n var arrayMethodIsStrict = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n };\n\n var defineProperty$3 = Object.defineProperty;\n var cache = {};\n\n var thrower = function (it) { throw it; };\n\n var arrayMethodUsesToLength = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !descriptors) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty$3(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n };\n\n var $forEach$1 = arrayIteration.forEach;\n\n\n\n var STRICT_METHOD = arrayMethodIsStrict('forEach');\n var USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n // `Array.prototype.forEach` method implementation\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n var arrayForEach = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n } : [].forEach;\n\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n _export({ target: 'Array', proto: true, forced: [].forEach != arrayForEach }, {\n forEach: arrayForEach\n });\n\n var $indexOf = arrayIncludes.indexOf;\n\n\n\n var nativeIndexOf = [].indexOf;\n\n var NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\n var STRICT_METHOD$1 = arrayMethodIsStrict('indexOf');\n var USES_TO_LENGTH$1 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n _export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD$1 || !USES_TO_LENGTH$1 }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n var UNSCOPABLES = wellKnownSymbol('unscopables');\n var ArrayPrototype = Array.prototype;\n\n // Array.prototype[@@unscopables]\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n if (ArrayPrototype[UNSCOPABLES] == undefined) {\n objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: objectCreate(null)\n });\n }\n\n // add a key to Array.prototype[@@unscopables]\n var addToUnscopables = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n };\n\n var iterators = {};\n\n var correctPrototypeGetter = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n });\n\n var IE_PROTO$1 = sharedKey('IE_PROTO');\n var ObjectPrototype$1 = Object.prototype;\n\n // `Object.getPrototypeOf` method\n // https://tc39.github.io/ecma262/#sec-object.getprototypeof\n var objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO$1)) return O[IE_PROTO$1];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype$1 : null;\n };\n\n var ITERATOR = wellKnownSymbol('iterator');\n var BUGGY_SAFARI_ITERATORS = false;\n\n var returnThis = function () { return this; };\n\n // `%IteratorPrototype%` object\n // https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\n var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\n if ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n }\n\n if (IteratorPrototype == undefined) IteratorPrototype = {};\n\n // 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\n if ( !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n }\n\n var iteratorsCore = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n };\n\n var IteratorPrototype$1 = iteratorsCore.IteratorPrototype;\n\n\n\n\n\n var returnThis$1 = function () { return this; };\n\n var createIteratorConstructor = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false);\n iterators[TO_STRING_TAG] = returnThis$1;\n return IteratorConstructor;\n };\n\n var aPossiblePrototype = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n };\n\n // `Object.setPrototypeOf` method\n // https://tc39.github.io/ecma262/#sec-object.setprototypeof\n // Works with __proto__ only. Old v8 can't work with null proto objects.\n /* eslint-disable no-proto */\n var objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n }() : undefined);\n\n var IteratorPrototype$2 = iteratorsCore.IteratorPrototype;\n var BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\n var ITERATOR$1 = wellKnownSymbol('iterator');\n var KEYS = 'keys';\n var VALUES = 'values';\n var ENTRIES = 'entries';\n\n var returnThis$2 = function () { return this; };\n\n var defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR$1]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {\n if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {\n if (objectSetPrototypeOf) {\n objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);\n } else if (typeof CurrentIteratorPrototype[ITERATOR$1] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$1, returnThis$2);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ( IterablePrototype[ITERATOR$1] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR$1, defaultIterator);\n }\n iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n };\n\n var ARRAY_ITERATOR = 'Array Iterator';\n var setInternalState$1 = internalState.set;\n var getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR);\n\n // `Array.prototype.entries` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.entries\n // `Array.prototype.keys` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.keys\n // `Array.prototype.values` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.values\n // `Array.prototype[@@iterator]` method\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n // `CreateArrayIterator` internal method\n // https://tc39.github.io/ecma262/#sec-createarrayiterator\n var es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState$1(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n // `%ArrayIteratorPrototype%.next` method\n // https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n }, function () {\n var state = getInternalState$1(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n }, 'values');\n\n // argumentsList[@@iterator] is %ArrayProto_values%\n // https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n // https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\n iterators.Arguments = iterators.Array;\n\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n addToUnscopables('keys');\n addToUnscopables('values');\n addToUnscopables('entries');\n\n var nativeJoin = [].join;\n\n var ES3_STRINGS = indexedObject != Object;\n var STRICT_METHOD$2 = arrayMethodIsStrict('join', ',');\n\n // `Array.prototype.join` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.join\n _export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$2 }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n });\n\n var createProperty = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n };\n\n var engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\n\n var process = global_1.process;\n var versions = process && process.versions;\n var v8 = versions && versions.v8;\n var match, version;\n\n if (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n } else if (engineUserAgent) {\n match = engineUserAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = engineUserAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n }\n\n var engineV8Version = version && +version;\n\n var SPECIES$1 = wellKnownSymbol('species');\n\n var arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return engineV8Version >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES$1] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n };\n\n var HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\n var USES_TO_LENGTH$2 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n var SPECIES$2 = wellKnownSymbol('species');\n var nativeSlice = [].slice;\n var max$1 = Math.max;\n\n // `Array.prototype.slice` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.slice\n // fallback for not array-like ES3 strings and DOM objects\n _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$2 }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES$2];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n });\n\n var TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\n var test = {};\n\n test[TO_STRING_TAG$1] = 'z';\n\n var toStringTagSupport = String(test) === '[object z]';\n\n var TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');\n // ES3 wrong here\n var CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n // fallback for IE11 Script Access Denied error\n var tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n };\n\n // getting tag from ES6+ `Object.prototype.toString`\n var classof = toStringTagSupport ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$2)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n };\n\n // `Object.prototype.toString` method implementation\n // https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n var objectToString = toStringTagSupport ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n };\n\n // `Object.prototype.toString` method\n // https://tc39.github.io/ecma262/#sec-object.prototype.tostring\n if (!toStringTagSupport) {\n redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\n }\n\n // `RegExp.prototype.flags` getter implementation\n // https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\n var regexpFlags = 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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n };\n\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n // so we use an intermediate function.\n function RE(s, f) {\n return RegExp(s, f);\n }\n\n var UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n });\n\n var BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n });\n\n var regexpStickyHelpers = {\n \tUNSUPPORTED_Y: UNSUPPORTED_Y,\n \tBROKEN_CARET: BROKEN_CARET\n };\n\n var nativeExec = RegExp.prototype.exec;\n // This always refers to the native implementation, because the\n // String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n // which loads this file before patching the method.\n var nativeReplace = String.prototype.replace;\n\n var patchedExec = nativeExec;\n\n var UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n })();\n\n var UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\n\n // nonparticipating capturing group, copied from es5-shim's String#split patch.\n var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\n var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1;\n\n if (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y$1 && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n }\n\n var regexpExec = patchedExec;\n\n _export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\n exec: regexpExec\n });\n\n var TO_STRING = 'toString';\n var RegExpPrototype = RegExp.prototype;\n var nativeToString = RegExpPrototype[TO_STRING];\n\n var NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n // FF44- RegExp#toString has a wrong name\n var INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n // `RegExp.prototype.toString` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\n if (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n }\n\n // `String.prototype.{ codePointAt, at }` methods implementation\n var createMethod$2 = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n };\n\n var stringMultibyte = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod$2(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod$2(true)\n };\n\n var charAt = stringMultibyte.charAt;\n\n\n\n var STRING_ITERATOR = 'String Iterator';\n var setInternalState$2 = internalState.set;\n var getInternalState$2 = internalState.getterFor(STRING_ITERATOR);\n\n // `String.prototype[@@iterator]` method\n // https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\n defineIterator(String, 'String', function (iterated) {\n setInternalState$2(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n // `%StringIteratorPrototype%.next` method\n // https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n }, function next() {\n var state = getInternalState$2(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n });\n\n // TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\n\n\n\n\n var SPECIES$3 = wellKnownSymbol('species');\n\n var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n });\n\n // IE <= 11 replaces $0 with the whole match, as if it was $&\n // https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\n var REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n })();\n\n var REPLACE = wellKnownSymbol('replace');\n // Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n })();\n\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n // Weex JS has frozen built-in prototypes, so use try / catch wrapper\n var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n });\n\n var fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES$3] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n };\n\n var charAt$1 = stringMultibyte.charAt;\n\n // `AdvanceStringIndex` abstract operation\n // https://tc39.github.io/ecma262/#sec-advancestringindex\n var advanceStringIndex = function (S, index, unicode) {\n return index + (unicode ? charAt$1(S, index).length : 1);\n };\n\n // `RegExpExec` abstract operation\n // https://tc39.github.io/ecma262/#sec-regexpexec\n var regexpExecAbstract = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classofRaw(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n };\n\n var max$2 = Math.max;\n var min$2 = Math.min;\n var floor$1 = Math.floor;\n var SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\n var SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\n var maybeToString = function (it) {\n return it === undefined ? it : String(it);\n };\n\n // @@replace logic\n fixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regexpExecAbstract(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max$2(min$2(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor$1(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n });\n\n // `SameValue` abstract operation\n // https://tc39.github.io/ecma262/#sec-samevalue\n var sameValue = 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\n // @@search logic\n fixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regexpExecAbstract(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n });\n\n var MATCH = wellKnownSymbol('match');\n\n // `IsRegExp` abstract operation\n // https://tc39.github.io/ecma262/#sec-isregexp\n var isRegexp = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\n };\n\n var SPECIES$4 = wellKnownSymbol('species');\n\n // `SpeciesConstructor` abstract operation\n // https://tc39.github.io/ecma262/#sec-speciesconstructor\n var speciesConstructor = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES$4]) == undefined ? defaultConstructor : aFunction$1(S);\n };\n\n var arrayPush = [].push;\n var min$3 = Math.min;\n var MAX_UINT32 = 0xFFFFFFFF;\n\n // babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\n var SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n // @@split logic\n fixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegexp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min$3(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n }, !SUPPORTS_Y);\n\n // iterable DOM collections\n // flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\n var domIterables = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n };\n\n for (var COLLECTION_NAME in domIterables) {\n var Collection = global_1[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach);\n } catch (error) {\n CollectionPrototype.forEach = arrayForEach;\n }\n }\n\n var ITERATOR$2 = wellKnownSymbol('iterator');\n var TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');\n var ArrayValues = es_array_iterator.values;\n\n for (var COLLECTION_NAME$1 in domIterables) {\n var Collection$1 = global_1[COLLECTION_NAME$1];\n var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;\n if (CollectionPrototype$1) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype$1[ITERATOR$2] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype$1, ITERATOR$2, ArrayValues);\n } catch (error) {\n CollectionPrototype$1[ITERATOR$2] = ArrayValues;\n }\n if (!CollectionPrototype$1[TO_STRING_TAG$3]) {\n createNonEnumerableProperty(CollectionPrototype$1, TO_STRING_TAG$3, COLLECTION_NAME$1);\n }\n if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME];\n }\n }\n }\n }\n\n var ITERATOR$3 = wellKnownSymbol('iterator');\n\n var nativeUrl = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (isPure && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR$3]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n });\n\n var anInstance = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n };\n\n var nativeAssign = Object.assign;\n var defineProperty$4 = Object.defineProperty;\n\n // `Object.assign` method\n // https://tc39.github.io/ecma262/#sec-object.assign\n var objectAssign = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$4({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty$4(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n }) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n while (argumentsLength > index) {\n var S = indexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n } : nativeAssign;\n\n var iteratorClose = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n };\n\n // call something on iterator step with safe closing on error\n var callWithSafeIterationClosing = 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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n };\n\n var ITERATOR$4 = wellKnownSymbol('iterator');\n var ArrayPrototype$1 = Array.prototype;\n\n // check on default Array iterator\n var isArrayIteratorMethod = function (it) {\n return it !== undefined && (iterators.Array === it || ArrayPrototype$1[ITERATOR$4] === it);\n };\n\n var ITERATOR$5 = wellKnownSymbol('iterator');\n\n var getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR$5]\n || it['@@iterator']\n || iterators[classof(it)];\n };\n\n // `Array.from` method implementation\n // https://tc39.github.io/ecma262/#sec-array.from\n var arrayFrom = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n };\n\n // based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\n var maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\n var base = 36;\n var tMin = 1;\n var tMax = 26;\n var skew = 38;\n var damp = 700;\n var initialBias = 72;\n var initialN = 128; // 0x80\n var delimiter = '-'; // '\\x2D'\n var regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\n var regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\n var OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\n var baseMinusTMin = base - tMin;\n var floor$2 = Math.floor;\n var stringFromCharCode = String.fromCharCode;\n\n /**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\n var ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n };\n\n /**\n * Converts a digit/integer into a basic code point.\n */\n var digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n };\n\n /**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\n var adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor$2(delta / damp) : delta >> 1;\n delta += floor$2(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor$2(delta / baseMinusTMin);\n }\n return floor$2(k + (baseMinusTMin + 1) * delta / (delta + skew));\n };\n\n /**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n // eslint-disable-next-line max-statements\n var encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor$2((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor$2(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n };\n\n var stringPunycodeToAscii = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n };\n\n var redefineAll = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n };\n\n var getIterator = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n };\n\n // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n var $fetch = getBuiltIn('fetch');\n var Headers = getBuiltIn('Headers');\n var ITERATOR$6 = wellKnownSymbol('iterator');\n var URL_SEARCH_PARAMS = 'URLSearchParams';\n var URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\n var setInternalState$3 = internalState.set;\n var getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS);\n var getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\n var plus = /\\+/g;\n var sequences = Array(4);\n\n var percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n };\n\n var percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n };\n\n var deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n };\n\n var find = /[!'()~]|%20/g;\n\n var replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n };\n\n var replacer = function (match) {\n return replace[match];\n };\n\n var serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n };\n\n var parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n };\n\n var updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n };\n\n var validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n };\n\n var URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState$3(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n }, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n });\n\n // `URLSearchParams` constructor\n // https://url.spec.whatwg.org/#interface-urlsearchparams\n var URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState$3(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (has(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n };\n\n var URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\n redefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n }, { enumerable: true });\n\n // `URLSearchParams.prototype[@@iterator]` method\n redefine(URLSearchParamsPrototype, ITERATOR$6, URLSearchParamsPrototype.entries);\n\n // `URLSearchParams.prototype.toString` method\n // https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\n redefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n }, { enumerable: true });\n\n setToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n _export({ global: true, forced: !nativeUrl }, {\n URLSearchParams: URLSearchParamsConstructor\n });\n\n // Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n // https://github.com/zloirock/core-js/issues/674\n if (!nativeUrl && typeof $fetch == 'function' && typeof Headers == 'function') {\n _export({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = objectCreate(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n }\n\n var web_urlSearchParams = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n };\n\n // TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n var codeAt = stringMultibyte.codeAt;\n\n\n\n\n\n var NativeURL = global_1.URL;\n var URLSearchParams$1 = web_urlSearchParams.URLSearchParams;\n var getInternalSearchParamsState = web_urlSearchParams.getState;\n var setInternalState$4 = internalState.set;\n var getInternalURLState = internalState.getterFor('URL');\n var floor$3 = Math.floor;\n var pow = Math.pow;\n\n var INVALID_AUTHORITY = 'Invalid authority';\n var INVALID_SCHEME = 'Invalid scheme';\n var INVALID_HOST = 'Invalid host';\n var INVALID_PORT = 'Invalid port';\n\n var ALPHA = /[A-Za-z]/;\n var ALPHANUMERIC = /[\\d+-.A-Za-z]/;\n var DIGIT = /\\d/;\n var HEX_START = /^(0x|0X)/;\n var OCT = /^[0-7]+$/;\n var DEC = /^\\d+$/;\n var HEX = /^[\\dA-Fa-f]+$/;\n // eslint-disable-next-line no-control-regex\n var FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n // eslint-disable-next-line no-control-regex\n var FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n // eslint-disable-next-line no-control-regex\n var LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n // eslint-disable-next-line no-control-regex\n var TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\n var EOF;\n\n var parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = stringPunycodeToAscii(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n };\n\n var parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n };\n\n // eslint-disable-next-line max-statements\n var parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n };\n\n var findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n };\n\n var serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor$3(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n };\n\n var C0ControlPercentEncodeSet = {};\n var fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n });\n var pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n });\n var userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n });\n\n var percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n };\n\n var specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n };\n\n var isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n };\n\n var includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n };\n\n var cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n };\n\n var isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n };\n\n var startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n };\n\n var shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n };\n\n var isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n };\n\n var isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n };\n\n // States:\n var SCHEME_START = {};\n var SCHEME = {};\n var NO_SCHEME = {};\n var SPECIAL_RELATIVE_OR_AUTHORITY = {};\n var PATH_OR_AUTHORITY = {};\n var RELATIVE = {};\n var RELATIVE_SLASH = {};\n var SPECIAL_AUTHORITY_SLASHES = {};\n var SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\n var AUTHORITY = {};\n var HOST = {};\n var HOSTNAME = {};\n var PORT = {};\n var FILE = {};\n var FILE_SLASH = {};\n var FILE_HOST = {};\n var PATH_START = {};\n var PATH = {};\n var CANNOT_BE_A_BASE_URL_PATH = {};\n var QUERY = {};\n var FRAGMENT = {};\n\n // eslint-disable-next-line max-statements\n var parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n };\n\n // `URL` constructor\n // https://url.spec.whatwg.org/#url-class\n var URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState$4(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams$1();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!descriptors) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n };\n\n var URLPrototype = URLConstructor.prototype;\n\n var serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n };\n\n var getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n };\n\n var getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n };\n\n var getUsername = function () {\n return getInternalURLState(this).username;\n };\n\n var getPassword = function () {\n return getInternalURLState(this).password;\n };\n\n var getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n };\n\n var getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n };\n\n var getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n };\n\n var getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n };\n\n var getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n };\n\n var getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n };\n\n var getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n };\n\n var accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n };\n\n if (descriptors) {\n objectDefineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n }\n\n // `URL.prototype.toJSON` method\n // https://url.spec.whatwg.org/#dom-url-tojson\n redefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n }, { enumerable: true });\n\n // `URL.prototype.toString` method\n // https://url.spec.whatwg.org/#URL-stringification-behavior\n redefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n }, { enumerable: true });\n\n if (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n }\n\n setToStringTag(URLConstructor, 'URL');\n\n _export({ global: true, forced: !nativeUrl, sham: !descriptors }, {\n URL: URLConstructor\n });\n\n function _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n }\n\n function _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n }\n\n function _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n }\n\n function _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n }\n\n function _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n }\n\n function ownKeys$1(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n }\n\n function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys$1(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys$1(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n }\n\n function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n }\n\n function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n }\n\n function _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n }\n\n function _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n }\n\n function _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n }\n\n function _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n }\n\n function _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n }\n\n function _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n }\n\n function _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n }\n\n function _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n }\n\n function _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n function _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n }\n\n (function (global) {\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 */\n var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() {\n try {\n return !!Symbol.iterator;\n } catch (error) {\n return false;\n }\n };\n\n var iteratorSupported = checkIfIteratorIsSupported();\n\n var createIterator = function createIterator(items) {\n var iterator = {\n next: function next() {\n var value = items.shift();\n return {\n done: value === void 0,\n value: value\n };\n }\n };\n\n if (iteratorSupported) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n };\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 */\n\n\n var serializeParam = function serializeParam(value) {\n return encodeURIComponent(value).replace(/%20/g, '+');\n };\n\n var deserializeParam = function deserializeParam(value) {\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\n };\n\n var polyfillURLSearchParams = function polyfillURLSearchParams() {\n var URLSearchParams = function URLSearchParams(searchString) {\n Object.defineProperty(this, '_entries', {\n writable: true,\n value: {}\n });\n\n var typeofSearchString = _typeof(searchString);\n\n if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n if (searchString !== '') {\n this._fromString(searchString);\n }\n } else if (searchString instanceof URLSearchParams) {\n var _this = this;\n\n searchString.forEach(function (value, name) {\n _this.append(name, value);\n });\n } else if (searchString !== null && typeofSearchString === 'object') {\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\n for (var i = 0; i < searchString.length; i++) {\n var entry = searchString[i];\n\n if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n this.append(entry[0], entry[1]);\n } else {\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n }\n }\n } else {\n for (var key in searchString) {\n if (searchString.hasOwnProperty(key)) {\n this.append(key, searchString[key]);\n }\n }\n }\n } else {\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n }\n };\n\n var proto = URLSearchParams.prototype;\n\n proto.append = function (name, value) {\n if (name in this._entries) {\n this._entries[name].push(String(value));\n } else {\n this._entries[name] = [String(value)];\n }\n };\n\n proto.delete = function (name) {\n delete this._entries[name];\n };\n\n proto.get = function (name) {\n return name in this._entries ? this._entries[name][0] : null;\n };\n\n proto.getAll = function (name) {\n return name in this._entries ? this._entries[name].slice(0) : [];\n };\n\n proto.has = function (name) {\n return name in this._entries;\n };\n\n proto.set = function (name, value) {\n this._entries[name] = [String(value)];\n };\n\n proto.forEach = function (callback, thisArg) {\n var entries;\n\n for (var name in this._entries) {\n if (this._entries.hasOwnProperty(name)) {\n entries = this._entries[name];\n\n for (var i = 0; i < entries.length; i++) {\n callback.call(thisArg, entries[i], name, this);\n }\n }\n }\n };\n\n proto.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return createIterator(items);\n };\n\n proto.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return createIterator(items);\n };\n\n proto.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return createIterator(items);\n };\n\n if (iteratorSupported) {\n proto[Symbol.iterator] = proto.entries;\n }\n\n proto.toString = function () {\n var searchArray = [];\n this.forEach(function (value, name) {\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n });\n return searchArray.join('&');\n };\n\n global.URLSearchParams = URLSearchParams;\n };\n\n var checkIfURLSearchParamsSupported = function checkIfURLSearchParamsSupported() {\n try {\n var URLSearchParams = global.URLSearchParams;\n return new URLSearchParams('?a=1').toString() === 'a=1' && typeof URLSearchParams.prototype.set === 'function' && typeof URLSearchParams.prototype.entries === 'function';\n } catch (e) {\n return false;\n }\n };\n\n if (!checkIfURLSearchParamsSupported()) {\n polyfillURLSearchParams();\n }\n\n var proto = global.URLSearchParams.prototype;\n\n if (typeof proto.sort !== 'function') {\n proto.sort = function () {\n var _this = this;\n\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n\n if (!_this._entries) {\n _this.delete(name);\n }\n });\n items.sort(function (a, b) {\n if (a[0] < b[0]) {\n return -1;\n } else if (a[0] > b[0]) {\n return +1;\n } else {\n return 0;\n }\n });\n\n if (_this._entries) {\n // force reset because IE keeps keys index\n _this._entries = {};\n }\n\n for (var i = 0; i < items.length; i++) {\n this.append(items[i][0], items[i][1]);\n }\n };\n }\n\n if (typeof proto._fromString !== 'function') {\n Object.defineProperty(proto, '_fromString', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value(searchString) {\n if (this._entries) {\n this._entries = {};\n } else {\n var keys = [];\n this.forEach(function (value, name) {\n keys.push(name);\n });\n\n for (var i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n }\n\n searchString = searchString.replace(/^\\?/, '');\n var attributes = searchString.split('&');\n var attribute;\n\n for (var i = 0; i < attributes.length; i++) {\n attribute = attributes[i].split('=');\n this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n }\n }\n });\n } // HTMLAnchorElement\n\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n (function (global) {\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 */\n var checkIfURLIsSupported = function checkIfURLIsSupported() {\n try {\n var u = new global.URL('b', 'http://a');\n u.pathname = 'c d';\n return u.href === 'http://a/c%20d' && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n\n var polyfillURL = function polyfillURL() {\n var _URL = global.URL;\n\n var URL = function URL(url, base) {\n if (typeof url !== 'string') url = String(url);\n if (base && typeof base !== 'string') base = String(base); // Only create another document if the base is different from current location.\n\n var doc = document,\n baseElement;\n\n if (base && (global.location === void 0 || base !== global.location.href)) {\n base = base.toLowerCase();\n doc = document.implementation.createHTMLDocument('');\n baseElement = doc.createElement('base');\n baseElement.href = base;\n doc.head.appendChild(baseElement);\n\n try {\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n } catch (err) {\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\n }\n }\n\n var anchorElement = doc.createElement('a');\n anchorElement.href = url;\n\n if (baseElement) {\n doc.body.appendChild(anchorElement);\n anchorElement.href = anchorElement.href; // force href to refresh\n }\n\n var inputElement = doc.createElement('input');\n inputElement.type = 'url';\n inputElement.value = url;\n\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || !inputElement.checkValidity() && !base) {\n throw new TypeError('Invalid URL');\n }\n\n Object.defineProperty(this, '_anchorElement', {\n value: anchorElement\n }); // create a linked searchParams which reflect its changes on URL\n\n var searchParams = new global.URLSearchParams(this.search);\n var enableSearchUpdate = true;\n var enableSearchParamsUpdate = true;\n\n var _this = this;\n\n ['append', 'delete', 'set'].forEach(function (methodName) {\n var method = searchParams[methodName];\n\n searchParams[methodName] = function () {\n method.apply(searchParams, arguments);\n\n if (enableSearchUpdate) {\n enableSearchParamsUpdate = false;\n _this.search = searchParams.toString();\n enableSearchParamsUpdate = true;\n }\n };\n });\n Object.defineProperty(this, 'searchParams', {\n value: searchParams,\n enumerable: true\n });\n var search = void 0;\n Object.defineProperty(this, '_updateSearchParams', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value() {\n if (this.search !== search) {\n search = this.search;\n\n if (enableSearchParamsUpdate) {\n enableSearchUpdate = false;\n\n this.searchParams._fromString(this.search);\n\n enableSearchUpdate = true;\n }\n }\n }\n });\n };\n\n var proto = URL.prototype;\n\n var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) {\n Object.defineProperty(proto, attributeName, {\n get: function get() {\n return this._anchorElement[attributeName];\n },\n set: function set(value) {\n this._anchorElement[attributeName] = value;\n },\n enumerable: true\n });\n };\n\n ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n linkURLWithAnchorAttribute(attributeName);\n });\n Object.defineProperty(proto, 'search', {\n get: function get() {\n return this._anchorElement['search'];\n },\n set: function set(value) {\n this._anchorElement['search'] = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n });\n Object.defineProperties(proto, {\n 'toString': {\n get: function get() {\n var _this = this;\n\n return function () {\n return _this.href;\n };\n }\n },\n 'href': {\n get: function get() {\n return this._anchorElement.href.replace(/\\?$/, '');\n },\n set: function set(value) {\n this._anchorElement.href = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n },\n 'pathname': {\n get: function get() {\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n },\n set: function set(value) {\n this._anchorElement.pathname = value;\n },\n enumerable: true\n },\n 'origin': {\n get: function get() {\n // get expected port from protocol\n var expectedPort = {\n 'http:': 80,\n 'https:': 443,\n 'ftp:': 21\n }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port\n // and it is not empty f.e http://foo:8080\n // 8080 != 80 && 8080 != ''\n\n var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n },\n enumerable: true\n },\n 'password': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n },\n 'username': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n }\n });\n\n URL.createObjectURL = function (blob) {\n return _URL.createObjectURL.apply(_URL, arguments);\n };\n\n URL.revokeObjectURL = function (url) {\n return _URL.revokeObjectURL.apply(_URL, arguments);\n };\n\n global.URL = URL;\n };\n\n if (!checkIfURLIsSupported()) {\n polyfillURL();\n }\n\n if (global.location !== void 0 && !('origin' in global.location)) {\n var getOrigin = function getOrigin() {\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n };\n\n try {\n Object.defineProperty(global.location, 'origin', {\n get: getOrigin,\n enumerable: true\n });\n } catch (e) {\n setInterval(function () {\n global.location.origin = getOrigin();\n }, 100);\n }\n }\n })(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n var IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\n var MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\n var MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/679\n var IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n });\n\n var SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\n var isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n };\n\n var FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n // `Array.prototype.concat` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.concat\n // with adding support of @@isConcatSpreadable and @@species\n _export({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n });\n\n var $filter = arrayIteration.filter;\n\n\n\n var HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('filter');\n // Edge 14- issue\n var USES_TO_LENGTH$3 = arrayMethodUsesToLength('filter');\n\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n // with adding support of @@species\n _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$3 }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n var $find = arrayIteration.find;\n\n\n\n var FIND = 'find';\n var SKIPS_HOLES = true;\n\n var USES_TO_LENGTH$4 = arrayMethodUsesToLength(FIND);\n\n // Shouldn't skip holes\n if (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n _export({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH$4 }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n addToUnscopables(FIND);\n\n var ITERATOR$7 = wellKnownSymbol('iterator');\n var SAFE_CLOSING = false;\n\n try {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR$7] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n } catch (error) { /* empty */ }\n\n var checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR$7] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n };\n\n var INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n });\n\n // `Array.from` method\n // https://tc39.github.io/ecma262/#sec-array.from\n _export({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: arrayFrom\n });\n\n var $includes = arrayIncludes.includes;\n\n\n\n var USES_TO_LENGTH$5 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n _export({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$5 }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n addToUnscopables('includes');\n\n var $map = arrayIteration.map;\n\n\n\n var HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('map');\n // FF49- issue\n var USES_TO_LENGTH$6 = arrayMethodUsesToLength('map');\n\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n // with adding support of @@species\n _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // makes subclassing work correct for wrapped built-ins\n var inheritIfRequired = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n objectSetPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) objectSetPrototypeOf($this, NewTargetPrototype);\n return $this;\n };\n\n // a string of all valid unicode whitespaces\n // eslint-disable-next-line max-len\n var whitespaces = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\n var whitespace = '[' + whitespaces + ']';\n var ltrim = RegExp('^' + whitespace + whitespace + '*');\n var rtrim = RegExp(whitespace + whitespace + '*$');\n\n // `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\n var createMethod$3 = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n };\n\n var stringTrim = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod$3(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod$3(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod$3(3)\n };\n\n var getOwnPropertyNames = objectGetOwnPropertyNames.f;\n var getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n var defineProperty$5 = objectDefineProperty.f;\n var trim = stringTrim.trim;\n\n var NUMBER = 'Number';\n var NativeNumber = global_1[NUMBER];\n var NumberPrototype = NativeNumber.prototype;\n\n // Opera ~12 has broken Object#toString\n var BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;\n\n // `ToNumber` abstract operation\n // https://tc39.github.io/ecma262/#sec-tonumber\n var toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n // `Number` constructor\n // https://tc39.github.io/ecma262/#sec-number-constructor\n if (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys$1 = descriptors ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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$1.length > j; j++) {\n if (has(NativeNumber, key = keys$1[j]) && !has(NumberWrapper, key)) {\n defineProperty$5(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global_1, NUMBER, NumberWrapper);\n }\n\n var FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); });\n\n // `Object.keys` method\n // https://tc39.github.io/ecma262/#sec-object.keys\n _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return objectKeys(toObject(it));\n }\n });\n\n var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\n // `Object.{ entries, values }` methods implementation\n var createMethod$4 = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!descriptors || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n };\n\n var objectToArray = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod$4(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod$4(false)\n };\n\n var $values = objectToArray.values;\n\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n _export({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n });\n\n var notARegexp = function (it) {\n if (isRegexp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n };\n\n var MATCH$1 = wellKnownSymbol('match');\n\n var correctIsRegexpLogic = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH$1] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n };\n\n // `String.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.includes\n _export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n var freezing = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n });\n\n var internalMetadata = createCommonjsModule(function (module) {\n var defineProperty = objectDefineProperty.f;\n\n\n\n var METADATA = uid('meta');\n var id = 0;\n\n var isExtensible = Object.isExtensible || function () {\n return true;\n };\n\n var setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n };\n\n var fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n };\n\n var getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n };\n\n // add metadata on freeze-family methods calling\n var onFreeze = function (it) {\n if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n };\n\n var meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n };\n\n hiddenKeys[METADATA] = true;\n });\n var internalMetadata_1 = internalMetadata.REQUIRED;\n var internalMetadata_2 = internalMetadata.fastKey;\n var internalMetadata_3 = internalMetadata.getWeakData;\n var internalMetadata_4 = internalMetadata.onFreeze;\n\n var Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n };\n\n var iterate = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = functionBindContext(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n };\n\n var collection = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global_1[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n internalMetadata.REQUIRED = true;\n } else if (isForced_1(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n _export({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n };\n\n var getWeakData = internalMetadata.getWeakData;\n\n\n\n\n\n\n\n\n var setInternalState$5 = internalState.set;\n var internalStateGetterFor = internalState.getterFor;\n var find$1 = arrayIteration.find;\n var findIndex = arrayIteration.findIndex;\n var id$1 = 0;\n\n // fallback for uncaught frozen keys\n var uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n };\n\n var UncaughtFrozenStore = function () {\n this.entries = [];\n };\n\n var findUncaughtFrozen = function (store, key) {\n return find$1(store.entries, function (it) {\n return it[0] === key;\n });\n };\n\n UncaughtFrozenStore.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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n };\n\n var collectionWeak = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState$5(that, {\n type: CONSTRUCTOR_NAME,\n id: id$1++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && has(data, state.id) && delete data[state.id];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has$1(key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n };\n\n var es_weakMap = createCommonjsModule(function (module) {\n\n\n\n\n\n\n var enforceIternalState = internalState.enforce;\n\n\n var IS_IE11 = !global_1.ActiveXObject && 'ActiveXObject' in global_1;\n var isExtensible = Object.isExtensible;\n var InternalWeakMap;\n\n var wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n };\n\n // `WeakMap` constructor\n // https://tc39.github.io/ecma262/#sec-weakmap-constructor\n var $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n // IE11 WeakMap frozen keys fix\n // We can't use feature detection because it crash some old IE builds\n // https://github.com/zloirock/core-js/issues/485\n if (nativeWeakMap && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n internalMetadata.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n }\n });\n\n var $every = arrayIteration.every;\n\n\n\n var STRICT_METHOD$3 = arrayMethodIsStrict('every');\n var USES_TO_LENGTH$7 = arrayMethodUsesToLength('every');\n\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$3 || !USES_TO_LENGTH$7 }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // `Object.assign` method\n // https://tc39.github.io/ecma262/#sec-object.assign\n _export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\n assign: objectAssign\n });\n\n var non = '\\u200B\\u0085\\u180E';\n\n // check that a method works with the correct list\n // of whitespaces and has a correct name\n var stringTrimForced = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n };\n\n var $trim = stringTrim.trim;\n\n\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n _export({ target: 'String', proto: true, forced: stringTrimForced('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n });\n\n var $some = arrayIteration.some;\n\n\n\n var STRICT_METHOD$4 = arrayMethodIsStrict('some');\n var USES_TO_LENGTH$8 = arrayMethodUsesToLength('some');\n\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 || !USES_TO_LENGTH$8 }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // `thisNumberValue` abstract operation\n // https://tc39.github.io/ecma262/#sec-thisnumbervalue\n var thisNumberValue = function (value) {\n if (typeof value != 'number' && classofRaw(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n };\n\n // `String.prototype.repeat` method implementation\n // https://tc39.github.io/ecma262/#sec-string.prototype.repeat\n var stringRepeat = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n };\n\n var nativeToFixed = 1.0.toFixed;\n var floor$4 = Math.floor;\n\n var pow$1 = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow$1(x, n - 1, acc * x) : pow$1(x * x, n / 2, acc);\n };\n\n var log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n };\n\n var FORCED$1 = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n ) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n });\n\n // `Number.prototype.toFixed` method\n // https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n _export({ target: 'Number', proto: true, forced: FORCED$1 }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor$4(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor$4(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow$1(2, 69, 1)) - 69;\n z = e < 0 ? number * pow$1(2, -e, 1) : number / pow$1(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow$1(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + stringRepeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + stringRepeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n });\n\n var $entries = objectToArray.entries;\n\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n _export({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n });\n\n // `Number.isNaN` method\n // https://tc39.github.io/ecma262/#sec-number.isnan\n _export({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n });\n\n var nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\n\n var FAILS_ON_PRIMITIVES$1 = fails(function () { nativeGetOwnPropertyDescriptor$2(1); });\n var FORCED$2 = !descriptors || FAILS_ON_PRIMITIVES$1;\n\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n _export({ target: 'Object', stat: true, forced: FORCED$2, sham: !descriptors }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key);\n }\n });\n\n // `Object.getOwnPropertyDescriptors` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n _export({ target: 'Object', stat: true, sham: !descriptors }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n });\n\n // @@match logic\n fixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regexpExecAbstract(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regexpExecAbstract(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n });\n\n function _classCallCheck$1(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n }\n\n function _defineProperties$1(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n }\n\n function _createClass$1(e, t, n) {\n return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n }\n\n function _defineProperty$1(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n }\n\n function ownKeys$2(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n\n return n;\n }\n\n function _objectSpread2$1(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys$2(Object(n), !0).forEach(function (t) {\n _defineProperty$1(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$2(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n }\n\n var defaults = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n };\n\n function matches(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n }\n\n function trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n }\n\n var getConstructor = function getConstructor(e) {\n return null != e ? e.constructor : null;\n },\n instanceOf = function instanceOf(e, t) {\n return !!(e && t && e instanceof t);\n },\n isNullOrUndefined = function isNullOrUndefined(e) {\n return null == e;\n },\n isObject$1 = function isObject(e) {\n return getConstructor(e) === Object;\n },\n isNumber = function isNumber(e) {\n return getConstructor(e) === Number && !Number.isNaN(e);\n },\n isString = function isString(e) {\n return getConstructor(e) === String;\n },\n isBoolean = function isBoolean(e) {\n return getConstructor(e) === Boolean;\n },\n isFunction = function isFunction(e) {\n return getConstructor(e) === Function;\n },\n isArray$1 = function isArray(e) {\n return Array.isArray(e);\n },\n isNodeList = function isNodeList(e) {\n return instanceOf(e, NodeList);\n },\n isElement = function isElement(e) {\n return instanceOf(e, Element);\n },\n isEvent = function isEvent(e) {\n return instanceOf(e, Event);\n },\n isEmpty = function isEmpty(e) {\n return isNullOrUndefined(e) || (isString(e) || isArray$1(e) || isNodeList(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n },\n is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject$1,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray$1,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n };\n\n function getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n }\n\n function round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n\n return Math.round(e / t) * t;\n }\n\n var RangeTouch = function () {\n function e(t, n) {\n _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());\n }\n\n return _createClass$1(e, [{\n key: \"init\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function value(e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function value(t) {\n if (!e.enabled || !is.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function value(t) {\n e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function value(t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type=\"range\"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\n var i = _objectSpread2$1({}, defaults, {}, n);\n\n if (is.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is.element(n) && matches(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n }();\n\n var nativePromiseConstructor = global_1.Promise;\n\n var SPECIES$5 = wellKnownSymbol('species');\n\n var setSpecies = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = objectDefineProperty.f;\n\n if (descriptors && Constructor && !Constructor[SPECIES$5]) {\n defineProperty(Constructor, SPECIES$5, {\n configurable: true,\n get: function () { return this; }\n });\n }\n };\n\n var engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent);\n\n var engineIsNode = classofRaw(global_1.process) == 'process';\n\n var location = global_1.location;\n var set$1 = global_1.setImmediate;\n var clear = global_1.clearImmediate;\n var process$1 = global_1.process;\n var MessageChannel = global_1.MessageChannel;\n var Dispatch = global_1.Dispatch;\n var counter = 0;\n var queue = {};\n var ONREADYSTATECHANGE = 'onreadystatechange';\n var defer, channel, port;\n\n var run = function (id) {\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 };\n\n var runner = function (id) {\n return function () {\n run(id);\n };\n };\n\n var listener = function (event) {\n run(event.data);\n };\n\n var post = function (id) {\n // old engines have not location.origin\n global_1.postMessage(id + '', location.protocol + '//' + location.host);\n };\n\n // Node.js 0.9+ & IE10+ has setImmediate, otherwise:\n if (!set$1 || !clear) {\n set$1 = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (engineIsNode) {\n defer = function (id) {\n process$1.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !engineIsIos) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = functionBindContext(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 (\n global_1.addEventListener &&\n typeof postMessage == 'function' &&\n !global_1.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global_1.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {\n defer = function (id) {\n html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n }\n\n var task = {\n set: set$1,\n clear: clear\n };\n\n var getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;\n var macrotask = task.set;\n\n\n\n var MutationObserver$1 = global_1.MutationObserver || global_1.WebKitMutationObserver;\n var document$2 = global_1.document;\n var process$2 = global_1.process;\n var Promise$1 = global_1.Promise;\n // Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\n var queueMicrotaskDescriptor = getOwnPropertyDescriptor$3(global_1, 'queueMicrotask');\n var queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\n var flush, head, last, notify, toggle, node, promise, then;\n\n // modern engines have queueMicrotask method\n if (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (engineIsNode && (parent = process$2.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!engineIsIos && !engineIsNode && MutationObserver$1 && document$2) {\n toggle = true;\n node = document$2.createTextNode('');\n new MutationObserver$1(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise$1 && Promise$1.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise$1.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (engineIsNode) {\n notify = function () {\n process$2.nextTick(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_1, flush);\n };\n }\n }\n\n var microtask = queueMicrotask || 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 var PromiseCapability = function (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$1(resolve);\n this.reject = aFunction$1(reject);\n };\n\n // 25.4.1.5 NewPromiseCapability(C)\n var f$7 = function (C) {\n return new PromiseCapability(C);\n };\n\n var newPromiseCapability = {\n \tf: f$7\n };\n\n var promiseResolve = 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\n var hostReportErrors = function (a, b) {\n var console = global_1.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n };\n\n var perform = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n };\n\n var task$1 = task.set;\n\n\n\n\n\n\n\n\n\n\n\n var SPECIES$6 = wellKnownSymbol('species');\n var PROMISE = 'Promise';\n var getInternalState$3 = internalState.get;\n var setInternalState$6 = internalState.set;\n var getInternalPromiseState = internalState.getterFor(PROMISE);\n var PromiseConstructor = nativePromiseConstructor;\n var TypeError$1 = global_1.TypeError;\n var document$3 = global_1.document;\n var process$3 = global_1.process;\n var $fetch$1 = getBuiltIn('fetch');\n var newPromiseCapability$1 = newPromiseCapability.f;\n var newGenericPromiseCapability = newPromiseCapability$1;\n var DISPATCH_EVENT = !!(document$3 && document$3.createEvent && global_1.dispatchEvent);\n var NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\n var UNHANDLED_REJECTION = 'unhandledrejection';\n var REJECTION_HANDLED = 'rejectionhandled';\n var PENDING = 0;\n var FULFILLED = 1;\n var REJECTED = 2;\n var HANDLED = 1;\n var UNHANDLED = 2;\n var Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\n var FORCED$3 = isForced_1(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (engineV8Version === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!engineIsNode && !NATIVE_REJECTION_EVENT) return true;\n }\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES$6] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n });\n\n var INCORRECT_ITERATION$1 = FORCED$3 || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n });\n\n // helpers\n var isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n };\n\n var notify$1 = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError$1('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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n };\n\n var dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document$3.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global_1.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global_1['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n };\n\n var onUnhandled = function (state) {\n task$1.call(global_1, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (engineIsNode) {\n process$3.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = engineIsNode || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n };\n\n var isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n };\n\n var onHandleUnhandled = function (state) {\n task$1.call(global_1, function () {\n var promise = state.facade;\n if (engineIsNode) {\n process$3.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n };\n\n var bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n };\n\n var internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify$1(state, true);\n };\n\n var internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError$1(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify$1(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n };\n\n // constructor polyfill\n if (FORCED$3) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction$1(executor);\n Internal.call(this);\n var state = getInternalState$3(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState$6(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = engineIsNode ? process$3.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify$1(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState$3(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapability.f = newPromiseCapability$1 = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if ( typeof nativePromiseConstructor == 'function') {\n nativeThen = nativePromiseConstructor.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch$1 == 'function') _export({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch$1.apply(global_1, arguments));\n }\n });\n }\n }\n\n _export({ global: true, wrap: true, forced: FORCED$3 }, {\n Promise: PromiseConstructor\n });\n\n setToStringTag(PromiseConstructor, PROMISE, false);\n setSpecies(PROMISE);\n\n PromiseWrapper = getBuiltIn(PROMISE);\n\n // statics\n _export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability$1(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n });\n\n _export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve( this, x);\n }\n });\n\n _export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability$1(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction$1(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability$1(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction$1(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n });\n\n var getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n var nativeStartsWith = ''.startsWith;\n var min$4 = Math.min;\n\n var CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic('startsWith');\n // https://github.com/zloirock/core-js/pull/702\n var MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor$4(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n }();\n\n // `String.prototype.startsWith` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n _export({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegexp(searchString);\n var index = toLength(min$4(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n });\n\n // ==========================================================================\n // Type checking utils\n // ==========================================================================\n var getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n };\n\n var instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n };\n\n var isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n };\n\n var isObject$2 = function isObject(input) {\n return getConstructor$1(input) === Object;\n };\n\n var isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n };\n\n var isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n };\n\n var isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n };\n\n var isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n };\n\n var isArray$2 = function isArray(input) {\n return Array.isArray(input);\n };\n\n var isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n };\n\n var isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n };\n\n var isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n };\n\n var isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n };\n\n var isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n };\n\n var isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n };\n\n var isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n };\n\n var isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise) && isFunction$1(input.then);\n };\n\n var isElement$1 = function isElement(input) {\n return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';\n };\n\n var isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$2(input) || isNodeList$1(input)) && !input.length || isObject$2(input) && !Object.keys(input).length;\n };\n\n var isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n };\n\n var is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$2,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$2,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n };\n\n var transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n }(); // Force repaint of element\n\n function repaint(element, delay) {\n setTimeout(function () {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n element.hidden = false;\n } catch (e) {// Do nothing\n }\n }, delay);\n }\n\n // ==========================================================================\n // Browser sniffing\n // Unfortunately, due to mixed support, UA sniffing is required\n // ==========================================================================\n var browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\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\n // `Array.prototype.{ reduce, reduceRight }` methods implementation\n var createMethod$5 = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction$1(callbackfn);\n var O = toObject(that);\n var self = indexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n };\n\n var arrayReduce = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod$5(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod$5(true)\n };\n\n var $reduce = arrayReduce.left;\n\n\n\n\n\n var STRICT_METHOD$5 = arrayMethodIsStrict('reduce');\n var USES_TO_LENGTH$9 = arrayMethodUsesToLength('reduce', { 1: 0 });\n // Chrome 80-82 has a critical bug\n // https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\n var CHROME_BUG = !engineIsNode && engineV8Version > 79 && engineV8Version < 83;\n\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n _export({ target: 'Array', proto: true, forced: !STRICT_METHOD$5 || !USES_TO_LENGTH$9 || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n function cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n } // Get a nested value in an object\n\n function getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n } // Deep extend destination object with N more objects\n\n function extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n }\n\n function wrap$1(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // 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\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n } // Set attributes\n\n function setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n } // Create a DocumentFragment\n\n function createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n } // Inaert an element after another\n\n function insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n } // Insert a DocumentFragment\n\n function insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n } // Remove element(s)\n\n function removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n } // Remove all child elements\n\n function emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n } // Replace element\n\n function replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n } // Get an attribute object from a string selector\n\n 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 if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = extend({}, existingAttributes);\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n\n var _parts = _slicedToArray(parts, 1),\n key = _parts[0];\n\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.string(existing.class)) {\n attributes.class = \"\".concat(existing.class, \" \").concat(className);\n } else {\n attributes.class = className;\n }\n\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 break;\n }\n });\n return extend(existing, attributes);\n } // Toggle hidden\n\n function toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n } // eslint-disable-next-line no-param-reassign\n\n\n element.hidden = hide;\n } // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\n function toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\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 } // Has class name\n\n function hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n } // Element matches selector\n\n function matches$1(element, selector) {\n var _Element = Element,\n prototype = _Element.prototype;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n } // Closest ancestor element matching selector (also tests element itself)\n\n function closest(element, selector) {\n var _Element2 = Element,\n prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n function closestElement() {\n var el = this;\n\n do {\n if (matches$1.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n }\n\n var method = prototype.closest || closestElement;\n return method.call(element, selector);\n } // Find all elements\n\n function getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n } // Find a single element\n\n function getElement(selector) {\n return this.elements.container.querySelector(selector);\n } // Set focus and tab focus class\n\n function setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n }\n\n var 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 }; // Check for feature support\n\n var support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\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: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\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 // Detect transitions support\n transitions: transitionEndEvent !== false,\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\n // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n // https://www.youtube.com/watch?v=NPM6172J22g\n\n var supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n }(); // Toggle event listener\n\n\n function toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n } // Bind event handler\n\n function on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n } // Unbind event handler\n\n function off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n } // Bind once-only event handler\n\n function once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n } // Trigger event\n\n function triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n } // Unbind all cached event listeners\n\n function unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n } // Run method when / if player is ready\n\n function ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n }\n\n /**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n\n function silencePromise(value) {\n if (is$1.promise(value)) {\n value.then(null, function () {});\n }\n }\n\n function validateRatio(input) {\n if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {\n return false;\n }\n\n var ratio = is$1.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is$1.number);\n }\n function reduceAspectRatio(ratio) {\n if (!is$1.array(ratio) || !ratio.every(is$1.number)) {\n return null;\n }\n\n var _ratio = _slicedToArray(ratio, 2),\n width = _ratio[0],\n height = _ratio[1];\n\n var getDivider = function getDivider(w, h) {\n return h === 0 ? w : getDivider(h, w % h);\n };\n\n var divider = getDivider(width, height);\n return [width / divider, height / divider];\n }\n function getAspectRatio(input) {\n var parse = function parse(ratio) {\n return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n }; // Try provided ratio\n\n\n var ratio = parse(input); // Get from config\n\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n } // Get from embed\n\n\n if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {\n ratio = this.embed.ratio;\n } // Get from HTML5 video\n\n\n if (ratio === null && this.isHTML5) {\n var _this$media = this.media,\n videoWidth = _this$media.videoWidth,\n videoHeight = _this$media.videoHeight;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n } // Set aspect ratio for responsive container\n\n function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n var wrapper = this.elements.wrapper;\n var ratio = getAspectRatio.call(this, input);\n\n var _ref = is$1.array(ratio) ? ratio : [0, 0],\n _ref2 = _slicedToArray(_ref, 2),\n w = _ref2[0],\n h = _ref2[1];\n\n var padding = 100 / w * h;\n wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n var offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n }\n\n var html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n } // Get sizes from <source> elements\n\n\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('size'));\n }).filter(Boolean);\n },\n setup: function setup() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n if (!is$1.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n } // Quality\n\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (s) {\n return s.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('size'));\n },\n set: function set(input) {\n if (player.quality === input) {\n return;\n } // If we're using an an external handler...\n\n\n if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (s) {\n return Number(s.getAttribute('size')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState,\n playbackRate = _player$media.playbackRate; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.speed = playbackRate;\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n silencePromise(player.play());\n }\n }); // Load new source\n\n player.media.load();\n }\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // 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\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n };\n\n function dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n } // Get the closest value in an array\n\n function closest$1(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n }\n\n var defineProperty$6 = objectDefineProperty.f;\n var getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;\n\n\n\n\n\n var setInternalState$7 = internalState.set;\n\n\n\n var MATCH$2 = wellKnownSymbol('match');\n var NativeRegExp = global_1.RegExp;\n var RegExpPrototype$1 = NativeRegExp.prototype;\n var re1 = /a/g;\n var re2 = /a/g;\n\n // \"new\" should create a new object, old webkit bug\n var CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\n var UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y;\n\n var FORCED$4 = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$2 || fails(function () {\n re2[MATCH$2] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n })));\n\n // `RegExp` constructor\n // https://tc39.github.io/ecma262/#sec-regexp-constructor\n if (FORCED$4) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegexp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = regexpFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y$2) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype$1,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y$2 && sticky) setInternalState$7(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty$6(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys$2 = getOwnPropertyNames$1(NativeRegExp);\n var index = 0;\n while (keys$2.length > index) proxy(keys$2[index++]);\n RegExpPrototype$1.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype$1;\n redefine(global_1, 'RegExp', RegExpWrapper);\n }\n\n // https://tc39.github.io/ecma262/#sec-get-regexp-@@species\n setSpecies('RegExp');\n\n function generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n } // Format string\n\n function format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n } // Get percentage\n\n 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 } // Replace all occurances of a string in a string\n\n var replaceAll = function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n }; // Convert to title case\n\n var toTitleCase = function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n }; // Convert string to pascalCase\n\n function toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n } // Convert string to pascalCase\n\n function toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n } // Remove HTML from a string\n\n function stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n } // Like outerHTML, but also works for DocumentFragment\n\n function getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n }\n\n var resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n };\n var i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n k = _ref2[0],\n v = _ref2[1];\n\n string = replaceAll(string, k, v);\n });\n return string;\n }\n };\n\n var Storage = /*#__PURE__*/function () {\n function Storage(player) {\n var _this = this;\n\n _classCallCheck(this, Storage);\n\n _defineProperty(this, \"get\", function (key) {\n if (!Storage.supported || !_this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(_this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n });\n\n _defineProperty(this, \"set\", function (object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !_this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = _this.get(); // Default to empty object\n\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(_this.key, JSON.stringify(storage));\n });\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, null, [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // 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\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n }();\n\n // ==========================================================================\n // Fetch wrapper\n // Using XHR to avoid issues with older browsers\n // ==========================================================================\n function fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\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 request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n }\n\n // ==========================================================================\n\n function loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n }\n\n var ceil$1 = Math.ceil;\n var floor$5 = Math.floor;\n\n // `Math.trunc` method\n // https://tc39.github.io/ecma262/#sec-math.trunc\n _export({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor$5 : ceil$1)(it);\n }\n });\n\n var getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n };\n var getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n };\n var getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n }; // Format time to UI friendly string\n\n function formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n }\n\n var controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\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 }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\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 }; // Display\n\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 }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\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); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // 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\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n\n var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var _this = this;\n\n var attributes = extend({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some(function (c) {\n return c === _this.config.classNames.control;\n })) {\n extend(attributes, {\n class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.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 // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\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 }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type, attrs) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\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: function bindMenuItemShortcuts(menuItem, type) {\n var _this2 = this;\n\n // Navigate through menus via arrow keys and space\n on.call(this, menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this2, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this2, target, true);\n }\n }\n }, false); // 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\n on.call(this, menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this2, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this3 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(check) {\n // Ensure exclusivity\n if (check) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this3.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this3.quality = value;\n break;\n\n case 'speed':\n _this3.speed = parseFloat(value);\n break;\n }\n\n controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this4 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var val = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = val; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = val;\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); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this5 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(show) {\n return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n\n if (is$1.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 } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function 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 } // 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\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(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 // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this6.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this6, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this6.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this6, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this6, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\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 if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this7.captions.toggled && _this7.currentTrack === value,\n title: captions.getLabel.call(_this7, track),\n badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu() {\n var _this8 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n this.options.speed = this.options.speed.filter(function (o) {\n return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this8, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this8, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (p) {\n return !p.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;\n var isMenuItem = popup.contains(target); // 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\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.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$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this9 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function 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 } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this9, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl: function setDownloadUrl() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set attribute\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create: function create(data) {\n var _this10 = this;\n\n var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n createButton = controls.createButton,\n createProgress = controls.createProgress,\n createRange = controls.createRange,\n createTime = controls.createTime,\n setQualityMenu = controls.setQualityMenu,\n setSpeedMenu = controls.setSpeedMenu,\n showMenuPanel = controls.showMenuPanel;\n this.elements.controls = null; // Larger overlaid play button\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n } // Create the container\n\n\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container; // Default item attributes\n\n var defaultAttributes = {\n class: 'plyr__controls__item'\n }; // Loop through controls in order\n\n dedupe(is$1.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n } // Rewind button\n\n\n if (control === 'rewind') {\n container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n } // Play/Pause button\n\n\n if (control === 'play') {\n container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n } // Fast forward button\n\n\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n } // Progress\n\n\n if (control === 'progress') {\n var progressContainer = createElement('div', {\n class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n });\n var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(createRange.call(_this10, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (_this10.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: _this10.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n _this10.elements.display.seekTooltip = tooltip;\n }\n\n _this10.elements.progress = progress;\n progressContainer.appendChild(_this10.elements.progress);\n container.appendChild(progressContainer);\n } // Media current time display\n\n\n if (control === 'current-time') {\n container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n } // Media duration display\n\n\n if (control === 'duration') {\n container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n } // Volume controls\n\n\n if (control === 'mute' || control === 'volume') {\n var volume = _this10.elements.volume; // Create the volume container if needed\n\n if (!is$1.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n }));\n _this10.elements.volume = volume;\n container.appendChild(volume);\n } // Toggle mute button\n\n\n if (control === 'mute') {\n volume.appendChild(createButton.call(_this10, 'mute'));\n } // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: _this10.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n }\n } // Toggle captions button\n\n\n if (control === 'captions') {\n container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n } // Settings button / menu\n\n\n if (control === 'settings' && !is$1.empty(_this10.config.settings)) {\n var wrapper = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(_this10, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n _this10.elements.settings.panels.home = home; // Build the menu items\n\n _this10.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n on.call(_this10, menuItem, 'click', function () {\n showMenuPanel.call(_this10, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this10.config));\n var value = createElement('span', {\n class: _this10.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this10.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this10.config.classNames.hidden\n }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n on.call(_this10, pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n showMenuPanel.call(_this10, 'home', true);\n }, false); // Go back via button click\n\n on.call(_this10, backButton, 'click', function () {\n showMenuPanel.call(_this10, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this10.elements.settings.buttons[type] = menuItem;\n _this10.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n _this10.elements.settings.popup = popup;\n _this10.elements.settings.menu = wrapper;\n } // Picture in picture button\n\n\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n } // Airplay button\n\n\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n } // Download button\n\n\n if (control === 'download') {\n var _attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: _this10.download,\n target: '_blank'\n }); // Set download attribute for HTML5 only\n\n\n if (_this10.isHTML5) {\n _attributes.download = '';\n }\n\n var download = _this10.config.urls.download;\n\n if (!is$1.url(download) && _this10.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(_this10.provider),\n label: _this10.provider\n });\n }\n\n container.appendChild(createButton.call(_this10, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n }\n }); // Set available quality levels\n\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this11 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.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) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this11.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this11.config.classNames.hidden, false);\n toggleClass(label, _this11.config.classNames.tooltip, true);\n });\n }\n }\n };\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 */\n\n function parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var 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 } // Convert object to URLSearchParams\n\n function buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n }\n\n var captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\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\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n } // Add event listener for cue changes\n\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n 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\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n } // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n\n\n setTimeout(function () {\n if (active && _this2.captions.toggled) {\n _this2.captions.currentTrackNode.mode = 'hidden';\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: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.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 var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\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 // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\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: function getTracks() {\n var _this3 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // 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\n return tracks.filter(function (track) {\n return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this4 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this4.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (t) {\n return t.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.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 // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var 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 var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n };\n\n // ==========================================================================\n // Plyr default config\n // ==========================================================================\n var defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\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 // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\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 // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 // URLs\n urls: {\n download: null,\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/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\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 download: '[data-plyr=\"download\"]',\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',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\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 tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n }\n };\n\n // ==========================================================================\n // Plyr states\n // ==========================================================================\n var pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n };\n\n // ==========================================================================\n // Plyr supported types and providers\n // ==========================================================================\n var providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n };\n var types = {\n audio: 'audio',\n video: 'video'\n };\n /**\n * Get provider by URL\n * @param {String} url\n */\n\n function getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n }\n\n // ==========================================================================\n // Console wrapper\n // ==========================================================================\n var noop = function noop() {};\n\n var Console = /*#__PURE__*/function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n }();\n\n var Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(player) {\n var _this = this;\n\n _classCallCheck(this, Fullscreen);\n\n _defineProperty(this, \"onChange\", function () {\n if (!_this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = _this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = _this.active;\n } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event\n\n triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n });\n\n _defineProperty(this, \"toggleFallback\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\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 } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n _this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (_this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n }\n } // Toggle button and fire events\n\n\n _this.onChange();\n });\n\n _defineProperty(this, \"trapFocus\", function (event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n var _focusable = _slicedToArray(focusable, 1),\n first = _focusable[0];\n\n var last = focusable[focusable.length - 1];\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 _defineProperty(this, \"update\", function () {\n if (_this.enabled) {\n var mode;\n\n if (_this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n _this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n _this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);\n });\n\n _defineProperty(this, \"enter\", function () {\n if (!_this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n if (_this.player.isVimeo) {\n _this.player.embed.requestFullscreen();\n } else {\n _this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || _this.forceFallback) {\n _this.toggleFallback(true);\n } else if (!_this.prefix) {\n _this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is$1.empty(_this.prefix)) {\n _this.target[\"\".concat(_this.prefix, \"Request\").concat(_this.property)]();\n }\n });\n\n _defineProperty(this, \"exit\", function () {\n if (!_this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n _this.target.webkitExitFullscreen();\n\n silencePromise(_this.player.play());\n } else if (!Fullscreen.native || _this.forceFallback) {\n _this.toggleFallback(false);\n } else if (!_this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(_this.prefix)) {\n var action = _this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(_this.prefix).concat(action).concat(_this.property)]();\n }\n });\n\n _defineProperty(this, \"toggle\", function () {\n if (!_this.active) {\n _this.enter();\n } else {\n _this.exit();\n }\n });\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n\n this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n _this.onChange();\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n }); // Tap focus when in fullscreen\n\n on.call(this, this.player.elements.container, 'keydown', function (event) {\n return _this.trapFocus(event);\n }); // Update the UI\n\n this.update(); // this.toggle = this.toggle.bind(this);\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n }();\n\n // `Math.sign` method implementation\n // https://tc39.github.io/ecma262/#sec-math.sign\n var mathSign = 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 // `Math.sign` method\n // https://tc39.github.io/ecma262/#sec-math.sign\n _export({ target: 'Math', stat: true }, {\n sign: mathSign\n });\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 function loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n }\n\n var ui = {\n addStyleHook: function 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 // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset speed\n\n this.speed = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\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\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('data-poster', poster); // Show the poster\n\n this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(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(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\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); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n Object.assign(target, {\n pressed: _this3.playing\n });\n target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controlsElement = this.elements.controls;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles: function migrateStyles() {\n var _this5 = this;\n\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n .filter(function (key) {\n return !is$1.empty(key) && is$1.string(key) && key.startsWith('--plyr');\n }).forEach(function (key) {\n // Set on the container\n _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n _this5.media.style.removeProperty(key);\n }); // Remove attribute if empty\n\n if (is$1.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n };\n\n var Listeners = /*#__PURE__*/function () {\n function Listeners(_player) {\n var _this = this;\n\n _classCallCheck(this, Listeners);\n\n _defineProperty(this, \"firstTouch\", function () {\n var player = _this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n });\n\n _defineProperty(this, \"setTabFocus\", function (event) {\n var player = _this.player;\n var elements = player.elements;\n clearTimeout(_this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n _this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n if (event.type !== 'focusout') {\n _this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n });\n\n _defineProperty(this, \"global\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = _this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', _this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);\n });\n\n _defineProperty(this, \"container\", function () {\n var player = _this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controlsElement = elements.controls; // Remove button states for fullscreen\n\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio = _slicedToArray(ratio, 2),\n y = _ratio[1];\n\n var _getAspectRatio$call = getAspectRatio.call(player),\n _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n videoX = _getAspectRatio$call2[0],\n videoY = _getAspectRatio$call2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n if (target !== elements.container) {\n return;\n } // If it's not an embed and no ratio specified\n\n\n if (!player.isEmbed && is$1.empty(player.config.ratio)) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n if (isEnter) {\n setTimeout(function () {\n return repaint(elements.container);\n }, 100);\n } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n });\n\n _defineProperty(this, \"media\", function () {\n var player = _this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n player.pause();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, function () {\n silencePromise(player.play());\n }, 'play');\n } else {\n _this.proxy(event, function () {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadUrl.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\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 _defineProperty(this, \"proxy\", function (event, defaultHandler, customHandlerKey) {\n var player = _this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned !== false && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n });\n\n _defineProperty(this, \"bind\", function (element, type, defaultHandler, customHandlerKey) {\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = _this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n });\n\n _defineProperty(this, \"controls\", function () {\n var player = _this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this.bind(button, 'click', function () {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n } // Pause\n\n\n _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n\n _this.bind(elements.buttons.rewind, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind'); // Rewind\n\n\n _this.bind(elements.buttons.fastForward, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward'); // Mute toggle\n\n\n _this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n\n _this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n\n _this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n\n _this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n\n _this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n\n _this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n\n _this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\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\n\n _this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n\n _this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n\n _this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n\n _this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\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\n\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n _this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n\n _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n\n _this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n\n _this.bind(elements.progress, 'mouseleave touchend click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n\n _this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n _this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n _this.bind(elements.display.currentTime, 'click', function () {\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 controls.timeUpdate.call(player);\n });\n } // Volume\n\n\n _this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n\n _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(function (c) {\n return !c.contains(elements.container);\n }).forEach(function (child) {\n _this.bind(child, 'mouseenter mouseleave', function (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\n\n _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n\n _this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n\n _this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n });\n\n this.player = _player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\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 } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\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 var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n 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)\n\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\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\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\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\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }]);\n\n return Listeners;\n }();\n\n var HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('splice');\n var USES_TO_LENGTH$a = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\n var max$3 = Math.max;\n var min$5 = Math.min;\n var MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\n var MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n // `Array.prototype.splice` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.splice\n // with adding support of @@species\n _export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$a }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min$5(max$3(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n });\n\n var loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\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 */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function 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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; // tag IE9+\n\n isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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]; // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // resolve Promise\n\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n } // publish bundle load event\n\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\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 */\n\n\n loadjs.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 return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n });\n\n function loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n }\n\n function parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n var vimeo = {\n setup: function setup() {\n var player = this; // Add embed class for responsive\n\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set intial ratio\n\n setAspectRatio.call(player); // Load the SDK if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(player);\n }).catch(function (error) {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready: function ready() {\n var _this = this;\n\n var player = this;\n var config = player.config.vimeo;\n\n var premium = config.premium,\n referrerPolicy = config.referrerPolicy,\n frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n } // Get Vimeo params for the iframe\n\n\n var params = buildUrlParams(_objectSpread2({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, frameParams)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required\n\n if (!is$1.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n } // Inject the package\n\n\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n var wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n } // Get poster image\n\n\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n if (is$1.empty(response) || !response.thumbnail_url) {\n return;\n } // Set and show poster\n\n\n ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n });\n } // Setup instance\n // https://github.com/vimeo/player.js\n\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function () {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(function (error) {\n _this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = [width, height];\n setAspectRatio.call(_this);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', function () {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', function () {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n }\n };\n\n function parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n } // Set playback state and trigger change (only on actual change)\n\n\n function assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n }\n\n function getHost$1(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n } // Use YouTube's default\n\n\n return undefined;\n }\n\n var youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n // Call global callback if set\n if (is$1.function(callback)) {\n callback();\n }\n\n youtube.ready.call(_this);\n }; // Load the SDK\n\n\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n var url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(function (data) {\n if (is$1.object(data)) {\n var title = data.title,\n height = data.height,\n width = data.width; // Set title\n\n _this2.config.title = title;\n ui.setTitle.call(_this2); // Set aspect ratio\n\n _this2.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(_this2);\n }).catch(function () {\n // Set aspect ratio\n setAspectRatio.call(_this2);\n });\n },\n // API ready\n ready: function ready() {\n var player = this;\n var config = player.config.youtube; // Ignore already setup (race condition)\n\n var currentId = player.media && player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Replace media element\n\n var container = createElement('div', {\n id: id,\n 'data-poster': config.customControls ? player.poster : undefined\n });\n player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n if (config.customControls) {\n var posterSrc = function posterSrc(s) {\n return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (src) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n } // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n\n player.embed = new window.YT.Player(player.media, {\n videoId: videoId,\n host: getHost$1(config),\n playerVars: extend({}, {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\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 player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function 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 } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n player.options.speed = speeds.filter(function (s) {\n return player.config.speed.options.includes(s);\n }); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui && config.customControls) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n }\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var 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 } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\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 (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // 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\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\n assurePlaybackState$1.call(player, false);\n break;\n\n case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n };\n\n var media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap$1(this.media, this.elements.wrapper); // Poster image container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: ''\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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\n var destroy = function destroy(instance) {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n } // Destroy our adsManager\n\n\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n };\n\n var Ads = /*#__PURE__*/function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n _defineProperty(this, \"load\", function () {\n if (!_this.enabled) {\n return;\n } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {\n _this.ready();\n }).catch(function () {\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 _defineProperty(this, \"ready\", function () {\n // Double check we're enabled\n if (!_this.enabled) {\n destroy(_this);\n } // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n\n\n _this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n\n _this.managerPromise.then(function () {\n _this.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n\n _this.listeners(); // Setup the IMA SDK\n\n\n _this.setupIMA();\n });\n\n _defineProperty(this, \"setupIMA\", function () {\n // Create the container for our advertisements\n _this.elements.container = createElement('div', {\n class: _this.player.config.classNames.ads\n });\n\n _this.player.elements.container.appendChild(_this.elements.container); // So we can run VPAID2\n\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader\n\n _this.loader = new google.ima.AdsLoader(_this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this.onAdsManagerLoaded(event);\n }, false);\n\n _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this.onAdError(error);\n }, false); // Request video ads to be pre-loaded\n\n\n _this.requestAds();\n });\n\n _defineProperty(this, \"requestAds\", function () {\n var container = _this.player.elements.container;\n\n try {\n // Request video ads\n var request = new google.ima.AdsRequest();\n request.adTagUrl = _this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!_this.player.muted);\n\n _this.loader.requestAds(request);\n } catch (e) {\n _this.onAdError(e);\n }\n });\n\n _defineProperty(this, \"pollCountdown\", function () {\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(_this.countdownTimer);\n\n _this.elements.container.removeAttribute('data-badge-text');\n\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this.player.config), \" - \").concat(time);\n\n _this.elements.container.setAttribute('data-badge-text', label);\n };\n\n _this.countdownTimer = setInterval(update, 100);\n });\n\n _defineProperty(this, \"onAdsManagerLoaded\", function (event) {\n // Load could occur after a source change (race condition)\n if (!_this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // 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\n _this.manager = event.getAdsManager(_this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events\n // Advertisement error events\n\n _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this.onAdError(error);\n }); // Advertisement regular events\n\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n return _this.onAdEvent(e);\n });\n }); // Resolve our adsManager\n\n _this.trigger('loaded');\n });\n\n _defineProperty(this, \"addCuePoints\", function () {\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(_this.cuePoints)) {\n _this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {\n var seekElement = _this.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\n }\n });\n\n _defineProperty(this, \"onAdEvent\", function (event) {\n var container = _this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n triggerEvent.call(_this.player, _this.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n }; // Bubble the event\n\n\n dispatchEvent(event.type);\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'); // Start countdown\n\n\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 } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n _this.manager.setVolume(_this.player.volume);\n\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 // 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 // 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 if (_this.player.ended) {\n _this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n _this.loader.contentComplete();\n }\n\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 _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 _this.pollCountdown();\n\n _this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n _this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n }\n });\n\n _defineProperty(this, \"onAdError\", function (event) {\n _this.cancel();\n\n _this.player.debug.warn('Ads error', event);\n });\n\n _defineProperty(this, \"listeners\", function () {\n var container = _this.player.elements.container;\n var time;\n\n _this.player.on('canplay', function () {\n _this.addCuePoints();\n });\n\n _this.player.on('ended', function () {\n _this.loader.contentComplete();\n });\n\n _this.player.on('timeupdate', function () {\n time = _this.player.currentTime;\n });\n\n _this.player.on('seeked', function () {\n var seekedTime = _this.player.currentTime;\n\n if (is$1.empty(_this.cuePoints)) {\n return;\n }\n\n _this.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this.manager.discardAdBreak();\n\n _this.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n\n window.addEventListener('resize', function () {\n if (_this.manager) {\n _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n });\n\n _defineProperty(this, \"play\", function () {\n var container = _this.player.elements.container;\n\n if (!_this.managerPromise) {\n _this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n _this.managerPromise.then(function () {\n // Set volume to match player\n _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\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); // 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\n\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 }).catch(function () {});\n });\n\n _defineProperty(this, \"resumeContent\", function () {\n // Hide the advertisement container\n _this.elements.container.style.zIndex = ''; // Ad is stopped\n\n _this.playing = false; // Play video\n\n silencePromise(_this.player.media.play());\n });\n\n _defineProperty(this, \"pauseContent\", function () {\n // Show the advertisement container\n _this.elements.container.style.zIndex = 3; // Ad is playing\n\n _this.playing = true; // Pause our video.\n\n _this.player.media.pause();\n });\n\n _defineProperty(this, \"cancel\", function () {\n // Pause our video\n if (_this.initialized) {\n _this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n _this.trigger('error'); // Re-create our adsManager\n\n\n _this.loadAds();\n });\n\n _defineProperty(this, \"loadAds\", function () {\n // Tell our adsManager to go bye bye\n _this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this.manager) {\n _this.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this.managerPromise = new Promise(function (resolve) {\n _this.on('loaded', resolve);\n\n _this.player.debug.log(_this.manager);\n }); // Now that the manager has been destroyed set it to also be un-initialized\n\n _this.initialized = false; // Now request some new advertisements\n\n _this.requestAds();\n }).catch(function () {});\n });\n\n _defineProperty(this, \"trigger\", function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = _this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this, args);\n }\n });\n }\n });\n\n _defineProperty(this, \"on\", function (event, callback) {\n if (!is$1.array(_this.events[event])) {\n _this.events[event] = [];\n }\n\n _this.events[event].push(callback);\n\n return _this;\n });\n\n _defineProperty(this, \"startSafetyTimer\", function (time, from) {\n _this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n\n _this.safetyTimer = setTimeout(function () {\n _this.cancel();\n\n _this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n });\n\n _defineProperty(this, \"clearSafetyTimer\", function (from) {\n if (!is$1.nullOrUndefined(_this.safetyTimer)) {\n _this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n\n clearTimeout(_this.safetyTimer);\n _this.safetyTimer = null;\n }\n });\n\n this.player = player;\n this.config = player.config.ads;\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; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n /**\n * Load the IMA SDK\n */\n\n }, {\n key: \"tagUrl\",\n // Build the tag URL\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var 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: config.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\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\n }]);\n\n return Ads;\n }();\n\n var $findIndex = arrayIteration.findIndex;\n\n\n\n var FIND_INDEX = 'findIndex';\n var SKIPS_HOLES$1 = true;\n\n var USES_TO_LENGTH$b = arrayMethodUsesToLength(FIND_INDEX);\n\n // Shouldn't skip holes\n if (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES$1 = false; });\n\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n _export({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 || !USES_TO_LENGTH$b }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n });\n\n // https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\n addToUnscopables(FIND_INDEX);\n\n var min$6 = Math.min;\n var nativeLastIndexOf = [].lastIndexOf;\n var NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\n var STRICT_METHOD$6 = arrayMethodIsStrict('lastIndexOf');\n // For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\n var USES_TO_LENGTH$c = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n var FORCED$5 = NEGATIVE_ZERO$1 || !STRICT_METHOD$6 || !USES_TO_LENGTH$c;\n\n // `Array.prototype.lastIndexOf` method implementation\n // https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n var arrayLastIndexOf = FORCED$5 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min$6(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n } : nativeLastIndexOf;\n\n // `Array.prototype.lastIndexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n _export({ target: 'Array', proto: true, forced: arrayLastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: arrayLastIndexOf\n });\n\n var parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n };\n /**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\n var fitRatio = function fitRatio(ratio, outer) {\n var targetRatio = outer.width / outer.height;\n var result = {};\n\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = 1 / ratio * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n };\n\n var PreviewThumbnails = /*#__PURE__*/function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n var _this = this;\n\n _classCallCheck(this, PreviewThumbnails);\n\n _defineProperty(this, \"load\", function () {\n // Toggle the regular seek tooltip\n if (_this.player.elements.display.seekTooltip) {\n _this.player.elements.display.seekTooltip.hidden = _this.enabled;\n }\n\n if (!_this.enabled) {\n return;\n }\n\n _this.getThumbnails().then(function () {\n if (!_this.enabled) {\n return;\n } // Render DOM elements\n\n\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n });\n\n _defineProperty(this, \"getThumbnails\", function () {\n return new Promise(function (resolve) {\n var src = _this.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // Resolve promise\n\n\n var sortAndResolve = function sortAndResolve() {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this.player.debug.log('Preview thumbnails', _this.thumbnails);\n\n resolve();\n }; // Via callback()\n\n\n if (is$1.function(src)) {\n src(function (thumbnails) {\n _this.thumbnails = thumbnails;\n sortAndResolve();\n });\n } // VTT urls\n else {\n // If string, convert into single-element list\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this.getThumbnail(u);\n }); // Resolve\n\n Promise.all(promises).then(sortAndResolve);\n }\n });\n });\n\n _defineProperty(this, \"getThumbnail\", function (url) {\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n });\n\n _defineProperty(this, \"startMove\", function (event) {\n if (!_this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!_this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = _this.player.elements.progress.getBoundingClientRect();\n\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n _this.seekTime = _this.player.media.duration * (percentage / 100);\n\n if (_this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n _this.seekTime = 0;\n }\n\n if (_this.seekTime > _this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n _this.seekTime = _this.player.media.duration - 1;\n }\n\n _this.mousePosX = event.pageX; // Set time text inside image container\n\n _this.elements.thumb.time.innerText = formatTime(_this.seekTime);\n } // Download and show image\n\n\n _this.showImageAtCurrentTime();\n });\n\n _defineProperty(this, \"endMove\", function () {\n _this.toggleThumbContainer(false, true);\n });\n\n _defineProperty(this, \"startScrubbing\", function (event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n _this.mouseDown = true; // Wait until media has a duration\n\n if (_this.player.media.duration) {\n _this.toggleScrubbingContainer(true);\n\n _this.toggleThumbContainer(false, true); // Download and show image\n\n\n _this.showImageAtCurrentTime();\n }\n }\n });\n\n _defineProperty(this, \"endScrubbing\", function () {\n _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n _this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(_this.player, _this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this.mouseDown) {\n _this.toggleScrubbingContainer(false);\n }\n });\n }\n });\n\n _defineProperty(this, \"listeners\", function () {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n _this.player.on('play', function () {\n _this.toggleThumbContainer(false, true);\n });\n\n _this.player.on('seeked', function () {\n _this.toggleThumbContainer(false);\n });\n\n _this.player.on('timeupdate', function () {\n _this.lastTime = _this.player.media.currentTime;\n });\n });\n\n _defineProperty(this, \"render\", function () {\n // Create HTML element: plyr__preview-thumbnail-container\n _this.elements.thumb.container = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n _this.elements.thumb.imageContainer = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.imageContainer\n });\n\n _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n\n var timeContainer = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.timeContainer\n });\n _this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(_this.elements.thumb.time);\n\n _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n\n if (is$1.element(_this.player.elements.progress)) {\n _this.player.elements.progress.appendChild(_this.elements.thumb.container);\n } // Create HTML element: plyr__preview-scrubbing-container\n\n\n _this.elements.scrubbing.container = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n\n _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);\n });\n\n _defineProperty(this, \"destroy\", function () {\n if (_this.elements.thumb.container) {\n _this.elements.thumb.container.remove();\n }\n\n if (_this.elements.scrubbing.container) {\n _this.elements.scrubbing.container.remove();\n }\n });\n\n _defineProperty(this, \"showImageAtCurrentTime\", function () {\n if (_this.mouseDown) {\n _this.setScrubbingContainerSize();\n } else {\n _this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {\n return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;\n });\n\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n if (!_this.mouseDown) {\n _this.toggleThumbContainer(hasThumb);\n } // No matching thumb found\n\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n _this.thumbnails.forEach(function (thumbnail, index) {\n if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n\n if (thumbNum !== _this.showingThumb) {\n _this.showingThumb = thumbNum;\n\n _this.loadImage(qualityIndex);\n }\n });\n\n _defineProperty(this, \"loadImage\", function () {\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = _this.showingThumb;\n var thumbnail = _this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (_this.loadingImage && _this.usingSprites) {\n _this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n _this.showingThumbFilename = thumbFilename;\n\n _this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n\n previewImage.onload = function () {\n return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n _this.loadingImage = previewImage;\n\n _this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n\n _this.currentImageElement.dataset.index = thumbNum;\n\n _this.removeOldImages(_this.currentImageElement);\n }\n });\n\n _defineProperty(this, \"showImage\", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n _this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n\n _this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n _this.currentImageContainer.appendChild(previewImage);\n\n _this.currentImageElement = previewImage;\n\n if (!_this.loadedImages.includes(thumbFilename)) {\n _this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n });\n\n _defineProperty(this, \"removeOldImages\", function (currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(_this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n });\n\n _defineProperty(this, \"preloadNearby\", function (thumbNum) {\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;\n\n if (_this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n });\n\n _defineProperty(this, \"getHigherQuality\", function (currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < _this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (_this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < _this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this.showingThumbFilename === thumbFilename) {\n _this.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n });\n\n _defineProperty(this, \"toggleThumbContainer\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;\n\n _this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n _this.showingThumb = null;\n _this.showingThumbFilename = null;\n }\n });\n\n _defineProperty(this, \"toggleScrubbingContainer\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n\n _this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n _this.showingThumb = null;\n _this.showingThumbFilename = null;\n }\n });\n\n _defineProperty(this, \"determineContainerAutoSizing\", function () {\n if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n _this.sizeSpecifiedInCSS = true;\n }\n });\n\n _defineProperty(this, \"setThumbContainerSizeAndPos\", function () {\n if (!_this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);\n _this.elements.thumb.imageContainer.style.height = \"\".concat(_this.thumbContainerHeight, \"px\");\n _this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {\n var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);\n\n _this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {\n var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);\n _this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n }\n\n _this.setThumbContainerPos();\n });\n\n _defineProperty(this, \"setThumbContainerPos\", function () {\n var seekbarRect = _this.player.elements.progress.getBoundingClientRect();\n\n var plyrRect = _this.player.elements.container.getBoundingClientRect();\n\n var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n });\n\n _defineProperty(this, \"setScrubbingContainerSize\", function () {\n var _fitRatio = fitRatio(_this.thumbAspectRatio, {\n width: _this.player.media.clientWidth,\n height: _this.player.media.clientHeight\n }),\n width = _fitRatio.width,\n height = _fitRatio.height;\n\n _this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n _this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n });\n\n _defineProperty(this, \"setImageSizeAndOffset\", function (previewImage, frame) {\n if (!_this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n });\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n height = _fitRatio2.height;\n\n return height;\n } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n }();\n\n var source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Update previewThumbnails config & reload plugin\n\n\n if (!is$1.empty(input.previewThumbnails)) {\n Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n _this2.previewThumbnails.destroy();\n\n _this2.previewThumbnails = null;\n } // Create new instance if it is still enabled\n\n\n if (_this2.config.previewThumbnails.enabled) {\n _this2.previewThumbnails = new PreviewThumbnails(_this2);\n }\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n };\n\n /**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\n function clamp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n return Math.min(Math.max(input, min), max);\n }\n\n // TODO: Use a WeakMap for private globals\n // const globals = new WeakMap();\n // Plyr instance\n\n var Plyr = /*#__PURE__*/function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n _defineProperty(this, \"play\", function () {\n if (!is$1.function(_this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (_this.ads && _this.ads.enabled) {\n _this.ads.managerPromise.then(function () {\n return _this.ads.play();\n }).catch(function () {\n return silencePromise(_this.media.play());\n });\n } // Return the promise (for HTML5)\n\n\n return _this.media.play();\n });\n\n _defineProperty(this, \"pause\", function () {\n if (!_this.playing || !is$1.function(_this.media.pause)) {\n return null;\n }\n\n return _this.media.pause();\n });\n\n _defineProperty(this, \"togglePlay\", function (input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !_this.playing;\n\n if (toggle) {\n return _this.play();\n }\n\n return _this.pause();\n });\n\n _defineProperty(this, \"stop\", function () {\n if (_this.isHTML5) {\n _this.pause();\n\n _this.restart();\n } else if (is$1.function(_this.media.stop)) {\n _this.media.stop();\n }\n });\n\n _defineProperty(this, \"restart\", function () {\n _this.currentTime = 0;\n });\n\n _defineProperty(this, \"rewind\", function (seekTime) {\n _this.currentTime -= is$1.number(seekTime) ? seekTime : _this.config.seekTime;\n });\n\n _defineProperty(this, \"forward\", function (seekTime) {\n _this.currentTime += is$1.number(seekTime) ? seekTime : _this.config.seekTime;\n });\n\n _defineProperty(this, \"increaseVolume\", function (step) {\n var volume = _this.media.muted ? 0 : _this.volume;\n _this.volume = volume + (is$1.number(step) ? step : 0);\n });\n\n _defineProperty(this, \"decreaseVolume\", function (step) {\n _this.increaseVolume(-step);\n });\n\n _defineProperty(this, \"airplay\", function () {\n // Show dialog if supported\n if (support.airplay) {\n _this.media.webkitShowPlaybackTargetPicker();\n }\n });\n\n _defineProperty(this, \"toggleControls\", function (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 var isHidden = hasClass(_this.elements.container, _this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(_this.elements.container, _this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && is$1.array(_this.config.controls) && _this.config.controls.includes('settings') && !is$1.empty(_this.config.settings)) {\n controls.toggleMenu.call(_this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(_this, _this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n });\n\n _defineProperty(this, \"on\", function (event, callback) {\n on.call(_this, _this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"once\", function (event, callback) {\n once.call(_this, _this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"off\", function (event, callback) {\n off(_this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"destroy\", function (callback) {\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!_this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this.embed = null; // If it's a soft destroy, make minimal changes\n\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); // Clear for GC\n\n _this.elements.buttons.play = null;\n _this.elements.captions = null;\n _this.elements.controls = null;\n _this.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this); // Cancel current network requests\n\n html5.cancelRequests.call(_this); // Replace the container with the original element provided\n\n replaceElement(_this.elements.original, _this.elements.container); // Event\n\n triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this.elements.original);\n } // Reset state\n\n\n _this.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this.elements = null;\n _this.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n _this.stop(); // Clear timeouts\n\n\n clearTimeout(_this.timers.loading);\n clearTimeout(_this.timers.controls);\n clearTimeout(_this.timers.resized); // Provider specific stuff\n\n if (_this.isHTML5) {\n // Restore native video controls\n ui.toggleNativeControls.call(_this, true); // Clean up\n\n done();\n } else if (_this.isYouTube) {\n // Clear timers\n clearInterval(_this.timers.buffering);\n clearInterval(_this.timers.playing); // Destroy YouTube API\n\n if (_this.embed !== null && is$1.function(_this.embed.destroy)) {\n _this.embed.destroy();\n } // Clean up\n\n\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 } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n });\n\n _defineProperty(this, \"supports\", function (type) {\n return support.mime.call(_this, type);\n });\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n fullscreen: 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 }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var _type = this.media.tagName.toLowerCase(); // Embed properties\n\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (_type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.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); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.values(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = _type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\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 } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap$1(this.media, this.elements.container);\n } // Migrate custom properties from media to container (so they work 😉)\n\n\n ui.migrateStyles.call(this); // Add style hook\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup fullscreen\n\n\n this.fullscreen = new Fullscreen(this); // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', function () {\n return silencePromise(_this.play());\n });\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return this.provider === providers.html5;\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return this.isYouTube || this.isVimeo;\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return this.provider === providers.youtube;\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return this.provider === providers.vimeo;\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return this.type === types.video;\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return this.type === types.audio;\n }\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n\n }, {\n key: \"playing\",\n\n /**\n * Get playing state\n */\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n\n }, {\n key: \"currentTime\",\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: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\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\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"muted\",\n\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\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 } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var _this2 = this;\n\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Clamp to min/max\n\n\n var min = this.minimumSpeed,\n max = this.maximumSpeed;\n speed = clamp(speed, min, max); // Update config\n\n this.config.speed.selected = speed; // Set media speed\n\n setTimeout(function () {\n _this2.media.playbackRate = speed;\n }, 0);\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Get the minimum allowed speed\n */\n\n }, {\n key: \"minimumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 0.0625;\n }\n /**\n * Get the maximum allowed speed\n */\n\n }, {\n key: \"maximumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 16;\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest$1(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\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\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\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 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 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 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 default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the download URL\n */\n ,\n set: function set(input) {\n if (!is$1.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n controls.setDownloadUrl.call(this);\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(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(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n }\n /**\n * Get the current aspect ratio in use\n */\n\n }, {\n key: \"ratio\",\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n var ratio = reduceAspectRatio(getAspectRatio.call(this));\n return is$1.array(ratio) ? ratio.join(':') : ratio;\n }\n /**\n * Set video aspect ratio\n */\n ,\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is$1.string(input) || !validateRatio(input)) {\n this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n return;\n }\n\n this.config.ratio = input;\n setAspectRatio.call(this);\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\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\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\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\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n\n }], [{\n key: \"supported\",\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\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\n }, {\n key: \"loadSprite\",\n value: function loadSprite$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n }();\n\n Plyr.defaults = cloneDeep(defaults$1);\n\n // ==========================================================================\n\n return Plyr;\n\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 params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\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","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\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 toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\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 (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.7.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\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 nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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 isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","// `Symbol.prototype.description` getter\n// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar isObject = require('../internals/is-object');\nvar defineProperty = require('../internals/object-define-property').f;\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = global.Symbol;\n\nif (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? 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 ? ObjectPrototype : null;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\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","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var anObject = require('../internals/an-object');\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\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(String(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 var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === '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 } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\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(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\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] = [String(value)];\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\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (\r\n (new URLSearchParams('?a=1').toString() === 'a=1') &&\r\n (typeof URLSearchParams.prototype.set === 'function') &&\r\n (typeof URLSearchParams.prototype.entries === 'function')\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.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 if (typeof proto._fromString !== 'function') {\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 if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\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\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 global.URL('b', 'http://a');\r\n u.pathname = 'c d';\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 if (base && typeof base !== 'string') base = String(base);\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 base = base.toLowerCase();\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 var inputElement = doc.createElement('input');\r\n inputElement.type = 'url';\r\n inputElement.value = url;\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || (!inputElement.checkValidity() && !base)) {\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 global.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","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n","'use strict';\nvar redefineAll = require('../internals/redefine-all');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar $has = require('../internals/has');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && $has(data, state.id) && delete data[state.id];\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && $has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $every = require('../internals/array-iteration').every;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('every');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar global = require('../internals/global');\nvar redefineAll = require('../internals/redefine-all');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceIternalState = require('../internals/internal-state').enforce;\nvar NATIVE_WEAK_MAP = require('../internals/native-weak-map');\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var classof = require('../internals/classof-raw');\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nmodule.exports = function (value) {\n if (typeof value != 'number' && classof(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toInteger = require('../internals/to-integer');\nvar thisNumberValue = require('../internals/this-number-value');\nvar repeat = require('../internals/string-repeat');\nvar fails = require('../internals/fails');\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor = Math.floor;\n\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n$({ target: 'Number', proto: true, forced: FORCED }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow(2, 69, 1)) - 69;\n z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + repeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + repeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n }\n});\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","var $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar ownKeys = require('../internals/own-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar createProperty = require('../internals/create-property');\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(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 (\n global.addEventListener &&\n typeof postMessage == 'function' &&\n !global.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!IS_IOS && !IS_NODE && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\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 promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(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\nmodule.exports = queueMicrotask || 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","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can 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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\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 $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\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 var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (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\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/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","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\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 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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\n\nconst isElement = (input) =>\n input !== null &&\n typeof input === 'object' &&\n input.nodeType === 1 &&\n typeof input.style === 'object' &&\n typeof input.ownerDocument === 'object';\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 isEdge: window.navigator.userAgent.includes('Edge'),\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","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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","var $ = require('../internals/export');\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.github.io/ecma262/#sec-math.trunc\n$({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor : ceil)(it);\n }\n});\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = (value) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.4/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\n\n // Update the UI\n this.update();\n\n // this.toggle = this.toggle.bind(this);\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n };\n\n 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\n // Toggle button and fire events\n this.onChange();\n };\n\n // Trap focus inside container\n trapFocus = (event) => {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update = () => {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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","// `Math.sign` method implementation\n// https://tc39.github.io/ecma262/#sec-math.sign\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","var $ = require('../internals/export');\nvar sign = require('../internals/math-sign');\n\n// `Math.sign` method\n// https://tc39.github.io/ecma262/#sec-math.sign\n$({ target: 'Math', stat: true }, {\n sign: sign\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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n };\n\n // Container listeners\n container = () => {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load = () => {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready = () => {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n };\n\n addCuePoints = () => {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","'use strict';\nvar $ = require('../internals/export');\nvar $findIndex = require('../internals/array-iteration').findIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","var $ = require('../internals/export');\nvar lastIndexOf = require('../internals/array-last-index-of');\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: lastIndexOf\n});\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load = () => {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n };\n\n // Download VTT files and parse them\n getThumbnails = () => {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n };\n\n // Process individual VTT file\n getThumbnail = (url) => {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n };\n\n startMove = (event) => {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n };\n\n endMove = () => {\n this.toggleThumbContainer(false, true);\n };\n\n startScrubbing = (event) => {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n };\n\n endScrubbing = () => {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n };\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners = () => {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n };\n\n /**\n * Create HTML elements for image containers\n */\n render = () => {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n };\n\n destroy = () => {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n };\n\n showImageAtCurrentTime = () => {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n };\n\n // Show the image that's currently specified in this.showingThumb\n loadImage = (qualityIndex = 0) => {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n };\n\n showImage = (previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) => {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n };\n\n // Remove all preview images that aren't the designated current image\n removeOldImages = (currentImage) => {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n };\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby = (thumbNum, forward = true) => {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n };\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality = (currentQualityIndex, previewImage, frame, thumbFilename) => {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n };\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer = (toggle = false, clearShowing = false) => {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n toggleScrubbingContainer = (toggle = false) => {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n determineContainerAutoSizing = () => {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n };\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos = () => {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n };\n\n setThumbContainerPos = () => {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n };\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize = () => {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n };\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset = (previewImage, frame) => {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n };\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\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.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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.values(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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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) => support.mime.call(this, type);\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} 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 * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n"]} \ No newline at end of file
diff --git a/dist/plyr.polyfilled.min.mjs b/dist/plyr.polyfilled.min.mjs
index 3599fd69..7eae2aa3 100644
--- a/dist/plyr.polyfilled.min.mjs
+++ b/dist/plyr.polyfilled.min.mjs
@@ -1,3 +1,3 @@
-!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,r;return(t=t||{}).bubbles=!!t.bubbles,t.cancelable=!!t.cancelable,(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.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 commonjsGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var check=function(e){return e&&e.Math==Math&&e},global_1=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof commonjsGlobal&&commonjsGlobal)||function(){return this}()||Function("return this")(),fails=function(e){try{return!!e()}catch(e){return!0}},descriptors=!fails((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),nativePropertyIsEnumerable={}.propertyIsEnumerable,getOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,NASHORN_BUG=getOwnPropertyDescriptor&&!nativePropertyIsEnumerable.call({1:2},1),f=NASHORN_BUG?function(e){var t=getOwnPropertyDescriptor(this,e);return!!t&&t.enumerable}:nativePropertyIsEnumerable,objectPropertyIsEnumerable={f:f},createPropertyDescriptor=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},toString={}.toString,classofRaw=function(e){return toString.call(e).slice(8,-1)},split="".split,indexedObject=fails((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==classofRaw(e)?split.call(e,""):Object(e)}:Object,requireObjectCoercible=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},toIndexedObject=function(e){return indexedObject(requireObjectCoercible(e))},isObject=function(e){return"object"==typeof e?null!==e:"function"==typeof e},toPrimitive=function(e,t){if(!isObject(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!isObject(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!isObject(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!isObject(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},hasOwnProperty={}.hasOwnProperty,has=function(e,t){return hasOwnProperty.call(e,t)},document$1=global_1.document,EXISTS=isObject(document$1)&&isObject(document$1.createElement),documentCreateElement=function(e){return EXISTS?document$1.createElement(e):{}},ie8DomDefine=!descriptors&&!fails((function(){return 7!=Object.defineProperty(documentCreateElement("div"),"a",{get:function(){return 7}}).a})),nativeGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,f$1=descriptors?nativeGetOwnPropertyDescriptor:function(e,t){if(e=toIndexedObject(e),t=toPrimitive(t,!0),ie8DomDefine)try{return nativeGetOwnPropertyDescriptor(e,t)}catch(e){}if(has(e,t))return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(e,t),e[t])},objectGetOwnPropertyDescriptor={f:f$1},anObject=function(e){if(!isObject(e))throw TypeError(String(e)+" is not an object");return e},nativeDefineProperty=Object.defineProperty,f$2=descriptors?nativeDefineProperty:function(e,t,n){if(anObject(e),t=toPrimitive(t,!0),anObject(n),ie8DomDefine)try{return nativeDefineProperty(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},objectDefineProperty={f:f$2},createNonEnumerableProperty=descriptors?function(e,t,n){return objectDefineProperty.f(e,t,createPropertyDescriptor(1,n))}:function(e,t,n){return e[t]=n,e},setGlobal=function(e,t){try{createNonEnumerableProperty(global_1,e,t)}catch(n){global_1[e]=t}return t},SHARED="__core-js_shared__",store=global_1[SHARED]||setGlobal(SHARED,{}),sharedStore=store,functionToString=Function.toString;"function"!=typeof sharedStore.inspectSource&&(sharedStore.inspectSource=function(e){return functionToString.call(e)});var set,get,has$1,inspectSource=sharedStore.inspectSource,WeakMap$1=global_1.WeakMap,nativeWeakMap="function"==typeof WeakMap$1&&/native code/.test(inspectSource(WeakMap$1)),isPure=!1,shared=createCommonjsModule((function(e){(e.exports=function(e,t){return sharedStore[e]||(sharedStore[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.7.0",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),id=0,postfix=Math.random(),uid=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++id+postfix).toString(36)},keys=shared("keys"),sharedKey=function(e){return keys[e]||(keys[e]=uid(e))},hiddenKeys={},WeakMap$2=global_1.WeakMap,enforce=function(e){return has$1(e)?get(e):set(e,{})},getterFor=function(e){return function(t){var n;if(!isObject(t)||(n=get(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}};if(nativeWeakMap){var store$1=sharedStore.state||(sharedStore.state=new WeakMap$2),wmget=store$1.get,wmhas=store$1.has,wmset=store$1.set;set=function(e,t){return t.facade=e,wmset.call(store$1,e,t),t},get=function(e){return wmget.call(store$1,e)||{}},has$1=function(e){return wmhas.call(store$1,e)}}else{var STATE=sharedKey("state");hiddenKeys[STATE]=!0,set=function(e,t){return t.facade=e,createNonEnumerableProperty(e,STATE,t),t},get=function(e){return has(e,STATE)?e[STATE]:{}},has$1=function(e){return has(e,STATE)}}var activeXDocument,internalState={set:set,get:get,has:has$1,enforce:enforce,getterFor:getterFor},redefine=createCommonjsModule((function(e){var t=internalState.get,n=internalState.enforce,r=String(String).split("String");(e.exports=function(e,t,i,o){var a,s=!!o&&!!o.unsafe,l=!!o&&!!o.enumerable,c=!!o&&!!o.noTargetGet;"function"==typeof i&&("string"!=typeof t||has(i,"name")||createNonEnumerableProperty(i,"name",t),(a=n(i)).source||(a.source=r.join("string"==typeof t?t:""))),e!==global_1?(s?!c&&e[t]&&(l=!0):delete e[t],l?e[t]=i:createNonEnumerableProperty(e,t,i)):l?e[t]=i:setGlobal(t,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||inspectSource(this)}))})),path=global_1,aFunction=function(e){return"function"==typeof e?e:void 0},getBuiltIn=function(e,t){return arguments.length<2?aFunction(path[e])||aFunction(global_1[e]):path[e]&&path[e][t]||global_1[e]&&global_1[e][t]},ceil=Math.ceil,floor=Math.floor,toInteger=function(e){return isNaN(e=+e)?0:(e>0?floor:ceil)(e)},min=Math.min,toLength=function(e){return e>0?min(toInteger(e),9007199254740991):0},max=Math.max,min$1=Math.min,toAbsoluteIndex=function(e,t){var n=toInteger(e);return n<0?max(n+t,0):min$1(n,t)},createMethod=function(e){return function(t,n,r){var i,o=toIndexedObject(t),a=toLength(o.length),s=toAbsoluteIndex(r,a);if(e&&n!=n){for(;a>s;)if((i=o[s++])!=i)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},arrayIncludes={includes:createMethod(!0),indexOf:createMethod(!1)},indexOf=arrayIncludes.indexOf,objectKeysInternal=function(e,t){var n,r=toIndexedObject(e),i=0,o=[];for(n in r)!has(hiddenKeys,n)&&has(r,n)&&o.push(n);for(;t.length>i;)has(r,n=t[i++])&&(~indexOf(o,n)||o.push(n));return o},enumBugKeys=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],hiddenKeys$1=enumBugKeys.concat("length","prototype"),f$3=Object.getOwnPropertyNames||function(e){return objectKeysInternal(e,hiddenKeys$1)},objectGetOwnPropertyNames={f:f$3},f$4=Object.getOwnPropertySymbols,objectGetOwnPropertySymbols={f:f$4},ownKeys=getBuiltIn("Reflect","ownKeys")||function(e){var t=objectGetOwnPropertyNames.f(anObject(e)),n=objectGetOwnPropertySymbols.f;return n?t.concat(n(e)):t},copyConstructorProperties=function(e,t){for(var n=ownKeys(t),r=objectDefineProperty.f,i=objectGetOwnPropertyDescriptor.f,o=0;o<n.length;o++){var a=n[o];has(e,a)||r(e,a,i(t,a))}},replacement=/#|\.prototype\./,isForced=function(e,t){var n=data[normalize(e)];return n==POLYFILL||n!=NATIVE&&("function"==typeof t?fails(t):!!t)},normalize=isForced.normalize=function(e){return String(e).replace(replacement,".").toLowerCase()},data=isForced.data={},NATIVE=isForced.NATIVE="N",POLYFILL=isForced.POLYFILL="P",isForced_1=isForced,getOwnPropertyDescriptor$1=objectGetOwnPropertyDescriptor.f,_export=function(e,t){var n,r,i,o,a,s=e.target,l=e.global,c=e.stat;if(n=l?global_1:c?global_1[s]||setGlobal(s,{}):(global_1[s]||{}).prototype)for(r in t){if(o=t[r],i=e.noTargetGet?(a=getOwnPropertyDescriptor$1(n,r))&&a.value:n[r],!isForced_1(l?r:s+(c?".":"#")+r,e.forced)&&void 0!==i){if(typeof o==typeof i)continue;copyConstructorProperties(o,i)}(e.sham||i&&i.sham)&&createNonEnumerableProperty(o,"sham",!0),redefine(n,r,o,e)}},nativeSymbol=!!Object.getOwnPropertySymbols&&!fails((function(){return!String(Symbol())})),useSymbolAsUid=nativeSymbol&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,isArray=Array.isArray||function(e){return"Array"==classofRaw(e)},toObject=function(e){return Object(requireObjectCoercible(e))},objectKeys=Object.keys||function(e){return objectKeysInternal(e,enumBugKeys)},objectDefineProperties=descriptors?Object.defineProperties:function(e,t){anObject(e);for(var n,r=objectKeys(t),i=r.length,o=0;i>o;)objectDefineProperty.f(e,n=r[o++],t[n]);return e},html=getBuiltIn("document","documentElement"),GT=">",LT="<",PROTOTYPE="prototype",SCRIPT="script",IE_PROTO=sharedKey("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(e){return LT+SCRIPT+GT+e+LT+"/"+SCRIPT+GT},NullProtoObjectViaActiveX=function(e){e.write(scriptTag("")),e.close();var t=e.parentWindow.Object;return e=null,t},NullProtoObjectViaIFrame=function(){var e,t=documentCreateElement("iframe"),n="java"+SCRIPT+":";return t.style.display="none",html.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(scriptTag("document.F=Object")),e.close(),e.F},NullProtoObject=function(){try{activeXDocument=document.domain&&new ActiveXObject("htmlfile")}catch(e){}NullProtoObject=activeXDocument?NullProtoObjectViaActiveX(activeXDocument):NullProtoObjectViaIFrame();for(var e=enumBugKeys.length;e--;)delete NullProtoObject[PROTOTYPE][enumBugKeys[e]];return NullProtoObject()};hiddenKeys[IE_PROTO]=!0;var objectCreate=Object.create||function(e,t){var n;return null!==e?(EmptyConstructor[PROTOTYPE]=anObject(e),n=new EmptyConstructor,EmptyConstructor[PROTOTYPE]=null,n[IE_PROTO]=e):n=NullProtoObject(),void 0===t?n:objectDefineProperties(n,t)},nativeGetOwnPropertyNames=objectGetOwnPropertyNames.f,toString$1={}.toString,windowNames="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],getWindowNames=function(e){try{return nativeGetOwnPropertyNames(e)}catch(e){return windowNames.slice()}},f$5=function(e){return windowNames&&"[object Window]"==toString$1.call(e)?getWindowNames(e):nativeGetOwnPropertyNames(toIndexedObject(e))},objectGetOwnPropertyNamesExternal={f:f$5},WellKnownSymbolsStore=shared("wks"),Symbol$1=global_1.Symbol,createWellKnownSymbol=useSymbolAsUid?Symbol$1:Symbol$1&&Symbol$1.withoutSetter||uid,wellKnownSymbol=function(e){return has(WellKnownSymbolsStore,e)||(nativeSymbol&&has(Symbol$1,e)?WellKnownSymbolsStore[e]=Symbol$1[e]:WellKnownSymbolsStore[e]=createWellKnownSymbol("Symbol."+e)),WellKnownSymbolsStore[e]},f$6=wellKnownSymbol,wellKnownSymbolWrapped={f:f$6},defineProperty=objectDefineProperty.f,defineWellKnownSymbol=function(e){var t=path.Symbol||(path.Symbol={});has(t,e)||defineProperty(t,e,{value:wellKnownSymbolWrapped.f(e)})},defineProperty$1=objectDefineProperty.f,TO_STRING_TAG=wellKnownSymbol("toStringTag"),setToStringTag=function(e,t,n){e&&!has(e=n?e:e.prototype,TO_STRING_TAG)&&defineProperty$1(e,TO_STRING_TAG,{configurable:!0,value:t})},aFunction$1=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},functionBindContext=function(e,t,n){if(aFunction$1(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},SPECIES=wellKnownSymbol("species"),arraySpeciesCreate=function(e,t){var n;return isArray(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!isArray(n.prototype)?isObject(n)&&null===(n=n[SPECIES])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},push=[].push,createMethod$1=function(e){var t=1==e,n=2==e,r=3==e,i=4==e,o=6==e,a=5==e||o;return function(s,l,c,u){for(var d,h,p=toObject(s),f=indexedObject(p),m=functionBindContext(l,c,3),g=toLength(f.length),y=0,b=u||arraySpeciesCreate,v=t?b(s,g):n?b(s,0):void 0;g>y;y++)if((a||y in f)&&(h=m(d=f[y],y,p),e))if(t)v[y]=h;else if(h)switch(e){case 3:return!0;case 5:return d;case 6:return y;case 2:push.call(v,d)}else if(i)return!1;return o?-1:r||i?i:v}},arrayIteration={forEach:createMethod$1(0),map:createMethod$1(1),filter:createMethod$1(2),some:createMethod$1(3),every:createMethod$1(4),find:createMethod$1(5),findIndex:createMethod$1(6)},$forEach=arrayIteration.forEach,HIDDEN=sharedKey("hidden"),SYMBOL="Symbol",PROTOTYPE$1="prototype",TO_PRIMITIVE=wellKnownSymbol("toPrimitive"),setInternalState=internalState.set,getInternalState=internalState.getterFor(SYMBOL),ObjectPrototype=Object[PROTOTYPE$1],$Symbol=global_1.Symbol,$stringify=getBuiltIn("JSON","stringify"),nativeGetOwnPropertyDescriptor$1=objectGetOwnPropertyDescriptor.f,nativeDefineProperty$1=objectDefineProperty.f,nativeGetOwnPropertyNames$1=objectGetOwnPropertyNamesExternal.f,nativePropertyIsEnumerable$1=objectPropertyIsEnumerable.f,AllSymbols=shared("symbols"),ObjectPrototypeSymbols=shared("op-symbols"),StringToSymbolRegistry=shared("string-to-symbol-registry"),SymbolToStringRegistry=shared("symbol-to-string-registry"),WellKnownSymbolsStore$1=shared("wks"),QObject=global_1.QObject,USE_SETTER=!QObject||!QObject[PROTOTYPE$1]||!QObject[PROTOTYPE$1].findChild,setSymbolDescriptor=descriptors&&fails((function(){return 7!=objectCreate(nativeDefineProperty$1({},"a",{get:function(){return nativeDefineProperty$1(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=nativeGetOwnPropertyDescriptor$1(ObjectPrototype,t);r&&delete ObjectPrototype[t],nativeDefineProperty$1(e,t,n),r&&e!==ObjectPrototype&&nativeDefineProperty$1(ObjectPrototype,t,r)}:nativeDefineProperty$1,wrap=function(e,t){var n=AllSymbols[e]=objectCreate($Symbol[PROTOTYPE$1]);return setInternalState(n,{type:SYMBOL,tag:e,description:t}),descriptors||(n.description=t),n},isSymbol=useSymbolAsUid?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof $Symbol},$defineProperty=function(e,t,n){e===ObjectPrototype&&$defineProperty(ObjectPrototypeSymbols,t,n),anObject(e);var r=toPrimitive(t,!0);return anObject(n),has(AllSymbols,r)?(n.enumerable?(has(e,HIDDEN)&&e[HIDDEN][r]&&(e[HIDDEN][r]=!1),n=objectCreate(n,{enumerable:createPropertyDescriptor(0,!1)})):(has(e,HIDDEN)||nativeDefineProperty$1(e,HIDDEN,createPropertyDescriptor(1,{})),e[HIDDEN][r]=!0),setSymbolDescriptor(e,r,n)):nativeDefineProperty$1(e,r,n)},$defineProperties=function(e,t){anObject(e);var n=toIndexedObject(t),r=objectKeys(n).concat($getOwnPropertySymbols(n));return $forEach(r,(function(t){descriptors&&!$propertyIsEnumerable.call(n,t)||$defineProperty(e,t,n[t])})),e},$create=function(e,t){return void 0===t?objectCreate(e):$defineProperties(objectCreate(e),t)},$propertyIsEnumerable=function(e){var t=toPrimitive(e,!0),n=nativePropertyIsEnumerable$1.call(this,t);return!(this===ObjectPrototype&&has(AllSymbols,t)&&!has(ObjectPrototypeSymbols,t))&&(!(n||!has(this,t)||!has(AllSymbols,t)||has(this,HIDDEN)&&this[HIDDEN][t])||n)},$getOwnPropertyDescriptor=function(e,t){var n=toIndexedObject(e),r=toPrimitive(t,!0);if(n!==ObjectPrototype||!has(AllSymbols,r)||has(ObjectPrototypeSymbols,r)){var i=nativeGetOwnPropertyDescriptor$1(n,r);return!i||!has(AllSymbols,r)||has(n,HIDDEN)&&n[HIDDEN][r]||(i.enumerable=!0),i}},$getOwnPropertyNames=function(e){var t=nativeGetOwnPropertyNames$1(toIndexedObject(e)),n=[];return $forEach(t,(function(e){has(AllSymbols,e)||has(hiddenKeys,e)||n.push(e)})),n},$getOwnPropertySymbols=function(e){var t=e===ObjectPrototype,n=nativeGetOwnPropertyNames$1(t?ObjectPrototypeSymbols:toIndexedObject(e)),r=[];return $forEach(n,(function(e){!has(AllSymbols,e)||t&&!has(ObjectPrototype,e)||r.push(AllSymbols[e])})),r};if(nativeSymbol||(redefine(($Symbol=function(){if(this instanceof $Symbol)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=uid(e),n=function(e){this===ObjectPrototype&&n.call(ObjectPrototypeSymbols,e),has(this,HIDDEN)&&has(this[HIDDEN],t)&&(this[HIDDEN][t]=!1),setSymbolDescriptor(this,t,createPropertyDescriptor(1,e))};return descriptors&&USE_SETTER&&setSymbolDescriptor(ObjectPrototype,t,{configurable:!0,set:n}),wrap(t,e)})[PROTOTYPE$1],"toString",(function(){return getInternalState(this).tag})),redefine($Symbol,"withoutSetter",(function(e){return wrap(uid(e),e)})),objectPropertyIsEnumerable.f=$propertyIsEnumerable,objectDefineProperty.f=$defineProperty,objectGetOwnPropertyDescriptor.f=$getOwnPropertyDescriptor,objectGetOwnPropertyNames.f=objectGetOwnPropertyNamesExternal.f=$getOwnPropertyNames,objectGetOwnPropertySymbols.f=$getOwnPropertySymbols,wellKnownSymbolWrapped.f=function(e){return wrap(wellKnownSymbol(e),e)},descriptors&&(nativeDefineProperty$1($Symbol[PROTOTYPE$1],"description",{configurable:!0,get:function(){return getInternalState(this).description}}),redefine(ObjectPrototype,"propertyIsEnumerable",$propertyIsEnumerable,{unsafe:!0}))),_export({global:!0,wrap:!0,forced:!nativeSymbol,sham:!nativeSymbol},{Symbol:$Symbol}),$forEach(objectKeys(WellKnownSymbolsStore$1),(function(e){defineWellKnownSymbol(e)})),_export({target:SYMBOL,stat:!0,forced:!nativeSymbol},{for:function(e){var t=String(e);if(has(StringToSymbolRegistry,t))return StringToSymbolRegistry[t];var n=$Symbol(t);return StringToSymbolRegistry[t]=n,SymbolToStringRegistry[n]=t,n},keyFor:function(e){if(!isSymbol(e))throw TypeError(e+" is not a symbol");if(has(SymbolToStringRegistry,e))return SymbolToStringRegistry[e]},useSetter:function(){USE_SETTER=!0},useSimple:function(){USE_SETTER=!1}}),_export({target:"Object",stat:!0,forced:!nativeSymbol,sham:!descriptors},{create:$create,defineProperty:$defineProperty,defineProperties:$defineProperties,getOwnPropertyDescriptor:$getOwnPropertyDescriptor}),_export({target:"Object",stat:!0,forced:!nativeSymbol},{getOwnPropertyNames:$getOwnPropertyNames,getOwnPropertySymbols:$getOwnPropertySymbols}),_export({target:"Object",stat:!0,forced:fails((function(){objectGetOwnPropertySymbols.f(1)}))},{getOwnPropertySymbols:function(e){return objectGetOwnPropertySymbols.f(toObject(e))}}),$stringify){var FORCED_JSON_STRINGIFY=!nativeSymbol||fails((function(){var e=$Symbol();return"[null]"!=$stringify([e])||"{}"!=$stringify({a:e})||"{}"!=$stringify(Object(e))}));_export({target:"JSON",stat:!0,forced:FORCED_JSON_STRINGIFY},{stringify:function(e,t,n){for(var r,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(r=t,(isObject(t)||void 0!==e)&&!isSymbol(e))return isArray(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!isSymbol(t))return t}),i[1]=t,$stringify.apply(null,i)}})}$Symbol[PROTOTYPE$1][TO_PRIMITIVE]||createNonEnumerableProperty($Symbol[PROTOTYPE$1],TO_PRIMITIVE,$Symbol[PROTOTYPE$1].valueOf),setToStringTag($Symbol,SYMBOL),hiddenKeys[HIDDEN]=!0;var defineProperty$2=objectDefineProperty.f,NativeSymbol=global_1.Symbol;if(descriptors&&"function"==typeof NativeSymbol&&(!("description"in NativeSymbol.prototype)||void 0!==NativeSymbol().description)){var EmptyStringDescriptionStore={},SymbolWrapper=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof SymbolWrapper?new NativeSymbol(e):void 0===e?NativeSymbol():NativeSymbol(e);return""===e&&(EmptyStringDescriptionStore[t]=!0),t};copyConstructorProperties(SymbolWrapper,NativeSymbol);var symbolPrototype=SymbolWrapper.prototype=NativeSymbol.prototype;symbolPrototype.constructor=SymbolWrapper;var symbolToString=symbolPrototype.toString,native="Symbol(test)"==String(NativeSymbol("test")),regexp=/^Symbol\((.*)\)[^)]+$/;defineProperty$2(symbolPrototype,"description",{configurable:!0,get:function(){var e=isObject(this)?this.valueOf():this,t=symbolToString.call(e);if(has(EmptyStringDescriptionStore,e))return"";var n=native?t.slice(7,-1):t.replace(regexp,"$1");return""===n?void 0:n}}),_export({global:!0,forced:!0},{Symbol:SymbolWrapper})}defineWellKnownSymbol("iterator");var arrayMethodIsStrict=function(e,t){var n=[][e];return!!n&&fails((function(){n.call(null,t||function(){throw 1},1)}))},defineProperty$3=Object.defineProperty,cache={},thrower=function(e){throw e},arrayMethodUsesToLength=function(e,t){if(has(cache,e))return cache[e];t||(t={});var n=[][e],r=!!has(t,"ACCESSORS")&&t.ACCESSORS,i=has(t,0)?t[0]:thrower,o=has(t,1)?t[1]:void 0;return cache[e]=!!n&&!fails((function(){if(r&&!descriptors)return!0;var e={length:-1};r?defineProperty$3(e,1,{enumerable:!0,get:thrower}):e[1]=1,n.call(e,i,o)}))},$forEach$1=arrayIteration.forEach,STRICT_METHOD=arrayMethodIsStrict("forEach"),USES_TO_LENGTH=arrayMethodUsesToLength("forEach"),arrayForEach=STRICT_METHOD&&USES_TO_LENGTH?[].forEach:function(e){return $forEach$1(this,e,arguments.length>1?arguments[1]:void 0)};_export({target:"Array",proto:!0,forced:[].forEach!=arrayForEach},{forEach:arrayForEach});var $indexOf=arrayIncludes.indexOf,nativeIndexOf=[].indexOf,NEGATIVE_ZERO=!!nativeIndexOf&&1/[1].indexOf(1,-0)<0,STRICT_METHOD$1=arrayMethodIsStrict("indexOf"),USES_TO_LENGTH$1=arrayMethodUsesToLength("indexOf",{ACCESSORS:!0,1:0});_export({target:"Array",proto:!0,forced:NEGATIVE_ZERO||!STRICT_METHOD$1||!USES_TO_LENGTH$1},{indexOf:function(e){return NEGATIVE_ZERO?nativeIndexOf.apply(this,arguments)||0:$indexOf(this,e,arguments.length>1?arguments[1]:void 0)}});var UNSCOPABLES=wellKnownSymbol("unscopables"),ArrayPrototype=Array.prototype;null==ArrayPrototype[UNSCOPABLES]&&objectDefineProperty.f(ArrayPrototype,UNSCOPABLES,{configurable:!0,value:objectCreate(null)});var IteratorPrototype,PrototypeOfArrayIteratorPrototype,arrayIterator,addToUnscopables=function(e){ArrayPrototype[UNSCOPABLES][e]=!0},iterators={},correctPrototypeGetter=!fails((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),IE_PROTO$1=sharedKey("IE_PROTO"),ObjectPrototype$1=Object.prototype,objectGetPrototypeOf=correctPrototypeGetter?Object.getPrototypeOf:function(e){return e=toObject(e),has(e,IE_PROTO$1)?e[IE_PROTO$1]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?ObjectPrototype$1:null},ITERATOR=wellKnownSymbol("iterator"),BUGGY_SAFARI_ITERATORS=!1,returnThis=function(){return this};[].keys&&("next"in(arrayIterator=[].keys())?(PrototypeOfArrayIteratorPrototype=objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator)))!==Object.prototype&&(IteratorPrototype=PrototypeOfArrayIteratorPrototype):BUGGY_SAFARI_ITERATORS=!0),null==IteratorPrototype&&(IteratorPrototype={}),has(IteratorPrototype,ITERATOR)||createNonEnumerableProperty(IteratorPrototype,ITERATOR,returnThis);var iteratorsCore={IteratorPrototype:IteratorPrototype,BUGGY_SAFARI_ITERATORS:BUGGY_SAFARI_ITERATORS},IteratorPrototype$1=iteratorsCore.IteratorPrototype,returnThis$1=function(){return this},createIteratorConstructor=function(e,t,n){var r=t+" Iterator";return e.prototype=objectCreate(IteratorPrototype$1,{next:createPropertyDescriptor(1,n)}),setToStringTag(e,r,!1),iterators[r]=returnThis$1,e},aPossiblePrototype=function(e){if(!isObject(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e},objectSetPrototypeOf=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return anObject(n),aPossiblePrototype(r),t?e.call(n,r):n.__proto__=r,n}}():void 0),IteratorPrototype$2=iteratorsCore.IteratorPrototype,BUGGY_SAFARI_ITERATORS$1=iteratorsCore.BUGGY_SAFARI_ITERATORS,ITERATOR$1=wellKnownSymbol("iterator"),KEYS="keys",VALUES="values",ENTRIES="entries",returnThis$2=function(){return this},defineIterator=function(e,t,n,r,i,o,a){createIteratorConstructor(n,t,r);var s,l,c,u=function(e){if(e===i&&m)return m;if(!BUGGY_SAFARI_ITERATORS$1&&e in p)return p[e];switch(e){case KEYS:case VALUES:case ENTRIES:return function(){return new n(this,e)}}return function(){return new n(this)}},d=t+" Iterator",h=!1,p=e.prototype,f=p[ITERATOR$1]||p["@@iterator"]||i&&p[i],m=!BUGGY_SAFARI_ITERATORS$1&&f||u(i),g="Array"==t&&p.entries||f;if(g&&(s=objectGetPrototypeOf(g.call(new e)),IteratorPrototype$2!==Object.prototype&&s.next&&(objectGetPrototypeOf(s)!==IteratorPrototype$2&&(objectSetPrototypeOf?objectSetPrototypeOf(s,IteratorPrototype$2):"function"!=typeof s[ITERATOR$1]&&createNonEnumerableProperty(s,ITERATOR$1,returnThis$2)),setToStringTag(s,d,!0))),i==VALUES&&f&&f.name!==VALUES&&(h=!0,m=function(){return f.call(this)}),p[ITERATOR$1]!==m&&createNonEnumerableProperty(p,ITERATOR$1,m),iterators[t]=m,i)if(l={values:u(VALUES),keys:o?m:u(KEYS),entries:u(ENTRIES)},a)for(c in l)(BUGGY_SAFARI_ITERATORS$1||h||!(c in p))&&redefine(p,c,l[c]);else _export({target:t,proto:!0,forced:BUGGY_SAFARI_ITERATORS$1||h},l);return l},ARRAY_ITERATOR="Array Iterator",setInternalState$1=internalState.set,getInternalState$1=internalState.getterFor(ARRAY_ITERATOR),es_array_iterator=defineIterator(Array,"Array",(function(e,t){setInternalState$1(this,{type:ARRAY_ITERATOR,target:toIndexedObject(e),index:0,kind:t})}),(function(){var e=getInternalState$1(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");iterators.Arguments=iterators.Array,addToUnscopables("keys"),addToUnscopables("values"),addToUnscopables("entries");var nativeJoin=[].join,ES3_STRINGS=indexedObject!=Object,STRICT_METHOD$2=arrayMethodIsStrict("join",",");_export({target:"Array",proto:!0,forced:ES3_STRINGS||!STRICT_METHOD$2},{join:function(e){return nativeJoin.call(toIndexedObject(this),void 0===e?",":e)}});var match,version,createProperty=function(e,t,n){var r=toPrimitive(t);r in e?objectDefineProperty.f(e,r,createPropertyDescriptor(0,n)):e[r]=n},engineUserAgent=getBuiltIn("navigator","userAgent")||"",process=global_1.process,versions=process&&process.versions,v8=versions&&versions.v8;v8?version=(match=v8.split("."))[0]+match[1]:engineUserAgent&&(!(match=engineUserAgent.match(/Edge\/(\d+)/))||match[1]>=74)&&(match=engineUserAgent.match(/Chrome\/(\d+)/))&&(version=match[1]);var engineV8Version=version&&+version,SPECIES$1=wellKnownSymbol("species"),arrayMethodHasSpeciesSupport=function(e){return engineV8Version>=51||!fails((function(){var t=[];return(t.constructor={})[SPECIES$1]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},HAS_SPECIES_SUPPORT=arrayMethodHasSpeciesSupport("slice"),USES_TO_LENGTH$2=arrayMethodUsesToLength("slice",{ACCESSORS:!0,0:0,1:2}),SPECIES$2=wellKnownSymbol("species"),nativeSlice=[].slice,max$1=Math.max;_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT||!USES_TO_LENGTH$2},{slice:function(e,t){var n,r,i,o=toIndexedObject(this),a=toLength(o.length),s=toAbsoluteIndex(e,a),l=toAbsoluteIndex(void 0===t?a:t,a);if(isArray(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!isArray(n.prototype)?isObject(n)&&null===(n=n[SPECIES$2])&&(n=void 0):n=void 0,n===Array||void 0===n))return nativeSlice.call(o,s,l);for(r=new(void 0===n?Array:n)(max$1(l-s,0)),i=0;s<l;s++,i++)s in o&&createProperty(r,i,o[s]);return r.length=i,r}});var TO_STRING_TAG$1=wellKnownSymbol("toStringTag"),test={};test[TO_STRING_TAG$1]="z";var toStringTagSupport="[object z]"===String(test),TO_STRING_TAG$2=wellKnownSymbol("toStringTag"),CORRECT_ARGUMENTS="Arguments"==classofRaw(function(){return arguments}()),tryGet=function(e,t){try{return e[t]}catch(e){}},classof=toStringTagSupport?classofRaw:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=tryGet(t=Object(e),TO_STRING_TAG$2))?n:CORRECT_ARGUMENTS?classofRaw(t):"Object"==(r=classofRaw(t))&&"function"==typeof t.callee?"Arguments":r},objectToString=toStringTagSupport?{}.toString:function(){return"[object "+classof(this)+"]"};toStringTagSupport||redefine(Object.prototype,"toString",objectToString,{unsafe:!0});var regexpFlags=function(){var e=anObject(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function RE(e,t){return RegExp(e,t)}var UNSUPPORTED_Y=fails((function(){var e=RE("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET=fails((function(){var e=RE("^r","gy");return e.lastIndex=2,null!=e.exec("str")})),regexpStickyHelpers={UNSUPPORTED_Y:UNSUPPORTED_Y,BROKEN_CARET:BROKEN_CARET},nativeExec=RegExp.prototype.exec,nativeReplace=String.prototype.replace,patchedExec=nativeExec,UPDATES_LAST_INDEX_WRONG=function(){var e=/a/,t=/b*/g;return nativeExec.call(e,"a"),nativeExec.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),UNSUPPORTED_Y$1=regexpStickyHelpers.UNSUPPORTED_Y||regexpStickyHelpers.BROKEN_CARET,NPCG_INCLUDED=void 0!==/()??/.exec("")[1],PATCH=UPDATES_LAST_INDEX_WRONG||NPCG_INCLUDED||UNSUPPORTED_Y$1;PATCH&&(patchedExec=function(e){var t,n,r,i,o=this,a=UNSUPPORTED_Y$1&&o.sticky,s=regexpFlags.call(o),l=o.source,c=0,u=e;return a&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),u=String(e).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==e[o.lastIndex-1])&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",s)),NPCG_INCLUDED&&(n=new RegExp("^"+l+"$(?!\\s)",s)),UPDATES_LAST_INDEX_WRONG&&(t=o.lastIndex),r=nativeExec.call(a?n:o,u),a?r?(r.input=r.input.slice(c),r[0]=r[0].slice(c),r.index=o.lastIndex,o.lastIndex+=r[0].length):o.lastIndex=0:UPDATES_LAST_INDEX_WRONG&&r&&(o.lastIndex=o.global?r.index+r[0].length:t),NPCG_INCLUDED&&r&&r.length>1&&nativeReplace.call(r[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r});var regexpExec=patchedExec;_export({target:"RegExp",proto:!0,forced:/./.exec!==regexpExec},{exec:regexpExec});var TO_STRING="toString",RegExpPrototype=RegExp.prototype,nativeToString=RegExpPrototype[TO_STRING],NOT_GENERIC=fails((function(){return"/a/b"!=nativeToString.call({source:"a",flags:"b"})})),INCORRECT_NAME=nativeToString.name!=TO_STRING;(NOT_GENERIC||INCORRECT_NAME)&&redefine(RegExp.prototype,TO_STRING,(function(){var e=anObject(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in RegExpPrototype)?regexpFlags.call(e):n)}),{unsafe:!0});var createMethod$2=function(e){return function(t,n){var r,i,o=String(requireObjectCoercible(t)),a=toInteger(n),s=o.length;return a<0||a>=s?e?"":void 0:(r=o.charCodeAt(a))<55296||r>56319||a+1===s||(i=o.charCodeAt(a+1))<56320||i>57343?e?o.charAt(a):r:e?o.slice(a,a+2):i-56320+(r-55296<<10)+65536}},stringMultibyte={codeAt:createMethod$2(!1),charAt:createMethod$2(!0)},charAt=stringMultibyte.charAt,STRING_ITERATOR="String Iterator",setInternalState$2=internalState.set,getInternalState$2=internalState.getterFor(STRING_ITERATOR);defineIterator(String,"String",(function(e){setInternalState$2(this,{type:STRING_ITERATOR,string:String(e),index:0})}),(function(){var e,t=getInternalState$2(this),n=t.string,r=t.index;return r>=n.length?{value:void 0,done:!0}:(e=charAt(n,r),t.index+=e.length,{value:e,done:!1})}));var SPECIES$3=wellKnownSymbol("species"),REPLACE_SUPPORTS_NAMED_GROUPS=!fails((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),REPLACE_KEEPS_$0="$0"==="a".replace(/./,"$0"),REPLACE=wellKnownSymbol("replace"),REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE=!!/./[REPLACE]&&""===/./[REPLACE]("a","$0"),SPLIT_WORKS_WITH_OVERWRITTEN_EXEC=!fails((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),fixRegexpWellKnownSymbolLogic=function(e,t,n,r){var i=wellKnownSymbol(e),o=!fails((function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})),a=o&&!fails((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[SPECIES$3]=function(){return n},n.flags="",n[i]=/./[i]),n.exec=function(){return t=!0,null},n[i](""),!t}));if(!o||!a||"replace"===e&&(!REPLACE_SUPPORTS_NAMED_GROUPS||!REPLACE_KEEPS_$0||REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE)||"split"===e&&!SPLIT_WORKS_WITH_OVERWRITTEN_EXEC){var s=/./[i],l=n(i,""[e],(function(e,t,n,r,i){return t.exec===regexpExec?o&&!i?{done:!0,value:s.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:REPLACE_KEEPS_$0,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE}),c=l[0],u=l[1];redefine(String.prototype,e,c),redefine(RegExp.prototype,i,2==t?function(e,t){return u.call(e,this,t)}:function(e){return u.call(e,this)})}r&&createNonEnumerableProperty(RegExp.prototype[i],"sham",!0)},charAt$1=stringMultibyte.charAt,advanceStringIndex=function(e,t,n){return t+(n?charAt$1(e,t).length:1)},regexpExecAbstract=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==classofRaw(e))throw TypeError("RegExp#exec called on incompatible receiver");return regexpExec.call(e,t)},max$2=Math.max,min$2=Math.min,floor$1=Math.floor,SUBSTITUTION_SYMBOLS=/\$([$&'`]|\d\d?|<[^>]*>)/g,SUBSTITUTION_SYMBOLS_NO_NAMED=/\$([$&'`]|\d\d?)/g,maybeToString=function(e){return void 0===e?e:String(e)};fixRegexpWellKnownSymbolLogic("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=r.REPLACE_KEEPS_$0,a=i?"$":"$0";return[function(n,r){var i=requireObjectCoercible(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&o||"string"==typeof r&&-1===r.indexOf(a)){var l=n(t,e,this,r);if(l.done)return l.value}var c=anObject(e),u=String(this),d="function"==typeof r;d||(r=String(r));var h=c.global;if(h){var p=c.unicode;c.lastIndex=0}for(var f=[];;){var m=regexpExecAbstract(c,u);if(null===m)break;if(f.push(m),!h)break;""===String(m[0])&&(c.lastIndex=advanceStringIndex(u,toLength(c.lastIndex),p))}for(var g="",y=0,b=0;b<f.length;b++){m=f[b];for(var v=String(m[0]),E=max$2(min$2(toInteger(m.index),u.length),0),S=[],T=1;T<m.length;T++)S.push(maybeToString(m[T]));var P=m.groups;if(d){var w=[v].concat(S,E,u);void 0!==P&&w.push(P);var O=String(r.apply(void 0,w))}else O=s(v,u,E,S,P,r);E>=y&&(g+=u.slice(y,E)+O,y=E+v.length)}return g+u.slice(y)}];function s(e,n,r,i,o,a){var s=r+e.length,l=i.length,c=SUBSTITUTION_SYMBOLS_NO_NAMED;return void 0!==o&&(o=toObject(o),c=SUBSTITUTION_SYMBOLS),t.call(a,c,(function(t,a){var c;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":c=o[a.slice(1,-1)];break;default:var u=+a;if(0===u)return t;if(u>l){var d=floor$1(u/10);return 0===d?t:d<=l?void 0===i[d-1]?a.charAt(1):i[d-1]+a.charAt(1):t}c=i[u-1]}return void 0===c?"":c}))}}));var sameValue=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};fixRegexpWellKnownSymbolLogic("search",1,(function(e,t,n){return[function(t){var n=requireObjectCoercible(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=anObject(e),o=String(this),a=i.lastIndex;sameValue(a,0)||(i.lastIndex=0);var s=regexpExecAbstract(i,o);return sameValue(i.lastIndex,a)||(i.lastIndex=a),null===s?-1:s.index}]}));var MATCH=wellKnownSymbol("match"),isRegexp=function(e){var t;return isObject(e)&&(void 0!==(t=e[MATCH])?!!t:"RegExp"==classofRaw(e))},SPECIES$4=wellKnownSymbol("species"),speciesConstructor=function(e,t){var n,r=anObject(e).constructor;return void 0===r||null==(n=anObject(r)[SPECIES$4])?t:aFunction$1(n)},arrayPush=[].push,min$3=Math.min,MAX_UINT32=4294967295,SUPPORTS_Y=!fails((function(){return!RegExp(MAX_UINT32,"y")}));fixRegexpWellKnownSymbolLogic("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(requireObjectCoercible(this)),i=void 0===n?MAX_UINT32:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!isRegexp(e))return t.call(r,e,i);for(var o,a,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),u=0,d=new RegExp(e.source,c+"g");(o=regexpExec.call(d,r))&&!((a=d.lastIndex)>u&&(l.push(r.slice(u,o.index)),o.length>1&&o.index<r.length&&arrayPush.apply(l,o.slice(1)),s=o[0].length,u=a,l.length>=i));)d.lastIndex===o.index&&d.lastIndex++;return u===r.length?!s&&d.test("")||l.push(""):l.push(r.slice(u)),l.length>i?l.slice(0,i):l}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=requireObjectCoercible(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var o=n(r,e,this,i,r!==t);if(o.done)return o.value;var a=anObject(e),s=String(this),l=speciesConstructor(a,RegExp),c=a.unicode,u=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(SUPPORTS_Y?"y":"g"),d=new l(SUPPORTS_Y?a:"^(?:"+a.source+")",u),h=void 0===i?MAX_UINT32:i>>>0;if(0===h)return[];if(0===s.length)return null===regexpExecAbstract(d,s)?[s]:[];for(var p=0,f=0,m=[];f<s.length;){d.lastIndex=SUPPORTS_Y?f:0;var g,y=regexpExecAbstract(d,SUPPORTS_Y?s:s.slice(f));if(null===y||(g=min$3(toLength(d.lastIndex+(SUPPORTS_Y?0:f)),s.length))===p)f=advanceStringIndex(s,f,c);else{if(m.push(s.slice(p,f)),m.length===h)return m;for(var b=1;b<=y.length-1;b++)if(m.push(y[b]),m.length===h)return m;f=p=g}}return m.push(s.slice(p)),m}]}),!SUPPORTS_Y);var domIterables={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0};for(var COLLECTION_NAME in domIterables){var Collection=global_1[COLLECTION_NAME],CollectionPrototype=Collection&&Collection.prototype;if(CollectionPrototype&&CollectionPrototype.forEach!==arrayForEach)try{createNonEnumerableProperty(CollectionPrototype,"forEach",arrayForEach)}catch(e){CollectionPrototype.forEach=arrayForEach}}var ITERATOR$2=wellKnownSymbol("iterator"),TO_STRING_TAG$3=wellKnownSymbol("toStringTag"),ArrayValues=es_array_iterator.values;for(var COLLECTION_NAME$1 in domIterables){var Collection$1=global_1[COLLECTION_NAME$1],CollectionPrototype$1=Collection$1&&Collection$1.prototype;if(CollectionPrototype$1){if(CollectionPrototype$1[ITERATOR$2]!==ArrayValues)try{createNonEnumerableProperty(CollectionPrototype$1,ITERATOR$2,ArrayValues)}catch(e){CollectionPrototype$1[ITERATOR$2]=ArrayValues}if(CollectionPrototype$1[TO_STRING_TAG$3]||createNonEnumerableProperty(CollectionPrototype$1,TO_STRING_TAG$3,COLLECTION_NAME$1),domIterables[COLLECTION_NAME$1])for(var METHOD_NAME in es_array_iterator)if(CollectionPrototype$1[METHOD_NAME]!==es_array_iterator[METHOD_NAME])try{createNonEnumerableProperty(CollectionPrototype$1,METHOD_NAME,es_array_iterator[METHOD_NAME])}catch(e){CollectionPrototype$1[METHOD_NAME]=es_array_iterator[METHOD_NAME]}}}var ITERATOR$3=wellKnownSymbol("iterator"),nativeUrl=!fails((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,r){t.delete("b"),n+=r+e})),isPure&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[ITERATOR$3]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})),anInstance=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},nativeAssign=Object.assign,defineProperty$4=Object.defineProperty,objectAssign=!nativeAssign||fails((function(){if(descriptors&&1!==nativeAssign({b:1},nativeAssign(defineProperty$4({},"a",{enumerable:!0,get:function(){defineProperty$4(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=nativeAssign({},e)[n]||objectKeys(nativeAssign({},t)).join("")!=r}))?function(e,t){for(var n=toObject(e),r=arguments.length,i=1,o=objectGetOwnPropertySymbols.f,a=objectPropertyIsEnumerable.f;r>i;)for(var s,l=indexedObject(arguments[i++]),c=o?objectKeys(l).concat(o(l)):objectKeys(l),u=c.length,d=0;u>d;)s=c[d++],descriptors&&!a.call(l,s)||(n[s]=l[s]);return n}:nativeAssign,iteratorClose=function(e){var t=e.return;if(void 0!==t)return anObject(t.call(e)).value},callWithSafeIterationClosing=function(e,t,n,r){try{return r?t(anObject(n)[0],n[1]):t(n)}catch(t){throw iteratorClose(e),t}},ITERATOR$4=wellKnownSymbol("iterator"),ArrayPrototype$1=Array.prototype,isArrayIteratorMethod=function(e){return void 0!==e&&(iterators.Array===e||ArrayPrototype$1[ITERATOR$4]===e)},ITERATOR$5=wellKnownSymbol("iterator"),getIteratorMethod=function(e){if(null!=e)return e[ITERATOR$5]||e["@@iterator"]||iterators[classof(e)]},arrayFrom=function(e){var t,n,r,i,o,a,s=toObject(e),l="function"==typeof this?this:Array,c=arguments.length,u=c>1?arguments[1]:void 0,d=void 0!==u,h=getIteratorMethod(s),p=0;if(d&&(u=functionBindContext(u,c>2?arguments[2]:void 0,2)),null==h||l==Array&&isArrayIteratorMethod(h))for(n=new l(t=toLength(s.length));t>p;p++)a=d?u(s[p],p):s[p],createProperty(n,p,a);else for(o=(i=h.call(s)).next,n=new l;!(r=o.call(i)).done;p++)a=d?callWithSafeIterationClosing(i,u,[r.value,p],!0):r.value,createProperty(n,p,a);return n.length=p,n},maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter="-",regexNonASCII=/[^\0-\u007E]/,regexSeparators=/[.\u3002\uFF0E\uFF61]/g,OVERFLOW_ERROR="Overflow: input needs wider integers to process",baseMinusTMin=base-tMin,floor$2=Math.floor,stringFromCharCode=String.fromCharCode,ucs2decode=function(e){for(var t=[],n=0,r=e.length;n<r;){var i=e.charCodeAt(n++);if(i>=55296&&i<=56319&&n<r){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&i)<<10)+(1023&o)+65536):(t.push(i),n--)}else t.push(i)}return t},digitToBasic=function(e){return e+22+75*(e<26)},adapt=function(e,t,n){var r=0;for(e=n?floor$2(e/damp):e>>1,e+=floor$2(e/t);e>baseMinusTMin*tMax>>1;r+=base)e=floor$2(e/baseMinusTMin);return floor$2(r+(baseMinusTMin+1)*e/(e+skew))},encode=function(e){var t,n,r=[],i=(e=ucs2decode(e)).length,o=initialN,a=0,s=initialBias;for(t=0;t<e.length;t++)(n=e[t])<128&&r.push(stringFromCharCode(n));var l=r.length,c=l;for(l&&r.push(delimiter);c<i;){var u=maxInt;for(t=0;t<e.length;t++)(n=e[t])>=o&&n<u&&(u=n);var d=c+1;if(u-o>floor$2((maxInt-a)/d))throw RangeError(OVERFLOW_ERROR);for(a+=(u-o)*d,o=u,t=0;t<e.length;t++){if((n=e[t])<o&&++a>maxInt)throw RangeError(OVERFLOW_ERROR);if(n==o){for(var h=a,p=base;;p+=base){var f=p<=s?tMin:p>=s+tMax?tMax:p-s;if(h<f)break;var m=h-f,g=base-f;r.push(stringFromCharCode(digitToBasic(f+m%g))),h=floor$2(m/g)}r.push(stringFromCharCode(digitToBasic(h))),s=adapt(a,d,c==l),a=0,++c}}++a,++o}return r.join("")},stringPunycodeToAscii=function(e){var t,n,r=[],i=e.toLowerCase().replace(regexSeparators,".").split(".");for(t=0;t<i.length;t++)n=i[t],r.push(regexNonASCII.test(n)?"xn--"+encode(n):n);return r.join(".")},redefineAll=function(e,t,n){for(var r in t)redefine(e,r,t[r],n);return e},getIterator=function(e){var t=getIteratorMethod(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return anObject(t.call(e))},$fetch=getBuiltIn("fetch"),Headers=getBuiltIn("Headers"),ITERATOR$6=wellKnownSymbol("iterator"),URL_SEARCH_PARAMS="URLSearchParams",URL_SEARCH_PARAMS_ITERATOR=URL_SEARCH_PARAMS+"Iterator",setInternalState$3=internalState.set,getInternalParamsState=internalState.getterFor(URL_SEARCH_PARAMS),getInternalIteratorState=internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR),plus=/\+/g,sequences=Array(4),percentSequence=function(e){return sequences[e-1]||(sequences[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},percentDecode=function(e){try{return decodeURIComponent(e)}catch(t){return e}},deserialize=function(e){var t=e.replace(plus," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(percentSequence(n--),percentDecode);return t}},find=/[!'()~]|%20/g,replace={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},replacer=function(e){return replace[e]},serialize=function(e){return encodeURIComponent(e).replace(find,replacer)},parseSearchParams=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o<i.length;)(n=i[o++]).length&&(r=n.split("="),e.push({key:deserialize(r.shift()),value:deserialize(r.join("="))}))},updateSearchParams=function(e){this.entries.length=0,parseSearchParams(this.entries,e)},validateArgumentsLength=function(e,t){if(e<t)throw TypeError("Not enough arguments")},URLSearchParamsIterator=createIteratorConstructor((function(e,t){setInternalState$3(this,{type:URL_SEARCH_PARAMS_ITERATOR,iterator:getIterator(getInternalParamsState(e).entries),kind:t})}),"Iterator",(function(){var e=getInternalIteratorState(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value="keys"===t?r.key:"values"===t?r.value:[r.key,r.value]),n})),URLSearchParamsConstructor=function(){anInstance(this,URLSearchParamsConstructor,URL_SEARCH_PARAMS);var e,t,n,r,i,o,a,s,l,c=arguments.length>0?arguments[0]:void 0,u=this,d=[];if(setInternalState$3(u,{type:URL_SEARCH_PARAMS,entries:d,updateURL:function(){},updateSearchParams:updateSearchParams}),void 0!==c)if(isObject(c))if("function"==typeof(e=getIteratorMethod(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((a=(o=(i=getIterator(anObject(r.value))).next).call(i)).done||(s=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");d.push({key:a.value+"",value:s.value+""})}else for(l in c)has(c,l)&&d.push({key:l,value:c[l]+""});else parseSearchParams(d,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},URLSearchParamsPrototype=URLSearchParamsConstructor.prototype;redefineAll(URLSearchParamsPrototype,{append:function(e,t){validateArgumentsLength(arguments.length,2);var n=getInternalParamsState(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){validateArgumentsLength(arguments.length,1);for(var t=getInternalParamsState(this),n=t.entries,r=e+"",i=0;i<n.length;)n[i].key===r?n.splice(i,1):i++;t.updateURL()},get:function(e){validateArgumentsLength(arguments.length,1);for(var t=getInternalParamsState(this).entries,n=e+"",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){validateArgumentsLength(arguments.length,1);for(var t=getInternalParamsState(this).entries,n=e+"",r=[],i=0;i<t.length;i++)t[i].key===n&&r.push(t[i].value);return r},has:function(e){validateArgumentsLength(arguments.length,1);for(var t=getInternalParamsState(this).entries,n=e+"",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){validateArgumentsLength(arguments.length,1);for(var n,r=getInternalParamsState(this),i=r.entries,o=!1,a=e+"",s=t+"",l=0;l<i.length;l++)(n=i[l]).key===a&&(o?i.splice(l--,1):(o=!0,n.value=s));o||i.push({key:a,value:s}),r.updateURL()},sort:function(){var e,t,n,r=getInternalParamsState(this),i=r.entries,o=i.slice();for(i.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(i[t].key>e.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=getInternalParamsState(this).entries,r=functionBindContext(e,arguments.length>1?arguments[1]:void 0,3),i=0;i<n.length;)r((t=n[i++]).value,t.key,this)},keys:function(){return new URLSearchParamsIterator(this,"keys")},values:function(){return new URLSearchParamsIterator(this,"values")},entries:function(){return new URLSearchParamsIterator(this,"entries")}},{enumerable:!0}),redefine(URLSearchParamsPrototype,ITERATOR$6,URLSearchParamsPrototype.entries),redefine(URLSearchParamsPrototype,"toString",(function(){for(var e,t=getInternalParamsState(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(serialize(e.key)+"="+serialize(e.value));return n.join("&")}),{enumerable:!0}),setToStringTag(URLSearchParamsConstructor,URL_SEARCH_PARAMS),_export({global:!0,forced:!nativeUrl},{URLSearchParams:URLSearchParamsConstructor}),nativeUrl||"function"!=typeof $fetch||"function"!=typeof Headers||_export({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,i=[e];return arguments.length>1&&(isObject(t=arguments[1])&&(n=t.body,classof(n)===URL_SEARCH_PARAMS&&((r=t.headers?new Headers(t.headers):new Headers).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=objectCreate(t,{body:createPropertyDescriptor(0,String(n)),headers:createPropertyDescriptor(0,r)}))),i.push(t)),$fetch.apply(this,i)}});var EOF,web_urlSearchParams={URLSearchParams:URLSearchParamsConstructor,getState:getInternalParamsState},codeAt=stringMultibyte.codeAt,NativeURL=global_1.URL,URLSearchParams$1=web_urlSearchParams.URLSearchParams,getInternalSearchParamsState=web_urlSearchParams.getState,setInternalState$4=internalState.set,getInternalURLState=internalState.getterFor("URL"),floor$3=Math.floor,pow=Math.pow,INVALID_AUTHORITY="Invalid authority",INVALID_SCHEME="Invalid scheme",INVALID_HOST="Invalid host",INVALID_PORT="Invalid port",ALPHA=/[A-Za-z]/,ALPHANUMERIC=/[\d+-.A-Za-z]/,DIGIT=/\d/,HEX_START=/^(0x|0X)/,OCT=/^[0-7]+$/,DEC=/^\d+$/,HEX=/^[\dA-Fa-f]+$/,FORBIDDEN_HOST_CODE_POINT=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,TAB_AND_NEW_LINE=/[\u0009\u000A\u000D]/g,parseHost=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return INVALID_HOST;if(!(n=parseIPv6(t.slice(1,-1))))return INVALID_HOST;e.host=n}else if(isSpecial(e)){if(t=stringPunycodeToAscii(t),FORBIDDEN_HOST_CODE_POINT.test(t))return INVALID_HOST;if(null===(n=parseIPv4(t)))return INVALID_HOST;e.host=n}else{if(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(t))return INVALID_HOST;for(n="",r=arrayFrom(t),i=0;i<r.length;i++)n+=percentEncode(r[i],C0ControlPercentEncodeSet);e.host=n}},parseIPv4=function(e){var t,n,r,i,o,a,s,l=e.split(".");if(l.length&&""==l[l.length-1]&&l.pop(),(t=l.length)>4)return e;for(n=[],r=0;r<t;r++){if(""==(i=l[r]))return e;if(o=10,i.length>1&&"0"==i.charAt(0)&&(o=HEX_START.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)a=0;else{if(!(10==o?DEC:8==o?OCT:HEX).test(i))return e;a=parseInt(i,o)}n.push(a)}for(r=0;r<t;r++)if(a=n[r],r==t-1){if(a>=pow(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*pow(256,3-r);return s},parseIPv6=function(e){var t,n,r,i,o,a,s,l=[0,0,0,0,0,0,0,0],c=0,u=null,d=0,h=function(){return e.charAt(d)};if(":"==h()){if(":"!=e.charAt(1))return;d+=2,u=++c}for(;h();){if(8==c)return;if(":"!=h()){for(t=n=0;n<4&&HEX.test(h());)t=16*t+parseInt(h(),16),d++,n++;if("."==h()){if(0==n)return;if(d-=n,c>6)return;for(r=0;h();){if(i=null,r>0){if(!("."==h()&&r<4))return;d++}if(!DIGIT.test(h()))return;for(;DIGIT.test(h());){if(o=parseInt(h(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==h()){if(d++,!h())return}else if(h())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(a=c-u,c=7;0!=c&&a>0;)s=l[c],l[c--]=l[u+a-1],l[u+--a]=s;else if(8!=c)return;return l},findLongestZeroSequence=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t},serializeHost=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=floor$3(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=findLongestZeroSequence(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},C0ControlPercentEncodeSet={},fragmentPercentEncodeSet=objectAssign({},C0ControlPercentEncodeSet,{" ":1,'"':1,"<":1,">":1,"`":1}),pathPercentEncodeSet=objectAssign({},fragmentPercentEncodeSet,{"#":1,"?":1,"{":1,"}":1}),userinfoPercentEncodeSet=objectAssign({},pathPercentEncodeSet,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),percentEncode=function(e,t){var n=codeAt(e,0);return n>32&&n<127&&!has(t,e)?e:encodeURIComponent(e)},specialSchemes={ftp:21,file:null,http:80,https:443,ws:80,wss:443},isSpecial=function(e){return has(specialSchemes,e.scheme)},includesCredentials=function(e){return""!=e.username||""!=e.password},cannotHaveUsernamePasswordPort=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},isWindowsDriveLetter=function(e,t){var n;return 2==e.length&&ALPHA.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},startsWithWindowsDriveLetter=function(e){var t;return e.length>1&&isWindowsDriveLetter(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},shortenURLsPath=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&isWindowsDriveLetter(t[0],!0)||t.pop()},isSingleDot=function(e){return"."===e||"%2e"===e.toLowerCase()},isDoubleDot=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},SCHEME_START={},SCHEME={},NO_SCHEME={},SPECIAL_RELATIVE_OR_AUTHORITY={},PATH_OR_AUTHORITY={},RELATIVE={},RELATIVE_SLASH={},SPECIAL_AUTHORITY_SLASHES={},SPECIAL_AUTHORITY_IGNORE_SLASHES={},AUTHORITY={},HOST={},HOSTNAME={},PORT={},FILE={},FILE_SLASH={},FILE_HOST={},PATH_START={},PATH={},CANNOT_BE_A_BASE_URL_PATH={},QUERY={},FRAGMENT={},parseURL=function(e,t,n,r){var i,o,a,s,l=n||SCHEME_START,c=0,u="",d=!1,h=!1,p=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE,"")),t=t.replace(TAB_AND_NEW_LINE,""),i=arrayFrom(t);c<=i.length;){switch(o=i[c],l){case SCHEME_START:if(!o||!ALPHA.test(o)){if(n)return INVALID_SCHEME;l=NO_SCHEME;continue}u+=o.toLowerCase(),l=SCHEME;break;case SCHEME:if(o&&(ALPHANUMERIC.test(o)||"+"==o||"-"==o||"."==o))u+=o.toLowerCase();else{if(":"!=o){if(n)return INVALID_SCHEME;u="",l=NO_SCHEME,c=0;continue}if(n&&(isSpecial(e)!=has(specialSchemes,u)||"file"==u&&(includesCredentials(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=u,n)return void(isSpecial(e)&&specialSchemes[e.scheme]==e.port&&(e.port=null));u="","file"==e.scheme?l=FILE:isSpecial(e)&&r&&r.scheme==e.scheme?l=SPECIAL_RELATIVE_OR_AUTHORITY:isSpecial(e)?l=SPECIAL_AUTHORITY_SLASHES:"/"==i[c+1]?(l=PATH_OR_AUTHORITY,c++):(e.cannotBeABaseURL=!0,e.path.push(""),l=CANNOT_BE_A_BASE_URL_PATH)}break;case NO_SCHEME:if(!r||r.cannotBeABaseURL&&"#"!=o)return INVALID_SCHEME;if(r.cannotBeABaseURL&&"#"==o){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,l=FRAGMENT;break}l="file"==r.scheme?FILE:RELATIVE;continue;case SPECIAL_RELATIVE_OR_AUTHORITY:if("/"!=o||"/"!=i[c+1]){l=RELATIVE;continue}l=SPECIAL_AUTHORITY_IGNORE_SLASHES,c++;break;case PATH_OR_AUTHORITY:if("/"==o){l=AUTHORITY;break}l=PATH;continue;case RELATIVE:if(e.scheme=r.scheme,o==EOF)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==o||"\\"==o&&isSpecial(e))l=RELATIVE_SLASH;else if("?"==o)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",l=QUERY;else{if("#"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),l=PATH;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",l=FRAGMENT}break;case RELATIVE_SLASH:if(!isSpecial(e)||"/"!=o&&"\\"!=o){if("/"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,l=PATH;continue}l=AUTHORITY}else l=SPECIAL_AUTHORITY_IGNORE_SLASHES;break;case SPECIAL_AUTHORITY_SLASHES:if(l=SPECIAL_AUTHORITY_IGNORE_SLASHES,"/"!=o||"/"!=u.charAt(c+1))continue;c++;break;case SPECIAL_AUTHORITY_IGNORE_SLASHES:if("/"!=o&&"\\"!=o){l=AUTHORITY;continue}break;case AUTHORITY:if("@"==o){d&&(u="%40"+u),d=!0,a=arrayFrom(u);for(var f=0;f<a.length;f++){var m=a[f];if(":"!=m||p){var g=percentEncode(m,userinfoPercentEncodeSet);p?e.password+=g:e.username+=g}else p=!0}u=""}else if(o==EOF||"/"==o||"?"==o||"#"==o||"\\"==o&&isSpecial(e)){if(d&&""==u)return INVALID_AUTHORITY;c-=arrayFrom(u).length+1,u="",l=HOST}else u+=o;break;case HOST:case HOSTNAME:if(n&&"file"==e.scheme){l=FILE_HOST;continue}if(":"!=o||h){if(o==EOF||"/"==o||"?"==o||"#"==o||"\\"==o&&isSpecial(e)){if(isSpecial(e)&&""==u)return INVALID_HOST;if(n&&""==u&&(includesCredentials(e)||null!==e.port))return;if(s=parseHost(e,u))return s;if(u="",l=PATH_START,n)return;continue}"["==o?h=!0:"]"==o&&(h=!1),u+=o}else{if(""==u)return INVALID_HOST;if(s=parseHost(e,u))return s;if(u="",l=PORT,n==HOSTNAME)return}break;case PORT:if(!DIGIT.test(o)){if(o==EOF||"/"==o||"?"==o||"#"==o||"\\"==o&&isSpecial(e)||n){if(""!=u){var y=parseInt(u,10);if(y>65535)return INVALID_PORT;e.port=isSpecial(e)&&y===specialSchemes[e.scheme]?null:y,u=""}if(n)return;l=PATH_START;continue}return INVALID_PORT}u+=o;break;case FILE:if(e.scheme="file","/"==o||"\\"==o)l=FILE_SLASH;else{if(!r||"file"!=r.scheme){l=PATH;continue}if(o==EOF)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==o)e.host=r.host,e.path=r.path.slice(),e.query="",l=QUERY;else{if("#"!=o){startsWithWindowsDriveLetter(i.slice(c).join(""))||(e.host=r.host,e.path=r.path.slice(),shortenURLsPath(e)),l=PATH;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",l=FRAGMENT}}break;case FILE_SLASH:if("/"==o||"\\"==o){l=FILE_HOST;break}r&&"file"==r.scheme&&!startsWithWindowsDriveLetter(i.slice(c).join(""))&&(isWindowsDriveLetter(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),l=PATH;continue;case FILE_HOST:if(o==EOF||"/"==o||"\\"==o||"?"==o||"#"==o){if(!n&&isWindowsDriveLetter(u))l=PATH;else if(""==u){if(e.host="",n)return;l=PATH_START}else{if(s=parseHost(e,u))return s;if("localhost"==e.host&&(e.host=""),n)return;u="",l=PATH_START}continue}u+=o;break;case PATH_START:if(isSpecial(e)){if(l=PATH,"/"!=o&&"\\"!=o)continue}else if(n||"?"!=o)if(n||"#"!=o){if(o!=EOF&&(l=PATH,"/"!=o))continue}else e.fragment="",l=FRAGMENT;else e.query="",l=QUERY;break;case PATH:if(o==EOF||"/"==o||"\\"==o&&isSpecial(e)||!n&&("?"==o||"#"==o)){if(isDoubleDot(u)?(shortenURLsPath(e),"/"==o||"\\"==o&&isSpecial(e)||e.path.push("")):isSingleDot(u)?"/"==o||"\\"==o&&isSpecial(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&isWindowsDriveLetter(u)&&(e.host&&(e.host=""),u=u.charAt(0)+":"),e.path.push(u)),u="","file"==e.scheme&&(o==EOF||"?"==o||"#"==o))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==o?(e.query="",l=QUERY):"#"==o&&(e.fragment="",l=FRAGMENT)}else u+=percentEncode(o,pathPercentEncodeSet);break;case CANNOT_BE_A_BASE_URL_PATH:"?"==o?(e.query="",l=QUERY):"#"==o?(e.fragment="",l=FRAGMENT):o!=EOF&&(e.path[0]+=percentEncode(o,C0ControlPercentEncodeSet));break;case QUERY:n||"#"!=o?o!=EOF&&("'"==o&&isSpecial(e)?e.query+="%27":e.query+="#"==o?"%23":percentEncode(o,C0ControlPercentEncodeSet)):(e.fragment="",l=FRAGMENT);break;case FRAGMENT:o!=EOF&&(e.fragment+=percentEncode(o,fragmentPercentEncodeSet))}c++}},URLConstructor=function(e){var t,n,r=anInstance(this,URLConstructor,"URL"),i=arguments.length>1?arguments[1]:void 0,o=String(e),a=setInternalState$4(r,{type:"URL"});if(void 0!==i)if(i instanceof URLConstructor)t=getInternalURLState(i);else if(n=parseURL(t={},String(i)))throw TypeError(n);if(n=parseURL(a,o,null,t))throw TypeError(n);var s=a.searchParams=new URLSearchParams$1,l=getInternalSearchParamsState(s);l.updateSearchParams(a.query),l.updateURL=function(){a.query=String(s)||null},descriptors||(r.href=serializeURL.call(r),r.origin=getOrigin.call(r),r.protocol=getProtocol.call(r),r.username=getUsername.call(r),r.password=getPassword.call(r),r.host=getHost.call(r),r.hostname=getHostname.call(r),r.port=getPort.call(r),r.pathname=getPathname.call(r),r.search=getSearch.call(r),r.searchParams=getSearchParams.call(r),r.hash=getHash.call(r))},URLPrototype=URLConstructor.prototype,serializeURL=function(){var e=getInternalURLState(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,a=e.path,s=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",includesCredentials(e)&&(c+=n+(r?":"+r:"")+"@"),c+=serializeHost(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(c+="?"+s),null!==l&&(c+="#"+l),c},getOrigin=function(){var e=getInternalURLState(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&isSpecial(e)?t+"://"+serializeHost(e.host)+(null!==n?":"+n:""):"null"},getProtocol=function(){return getInternalURLState(this).scheme+":"},getUsername=function(){return getInternalURLState(this).username},getPassword=function(){return getInternalURLState(this).password},getHost=function(){var e=getInternalURLState(this),t=e.host,n=e.port;return null===t?"":null===n?serializeHost(t):serializeHost(t)+":"+n},getHostname=function(){var e=getInternalURLState(this).host;return null===e?"":serializeHost(e)},getPort=function(){var e=getInternalURLState(this).port;return null===e?"":String(e)},getPathname=function(){var e=getInternalURLState(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},getSearch=function(){var e=getInternalURLState(this).query;return e?"?"+e:""},getSearchParams=function(){return getInternalURLState(this).searchParams},getHash=function(){var e=getInternalURLState(this).fragment;return e?"#"+e:""},accessorDescriptor=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(descriptors&&objectDefineProperties(URLPrototype,{href:accessorDescriptor(serializeURL,(function(e){var t=getInternalURLState(this),n=String(e),r=parseURL(t,n);if(r)throw TypeError(r);getInternalSearchParamsState(t.searchParams).updateSearchParams(t.query)})),origin:accessorDescriptor(getOrigin),protocol:accessorDescriptor(getProtocol,(function(e){var t=getInternalURLState(this);parseURL(t,String(e)+":",SCHEME_START)})),username:accessorDescriptor(getUsername,(function(e){var t=getInternalURLState(this),n=arrayFrom(String(e));if(!cannotHaveUsernamePasswordPort(t)){t.username="";for(var r=0;r<n.length;r++)t.username+=percentEncode(n[r],userinfoPercentEncodeSet)}})),password:accessorDescriptor(getPassword,(function(e){var t=getInternalURLState(this),n=arrayFrom(String(e));if(!cannotHaveUsernamePasswordPort(t)){t.password="";for(var r=0;r<n.length;r++)t.password+=percentEncode(n[r],userinfoPercentEncodeSet)}})),host:accessorDescriptor(getHost,(function(e){var t=getInternalURLState(this);t.cannotBeABaseURL||parseURL(t,String(e),HOST)})),hostname:accessorDescriptor(getHostname,(function(e){var t=getInternalURLState(this);t.cannotBeABaseURL||parseURL(t,String(e),HOSTNAME)})),port:accessorDescriptor(getPort,(function(e){var t=getInternalURLState(this);cannotHaveUsernamePasswordPort(t)||(""==(e=String(e))?t.port=null:parseURL(t,e,PORT))})),pathname:accessorDescriptor(getPathname,(function(e){var t=getInternalURLState(this);t.cannotBeABaseURL||(t.path=[],parseURL(t,e+"",PATH_START))})),search:accessorDescriptor(getSearch,(function(e){var t=getInternalURLState(this);""==(e=String(e))?t.query=null:("?"==e.charAt(0)&&(e=e.slice(1)),t.query="",parseURL(t,e,QUERY)),getInternalSearchParamsState(t.searchParams).updateSearchParams(t.query)})),searchParams:accessorDescriptor(getSearchParams),hash:accessorDescriptor(getHash,(function(e){var t=getInternalURLState(this);""!=(e=String(e))?("#"==e.charAt(0)&&(e=e.slice(1)),t.fragment="",parseURL(t,e,FRAGMENT)):t.fragment=null}))}),redefine(URLPrototype,"toJSON",(function(){return serializeURL.call(this)}),{enumerable:!0}),redefine(URLPrototype,"toString",(function(){return serializeURL.call(this)}),{enumerable:!0}),NativeURL){var nativeCreateObjectURL=NativeURL.createObjectURL,nativeRevokeObjectURL=NativeURL.revokeObjectURL;nativeCreateObjectURL&&redefine(URLConstructor,"createObjectURL",(function(e){return nativeCreateObjectURL.apply(NativeURL,arguments)})),nativeRevokeObjectURL&&redefine(URLConstructor,"revokeObjectURL",(function(e){return nativeRevokeObjectURL.apply(NativeURL,arguments)}))}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys$1(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys$1(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys$1(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function _objectWithoutPropertiesLoose(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}function _objectWithoutProperties(e,t){if(null==e)return{};var n,r,i=_objectWithoutPropertiesLoose(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArray(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}function _iterableToArrayLimit(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw o}}return n}}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}setToStringTag(URLConstructor,"URL"),_export({global:!0,forced:!nativeUrl,sham:!descriptors},{URL:URLConstructor}),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},r=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},i=function(e){return decodeURIComponent(String(e).replace(/\+/g," "))};(function(){try{var t=e.URLSearchParams;return"a=1"===new t("?a=1").toString()&&"function"==typeof t.prototype.set&&"function"==typeof t.prototype.entries}catch(e){return!1}})()||function(){var i=function e(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var n=_typeof(t);if("undefined"===n);else if("string"===n)""!==t&&this._fromString(t);else if(t instanceof e){var r=this;t.forEach((function(e,t){r.append(t,e)}))}else{if(null===t||"object"!==n)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var i=0;i<t.length;i++){var o=t[i];if("[object Array]"!==Object.prototype.toString.call(o)&&2===o.length)throw new TypeError("Expected [string, any] as entry at index "+i+" of URLSearchParams's input");this.append(o[0],o[1])}else for(var a in t)t.hasOwnProperty(a)&&this.append(a,t[a])}},o=i.prototype;o.append=function(e,t){e in this._entries?this._entries[e].push(String(t)):this._entries[e]=[String(t)]},o.delete=function(e){delete this._entries[e]},o.get=function(e){return e in this._entries?this._entries[e][0]:null},o.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},o.has=function(e){return e in this._entries},o.set=function(e,t){this._entries[e]=[String(t)]},o.forEach=function(e,t){var n;for(var r in this._entries)if(this._entries.hasOwnProperty(r)){n=this._entries[r];for(var i=0;i<n.length;i++)e.call(t,n[i],r,this)}},o.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),n(e)},o.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),n(e)},o.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),n(e)},t&&(o[Symbol.iterator]=o.entries),o.toString=function(){var e=[];return this.forEach((function(t,n){e.push(r(n)+"="+r(t))})),e.join("&")},e.URLSearchParams=i}();var o=e.URLSearchParams.prototype;"function"!=typeof o.sort&&(o.sort=function(){var e=this,t=[];this.forEach((function(n,r){t.push([r,n]),e._entries||e.delete(r)})),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])}),"function"!=typeof o._fromString&&Object.defineProperty(o,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){if(this._entries)this._entries={};else{var t=[];this.forEach((function(e,n){t.push(n)}));for(var n=0;n<t.length;n++)this.delete(t[n])}var r,o=(e=e.replace(/^\?/,"")).split("&");for(n=0;n<o.length;n++)r=o[n].split("="),this.append(i(r[0]),r.length>1?i(r[1]):"")}})}(void 0!==commonjsGlobal?commonjsGlobal:"undefined"!=typeof window?window:"undefined"!=typeof self?self:commonjsGlobal),function(e){if(function(){try{var t=new e.URL("b","http://a");return t.pathname="c d","http://a/c%20d"===t.href&&t.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t)),n&&"string"!=typeof n&&(n=String(n));var r,i=document;if(n&&(void 0===e.location||n!==e.location.href)){n=n.toLowerCase(),(r=(i=document.implementation.createHTMLDocument("")).createElement("base")).href=n,i.head.appendChild(r);try{if(0!==r.href.indexOf(n))throw new Error(r.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=i.createElement("a");o.href=t,r&&(i.body.appendChild(o),o.href=o.href);var a=i.createElement("input");if(a.type="url",a.value=t,":"===o.protocol||!/:/.test(o.href)||!a.checkValidity()&&!n)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var s=new e.URLSearchParams(this.search),l=!0,c=!0,u=this;["append","delete","set"].forEach((function(e){var t=s[e];s[e]=function(){t.apply(s,arguments),l&&(c=!1,u.search=s.toString(),c=!0)}})),Object.defineProperty(this,"searchParams",{value:s,enumerable:!0});var d=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==d&&(d=this.search,c&&(l=!1,this.searchParams._fromString(this.search),l=!0))}})},r=n.prototype;["hash","host","hostname","port","protocol"].forEach((function(e){!function(e){Object.defineProperty(r,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)})),Object.defineProperty(r,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(r,{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!==commonjsGlobal?commonjsGlobal:"undefined"!=typeof window?window:"undefined"!=typeof self?self:commonjsGlobal);var IS_CONCAT_SPREADABLE=wellKnownSymbol("isConcatSpreadable"),MAX_SAFE_INTEGER=9007199254740991,MAXIMUM_ALLOWED_INDEX_EXCEEDED="Maximum allowed index exceeded",IS_CONCAT_SPREADABLE_SUPPORT=engineV8Version>=51||!fails((function(){var e=[];return e[IS_CONCAT_SPREADABLE]=!1,e.concat()[0]!==e})),SPECIES_SUPPORT=arrayMethodHasSpeciesSupport("concat"),isConcatSpreadable=function(e){if(!isObject(e))return!1;var t=e[IS_CONCAT_SPREADABLE];return void 0!==t?!!t:isArray(e)},FORCED=!IS_CONCAT_SPREADABLE_SUPPORT||!SPECIES_SUPPORT;_export({target:"Array",proto:!0,forced:FORCED},{concat:function(e){var t,n,r,i,o,a=toObject(this),s=arraySpeciesCreate(a,0),l=0;for(t=-1,r=arguments.length;t<r;t++)if(isConcatSpreadable(o=-1===t?a:arguments[t])){if(l+(i=toLength(o.length))>MAX_SAFE_INTEGER)throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);for(n=0;n<i;n++,l++)n in o&&createProperty(s,l,o[n])}else{if(l>=MAX_SAFE_INTEGER)throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);createProperty(s,l++,o)}return s.length=l,s}});var $filter=arrayIteration.filter,HAS_SPECIES_SUPPORT$1=arrayMethodHasSpeciesSupport("filter"),USES_TO_LENGTH$3=arrayMethodUsesToLength("filter");_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT$1||!USES_TO_LENGTH$3},{filter:function(e){return $filter(this,e,arguments.length>1?arguments[1]:void 0)}});var $find=arrayIteration.find,FIND="find",SKIPS_HOLES=!0,USES_TO_LENGTH$4=arrayMethodUsesToLength(FIND);FIND in[]&&Array(1)[FIND]((function(){SKIPS_HOLES=!1})),_export({target:"Array",proto:!0,forced:SKIPS_HOLES||!USES_TO_LENGTH$4},{find:function(e){return $find(this,e,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables(FIND);var ITERATOR$7=wellKnownSymbol("iterator"),SAFE_CLOSING=!1;try{var called=0,iteratorWithReturn={next:function(){return{done:!!called++}},return:function(){SAFE_CLOSING=!0}};iteratorWithReturn[ITERATOR$7]=function(){return this},Array.from(iteratorWithReturn,(function(){throw 2}))}catch(e){}var checkCorrectnessOfIteration=function(e,t){if(!t&&!SAFE_CLOSING)return!1;var n=!1;try{var r={};r[ITERATOR$7]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},INCORRECT_ITERATION=!checkCorrectnessOfIteration((function(e){Array.from(e)}));_export({target:"Array",stat:!0,forced:INCORRECT_ITERATION},{from:arrayFrom});var $includes=arrayIncludes.includes,USES_TO_LENGTH$5=arrayMethodUsesToLength("indexOf",{ACCESSORS:!0,1:0});_export({target:"Array",proto:!0,forced:!USES_TO_LENGTH$5},{includes:function(e){return $includes(this,e,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables("includes");var $map=arrayIteration.map,HAS_SPECIES_SUPPORT$2=arrayMethodHasSpeciesSupport("map"),USES_TO_LENGTH$6=arrayMethodUsesToLength("map");_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT$2||!USES_TO_LENGTH$6},{map:function(e){return $map(this,e,arguments.length>1?arguments[1]:void 0)}});var inheritIfRequired=function(e,t,n){var r,i;return objectSetPrototypeOf&&"function"==typeof(r=t.constructor)&&r!==n&&isObject(i=r.prototype)&&i!==n.prototype&&objectSetPrototypeOf(e,i),e},whitespaces="\t\n\v\f\r                 \u2028\u2029\ufeff",whitespace="["+whitespaces+"]",ltrim=RegExp("^"+whitespace+whitespace+"*"),rtrim=RegExp(whitespace+whitespace+"*$"),createMethod$3=function(e){return function(t){var n=String(requireObjectCoercible(t));return 1&e&&(n=n.replace(ltrim,"")),2&e&&(n=n.replace(rtrim,"")),n}},stringTrim={start:createMethod$3(1),end:createMethod$3(2),trim:createMethod$3(3)},getOwnPropertyNames=objectGetOwnPropertyNames.f,getOwnPropertyDescriptor$2=objectGetOwnPropertyDescriptor.f,defineProperty$5=objectDefineProperty.f,trim=stringTrim.trim,NUMBER="Number",NativeNumber=global_1[NUMBER],NumberPrototype=NativeNumber.prototype,BROKEN_CLASSOF=classofRaw(objectCreate(NumberPrototype))==NUMBER,toNumber=function(e){var t,n,r,i,o,a,s,l,c=toPrimitive(e,!1);if("string"==typeof c&&c.length>2)if(43===(t=(c=trim(c)).charCodeAt(0))||45===t){if(88===(n=c.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(c.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+c}for(a=(o=c.slice(2)).length,s=0;s<a;s++)if((l=o.charCodeAt(s))<48||l>i)return NaN;return parseInt(o,r)}return+c};if(isForced_1(NUMBER,!NativeNumber(" 0o1")||!NativeNumber("0b1")||NativeNumber("+0x1"))){for(var key,NumberWrapper=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof NumberWrapper&&(BROKEN_CLASSOF?fails((function(){NumberPrototype.valueOf.call(n)})):classofRaw(n)!=NUMBER)?inheritIfRequired(new NativeNumber(toNumber(t)),n,NumberWrapper):toNumber(t)},keys$1=descriptors?getOwnPropertyNames(NativeNumber):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),j=0;keys$1.length>j;j++)has(NativeNumber,key=keys$1[j])&&!has(NumberWrapper,key)&&defineProperty$5(NumberWrapper,key,getOwnPropertyDescriptor$2(NativeNumber,key));NumberWrapper.prototype=NumberPrototype,NumberPrototype.constructor=NumberWrapper,redefine(global_1,NUMBER,NumberWrapper)}var FAILS_ON_PRIMITIVES=fails((function(){objectKeys(1)}));_export({target:"Object",stat:!0,forced:FAILS_ON_PRIMITIVES},{keys:function(e){return objectKeys(toObject(e))}});var notARegexp=function(e){if(isRegexp(e))throw TypeError("The method doesn't accept regular expressions");return e},MATCH$1=wellKnownSymbol("match"),correctIsRegexpLogic=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[MATCH$1]=!1,"/./"[e](t)}catch(e){}}return!1};_export({target:"String",proto:!0,forced:!correctIsRegexpLogic("includes")},{includes:function(e){return!!~String(requireObjectCoercible(this)).indexOf(notARegexp(e),arguments.length>1?arguments[1]:void 0)}});var freezing=!fails((function(){return Object.isExtensible(Object.preventExtensions({}))})),internalMetadata=createCommonjsModule((function(e){var t=objectDefineProperty.f,n=uid("meta"),r=0,i=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:"O"+ ++r,weakData:{}}})},a=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!isObject(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!has(e,n)){if(!i(e))return"F";if(!t)return"E";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!has(e,n)){if(!i(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return freezing&&a.REQUIRED&&i(e)&&!has(e,n)&&o(e),e}};hiddenKeys[n]=!0})),internalMetadata_1=internalMetadata.REQUIRED,internalMetadata_2=internalMetadata.fastKey,internalMetadata_3=internalMetadata.getWeakData,internalMetadata_4=internalMetadata.onFreeze,Result=function(e,t){this.stopped=e,this.result=t},iterate=function(e,t,n){var r,i,o,a,s,l,c,u=n&&n.that,d=!(!n||!n.AS_ENTRIES),h=!(!n||!n.IS_ITERATOR),p=!(!n||!n.INTERRUPTED),f=functionBindContext(t,u,1+d+p),m=function(e){return r&&iteratorClose(r),new Result(!0,e)},g=function(e){return d?(anObject(e),p?f(e[0],e[1],m):f(e[0],e[1])):p?f(e,m):f(e)};if(h)r=e;else{if("function"!=typeof(i=getIteratorMethod(e)))throw TypeError("Target is not iterable");if(isArrayIteratorMethod(i)){for(o=0,a=toLength(e.length);a>o;o++)if((s=g(e[o]))&&s instanceof Result)return s;return new Result(!1)}r=i.call(e)}for(l=r.next;!(c=l.call(r)).done;){try{s=g(c.value)}catch(e){throw iteratorClose(r),e}if("object"==typeof s&&s&&s instanceof Result)return s}return new Result(!1)},collection=function(e,t,n){var r=-1!==e.indexOf("Map"),i=-1!==e.indexOf("Weak"),o=r?"set":"add",a=global_1[e],s=a&&a.prototype,l=a,c={},u=function(e){var t=s[e];redefine(s,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(i&&!isObject(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return i&&!isObject(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(i&&!isObject(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(isForced_1(e,"function"!=typeof a||!(i||s.forEach&&!fails((function(){(new a).entries().next()})))))l=n.getConstructor(t,e,r,o),internalMetadata.REQUIRED=!0;else if(isForced_1(e,!0)){var d=new l,h=d[o](i?{}:-0,1)!=d,p=fails((function(){d.has(1)})),f=checkCorrectnessOfIteration((function(e){new a(e)})),m=!i&&fails((function(){for(var e=new a,t=5;t--;)e[o](t,t);return!e.has(-0)}));f||((l=t((function(t,n){anInstance(t,l,e);var i=inheritIfRequired(new a,t,l);return null!=n&&iterate(n,i[o],{that:i,AS_ENTRIES:r}),i}))).prototype=s,s.constructor=l),(p||m)&&(u("delete"),u("has"),r&&u("get")),(m||h)&&u(o),i&&s.clear&&delete s.clear}return c[e]=l,_export({global:!0,forced:l!=a},c),setToStringTag(l,e),i||n.setStrong(l,e,r),l},getWeakData=internalMetadata.getWeakData,setInternalState$5=internalState.set,internalStateGetterFor=internalState.getterFor,find$1=arrayIteration.find,findIndex=arrayIteration.findIndex,id$1=0,uncaughtFrozenStore=function(e){return e.frozen||(e.frozen=new UncaughtFrozenStore)},UncaughtFrozenStore=function(){this.entries=[]},findUncaughtFrozen=function(e,t){return find$1(e.entries,(function(e){return e[0]===t}))};UncaughtFrozenStore.prototype={get:function(e){var t=findUncaughtFrozen(this,e);if(t)return t[1]},has:function(e){return!!findUncaughtFrozen(this,e)},set:function(e,t){var n=findUncaughtFrozen(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=findIndex(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}};var collectionWeak={getConstructor:function(e,t,n,r){var i=e((function(e,o){anInstance(e,i,t),setInternalState$5(e,{type:t,id:id$1++,frozen:void 0}),null!=o&&iterate(o,e[r],{that:e,AS_ENTRIES:n})})),o=internalStateGetterFor(t),a=function(e,t,n){var r=o(e),i=getWeakData(anObject(t),!0);return!0===i?uncaughtFrozenStore(r).set(t,n):i[r.id]=n,e};return redefineAll(i.prototype,{delete:function(e){var t=o(this);if(!isObject(e))return!1;var n=getWeakData(e);return!0===n?uncaughtFrozenStore(t).delete(e):n&&has(n,t.id)&&delete n[t.id]},has:function(e){var t=o(this);if(!isObject(e))return!1;var n=getWeakData(e);return!0===n?uncaughtFrozenStore(t).has(e):n&&has(n,t.id)}}),redefineAll(i.prototype,n?{get:function(e){var t=o(this);if(isObject(e)){var n=getWeakData(e);return!0===n?uncaughtFrozenStore(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return a(this,e,t)}}:{add:function(e){return a(this,e,!0)}}),i}},es_weakMap=createCommonjsModule((function(e){var t,n=internalState.enforce,r=!global_1.ActiveXObject&&"ActiveXObject"in global_1,i=Object.isExtensible,o=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},a=e.exports=collection("WeakMap",o,collectionWeak);if(nativeWeakMap&&r){t=collectionWeak.getConstructor(o,"WeakMap",!0),internalMetadata.REQUIRED=!0;var s=a.prototype,l=s.delete,c=s.has,u=s.get,d=s.set;redefineAll(s,{delete:function(e){if(isObject(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),l.call(this,e)||r.frozen.delete(e)}return l.call(this,e)},has:function(e){if(isObject(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),c.call(this,e)||r.frozen.has(e)}return c.call(this,e)},get:function(e){if(isObject(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),c.call(this,e)?u.call(this,e):r.frozen.get(e)}return u.call(this,e)},set:function(e,r){if(isObject(e)&&!i(e)){var o=n(this);o.frozen||(o.frozen=new t),c.call(this,e)?d.call(this,e,r):o.frozen.set(e,r)}else d.call(this,e,r);return this}})}})),$every=arrayIteration.every,STRICT_METHOD$3=arrayMethodIsStrict("every"),USES_TO_LENGTH$7=arrayMethodUsesToLength("every");_export({target:"Array",proto:!0,forced:!STRICT_METHOD$3||!USES_TO_LENGTH$7},{every:function(e){return $every(this,e,arguments.length>1?arguments[1]:void 0)}}),_export({target:"Object",stat:!0,forced:Object.assign!==objectAssign},{assign:objectAssign});var non="​…᠎",stringTrimForced=function(e){return fails((function(){return!!whitespaces[e]()||non[e]()!=non||whitespaces[e].name!==e}))},$trim=stringTrim.trim;_export({target:"String",proto:!0,forced:stringTrimForced("trim")},{trim:function(){return $trim(this)}});var $some=arrayIteration.some,STRICT_METHOD$4=arrayMethodIsStrict("some"),USES_TO_LENGTH$8=arrayMethodUsesToLength("some");_export({target:"Array",proto:!0,forced:!STRICT_METHOD$4||!USES_TO_LENGTH$8},{some:function(e){return $some(this,e,arguments.length>1?arguments[1]:void 0)}});var thisNumberValue=function(e){if("number"!=typeof e&&"Number"!=classofRaw(e))throw TypeError("Incorrect invocation");return+e},stringRepeat="".repeat||function(e){var t=String(requireObjectCoercible(this)),n="",r=toInteger(e);if(r<0||r==1/0)throw RangeError("Wrong number of repetitions");for(;r>0;(r>>>=1)&&(t+=t))1&r&&(n+=t);return n},nativeToFixed=1..toFixed,floor$4=Math.floor,pow$1=function(e,t,n){return 0===t?n:t%2==1?pow$1(e,t-1,n*e):pow$1(e*e,t/2,n)},log=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t},FORCED$1=nativeToFixed&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!fails((function(){nativeToFixed.call({})}));_export({target:"Number",proto:!0,forced:FORCED$1},{toFixed:function(e){var t,n,r,i,o=thisNumberValue(this),a=toInteger(e),s=[0,0,0,0,0,0],l="",c="0",u=function(e,t){for(var n=-1,r=t;++n<6;)r+=e*s[n],s[n]=r%1e7,r=floor$4(r/1e7)},d=function(e){for(var t=6,n=0;--t>=0;)n+=s[t],s[t]=floor$4(n/e),n=n%e*1e7},h=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==s[e]){var n=String(s[e]);t=""===t?n:t+stringRepeat.call("0",7-n.length)+n}return t};if(a<0||a>20)throw RangeError("Incorrect fraction digits");if(o!=o)return"NaN";if(o<=-1e21||o>=1e21)return String(o);if(o<0&&(l="-",o=-o),o>1e-21)if(n=(t=log(o*pow$1(2,69,1))-69)<0?o*pow$1(2,-t,1):o/pow$1(2,t,1),n*=4503599627370496,(t=52-t)>0){for(u(0,n),r=a;r>=7;)u(1e7,0),r-=7;for(u(pow$1(10,r,1),0),r=t-1;r>=23;)d(1<<23),r-=23;d(1<<r),u(1,1),d(2),c=h()}else u(0,n),u(1<<-t,0),c=h()+stringRepeat.call("0",a);return c=a>0?l+((i=c.length)<=a?"0."+stringRepeat.call("0",a-i)+c:c.slice(0,i-a)+"."+c.slice(i-a)):l+c}});var propertyIsEnumerable=objectPropertyIsEnumerable.f,createMethod$4=function(e){return function(t){for(var n,r=toIndexedObject(t),i=objectKeys(r),o=i.length,a=0,s=[];o>a;)n=i[a++],descriptors&&!propertyIsEnumerable.call(r,n)||s.push(e?[n,r[n]]:r[n]);return s}},objectToArray={entries:createMethod$4(!0),values:createMethod$4(!1)},$entries=objectToArray.entries;_export({target:"Object",stat:!0},{entries:function(e){return $entries(e)}});var $values=objectToArray.values;_export({target:"Object",stat:!0},{values:function(e){return $values(e)}}),_export({target:"Number",stat:!0},{isNaN:function(e){return e!=e}});var nativeGetOwnPropertyDescriptor$2=objectGetOwnPropertyDescriptor.f,FAILS_ON_PRIMITIVES$1=fails((function(){nativeGetOwnPropertyDescriptor$2(1)})),FORCED$2=!descriptors||FAILS_ON_PRIMITIVES$1;function _classCallCheck$1(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties$1(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass$1(e,t,n){return t&&_defineProperties$1(e.prototype,t),n&&_defineProperties$1(e,n),e}function _defineProperty$1(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys$2(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2$1(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys$2(Object(n),!0).forEach((function(t){_defineProperty$1(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys$2(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}_export({target:"Object",stat:!0,forced:FORCED$2,sham:!descriptors},{getOwnPropertyDescriptor:function(e,t){return nativeGetOwnPropertyDescriptor$2(toIndexedObject(e),t)}}),_export({target:"Object",stat:!0,sham:!descriptors},{getOwnPropertyDescriptors:function(e){for(var t,n,r=toIndexedObject(e),i=objectGetOwnPropertyDescriptor.f,o=ownKeys(r),a={},s=0;o.length>s;)void 0!==(n=i(r,t=o[s++]))&&createProperty(a,t,n);return a}}),fixRegexpWellKnownSymbolLogic("match",1,(function(e,t,n){return[function(t){var n=requireObjectCoercible(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=anObject(e),o=String(this);if(!i.global)return regexpExecAbstract(i,o);var a=i.unicode;i.lastIndex=0;for(var s,l=[],c=0;null!==(s=regexpExecAbstract(i,o));){var u=String(s[0]);l[c]=u,""===u&&(i.lastIndex=advanceStringIndex(o,toLength(i.lastIndex),a)),c++}return 0===c?null:l}]}));var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject$1=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray$1=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray$1(e)||isNodeList(e))&&!e.length||isObject$1(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject$1,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray$1,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var defer,channel,port,RangeTouch=function(){function e(t,n){_classCallCheck$1(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2$1({},defaults,{},n),this.init())}return _createClass$1(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute("min"))||0,a=parseFloat(r.getAttribute("max"))||100,s=parseFloat(r.getAttribute("step"))||1,l=r.getBoundingClientRect(),c=100/l.width*(this.config.thumbWidth/2)/100;return 0>(n=100/l.width*(i.clientX-l.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*c:50<n&&(n+=2*(n-50)*c),o+round(n/100*(a-o),s)}},{key:"set",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type="range"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2$1({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),nativePromiseConstructor=global_1.Promise,SPECIES$5=wellKnownSymbol("species"),setSpecies=function(e){var t=getBuiltIn(e),n=objectDefineProperty.f;descriptors&&t&&!t[SPECIES$5]&&n(t,SPECIES$5,{configurable:!0,get:function(){return this}})},engineIsIos=/(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent),engineIsNode="process"==classofRaw(global_1.process),location=global_1.location,set$1=global_1.setImmediate,clear=global_1.clearImmediate,process$1=global_1.process,MessageChannel=global_1.MessageChannel,Dispatch=global_1.Dispatch,counter=0,queue={},ONREADYSTATECHANGE="onreadystatechange",run=function(e){if(queue.hasOwnProperty(e)){var t=queue[e];delete queue[e],t()}},runner=function(e){return function(){run(e)}},listener=function(e){run(e.data)},post=function(e){global_1.postMessage(e+"",location.protocol+"//"+location.host)};set$1&&clear||(set$1=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return queue[++counter]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},defer(counter),counter},clear=function(e){delete queue[e]},engineIsNode?defer=function(e){process$1.nextTick(runner(e))}:Dispatch&&Dispatch.now?defer=function(e){Dispatch.now(runner(e))}:MessageChannel&&!engineIsIos?(port=(channel=new MessageChannel).port2,channel.port1.onmessage=listener,defer=functionBindContext(port.postMessage,port,1)):global_1.addEventListener&&"function"==typeof postMessage&&!global_1.importScripts&&location&&"file:"!==location.protocol&&!fails(post)?(defer=post,global_1.addEventListener("message",listener,!1)):defer=ONREADYSTATECHANGE in documentCreateElement("script")?function(e){html.appendChild(documentCreateElement("script"))[ONREADYSTATECHANGE]=function(){html.removeChild(this),run(e)}}:function(e){setTimeout(runner(e),0)});var flush,head,last,notify,toggle,node,promise,then,task={set:set$1,clear:clear},getOwnPropertyDescriptor$3=objectGetOwnPropertyDescriptor.f,macrotask=task.set,MutationObserver$1=global_1.MutationObserver||global_1.WebKitMutationObserver,document$2=global_1.document,process$2=global_1.process,Promise$1=global_1.Promise,queueMicrotaskDescriptor=getOwnPropertyDescriptor$3(global_1,"queueMicrotask"),queueMicrotask=queueMicrotaskDescriptor&&queueMicrotaskDescriptor.value;queueMicrotask||(flush=function(){var e,t;for(engineIsNode&&(e=process$2.domain)&&e.exit();head;){t=head.fn,head=head.next;try{t()}catch(e){throw head?notify():last=void 0,e}}last=void 0,e&&e.enter()},!engineIsIos&&!engineIsNode&&MutationObserver$1&&document$2?(toggle=!0,node=document$2.createTextNode(""),new MutationObserver$1(flush).observe(node,{characterData:!0}),notify=function(){node.data=toggle=!toggle}):Promise$1&&Promise$1.resolve?(promise=Promise$1.resolve(void 0),then=promise.then,notify=function(){then.call(promise,flush)}):notify=engineIsNode?function(){process$2.nextTick(flush)}:function(){macrotask.call(global_1,flush)});var Internal,OwnPromiseCapability,PromiseWrapper,nativeThen,microtask=queueMicrotask||function(e){var t={fn:e,next:void 0};last&&(last.next=t),head||(head=t,notify()),last=t},PromiseCapability=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=aFunction$1(t),this.reject=aFunction$1(n)},f$7=function(e){return new PromiseCapability(e)},newPromiseCapability={f:f$7},promiseResolve=function(e,t){if(anObject(e),isObject(t)&&t.constructor===e)return t;var n=newPromiseCapability.f(e);return(0,n.resolve)(t),n.promise},hostReportErrors=function(e,t){var n=global_1.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))},perform=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},task$1=task.set,SPECIES$6=wellKnownSymbol("species"),PROMISE="Promise",getInternalState$3=internalState.get,setInternalState$6=internalState.set,getInternalPromiseState=internalState.getterFor(PROMISE),PromiseConstructor=nativePromiseConstructor,TypeError$1=global_1.TypeError,document$3=global_1.document,process$3=global_1.process,$fetch$1=getBuiltIn("fetch"),newPromiseCapability$1=newPromiseCapability.f,newGenericPromiseCapability=newPromiseCapability$1,DISPATCH_EVENT=!!(document$3&&document$3.createEvent&&global_1.dispatchEvent),NATIVE_REJECTION_EVENT="function"==typeof PromiseRejectionEvent,UNHANDLED_REJECTION="unhandledrejection",REJECTION_HANDLED="rejectionhandled",PENDING=0,FULFILLED=1,REJECTED=2,HANDLED=1,UNHANDLED=2,FORCED$3=isForced_1(PROMISE,(function(){if(!(inspectSource(PromiseConstructor)!==String(PromiseConstructor))){if(66===engineV8Version)return!0;if(!engineIsNode&&!NATIVE_REJECTION_EVENT)return!0}if(engineV8Version>=51&&/native code/.test(PromiseConstructor))return!1;var e=PromiseConstructor.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[SPECIES$6]=t,!(e.then((function(){}))instanceof t)})),INCORRECT_ITERATION$1=FORCED$3||!checkCorrectnessOfIteration((function(e){PromiseConstructor.all(e).catch((function(){}))})),isThenable=function(e){var t;return!(!isObject(e)||"function"!=typeof(t=e.then))&&t},notify$1=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;microtask((function(){for(var r=e.value,i=e.state==FULFILLED,o=0;n.length>o;){var a,s,l,c=n[o++],u=i?c.ok:c.fail,d=c.resolve,h=c.reject,p=c.domain;try{u?(i||(e.rejection===UNHANDLED&&onHandleUnhandled(e),e.rejection=HANDLED),!0===u?a=r:(p&&p.enter(),a=u(r),p&&(p.exit(),l=!0)),a===c.promise?h(TypeError$1("Promise-chain cycle")):(s=isThenable(a))?s.call(a,d,h):d(a)):h(r)}catch(e){p&&!l&&p.exit(),h(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&onUnhandled(e)}))}},dispatchEvent=function(e,t,n){var r,i;DISPATCH_EVENT?((r=document$3.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),global_1.dispatchEvent(r)):r={promise:t,reason:n},!NATIVE_REJECTION_EVENT&&(i=global_1["on"+e])?i(r):e===UNHANDLED_REJECTION&&hostReportErrors("Unhandled promise rejection",n)},onUnhandled=function(e){task$1.call(global_1,(function(){var t,n=e.facade,r=e.value;if(isUnhandled(e)&&(t=perform((function(){engineIsNode?process$3.emit("unhandledRejection",r,n):dispatchEvent(UNHANDLED_REJECTION,n,r)})),e.rejection=engineIsNode||isUnhandled(e)?UNHANDLED:HANDLED,t.error))throw t.value}))},isUnhandled=function(e){return e.rejection!==HANDLED&&!e.parent},onHandleUnhandled=function(e){task$1.call(global_1,(function(){var t=e.facade;engineIsNode?process$3.emit("rejectionHandled",t):dispatchEvent(REJECTION_HANDLED,t,e.value)}))},bind=function(e,t,n){return function(r){e(t,r,n)}},internalReject=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=REJECTED,notify$1(e,!0))},internalResolve=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw TypeError$1("Promise can't be resolved itself");var r=isThenable(t);r?microtask((function(){var n={done:!1};try{r.call(t,bind(internalResolve,n,e),bind(internalReject,n,e))}catch(t){internalReject(n,t,e)}})):(e.value=t,e.state=FULFILLED,notify$1(e,!1))}catch(t){internalReject({done:!1},t,e)}}};FORCED$3&&(PromiseConstructor=function(e){anInstance(this,PromiseConstructor,PROMISE),aFunction$1(e),Internal.call(this);var t=getInternalState$3(this);try{e(bind(internalResolve,t),bind(internalReject,t))}catch(e){internalReject(t,e)}},(Internal=function(e){setInternalState$6(this,{type:PROMISE,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:PENDING,value:void 0})}).prototype=redefineAll(PromiseConstructor.prototype,{then:function(e,t){var n=getInternalPromiseState(this),r=newPromiseCapability$1(speciesConstructor(this,PromiseConstructor));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=engineIsNode?process$3.domain:void 0,n.parent=!0,n.reactions.push(r),n.state!=PENDING&&notify$1(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),OwnPromiseCapability=function(){var e=new Internal,t=getInternalState$3(e);this.promise=e,this.resolve=bind(internalResolve,t),this.reject=bind(internalReject,t)},newPromiseCapability.f=newPromiseCapability$1=function(e){return e===PromiseConstructor||e===PromiseWrapper?new OwnPromiseCapability(e):newGenericPromiseCapability(e)},"function"==typeof nativePromiseConstructor&&(nativeThen=nativePromiseConstructor.prototype.then,redefine(nativePromiseConstructor.prototype,"then",(function(e,t){var n=this;return new PromiseConstructor((function(e,t){nativeThen.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof $fetch$1&&_export({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return promiseResolve(PromiseConstructor,$fetch$1.apply(global_1,arguments))}}))),_export({global:!0,wrap:!0,forced:FORCED$3},{Promise:PromiseConstructor}),setToStringTag(PromiseConstructor,PROMISE,!1),setSpecies(PROMISE),PromiseWrapper=getBuiltIn(PROMISE),_export({target:PROMISE,stat:!0,forced:FORCED$3},{reject:function(e){var t=newPromiseCapability$1(this);return t.reject.call(void 0,e),t.promise}}),_export({target:PROMISE,stat:!0,forced:FORCED$3},{resolve:function(e){return promiseResolve(this,e)}}),_export({target:PROMISE,stat:!0,forced:INCORRECT_ITERATION$1},{all:function(e){var t=this,n=newPromiseCapability$1(t),r=n.resolve,i=n.reject,o=perform((function(){var n=aFunction$1(t.resolve),o=[],a=0,s=1;iterate(e,(function(e){var l=a++,c=!1;o.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,o[l]=e,--s||r(o))}),i)})),--s||r(o)}));return o.error&&i(o.value),n.promise},race:function(e){var t=this,n=newPromiseCapability$1(t),r=n.reject,i=perform((function(){var i=aFunction$1(t.resolve);iterate(e,(function(e){i.call(t,e).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}});var getOwnPropertyDescriptor$4=objectGetOwnPropertyDescriptor.f,nativeStartsWith="".startsWith,min$4=Math.min,CORRECT_IS_REGEXP_LOGIC=correctIsRegexpLogic("startsWith"),MDN_POLYFILL_BUG=!CORRECT_IS_REGEXP_LOGIC&&!!function(){var e=getOwnPropertyDescriptor$4(String.prototype,"startsWith");return e&&!e.writable}();_export({target:"String",proto:!0,forced:!MDN_POLYFILL_BUG&&!CORRECT_IS_REGEXP_LOGIC},{startsWith:function(e){var t=String(requireObjectCoercible(this));notARegexp(e);var n=toLength(min$4(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return nativeStartsWith?nativeStartsWith.call(t,r,n):t.slice(n,n+r.length)===r}});var getConstructor$1=function(e){return null!=e?e.constructor:null},instanceOf$1=function(e,t){return Boolean(e&&t&&e instanceof t)},isNullOrUndefined$1=function(e){return null==e},isObject$2=function(e){return getConstructor$1(e)===Object},isNumber$1=function(e){return getConstructor$1(e)===Number&&!Number.isNaN(e)},isString$1=function(e){return getConstructor$1(e)===String},isBoolean$1=function(e){return getConstructor$1(e)===Boolean},isFunction$1=function(e){return getConstructor$1(e)===Function},isArray$2=function(e){return Array.isArray(e)},isWeakMap=function(e){return instanceOf$1(e,WeakMap)},isNodeList$1=function(e){return instanceOf$1(e,NodeList)},isElement$1=function(e){return instanceOf$1(e,Element)},isTextNode=function(e){return getConstructor$1(e)===Text},isEvent$1=function(e){return instanceOf$1(e,Event)},isKeyboardEvent=function(e){return instanceOf$1(e,KeyboardEvent)},isCue=function(e){return instanceOf$1(e,window.TextTrackCue)||instanceOf$1(e,window.VTTCue)},isTrack=function(e){return instanceOf$1(e,TextTrack)||!isNullOrUndefined$1(e)&&isString$1(e.kind)},isPromise=function(e){return instanceOf$1(e,Promise)&&isFunction$1(e.then)},isEmpty$1=function(e){return isNullOrUndefined$1(e)||(isString$1(e)||isArray$2(e)||isNodeList$1(e))&&!e.length||isObject$2(e)&&!Object.keys(e).length},isUrl=function(e){if(instanceOf$1(e,window.URL))return!0;if(!isString$1(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!isEmpty$1(new URL(t).hostname)}catch(e){return!1}},is$1={nullOrUndefined:isNullOrUndefined$1,object:isObject$2,number:isNumber$1,string:isString$1,boolean:isBoolean$1,function:isFunction$1,array:isArray$2,weakMap:isWeakMap,nodeList:isNodeList$1,element:isElement$1,textNode:isTextNode,event:isEvent$1,keyboardEvent:isKeyboardEvent,cue:isCue,track:isTrack,promise:isPromise,url:isUrl,empty:isEmpty$1},transitionEndEvent=function(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n=Object.keys(t).find((function(t){return void 0!==e.style[t]}));return!!is$1.string(n)&&t[n]}();function repaint(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var browser={isIE:
+!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,r;return(t=t||{}).bubbles=!!t.bubbles,t.cancelable=!!t.cancelable,(n=document.createEvent("CustomEvent")).initCustomEvent(e,t.bubbles,t.cancelable,t.detail),r=n.preventDefault,n.preventDefault=function(){r.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 commonjsGlobal="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function createCommonjsModule(e,t){return e(t={exports:{}},t.exports),t.exports}var check=function(e){return e&&e.Math==Math&&e},global_1=check("object"==typeof globalThis&&globalThis)||check("object"==typeof window&&window)||check("object"==typeof self&&self)||check("object"==typeof commonjsGlobal&&commonjsGlobal)||function(){return this}()||Function("return this")(),fails=function(e){try{return!!e()}catch(e){return!0}},descriptors=!fails((function(){return 7!=Object.defineProperty({},1,{get:function(){return 7}})[1]})),nativePropertyIsEnumerable={}.propertyIsEnumerable,getOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,NASHORN_BUG=getOwnPropertyDescriptor&&!nativePropertyIsEnumerable.call({1:2},1),f=NASHORN_BUG?function(e){var t=getOwnPropertyDescriptor(this,e);return!!t&&t.enumerable}:nativePropertyIsEnumerable,objectPropertyIsEnumerable={f:f},createPropertyDescriptor=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}},toString={}.toString,classofRaw=function(e){return toString.call(e).slice(8,-1)},split="".split,indexedObject=fails((function(){return!Object("z").propertyIsEnumerable(0)}))?function(e){return"String"==classofRaw(e)?split.call(e,""):Object(e)}:Object,requireObjectCoercible=function(e){if(null==e)throw TypeError("Can't call method on "+e);return e},toIndexedObject=function(e){return indexedObject(requireObjectCoercible(e))},isObject=function(e){return"object"==typeof e?null!==e:"function"==typeof e},toPrimitive=function(e,t){if(!isObject(e))return e;var n,r;if(t&&"function"==typeof(n=e.toString)&&!isObject(r=n.call(e)))return r;if("function"==typeof(n=e.valueOf)&&!isObject(r=n.call(e)))return r;if(!t&&"function"==typeof(n=e.toString)&&!isObject(r=n.call(e)))return r;throw TypeError("Can't convert object to primitive value")},hasOwnProperty={}.hasOwnProperty,has=function(e,t){return hasOwnProperty.call(e,t)},document$1=global_1.document,EXISTS=isObject(document$1)&&isObject(document$1.createElement),documentCreateElement=function(e){return EXISTS?document$1.createElement(e):{}},ie8DomDefine=!descriptors&&!fails((function(){return 7!=Object.defineProperty(documentCreateElement("div"),"a",{get:function(){return 7}}).a})),nativeGetOwnPropertyDescriptor=Object.getOwnPropertyDescriptor,f$1=descriptors?nativeGetOwnPropertyDescriptor:function(e,t){if(e=toIndexedObject(e),t=toPrimitive(t,!0),ie8DomDefine)try{return nativeGetOwnPropertyDescriptor(e,t)}catch(e){}if(has(e,t))return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(e,t),e[t])},objectGetOwnPropertyDescriptor={f:f$1},anObject=function(e){if(!isObject(e))throw TypeError(String(e)+" is not an object");return e},nativeDefineProperty=Object.defineProperty,f$2=descriptors?nativeDefineProperty:function(e,t,n){if(anObject(e),t=toPrimitive(t,!0),anObject(n),ie8DomDefine)try{return nativeDefineProperty(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},objectDefineProperty={f:f$2},createNonEnumerableProperty=descriptors?function(e,t,n){return objectDefineProperty.f(e,t,createPropertyDescriptor(1,n))}:function(e,t,n){return e[t]=n,e},setGlobal=function(e,t){try{createNonEnumerableProperty(global_1,e,t)}catch(n){global_1[e]=t}return t},SHARED="__core-js_shared__",store=global_1[SHARED]||setGlobal(SHARED,{}),sharedStore=store,functionToString=Function.toString;"function"!=typeof sharedStore.inspectSource&&(sharedStore.inspectSource=function(e){return functionToString.call(e)});var set,get,has$1,inspectSource=sharedStore.inspectSource,WeakMap$1=global_1.WeakMap,nativeWeakMap="function"==typeof WeakMap$1&&/native code/.test(inspectSource(WeakMap$1)),isPure=!1,shared=createCommonjsModule((function(e){(e.exports=function(e,t){return sharedStore[e]||(sharedStore[e]=void 0!==t?t:{})})("versions",[]).push({version:"3.7.0",mode:"global",copyright:"© 2020 Denis Pushkarev (zloirock.ru)"})})),id=0,postfix=Math.random(),uid=function(e){return"Symbol("+String(void 0===e?"":e)+")_"+(++id+postfix).toString(36)},keys=shared("keys"),sharedKey=function(e){return keys[e]||(keys[e]=uid(e))},hiddenKeys={},WeakMap$2=global_1.WeakMap,enforce=function(e){return has$1(e)?get(e):set(e,{})},getterFor=function(e){return function(t){var n;if(!isObject(t)||(n=get(t)).type!==e)throw TypeError("Incompatible receiver, "+e+" required");return n}};if(nativeWeakMap){var store$1=sharedStore.state||(sharedStore.state=new WeakMap$2),wmget=store$1.get,wmhas=store$1.has,wmset=store$1.set;set=function(e,t){return t.facade=e,wmset.call(store$1,e,t),t},get=function(e){return wmget.call(store$1,e)||{}},has$1=function(e){return wmhas.call(store$1,e)}}else{var STATE=sharedKey("state");hiddenKeys[STATE]=!0,set=function(e,t){return t.facade=e,createNonEnumerableProperty(e,STATE,t),t},get=function(e){return has(e,STATE)?e[STATE]:{}},has$1=function(e){return has(e,STATE)}}var activeXDocument,internalState={set:set,get:get,has:has$1,enforce:enforce,getterFor:getterFor},redefine=createCommonjsModule((function(e){var t=internalState.get,n=internalState.enforce,r=String(String).split("String");(e.exports=function(e,t,i,o){var a,s=!!o&&!!o.unsafe,l=!!o&&!!o.enumerable,c=!!o&&!!o.noTargetGet;"function"==typeof i&&("string"!=typeof t||has(i,"name")||createNonEnumerableProperty(i,"name",t),(a=n(i)).source||(a.source=r.join("string"==typeof t?t:""))),e!==global_1?(s?!c&&e[t]&&(l=!0):delete e[t],l?e[t]=i:createNonEnumerableProperty(e,t,i)):l?e[t]=i:setGlobal(t,i)})(Function.prototype,"toString",(function(){return"function"==typeof this&&t(this).source||inspectSource(this)}))})),path=global_1,aFunction=function(e){return"function"==typeof e?e:void 0},getBuiltIn=function(e,t){return arguments.length<2?aFunction(path[e])||aFunction(global_1[e]):path[e]&&path[e][t]||global_1[e]&&global_1[e][t]},ceil=Math.ceil,floor=Math.floor,toInteger=function(e){return isNaN(e=+e)?0:(e>0?floor:ceil)(e)},min=Math.min,toLength=function(e){return e>0?min(toInteger(e),9007199254740991):0},max=Math.max,min$1=Math.min,toAbsoluteIndex=function(e,t){var n=toInteger(e);return n<0?max(n+t,0):min$1(n,t)},createMethod=function(e){return function(t,n,r){var i,o=toIndexedObject(t),a=toLength(o.length),s=toAbsoluteIndex(r,a);if(e&&n!=n){for(;a>s;)if((i=o[s++])!=i)return!0}else for(;a>s;s++)if((e||s in o)&&o[s]===n)return e||s||0;return!e&&-1}},arrayIncludes={includes:createMethod(!0),indexOf:createMethod(!1)},indexOf=arrayIncludes.indexOf,objectKeysInternal=function(e,t){var n,r=toIndexedObject(e),i=0,o=[];for(n in r)!has(hiddenKeys,n)&&has(r,n)&&o.push(n);for(;t.length>i;)has(r,n=t[i++])&&(~indexOf(o,n)||o.push(n));return o},enumBugKeys=["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf"],hiddenKeys$1=enumBugKeys.concat("length","prototype"),f$3=Object.getOwnPropertyNames||function(e){return objectKeysInternal(e,hiddenKeys$1)},objectGetOwnPropertyNames={f:f$3},f$4=Object.getOwnPropertySymbols,objectGetOwnPropertySymbols={f:f$4},ownKeys=getBuiltIn("Reflect","ownKeys")||function(e){var t=objectGetOwnPropertyNames.f(anObject(e)),n=objectGetOwnPropertySymbols.f;return n?t.concat(n(e)):t},copyConstructorProperties=function(e,t){for(var n=ownKeys(t),r=objectDefineProperty.f,i=objectGetOwnPropertyDescriptor.f,o=0;o<n.length;o++){var a=n[o];has(e,a)||r(e,a,i(t,a))}},replacement=/#|\.prototype\./,isForced=function(e,t){var n=data[normalize(e)];return n==POLYFILL||n!=NATIVE&&("function"==typeof t?fails(t):!!t)},normalize=isForced.normalize=function(e){return String(e).replace(replacement,".").toLowerCase()},data=isForced.data={},NATIVE=isForced.NATIVE="N",POLYFILL=isForced.POLYFILL="P",isForced_1=isForced,getOwnPropertyDescriptor$1=objectGetOwnPropertyDescriptor.f,_export=function(e,t){var n,r,i,o,a,s=e.target,l=e.global,c=e.stat;if(n=l?global_1:c?global_1[s]||setGlobal(s,{}):(global_1[s]||{}).prototype)for(r in t){if(o=t[r],i=e.noTargetGet?(a=getOwnPropertyDescriptor$1(n,r))&&a.value:n[r],!isForced_1(l?r:s+(c?".":"#")+r,e.forced)&&void 0!==i){if(typeof o==typeof i)continue;copyConstructorProperties(o,i)}(e.sham||i&&i.sham)&&createNonEnumerableProperty(o,"sham",!0),redefine(n,r,o,e)}},nativeSymbol=!!Object.getOwnPropertySymbols&&!fails((function(){return!String(Symbol())})),useSymbolAsUid=nativeSymbol&&!Symbol.sham&&"symbol"==typeof Symbol.iterator,isArray=Array.isArray||function(e){return"Array"==classofRaw(e)},toObject=function(e){return Object(requireObjectCoercible(e))},objectKeys=Object.keys||function(e){return objectKeysInternal(e,enumBugKeys)},objectDefineProperties=descriptors?Object.defineProperties:function(e,t){anObject(e);for(var n,r=objectKeys(t),i=r.length,o=0;i>o;)objectDefineProperty.f(e,n=r[o++],t[n]);return e},html=getBuiltIn("document","documentElement"),GT=">",LT="<",PROTOTYPE="prototype",SCRIPT="script",IE_PROTO=sharedKey("IE_PROTO"),EmptyConstructor=function(){},scriptTag=function(e){return LT+SCRIPT+GT+e+LT+"/"+SCRIPT+GT},NullProtoObjectViaActiveX=function(e){e.write(scriptTag("")),e.close();var t=e.parentWindow.Object;return e=null,t},NullProtoObjectViaIFrame=function(){var e,t=documentCreateElement("iframe"),n="java"+SCRIPT+":";return t.style.display="none",html.appendChild(t),t.src=String(n),(e=t.contentWindow.document).open(),e.write(scriptTag("document.F=Object")),e.close(),e.F},NullProtoObject=function(){try{activeXDocument=document.domain&&new ActiveXObject("htmlfile")}catch(e){}NullProtoObject=activeXDocument?NullProtoObjectViaActiveX(activeXDocument):NullProtoObjectViaIFrame();for(var e=enumBugKeys.length;e--;)delete NullProtoObject[PROTOTYPE][enumBugKeys[e]];return NullProtoObject()};hiddenKeys[IE_PROTO]=!0;var objectCreate=Object.create||function(e,t){var n;return null!==e?(EmptyConstructor[PROTOTYPE]=anObject(e),n=new EmptyConstructor,EmptyConstructor[PROTOTYPE]=null,n[IE_PROTO]=e):n=NullProtoObject(),void 0===t?n:objectDefineProperties(n,t)},nativeGetOwnPropertyNames=objectGetOwnPropertyNames.f,toString$1={}.toString,windowNames="object"==typeof window&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],getWindowNames=function(e){try{return nativeGetOwnPropertyNames(e)}catch(e){return windowNames.slice()}},f$5=function(e){return windowNames&&"[object Window]"==toString$1.call(e)?getWindowNames(e):nativeGetOwnPropertyNames(toIndexedObject(e))},objectGetOwnPropertyNamesExternal={f:f$5},WellKnownSymbolsStore=shared("wks"),Symbol$1=global_1.Symbol,createWellKnownSymbol=useSymbolAsUid?Symbol$1:Symbol$1&&Symbol$1.withoutSetter||uid,wellKnownSymbol=function(e){return has(WellKnownSymbolsStore,e)||(nativeSymbol&&has(Symbol$1,e)?WellKnownSymbolsStore[e]=Symbol$1[e]:WellKnownSymbolsStore[e]=createWellKnownSymbol("Symbol."+e)),WellKnownSymbolsStore[e]},f$6=wellKnownSymbol,wellKnownSymbolWrapped={f:f$6},defineProperty=objectDefineProperty.f,defineWellKnownSymbol=function(e){var t=path.Symbol||(path.Symbol={});has(t,e)||defineProperty(t,e,{value:wellKnownSymbolWrapped.f(e)})},defineProperty$1=objectDefineProperty.f,TO_STRING_TAG=wellKnownSymbol("toStringTag"),setToStringTag=function(e,t,n){e&&!has(e=n?e:e.prototype,TO_STRING_TAG)&&defineProperty$1(e,TO_STRING_TAG,{configurable:!0,value:t})},aFunction$1=function(e){if("function"!=typeof e)throw TypeError(String(e)+" is not a function");return e},functionBindContext=function(e,t,n){if(aFunction$1(e),void 0===t)return e;switch(n){case 0:return function(){return e.call(t)};case 1:return function(n){return e.call(t,n)};case 2:return function(n,r){return e.call(t,n,r)};case 3:return function(n,r,i){return e.call(t,n,r,i)}}return function(){return e.apply(t,arguments)}},SPECIES=wellKnownSymbol("species"),arraySpeciesCreate=function(e,t){var n;return isArray(e)&&("function"!=typeof(n=e.constructor)||n!==Array&&!isArray(n.prototype)?isObject(n)&&null===(n=n[SPECIES])&&(n=void 0):n=void 0),new(void 0===n?Array:n)(0===t?0:t)},push=[].push,createMethod$1=function(e){var t=1==e,n=2==e,r=3==e,i=4==e,o=6==e,a=5==e||o;return function(s,l,c,u){for(var d,p,f=toObject(s),h=indexedObject(f),m=functionBindContext(l,c,3),g=toLength(h.length),y=0,b=u||arraySpeciesCreate,v=t?b(s,g):n?b(s,0):void 0;g>y;y++)if((a||y in h)&&(p=m(d=h[y],y,f),e))if(t)v[y]=p;else if(p)switch(e){case 3:return!0;case 5:return d;case 6:return y;case 2:push.call(v,d)}else if(i)return!1;return o?-1:r||i?i:v}},arrayIteration={forEach:createMethod$1(0),map:createMethod$1(1),filter:createMethod$1(2),some:createMethod$1(3),every:createMethod$1(4),find:createMethod$1(5),findIndex:createMethod$1(6)},$forEach=arrayIteration.forEach,HIDDEN=sharedKey("hidden"),SYMBOL="Symbol",PROTOTYPE$1="prototype",TO_PRIMITIVE=wellKnownSymbol("toPrimitive"),setInternalState=internalState.set,getInternalState=internalState.getterFor(SYMBOL),ObjectPrototype=Object[PROTOTYPE$1],$Symbol=global_1.Symbol,$stringify=getBuiltIn("JSON","stringify"),nativeGetOwnPropertyDescriptor$1=objectGetOwnPropertyDescriptor.f,nativeDefineProperty$1=objectDefineProperty.f,nativeGetOwnPropertyNames$1=objectGetOwnPropertyNamesExternal.f,nativePropertyIsEnumerable$1=objectPropertyIsEnumerable.f,AllSymbols=shared("symbols"),ObjectPrototypeSymbols=shared("op-symbols"),StringToSymbolRegistry=shared("string-to-symbol-registry"),SymbolToStringRegistry=shared("symbol-to-string-registry"),WellKnownSymbolsStore$1=shared("wks"),QObject=global_1.QObject,USE_SETTER=!QObject||!QObject[PROTOTYPE$1]||!QObject[PROTOTYPE$1].findChild,setSymbolDescriptor=descriptors&&fails((function(){return 7!=objectCreate(nativeDefineProperty$1({},"a",{get:function(){return nativeDefineProperty$1(this,"a",{value:7}).a}})).a}))?function(e,t,n){var r=nativeGetOwnPropertyDescriptor$1(ObjectPrototype,t);r&&delete ObjectPrototype[t],nativeDefineProperty$1(e,t,n),r&&e!==ObjectPrototype&&nativeDefineProperty$1(ObjectPrototype,t,r)}:nativeDefineProperty$1,wrap=function(e,t){var n=AllSymbols[e]=objectCreate($Symbol[PROTOTYPE$1]);return setInternalState(n,{type:SYMBOL,tag:e,description:t}),descriptors||(n.description=t),n},isSymbol=useSymbolAsUid?function(e){return"symbol"==typeof e}:function(e){return Object(e)instanceof $Symbol},$defineProperty=function(e,t,n){e===ObjectPrototype&&$defineProperty(ObjectPrototypeSymbols,t,n),anObject(e);var r=toPrimitive(t,!0);return anObject(n),has(AllSymbols,r)?(n.enumerable?(has(e,HIDDEN)&&e[HIDDEN][r]&&(e[HIDDEN][r]=!1),n=objectCreate(n,{enumerable:createPropertyDescriptor(0,!1)})):(has(e,HIDDEN)||nativeDefineProperty$1(e,HIDDEN,createPropertyDescriptor(1,{})),e[HIDDEN][r]=!0),setSymbolDescriptor(e,r,n)):nativeDefineProperty$1(e,r,n)},$defineProperties=function(e,t){anObject(e);var n=toIndexedObject(t),r=objectKeys(n).concat($getOwnPropertySymbols(n));return $forEach(r,(function(t){descriptors&&!$propertyIsEnumerable.call(n,t)||$defineProperty(e,t,n[t])})),e},$create=function(e,t){return void 0===t?objectCreate(e):$defineProperties(objectCreate(e),t)},$propertyIsEnumerable=function(e){var t=toPrimitive(e,!0),n=nativePropertyIsEnumerable$1.call(this,t);return!(this===ObjectPrototype&&has(AllSymbols,t)&&!has(ObjectPrototypeSymbols,t))&&(!(n||!has(this,t)||!has(AllSymbols,t)||has(this,HIDDEN)&&this[HIDDEN][t])||n)},$getOwnPropertyDescriptor=function(e,t){var n=toIndexedObject(e),r=toPrimitive(t,!0);if(n!==ObjectPrototype||!has(AllSymbols,r)||has(ObjectPrototypeSymbols,r)){var i=nativeGetOwnPropertyDescriptor$1(n,r);return!i||!has(AllSymbols,r)||has(n,HIDDEN)&&n[HIDDEN][r]||(i.enumerable=!0),i}},$getOwnPropertyNames=function(e){var t=nativeGetOwnPropertyNames$1(toIndexedObject(e)),n=[];return $forEach(t,(function(e){has(AllSymbols,e)||has(hiddenKeys,e)||n.push(e)})),n},$getOwnPropertySymbols=function(e){var t=e===ObjectPrototype,n=nativeGetOwnPropertyNames$1(t?ObjectPrototypeSymbols:toIndexedObject(e)),r=[];return $forEach(n,(function(e){!has(AllSymbols,e)||t&&!has(ObjectPrototype,e)||r.push(AllSymbols[e])})),r};if(nativeSymbol||(redefine(($Symbol=function(){if(this instanceof $Symbol)throw TypeError("Symbol is not a constructor");var e=arguments.length&&void 0!==arguments[0]?String(arguments[0]):void 0,t=uid(e),n=function(e){this===ObjectPrototype&&n.call(ObjectPrototypeSymbols,e),has(this,HIDDEN)&&has(this[HIDDEN],t)&&(this[HIDDEN][t]=!1),setSymbolDescriptor(this,t,createPropertyDescriptor(1,e))};return descriptors&&USE_SETTER&&setSymbolDescriptor(ObjectPrototype,t,{configurable:!0,set:n}),wrap(t,e)})[PROTOTYPE$1],"toString",(function(){return getInternalState(this).tag})),redefine($Symbol,"withoutSetter",(function(e){return wrap(uid(e),e)})),objectPropertyIsEnumerable.f=$propertyIsEnumerable,objectDefineProperty.f=$defineProperty,objectGetOwnPropertyDescriptor.f=$getOwnPropertyDescriptor,objectGetOwnPropertyNames.f=objectGetOwnPropertyNamesExternal.f=$getOwnPropertyNames,objectGetOwnPropertySymbols.f=$getOwnPropertySymbols,wellKnownSymbolWrapped.f=function(e){return wrap(wellKnownSymbol(e),e)},descriptors&&(nativeDefineProperty$1($Symbol[PROTOTYPE$1],"description",{configurable:!0,get:function(){return getInternalState(this).description}}),redefine(ObjectPrototype,"propertyIsEnumerable",$propertyIsEnumerable,{unsafe:!0}))),_export({global:!0,wrap:!0,forced:!nativeSymbol,sham:!nativeSymbol},{Symbol:$Symbol}),$forEach(objectKeys(WellKnownSymbolsStore$1),(function(e){defineWellKnownSymbol(e)})),_export({target:SYMBOL,stat:!0,forced:!nativeSymbol},{for:function(e){var t=String(e);if(has(StringToSymbolRegistry,t))return StringToSymbolRegistry[t];var n=$Symbol(t);return StringToSymbolRegistry[t]=n,SymbolToStringRegistry[n]=t,n},keyFor:function(e){if(!isSymbol(e))throw TypeError(e+" is not a symbol");if(has(SymbolToStringRegistry,e))return SymbolToStringRegistry[e]},useSetter:function(){USE_SETTER=!0},useSimple:function(){USE_SETTER=!1}}),_export({target:"Object",stat:!0,forced:!nativeSymbol,sham:!descriptors},{create:$create,defineProperty:$defineProperty,defineProperties:$defineProperties,getOwnPropertyDescriptor:$getOwnPropertyDescriptor}),_export({target:"Object",stat:!0,forced:!nativeSymbol},{getOwnPropertyNames:$getOwnPropertyNames,getOwnPropertySymbols:$getOwnPropertySymbols}),_export({target:"Object",stat:!0,forced:fails((function(){objectGetOwnPropertySymbols.f(1)}))},{getOwnPropertySymbols:function(e){return objectGetOwnPropertySymbols.f(toObject(e))}}),$stringify){var FORCED_JSON_STRINGIFY=!nativeSymbol||fails((function(){var e=$Symbol();return"[null]"!=$stringify([e])||"{}"!=$stringify({a:e})||"{}"!=$stringify(Object(e))}));_export({target:"JSON",stat:!0,forced:FORCED_JSON_STRINGIFY},{stringify:function(e,t,n){for(var r,i=[e],o=1;arguments.length>o;)i.push(arguments[o++]);if(r=t,(isObject(t)||void 0!==e)&&!isSymbol(e))return isArray(t)||(t=function(e,t){if("function"==typeof r&&(t=r.call(this,e,t)),!isSymbol(t))return t}),i[1]=t,$stringify.apply(null,i)}})}$Symbol[PROTOTYPE$1][TO_PRIMITIVE]||createNonEnumerableProperty($Symbol[PROTOTYPE$1],TO_PRIMITIVE,$Symbol[PROTOTYPE$1].valueOf),setToStringTag($Symbol,SYMBOL),hiddenKeys[HIDDEN]=!0;var defineProperty$2=objectDefineProperty.f,NativeSymbol=global_1.Symbol;if(descriptors&&"function"==typeof NativeSymbol&&(!("description"in NativeSymbol.prototype)||void 0!==NativeSymbol().description)){var EmptyStringDescriptionStore={},SymbolWrapper=function(){var e=arguments.length<1||void 0===arguments[0]?void 0:String(arguments[0]),t=this instanceof SymbolWrapper?new NativeSymbol(e):void 0===e?NativeSymbol():NativeSymbol(e);return""===e&&(EmptyStringDescriptionStore[t]=!0),t};copyConstructorProperties(SymbolWrapper,NativeSymbol);var symbolPrototype=SymbolWrapper.prototype=NativeSymbol.prototype;symbolPrototype.constructor=SymbolWrapper;var symbolToString=symbolPrototype.toString,native="Symbol(test)"==String(NativeSymbol("test")),regexp=/^Symbol\((.*)\)[^)]+$/;defineProperty$2(symbolPrototype,"description",{configurable:!0,get:function(){var e=isObject(this)?this.valueOf():this,t=symbolToString.call(e);if(has(EmptyStringDescriptionStore,e))return"";var n=native?t.slice(7,-1):t.replace(regexp,"$1");return""===n?void 0:n}}),_export({global:!0,forced:!0},{Symbol:SymbolWrapper})}defineWellKnownSymbol("iterator");var arrayMethodIsStrict=function(e,t){var n=[][e];return!!n&&fails((function(){n.call(null,t||function(){throw 1},1)}))},defineProperty$3=Object.defineProperty,cache={},thrower=function(e){throw e},arrayMethodUsesToLength=function(e,t){if(has(cache,e))return cache[e];t||(t={});var n=[][e],r=!!has(t,"ACCESSORS")&&t.ACCESSORS,i=has(t,0)?t[0]:thrower,o=has(t,1)?t[1]:void 0;return cache[e]=!!n&&!fails((function(){if(r&&!descriptors)return!0;var e={length:-1};r?defineProperty$3(e,1,{enumerable:!0,get:thrower}):e[1]=1,n.call(e,i,o)}))},$forEach$1=arrayIteration.forEach,STRICT_METHOD=arrayMethodIsStrict("forEach"),USES_TO_LENGTH=arrayMethodUsesToLength("forEach"),arrayForEach=STRICT_METHOD&&USES_TO_LENGTH?[].forEach:function(e){return $forEach$1(this,e,arguments.length>1?arguments[1]:void 0)};_export({target:"Array",proto:!0,forced:[].forEach!=arrayForEach},{forEach:arrayForEach});var $indexOf=arrayIncludes.indexOf,nativeIndexOf=[].indexOf,NEGATIVE_ZERO=!!nativeIndexOf&&1/[1].indexOf(1,-0)<0,STRICT_METHOD$1=arrayMethodIsStrict("indexOf"),USES_TO_LENGTH$1=arrayMethodUsesToLength("indexOf",{ACCESSORS:!0,1:0});_export({target:"Array",proto:!0,forced:NEGATIVE_ZERO||!STRICT_METHOD$1||!USES_TO_LENGTH$1},{indexOf:function(e){return NEGATIVE_ZERO?nativeIndexOf.apply(this,arguments)||0:$indexOf(this,e,arguments.length>1?arguments[1]:void 0)}});var UNSCOPABLES=wellKnownSymbol("unscopables"),ArrayPrototype=Array.prototype;null==ArrayPrototype[UNSCOPABLES]&&objectDefineProperty.f(ArrayPrototype,UNSCOPABLES,{configurable:!0,value:objectCreate(null)});var IteratorPrototype,PrototypeOfArrayIteratorPrototype,arrayIterator,addToUnscopables=function(e){ArrayPrototype[UNSCOPABLES][e]=!0},iterators={},correctPrototypeGetter=!fails((function(){function e(){}return e.prototype.constructor=null,Object.getPrototypeOf(new e)!==e.prototype})),IE_PROTO$1=sharedKey("IE_PROTO"),ObjectPrototype$1=Object.prototype,objectGetPrototypeOf=correctPrototypeGetter?Object.getPrototypeOf:function(e){return e=toObject(e),has(e,IE_PROTO$1)?e[IE_PROTO$1]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?ObjectPrototype$1:null},ITERATOR=wellKnownSymbol("iterator"),BUGGY_SAFARI_ITERATORS=!1,returnThis=function(){return this};[].keys&&("next"in(arrayIterator=[].keys())?(PrototypeOfArrayIteratorPrototype=objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator)))!==Object.prototype&&(IteratorPrototype=PrototypeOfArrayIteratorPrototype):BUGGY_SAFARI_ITERATORS=!0),null==IteratorPrototype&&(IteratorPrototype={}),has(IteratorPrototype,ITERATOR)||createNonEnumerableProperty(IteratorPrototype,ITERATOR,returnThis);var iteratorsCore={IteratorPrototype:IteratorPrototype,BUGGY_SAFARI_ITERATORS:BUGGY_SAFARI_ITERATORS},IteratorPrototype$1=iteratorsCore.IteratorPrototype,returnThis$1=function(){return this},createIteratorConstructor=function(e,t,n){var r=t+" Iterator";return e.prototype=objectCreate(IteratorPrototype$1,{next:createPropertyDescriptor(1,n)}),setToStringTag(e,r,!1),iterators[r]=returnThis$1,e},aPossiblePrototype=function(e){if(!isObject(e)&&null!==e)throw TypeError("Can't set "+String(e)+" as a prototype");return e},objectSetPrototypeOf=Object.setPrototypeOf||("__proto__"in{}?function(){var e,t=!1,n={};try{(e=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__").set).call(n,[]),t=n instanceof Array}catch(e){}return function(n,r){return anObject(n),aPossiblePrototype(r),t?e.call(n,r):n.__proto__=r,n}}():void 0),IteratorPrototype$2=iteratorsCore.IteratorPrototype,BUGGY_SAFARI_ITERATORS$1=iteratorsCore.BUGGY_SAFARI_ITERATORS,ITERATOR$1=wellKnownSymbol("iterator"),KEYS="keys",VALUES="values",ENTRIES="entries",returnThis$2=function(){return this},defineIterator=function(e,t,n,r,i,o,a){createIteratorConstructor(n,t,r);var s,l,c,u=function(e){if(e===i&&m)return m;if(!BUGGY_SAFARI_ITERATORS$1&&e in f)return f[e];switch(e){case KEYS:case VALUES:case ENTRIES:return function(){return new n(this,e)}}return function(){return new n(this)}},d=t+" Iterator",p=!1,f=e.prototype,h=f[ITERATOR$1]||f["@@iterator"]||i&&f[i],m=!BUGGY_SAFARI_ITERATORS$1&&h||u(i),g="Array"==t&&f.entries||h;if(g&&(s=objectGetPrototypeOf(g.call(new e)),IteratorPrototype$2!==Object.prototype&&s.next&&(objectGetPrototypeOf(s)!==IteratorPrototype$2&&(objectSetPrototypeOf?objectSetPrototypeOf(s,IteratorPrototype$2):"function"!=typeof s[ITERATOR$1]&&createNonEnumerableProperty(s,ITERATOR$1,returnThis$2)),setToStringTag(s,d,!0))),i==VALUES&&h&&h.name!==VALUES&&(p=!0,m=function(){return h.call(this)}),f[ITERATOR$1]!==m&&createNonEnumerableProperty(f,ITERATOR$1,m),iterators[t]=m,i)if(l={values:u(VALUES),keys:o?m:u(KEYS),entries:u(ENTRIES)},a)for(c in l)(BUGGY_SAFARI_ITERATORS$1||p||!(c in f))&&redefine(f,c,l[c]);else _export({target:t,proto:!0,forced:BUGGY_SAFARI_ITERATORS$1||p},l);return l},ARRAY_ITERATOR="Array Iterator",setInternalState$1=internalState.set,getInternalState$1=internalState.getterFor(ARRAY_ITERATOR),es_array_iterator=defineIterator(Array,"Array",(function(e,t){setInternalState$1(this,{type:ARRAY_ITERATOR,target:toIndexedObject(e),index:0,kind:t})}),(function(){var e=getInternalState$1(this),t=e.target,n=e.kind,r=e.index++;return!t||r>=t.length?(e.target=void 0,{value:void 0,done:!0}):"keys"==n?{value:r,done:!1}:"values"==n?{value:t[r],done:!1}:{value:[r,t[r]],done:!1}}),"values");iterators.Arguments=iterators.Array,addToUnscopables("keys"),addToUnscopables("values"),addToUnscopables("entries");var nativeJoin=[].join,ES3_STRINGS=indexedObject!=Object,STRICT_METHOD$2=arrayMethodIsStrict("join",",");_export({target:"Array",proto:!0,forced:ES3_STRINGS||!STRICT_METHOD$2},{join:function(e){return nativeJoin.call(toIndexedObject(this),void 0===e?",":e)}});var match,version,createProperty=function(e,t,n){var r=toPrimitive(t);r in e?objectDefineProperty.f(e,r,createPropertyDescriptor(0,n)):e[r]=n},engineUserAgent=getBuiltIn("navigator","userAgent")||"",process=global_1.process,versions=process&&process.versions,v8=versions&&versions.v8;v8?version=(match=v8.split("."))[0]+match[1]:engineUserAgent&&(!(match=engineUserAgent.match(/Edge\/(\d+)/))||match[1]>=74)&&(match=engineUserAgent.match(/Chrome\/(\d+)/))&&(version=match[1]);var engineV8Version=version&&+version,SPECIES$1=wellKnownSymbol("species"),arrayMethodHasSpeciesSupport=function(e){return engineV8Version>=51||!fails((function(){var t=[];return(t.constructor={})[SPECIES$1]=function(){return{foo:1}},1!==t[e](Boolean).foo}))},HAS_SPECIES_SUPPORT=arrayMethodHasSpeciesSupport("slice"),USES_TO_LENGTH$2=arrayMethodUsesToLength("slice",{ACCESSORS:!0,0:0,1:2}),SPECIES$2=wellKnownSymbol("species"),nativeSlice=[].slice,max$1=Math.max;_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT||!USES_TO_LENGTH$2},{slice:function(e,t){var n,r,i,o=toIndexedObject(this),a=toLength(o.length),s=toAbsoluteIndex(e,a),l=toAbsoluteIndex(void 0===t?a:t,a);if(isArray(o)&&("function"!=typeof(n=o.constructor)||n!==Array&&!isArray(n.prototype)?isObject(n)&&null===(n=n[SPECIES$2])&&(n=void 0):n=void 0,n===Array||void 0===n))return nativeSlice.call(o,s,l);for(r=new(void 0===n?Array:n)(max$1(l-s,0)),i=0;s<l;s++,i++)s in o&&createProperty(r,i,o[s]);return r.length=i,r}});var TO_STRING_TAG$1=wellKnownSymbol("toStringTag"),test={};test[TO_STRING_TAG$1]="z";var toStringTagSupport="[object z]"===String(test),TO_STRING_TAG$2=wellKnownSymbol("toStringTag"),CORRECT_ARGUMENTS="Arguments"==classofRaw(function(){return arguments}()),tryGet=function(e,t){try{return e[t]}catch(e){}},classof=toStringTagSupport?classofRaw:function(e){var t,n,r;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(n=tryGet(t=Object(e),TO_STRING_TAG$2))?n:CORRECT_ARGUMENTS?classofRaw(t):"Object"==(r=classofRaw(t))&&"function"==typeof t.callee?"Arguments":r},objectToString=toStringTagSupport?{}.toString:function(){return"[object "+classof(this)+"]"};toStringTagSupport||redefine(Object.prototype,"toString",objectToString,{unsafe:!0});var regexpFlags=function(){var e=anObject(this),t="";return e.global&&(t+="g"),e.ignoreCase&&(t+="i"),e.multiline&&(t+="m"),e.dotAll&&(t+="s"),e.unicode&&(t+="u"),e.sticky&&(t+="y"),t};function RE(e,t){return RegExp(e,t)}var UNSUPPORTED_Y=fails((function(){var e=RE("a","y");return e.lastIndex=2,null!=e.exec("abcd")})),BROKEN_CARET=fails((function(){var e=RE("^r","gy");return e.lastIndex=2,null!=e.exec("str")})),regexpStickyHelpers={UNSUPPORTED_Y:UNSUPPORTED_Y,BROKEN_CARET:BROKEN_CARET},nativeExec=RegExp.prototype.exec,nativeReplace=String.prototype.replace,patchedExec=nativeExec,UPDATES_LAST_INDEX_WRONG=function(){var e=/a/,t=/b*/g;return nativeExec.call(e,"a"),nativeExec.call(t,"a"),0!==e.lastIndex||0!==t.lastIndex}(),UNSUPPORTED_Y$1=regexpStickyHelpers.UNSUPPORTED_Y||regexpStickyHelpers.BROKEN_CARET,NPCG_INCLUDED=void 0!==/()??/.exec("")[1],PATCH=UPDATES_LAST_INDEX_WRONG||NPCG_INCLUDED||UNSUPPORTED_Y$1;PATCH&&(patchedExec=function(e){var t,n,r,i,o=this,a=UNSUPPORTED_Y$1&&o.sticky,s=regexpFlags.call(o),l=o.source,c=0,u=e;return a&&(-1===(s=s.replace("y","")).indexOf("g")&&(s+="g"),u=String(e).slice(o.lastIndex),o.lastIndex>0&&(!o.multiline||o.multiline&&"\n"!==e[o.lastIndex-1])&&(l="(?: "+l+")",u=" "+u,c++),n=new RegExp("^(?:"+l+")",s)),NPCG_INCLUDED&&(n=new RegExp("^"+l+"$(?!\\s)",s)),UPDATES_LAST_INDEX_WRONG&&(t=o.lastIndex),r=nativeExec.call(a?n:o,u),a?r?(r.input=r.input.slice(c),r[0]=r[0].slice(c),r.index=o.lastIndex,o.lastIndex+=r[0].length):o.lastIndex=0:UPDATES_LAST_INDEX_WRONG&&r&&(o.lastIndex=o.global?r.index+r[0].length:t),NPCG_INCLUDED&&r&&r.length>1&&nativeReplace.call(r[0],n,(function(){for(i=1;i<arguments.length-2;i++)void 0===arguments[i]&&(r[i]=void 0)})),r});var regexpExec=patchedExec;_export({target:"RegExp",proto:!0,forced:/./.exec!==regexpExec},{exec:regexpExec});var TO_STRING="toString",RegExpPrototype=RegExp.prototype,nativeToString=RegExpPrototype[TO_STRING],NOT_GENERIC=fails((function(){return"/a/b"!=nativeToString.call({source:"a",flags:"b"})})),INCORRECT_NAME=nativeToString.name!=TO_STRING;(NOT_GENERIC||INCORRECT_NAME)&&redefine(RegExp.prototype,TO_STRING,(function(){var e=anObject(this),t=String(e.source),n=e.flags;return"/"+t+"/"+String(void 0===n&&e instanceof RegExp&&!("flags"in RegExpPrototype)?regexpFlags.call(e):n)}),{unsafe:!0});var createMethod$2=function(e){return function(t,n){var r,i,o=String(requireObjectCoercible(t)),a=toInteger(n),s=o.length;return a<0||a>=s?e?"":void 0:(r=o.charCodeAt(a))<55296||r>56319||a+1===s||(i=o.charCodeAt(a+1))<56320||i>57343?e?o.charAt(a):r:e?o.slice(a,a+2):i-56320+(r-55296<<10)+65536}},stringMultibyte={codeAt:createMethod$2(!1),charAt:createMethod$2(!0)},charAt=stringMultibyte.charAt,STRING_ITERATOR="String Iterator",setInternalState$2=internalState.set,getInternalState$2=internalState.getterFor(STRING_ITERATOR);defineIterator(String,"String",(function(e){setInternalState$2(this,{type:STRING_ITERATOR,string:String(e),index:0})}),(function(){var e,t=getInternalState$2(this),n=t.string,r=t.index;return r>=n.length?{value:void 0,done:!0}:(e=charAt(n,r),t.index+=e.length,{value:e,done:!1})}));var SPECIES$3=wellKnownSymbol("species"),REPLACE_SUPPORTS_NAMED_GROUPS=!fails((function(){var e=/./;return e.exec=function(){var e=[];return e.groups={a:"7"},e},"7"!=="".replace(e,"$<a>")})),REPLACE_KEEPS_$0="$0"==="a".replace(/./,"$0"),REPLACE=wellKnownSymbol("replace"),REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE=!!/./[REPLACE]&&""===/./[REPLACE]("a","$0"),SPLIT_WORKS_WITH_OVERWRITTEN_EXEC=!fails((function(){var e=/(?:)/,t=e.exec;e.exec=function(){return t.apply(this,arguments)};var n="ab".split(e);return 2!==n.length||"a"!==n[0]||"b"!==n[1]})),fixRegexpWellKnownSymbolLogic=function(e,t,n,r){var i=wellKnownSymbol(e),o=!fails((function(){var t={};return t[i]=function(){return 7},7!=""[e](t)})),a=o&&!fails((function(){var t=!1,n=/a/;return"split"===e&&((n={}).constructor={},n.constructor[SPECIES$3]=function(){return n},n.flags="",n[i]=/./[i]),n.exec=function(){return t=!0,null},n[i](""),!t}));if(!o||!a||"replace"===e&&(!REPLACE_SUPPORTS_NAMED_GROUPS||!REPLACE_KEEPS_$0||REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE)||"split"===e&&!SPLIT_WORKS_WITH_OVERWRITTEN_EXEC){var s=/./[i],l=n(i,""[e],(function(e,t,n,r,i){return t.exec===regexpExec?o&&!i?{done:!0,value:s.call(t,n,r)}:{done:!0,value:e.call(n,t,r)}:{done:!1}}),{REPLACE_KEEPS_$0:REPLACE_KEEPS_$0,REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE:REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE}),c=l[0],u=l[1];redefine(String.prototype,e,c),redefine(RegExp.prototype,i,2==t?function(e,t){return u.call(e,this,t)}:function(e){return u.call(e,this)})}r&&createNonEnumerableProperty(RegExp.prototype[i],"sham",!0)},charAt$1=stringMultibyte.charAt,advanceStringIndex=function(e,t,n){return t+(n?charAt$1(e,t).length:1)},regexpExecAbstract=function(e,t){var n=e.exec;if("function"==typeof n){var r=n.call(e,t);if("object"!=typeof r)throw TypeError("RegExp exec method returned something other than an Object or null");return r}if("RegExp"!==classofRaw(e))throw TypeError("RegExp#exec called on incompatible receiver");return regexpExec.call(e,t)},max$2=Math.max,min$2=Math.min,floor$1=Math.floor,SUBSTITUTION_SYMBOLS=/\$([$&'`]|\d\d?|<[^>]*>)/g,SUBSTITUTION_SYMBOLS_NO_NAMED=/\$([$&'`]|\d\d?)/g,maybeToString=function(e){return void 0===e?e:String(e)};fixRegexpWellKnownSymbolLogic("replace",2,(function(e,t,n,r){var i=r.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE,o=r.REPLACE_KEEPS_$0,a=i?"$":"$0";return[function(n,r){var i=requireObjectCoercible(this),o=null==n?void 0:n[e];return void 0!==o?o.call(n,i,r):t.call(String(i),n,r)},function(e,r){if(!i&&o||"string"==typeof r&&-1===r.indexOf(a)){var l=n(t,e,this,r);if(l.done)return l.value}var c=anObject(e),u=String(this),d="function"==typeof r;d||(r=String(r));var p=c.global;if(p){var f=c.unicode;c.lastIndex=0}for(var h=[];;){var m=regexpExecAbstract(c,u);if(null===m)break;if(h.push(m),!p)break;""===String(m[0])&&(c.lastIndex=advanceStringIndex(u,toLength(c.lastIndex),f))}for(var g="",y=0,b=0;b<h.length;b++){m=h[b];for(var v=String(m[0]),E=max$2(min$2(toInteger(m.index),u.length),0),S=[],T=1;T<m.length;T++)S.push(maybeToString(m[T]));var P=m.groups;if(d){var w=[v].concat(S,E,u);void 0!==P&&w.push(P);var _=String(r.apply(void 0,w))}else _=s(v,u,E,S,P,r);E>=y&&(g+=u.slice(y,E)+_,y=E+v.length)}return g+u.slice(y)}];function s(e,n,r,i,o,a){var s=r+e.length,l=i.length,c=SUBSTITUTION_SYMBOLS_NO_NAMED;return void 0!==o&&(o=toObject(o),c=SUBSTITUTION_SYMBOLS),t.call(a,c,(function(t,a){var c;switch(a.charAt(0)){case"$":return"$";case"&":return e;case"`":return n.slice(0,r);case"'":return n.slice(s);case"<":c=o[a.slice(1,-1)];break;default:var u=+a;if(0===u)return t;if(u>l){var d=floor$1(u/10);return 0===d?t:d<=l?void 0===i[d-1]?a.charAt(1):i[d-1]+a.charAt(1):t}c=i[u-1]}return void 0===c?"":c}))}}));var sameValue=Object.is||function(e,t){return e===t?0!==e||1/e==1/t:e!=e&&t!=t};fixRegexpWellKnownSymbolLogic("search",1,(function(e,t,n){return[function(t){var n=requireObjectCoercible(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=anObject(e),o=String(this),a=i.lastIndex;sameValue(a,0)||(i.lastIndex=0);var s=regexpExecAbstract(i,o);return sameValue(i.lastIndex,a)||(i.lastIndex=a),null===s?-1:s.index}]}));var MATCH=wellKnownSymbol("match"),isRegexp=function(e){var t;return isObject(e)&&(void 0!==(t=e[MATCH])?!!t:"RegExp"==classofRaw(e))},SPECIES$4=wellKnownSymbol("species"),speciesConstructor=function(e,t){var n,r=anObject(e).constructor;return void 0===r||null==(n=anObject(r)[SPECIES$4])?t:aFunction$1(n)},arrayPush=[].push,min$3=Math.min,MAX_UINT32=4294967295,SUPPORTS_Y=!fails((function(){return!RegExp(MAX_UINT32,"y")}));fixRegexpWellKnownSymbolLogic("split",2,(function(e,t,n){var r;return r="c"=="abbc".split(/(b)*/)[1]||4!="test".split(/(?:)/,-1).length||2!="ab".split(/(?:ab)*/).length||4!=".".split(/(.?)(.?)/).length||".".split(/()()/).length>1||"".split(/.?/).length?function(e,n){var r=String(requireObjectCoercible(this)),i=void 0===n?MAX_UINT32:n>>>0;if(0===i)return[];if(void 0===e)return[r];if(!isRegexp(e))return t.call(r,e,i);for(var o,a,s,l=[],c=(e.ignoreCase?"i":"")+(e.multiline?"m":"")+(e.unicode?"u":"")+(e.sticky?"y":""),u=0,d=new RegExp(e.source,c+"g");(o=regexpExec.call(d,r))&&!((a=d.lastIndex)>u&&(l.push(r.slice(u,o.index)),o.length>1&&o.index<r.length&&arrayPush.apply(l,o.slice(1)),s=o[0].length,u=a,l.length>=i));)d.lastIndex===o.index&&d.lastIndex++;return u===r.length?!s&&d.test("")||l.push(""):l.push(r.slice(u)),l.length>i?l.slice(0,i):l}:"0".split(void 0,0).length?function(e,n){return void 0===e&&0===n?[]:t.call(this,e,n)}:t,[function(t,n){var i=requireObjectCoercible(this),o=null==t?void 0:t[e];return void 0!==o?o.call(t,i,n):r.call(String(i),t,n)},function(e,i){var o=n(r,e,this,i,r!==t);if(o.done)return o.value;var a=anObject(e),s=String(this),l=speciesConstructor(a,RegExp),c=a.unicode,u=(a.ignoreCase?"i":"")+(a.multiline?"m":"")+(a.unicode?"u":"")+(SUPPORTS_Y?"y":"g"),d=new l(SUPPORTS_Y?a:"^(?:"+a.source+")",u),p=void 0===i?MAX_UINT32:i>>>0;if(0===p)return[];if(0===s.length)return null===regexpExecAbstract(d,s)?[s]:[];for(var f=0,h=0,m=[];h<s.length;){d.lastIndex=SUPPORTS_Y?h:0;var g,y=regexpExecAbstract(d,SUPPORTS_Y?s:s.slice(h));if(null===y||(g=min$3(toLength(d.lastIndex+(SUPPORTS_Y?0:h)),s.length))===f)h=advanceStringIndex(s,h,c);else{if(m.push(s.slice(f,h)),m.length===p)return m;for(var b=1;b<=y.length-1;b++)if(m.push(y[b]),m.length===p)return m;h=f=g}}return m.push(s.slice(f)),m}]}),!SUPPORTS_Y);var domIterables={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0};for(var COLLECTION_NAME in domIterables){var Collection=global_1[COLLECTION_NAME],CollectionPrototype=Collection&&Collection.prototype;if(CollectionPrototype&&CollectionPrototype.forEach!==arrayForEach)try{createNonEnumerableProperty(CollectionPrototype,"forEach",arrayForEach)}catch(e){CollectionPrototype.forEach=arrayForEach}}var ITERATOR$2=wellKnownSymbol("iterator"),TO_STRING_TAG$3=wellKnownSymbol("toStringTag"),ArrayValues=es_array_iterator.values;for(var COLLECTION_NAME$1 in domIterables){var Collection$1=global_1[COLLECTION_NAME$1],CollectionPrototype$1=Collection$1&&Collection$1.prototype;if(CollectionPrototype$1){if(CollectionPrototype$1[ITERATOR$2]!==ArrayValues)try{createNonEnumerableProperty(CollectionPrototype$1,ITERATOR$2,ArrayValues)}catch(e){CollectionPrototype$1[ITERATOR$2]=ArrayValues}if(CollectionPrototype$1[TO_STRING_TAG$3]||createNonEnumerableProperty(CollectionPrototype$1,TO_STRING_TAG$3,COLLECTION_NAME$1),domIterables[COLLECTION_NAME$1])for(var METHOD_NAME in es_array_iterator)if(CollectionPrototype$1[METHOD_NAME]!==es_array_iterator[METHOD_NAME])try{createNonEnumerableProperty(CollectionPrototype$1,METHOD_NAME,es_array_iterator[METHOD_NAME])}catch(e){CollectionPrototype$1[METHOD_NAME]=es_array_iterator[METHOD_NAME]}}}var ITERATOR$3=wellKnownSymbol("iterator"),nativeUrl=!fails((function(){var e=new URL("b?a=1&b=2&c=3","http://a"),t=e.searchParams,n="";return e.pathname="c%20d",t.forEach((function(e,r){t.delete("b"),n+=r+e})),isPure&&!e.toJSON||!t.sort||"http://a/c%20d?a=1&c=3"!==e.href||"3"!==t.get("c")||"a=1"!==String(new URLSearchParams("?a=1"))||!t[ITERATOR$3]||"a"!==new URL("https://a@b").username||"b"!==new URLSearchParams(new URLSearchParams("a=b")).get("a")||"xn--e1aybc"!==new URL("http://тест").host||"#%D0%B1"!==new URL("http://a#б").hash||"a1c3"!==n||"x"!==new URL("http://x",void 0).host})),anInstance=function(e,t,n){if(!(e instanceof t))throw TypeError("Incorrect "+(n?n+" ":"")+"invocation");return e},nativeAssign=Object.assign,defineProperty$4=Object.defineProperty,objectAssign=!nativeAssign||fails((function(){if(descriptors&&1!==nativeAssign({b:1},nativeAssign(defineProperty$4({},"a",{enumerable:!0,get:function(){defineProperty$4(this,"b",{value:3,enumerable:!1})}}),{b:2})).b)return!0;var e={},t={},n=Symbol(),r="abcdefghijklmnopqrst";return e[n]=7,r.split("").forEach((function(e){t[e]=e})),7!=nativeAssign({},e)[n]||objectKeys(nativeAssign({},t)).join("")!=r}))?function(e,t){for(var n=toObject(e),r=arguments.length,i=1,o=objectGetOwnPropertySymbols.f,a=objectPropertyIsEnumerable.f;r>i;)for(var s,l=indexedObject(arguments[i++]),c=o?objectKeys(l).concat(o(l)):objectKeys(l),u=c.length,d=0;u>d;)s=c[d++],descriptors&&!a.call(l,s)||(n[s]=l[s]);return n}:nativeAssign,iteratorClose=function(e){var t=e.return;if(void 0!==t)return anObject(t.call(e)).value},callWithSafeIterationClosing=function(e,t,n,r){try{return r?t(anObject(n)[0],n[1]):t(n)}catch(t){throw iteratorClose(e),t}},ITERATOR$4=wellKnownSymbol("iterator"),ArrayPrototype$1=Array.prototype,isArrayIteratorMethod=function(e){return void 0!==e&&(iterators.Array===e||ArrayPrototype$1[ITERATOR$4]===e)},ITERATOR$5=wellKnownSymbol("iterator"),getIteratorMethod=function(e){if(null!=e)return e[ITERATOR$5]||e["@@iterator"]||iterators[classof(e)]},arrayFrom=function(e){var t,n,r,i,o,a,s=toObject(e),l="function"==typeof this?this:Array,c=arguments.length,u=c>1?arguments[1]:void 0,d=void 0!==u,p=getIteratorMethod(s),f=0;if(d&&(u=functionBindContext(u,c>2?arguments[2]:void 0,2)),null==p||l==Array&&isArrayIteratorMethod(p))for(n=new l(t=toLength(s.length));t>f;f++)a=d?u(s[f],f):s[f],createProperty(n,f,a);else for(o=(i=p.call(s)).next,n=new l;!(r=o.call(i)).done;f++)a=d?callWithSafeIterationClosing(i,u,[r.value,f],!0):r.value,createProperty(n,f,a);return n.length=f,n},maxInt=2147483647,base=36,tMin=1,tMax=26,skew=38,damp=700,initialBias=72,initialN=128,delimiter="-",regexNonASCII=/[^\0-\u007E]/,regexSeparators=/[.\u3002\uFF0E\uFF61]/g,OVERFLOW_ERROR="Overflow: input needs wider integers to process",baseMinusTMin=base-tMin,floor$2=Math.floor,stringFromCharCode=String.fromCharCode,ucs2decode=function(e){for(var t=[],n=0,r=e.length;n<r;){var i=e.charCodeAt(n++);if(i>=55296&&i<=56319&&n<r){var o=e.charCodeAt(n++);56320==(64512&o)?t.push(((1023&i)<<10)+(1023&o)+65536):(t.push(i),n--)}else t.push(i)}return t},digitToBasic=function(e){return e+22+75*(e<26)},adapt=function(e,t,n){var r=0;for(e=n?floor$2(e/damp):e>>1,e+=floor$2(e/t);e>baseMinusTMin*tMax>>1;r+=base)e=floor$2(e/baseMinusTMin);return floor$2(r+(baseMinusTMin+1)*e/(e+skew))},encode=function(e){var t,n,r=[],i=(e=ucs2decode(e)).length,o=initialN,a=0,s=initialBias;for(t=0;t<e.length;t++)(n=e[t])<128&&r.push(stringFromCharCode(n));var l=r.length,c=l;for(l&&r.push(delimiter);c<i;){var u=maxInt;for(t=0;t<e.length;t++)(n=e[t])>=o&&n<u&&(u=n);var d=c+1;if(u-o>floor$2((maxInt-a)/d))throw RangeError(OVERFLOW_ERROR);for(a+=(u-o)*d,o=u,t=0;t<e.length;t++){if((n=e[t])<o&&++a>maxInt)throw RangeError(OVERFLOW_ERROR);if(n==o){for(var p=a,f=base;;f+=base){var h=f<=s?tMin:f>=s+tMax?tMax:f-s;if(p<h)break;var m=p-h,g=base-h;r.push(stringFromCharCode(digitToBasic(h+m%g))),p=floor$2(m/g)}r.push(stringFromCharCode(digitToBasic(p))),s=adapt(a,d,c==l),a=0,++c}}++a,++o}return r.join("")},stringPunycodeToAscii=function(e){var t,n,r=[],i=e.toLowerCase().replace(regexSeparators,".").split(".");for(t=0;t<i.length;t++)n=i[t],r.push(regexNonASCII.test(n)?"xn--"+encode(n):n);return r.join(".")},redefineAll=function(e,t,n){for(var r in t)redefine(e,r,t[r],n);return e},getIterator=function(e){var t=getIteratorMethod(e);if("function"!=typeof t)throw TypeError(String(e)+" is not iterable");return anObject(t.call(e))},$fetch=getBuiltIn("fetch"),Headers=getBuiltIn("Headers"),ITERATOR$6=wellKnownSymbol("iterator"),URL_SEARCH_PARAMS="URLSearchParams",URL_SEARCH_PARAMS_ITERATOR=URL_SEARCH_PARAMS+"Iterator",setInternalState$3=internalState.set,getInternalParamsState=internalState.getterFor(URL_SEARCH_PARAMS),getInternalIteratorState=internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR),plus=/\+/g,sequences=Array(4),percentSequence=function(e){return sequences[e-1]||(sequences[e-1]=RegExp("((?:%[\\da-f]{2}){"+e+"})","gi"))},percentDecode=function(e){try{return decodeURIComponent(e)}catch(t){return e}},deserialize=function(e){var t=e.replace(plus," "),n=4;try{return decodeURIComponent(t)}catch(e){for(;n;)t=t.replace(percentSequence(n--),percentDecode);return t}},find=/[!'()~]|%20/g,replace={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"},replacer=function(e){return replace[e]},serialize=function(e){return encodeURIComponent(e).replace(find,replacer)},parseSearchParams=function(e,t){if(t)for(var n,r,i=t.split("&"),o=0;o<i.length;)(n=i[o++]).length&&(r=n.split("="),e.push({key:deserialize(r.shift()),value:deserialize(r.join("="))}))},updateSearchParams=function(e){this.entries.length=0,parseSearchParams(this.entries,e)},validateArgumentsLength=function(e,t){if(e<t)throw TypeError("Not enough arguments")},URLSearchParamsIterator=createIteratorConstructor((function(e,t){setInternalState$3(this,{type:URL_SEARCH_PARAMS_ITERATOR,iterator:getIterator(getInternalParamsState(e).entries),kind:t})}),"Iterator",(function(){var e=getInternalIteratorState(this),t=e.kind,n=e.iterator.next(),r=n.value;return n.done||(n.value="keys"===t?r.key:"values"===t?r.value:[r.key,r.value]),n})),URLSearchParamsConstructor=function(){anInstance(this,URLSearchParamsConstructor,URL_SEARCH_PARAMS);var e,t,n,r,i,o,a,s,l,c=arguments.length>0?arguments[0]:void 0,u=this,d=[];if(setInternalState$3(u,{type:URL_SEARCH_PARAMS,entries:d,updateURL:function(){},updateSearchParams:updateSearchParams}),void 0!==c)if(isObject(c))if("function"==typeof(e=getIteratorMethod(c)))for(n=(t=e.call(c)).next;!(r=n.call(t)).done;){if((a=(o=(i=getIterator(anObject(r.value))).next).call(i)).done||(s=o.call(i)).done||!o.call(i).done)throw TypeError("Expected sequence with length 2");d.push({key:a.value+"",value:s.value+""})}else for(l in c)has(c,l)&&d.push({key:l,value:c[l]+""});else parseSearchParams(d,"string"==typeof c?"?"===c.charAt(0)?c.slice(1):c:c+"")},URLSearchParamsPrototype=URLSearchParamsConstructor.prototype;redefineAll(URLSearchParamsPrototype,{append:function(e,t){validateArgumentsLength(arguments.length,2);var n=getInternalParamsState(this);n.entries.push({key:e+"",value:t+""}),n.updateURL()},delete:function(e){validateArgumentsLength(arguments.length,1);for(var t=getInternalParamsState(this),n=t.entries,r=e+"",i=0;i<n.length;)n[i].key===r?n.splice(i,1):i++;t.updateURL()},get:function(e){validateArgumentsLength(arguments.length,1);for(var t=getInternalParamsState(this).entries,n=e+"",r=0;r<t.length;r++)if(t[r].key===n)return t[r].value;return null},getAll:function(e){validateArgumentsLength(arguments.length,1);for(var t=getInternalParamsState(this).entries,n=e+"",r=[],i=0;i<t.length;i++)t[i].key===n&&r.push(t[i].value);return r},has:function(e){validateArgumentsLength(arguments.length,1);for(var t=getInternalParamsState(this).entries,n=e+"",r=0;r<t.length;)if(t[r++].key===n)return!0;return!1},set:function(e,t){validateArgumentsLength(arguments.length,1);for(var n,r=getInternalParamsState(this),i=r.entries,o=!1,a=e+"",s=t+"",l=0;l<i.length;l++)(n=i[l]).key===a&&(o?i.splice(l--,1):(o=!0,n.value=s));o||i.push({key:a,value:s}),r.updateURL()},sort:function(){var e,t,n,r=getInternalParamsState(this),i=r.entries,o=i.slice();for(i.length=0,n=0;n<o.length;n++){for(e=o[n],t=0;t<n;t++)if(i[t].key>e.key){i.splice(t,0,e);break}t===n&&i.push(e)}r.updateURL()},forEach:function(e){for(var t,n=getInternalParamsState(this).entries,r=functionBindContext(e,arguments.length>1?arguments[1]:void 0,3),i=0;i<n.length;)r((t=n[i++]).value,t.key,this)},keys:function(){return new URLSearchParamsIterator(this,"keys")},values:function(){return new URLSearchParamsIterator(this,"values")},entries:function(){return new URLSearchParamsIterator(this,"entries")}},{enumerable:!0}),redefine(URLSearchParamsPrototype,ITERATOR$6,URLSearchParamsPrototype.entries),redefine(URLSearchParamsPrototype,"toString",(function(){for(var e,t=getInternalParamsState(this).entries,n=[],r=0;r<t.length;)e=t[r++],n.push(serialize(e.key)+"="+serialize(e.value));return n.join("&")}),{enumerable:!0}),setToStringTag(URLSearchParamsConstructor,URL_SEARCH_PARAMS),_export({global:!0,forced:!nativeUrl},{URLSearchParams:URLSearchParamsConstructor}),nativeUrl||"function"!=typeof $fetch||"function"!=typeof Headers||_export({global:!0,enumerable:!0,forced:!0},{fetch:function(e){var t,n,r,i=[e];return arguments.length>1&&(isObject(t=arguments[1])&&(n=t.body,classof(n)===URL_SEARCH_PARAMS&&((r=t.headers?new Headers(t.headers):new Headers).has("content-type")||r.set("content-type","application/x-www-form-urlencoded;charset=UTF-8"),t=objectCreate(t,{body:createPropertyDescriptor(0,String(n)),headers:createPropertyDescriptor(0,r)}))),i.push(t)),$fetch.apply(this,i)}});var EOF,web_urlSearchParams={URLSearchParams:URLSearchParamsConstructor,getState:getInternalParamsState},codeAt=stringMultibyte.codeAt,NativeURL=global_1.URL,URLSearchParams$1=web_urlSearchParams.URLSearchParams,getInternalSearchParamsState=web_urlSearchParams.getState,setInternalState$4=internalState.set,getInternalURLState=internalState.getterFor("URL"),floor$3=Math.floor,pow=Math.pow,INVALID_AUTHORITY="Invalid authority",INVALID_SCHEME="Invalid scheme",INVALID_HOST="Invalid host",INVALID_PORT="Invalid port",ALPHA=/[A-Za-z]/,ALPHANUMERIC=/[\d+-.A-Za-z]/,DIGIT=/\d/,HEX_START=/^(0x|0X)/,OCT=/^[0-7]+$/,DEC=/^\d+$/,HEX=/^[\dA-Fa-f]+$/,FORBIDDEN_HOST_CODE_POINT=/[\u0000\u0009\u000A\u000D #%/:?@[\\]]/,FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT=/[\u0000\u0009\u000A\u000D #/:?@[\\]]/,LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE=/^[\u0000-\u001F ]+|[\u0000-\u001F ]+$/g,TAB_AND_NEW_LINE=/[\u0009\u000A\u000D]/g,parseHost=function(e,t){var n,r,i;if("["==t.charAt(0)){if("]"!=t.charAt(t.length-1))return INVALID_HOST;if(!(n=parseIPv6(t.slice(1,-1))))return INVALID_HOST;e.host=n}else if(isSpecial(e)){if(t=stringPunycodeToAscii(t),FORBIDDEN_HOST_CODE_POINT.test(t))return INVALID_HOST;if(null===(n=parseIPv4(t)))return INVALID_HOST;e.host=n}else{if(FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(t))return INVALID_HOST;for(n="",r=arrayFrom(t),i=0;i<r.length;i++)n+=percentEncode(r[i],C0ControlPercentEncodeSet);e.host=n}},parseIPv4=function(e){var t,n,r,i,o,a,s,l=e.split(".");if(l.length&&""==l[l.length-1]&&l.pop(),(t=l.length)>4)return e;for(n=[],r=0;r<t;r++){if(""==(i=l[r]))return e;if(o=10,i.length>1&&"0"==i.charAt(0)&&(o=HEX_START.test(i)?16:8,i=i.slice(8==o?1:2)),""===i)a=0;else{if(!(10==o?DEC:8==o?OCT:HEX).test(i))return e;a=parseInt(i,o)}n.push(a)}for(r=0;r<t;r++)if(a=n[r],r==t-1){if(a>=pow(256,5-t))return null}else if(a>255)return null;for(s=n.pop(),r=0;r<n.length;r++)s+=n[r]*pow(256,3-r);return s},parseIPv6=function(e){var t,n,r,i,o,a,s,l=[0,0,0,0,0,0,0,0],c=0,u=null,d=0,p=function(){return e.charAt(d)};if(":"==p()){if(":"!=e.charAt(1))return;d+=2,u=++c}for(;p();){if(8==c)return;if(":"!=p()){for(t=n=0;n<4&&HEX.test(p());)t=16*t+parseInt(p(),16),d++,n++;if("."==p()){if(0==n)return;if(d-=n,c>6)return;for(r=0;p();){if(i=null,r>0){if(!("."==p()&&r<4))return;d++}if(!DIGIT.test(p()))return;for(;DIGIT.test(p());){if(o=parseInt(p(),10),null===i)i=o;else{if(0==i)return;i=10*i+o}if(i>255)return;d++}l[c]=256*l[c]+i,2!=++r&&4!=r||c++}if(4!=r)return;break}if(":"==p()){if(d++,!p())return}else if(p())return;l[c++]=t}else{if(null!==u)return;d++,u=++c}}if(null!==u)for(a=c-u,c=7;0!=c&&a>0;)s=l[c],l[c--]=l[u+a-1],l[u+--a]=s;else if(8!=c)return;return l},findLongestZeroSequence=function(e){for(var t=null,n=1,r=null,i=0,o=0;o<8;o++)0!==e[o]?(i>n&&(t=r,n=i),r=null,i=0):(null===r&&(r=o),++i);return i>n&&(t=r,n=i),t},serializeHost=function(e){var t,n,r,i;if("number"==typeof e){for(t=[],n=0;n<4;n++)t.unshift(e%256),e=floor$3(e/256);return t.join(".")}if("object"==typeof e){for(t="",r=findLongestZeroSequence(e),n=0;n<8;n++)i&&0===e[n]||(i&&(i=!1),r===n?(t+=n?":":"::",i=!0):(t+=e[n].toString(16),n<7&&(t+=":")));return"["+t+"]"}return e},C0ControlPercentEncodeSet={},fragmentPercentEncodeSet=objectAssign({},C0ControlPercentEncodeSet,{" ":1,'"':1,"<":1,">":1,"`":1}),pathPercentEncodeSet=objectAssign({},fragmentPercentEncodeSet,{"#":1,"?":1,"{":1,"}":1}),userinfoPercentEncodeSet=objectAssign({},pathPercentEncodeSet,{"/":1,":":1,";":1,"=":1,"@":1,"[":1,"\\":1,"]":1,"^":1,"|":1}),percentEncode=function(e,t){var n=codeAt(e,0);return n>32&&n<127&&!has(t,e)?e:encodeURIComponent(e)},specialSchemes={ftp:21,file:null,http:80,https:443,ws:80,wss:443},isSpecial=function(e){return has(specialSchemes,e.scheme)},includesCredentials=function(e){return""!=e.username||""!=e.password},cannotHaveUsernamePasswordPort=function(e){return!e.host||e.cannotBeABaseURL||"file"==e.scheme},isWindowsDriveLetter=function(e,t){var n;return 2==e.length&&ALPHA.test(e.charAt(0))&&(":"==(n=e.charAt(1))||!t&&"|"==n)},startsWithWindowsDriveLetter=function(e){var t;return e.length>1&&isWindowsDriveLetter(e.slice(0,2))&&(2==e.length||"/"===(t=e.charAt(2))||"\\"===t||"?"===t||"#"===t)},shortenURLsPath=function(e){var t=e.path,n=t.length;!n||"file"==e.scheme&&1==n&&isWindowsDriveLetter(t[0],!0)||t.pop()},isSingleDot=function(e){return"."===e||"%2e"===e.toLowerCase()},isDoubleDot=function(e){return".."===(e=e.toLowerCase())||"%2e."===e||".%2e"===e||"%2e%2e"===e},SCHEME_START={},SCHEME={},NO_SCHEME={},SPECIAL_RELATIVE_OR_AUTHORITY={},PATH_OR_AUTHORITY={},RELATIVE={},RELATIVE_SLASH={},SPECIAL_AUTHORITY_SLASHES={},SPECIAL_AUTHORITY_IGNORE_SLASHES={},AUTHORITY={},HOST={},HOSTNAME={},PORT={},FILE={},FILE_SLASH={},FILE_HOST={},PATH_START={},PATH={},CANNOT_BE_A_BASE_URL_PATH={},QUERY={},FRAGMENT={},parseURL=function(e,t,n,r){var i,o,a,s,l=n||SCHEME_START,c=0,u="",d=!1,p=!1,f=!1;for(n||(e.scheme="",e.username="",e.password="",e.host=null,e.port=null,e.path=[],e.query=null,e.fragment=null,e.cannotBeABaseURL=!1,t=t.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE,"")),t=t.replace(TAB_AND_NEW_LINE,""),i=arrayFrom(t);c<=i.length;){switch(o=i[c],l){case SCHEME_START:if(!o||!ALPHA.test(o)){if(n)return INVALID_SCHEME;l=NO_SCHEME;continue}u+=o.toLowerCase(),l=SCHEME;break;case SCHEME:if(o&&(ALPHANUMERIC.test(o)||"+"==o||"-"==o||"."==o))u+=o.toLowerCase();else{if(":"!=o){if(n)return INVALID_SCHEME;u="",l=NO_SCHEME,c=0;continue}if(n&&(isSpecial(e)!=has(specialSchemes,u)||"file"==u&&(includesCredentials(e)||null!==e.port)||"file"==e.scheme&&!e.host))return;if(e.scheme=u,n)return void(isSpecial(e)&&specialSchemes[e.scheme]==e.port&&(e.port=null));u="","file"==e.scheme?l=FILE:isSpecial(e)&&r&&r.scheme==e.scheme?l=SPECIAL_RELATIVE_OR_AUTHORITY:isSpecial(e)?l=SPECIAL_AUTHORITY_SLASHES:"/"==i[c+1]?(l=PATH_OR_AUTHORITY,c++):(e.cannotBeABaseURL=!0,e.path.push(""),l=CANNOT_BE_A_BASE_URL_PATH)}break;case NO_SCHEME:if(!r||r.cannotBeABaseURL&&"#"!=o)return INVALID_SCHEME;if(r.cannotBeABaseURL&&"#"==o){e.scheme=r.scheme,e.path=r.path.slice(),e.query=r.query,e.fragment="",e.cannotBeABaseURL=!0,l=FRAGMENT;break}l="file"==r.scheme?FILE:RELATIVE;continue;case SPECIAL_RELATIVE_OR_AUTHORITY:if("/"!=o||"/"!=i[c+1]){l=RELATIVE;continue}l=SPECIAL_AUTHORITY_IGNORE_SLASHES,c++;break;case PATH_OR_AUTHORITY:if("/"==o){l=AUTHORITY;break}l=PATH;continue;case RELATIVE:if(e.scheme=r.scheme,o==EOF)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query;else if("/"==o||"\\"==o&&isSpecial(e))l=RELATIVE_SLASH;else if("?"==o)e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query="",l=QUERY;else{if("#"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.path.pop(),l=PATH;continue}e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,e.path=r.path.slice(),e.query=r.query,e.fragment="",l=FRAGMENT}break;case RELATIVE_SLASH:if(!isSpecial(e)||"/"!=o&&"\\"!=o){if("/"!=o){e.username=r.username,e.password=r.password,e.host=r.host,e.port=r.port,l=PATH;continue}l=AUTHORITY}else l=SPECIAL_AUTHORITY_IGNORE_SLASHES;break;case SPECIAL_AUTHORITY_SLASHES:if(l=SPECIAL_AUTHORITY_IGNORE_SLASHES,"/"!=o||"/"!=u.charAt(c+1))continue;c++;break;case SPECIAL_AUTHORITY_IGNORE_SLASHES:if("/"!=o&&"\\"!=o){l=AUTHORITY;continue}break;case AUTHORITY:if("@"==o){d&&(u="%40"+u),d=!0,a=arrayFrom(u);for(var h=0;h<a.length;h++){var m=a[h];if(":"!=m||f){var g=percentEncode(m,userinfoPercentEncodeSet);f?e.password+=g:e.username+=g}else f=!0}u=""}else if(o==EOF||"/"==o||"?"==o||"#"==o||"\\"==o&&isSpecial(e)){if(d&&""==u)return INVALID_AUTHORITY;c-=arrayFrom(u).length+1,u="",l=HOST}else u+=o;break;case HOST:case HOSTNAME:if(n&&"file"==e.scheme){l=FILE_HOST;continue}if(":"!=o||p){if(o==EOF||"/"==o||"?"==o||"#"==o||"\\"==o&&isSpecial(e)){if(isSpecial(e)&&""==u)return INVALID_HOST;if(n&&""==u&&(includesCredentials(e)||null!==e.port))return;if(s=parseHost(e,u))return s;if(u="",l=PATH_START,n)return;continue}"["==o?p=!0:"]"==o&&(p=!1),u+=o}else{if(""==u)return INVALID_HOST;if(s=parseHost(e,u))return s;if(u="",l=PORT,n==HOSTNAME)return}break;case PORT:if(!DIGIT.test(o)){if(o==EOF||"/"==o||"?"==o||"#"==o||"\\"==o&&isSpecial(e)||n){if(""!=u){var y=parseInt(u,10);if(y>65535)return INVALID_PORT;e.port=isSpecial(e)&&y===specialSchemes[e.scheme]?null:y,u=""}if(n)return;l=PATH_START;continue}return INVALID_PORT}u+=o;break;case FILE:if(e.scheme="file","/"==o||"\\"==o)l=FILE_SLASH;else{if(!r||"file"!=r.scheme){l=PATH;continue}if(o==EOF)e.host=r.host,e.path=r.path.slice(),e.query=r.query;else if("?"==o)e.host=r.host,e.path=r.path.slice(),e.query="",l=QUERY;else{if("#"!=o){startsWithWindowsDriveLetter(i.slice(c).join(""))||(e.host=r.host,e.path=r.path.slice(),shortenURLsPath(e)),l=PATH;continue}e.host=r.host,e.path=r.path.slice(),e.query=r.query,e.fragment="",l=FRAGMENT}}break;case FILE_SLASH:if("/"==o||"\\"==o){l=FILE_HOST;break}r&&"file"==r.scheme&&!startsWithWindowsDriveLetter(i.slice(c).join(""))&&(isWindowsDriveLetter(r.path[0],!0)?e.path.push(r.path[0]):e.host=r.host),l=PATH;continue;case FILE_HOST:if(o==EOF||"/"==o||"\\"==o||"?"==o||"#"==o){if(!n&&isWindowsDriveLetter(u))l=PATH;else if(""==u){if(e.host="",n)return;l=PATH_START}else{if(s=parseHost(e,u))return s;if("localhost"==e.host&&(e.host=""),n)return;u="",l=PATH_START}continue}u+=o;break;case PATH_START:if(isSpecial(e)){if(l=PATH,"/"!=o&&"\\"!=o)continue}else if(n||"?"!=o)if(n||"#"!=o){if(o!=EOF&&(l=PATH,"/"!=o))continue}else e.fragment="",l=FRAGMENT;else e.query="",l=QUERY;break;case PATH:if(o==EOF||"/"==o||"\\"==o&&isSpecial(e)||!n&&("?"==o||"#"==o)){if(isDoubleDot(u)?(shortenURLsPath(e),"/"==o||"\\"==o&&isSpecial(e)||e.path.push("")):isSingleDot(u)?"/"==o||"\\"==o&&isSpecial(e)||e.path.push(""):("file"==e.scheme&&!e.path.length&&isWindowsDriveLetter(u)&&(e.host&&(e.host=""),u=u.charAt(0)+":"),e.path.push(u)),u="","file"==e.scheme&&(o==EOF||"?"==o||"#"==o))for(;e.path.length>1&&""===e.path[0];)e.path.shift();"?"==o?(e.query="",l=QUERY):"#"==o&&(e.fragment="",l=FRAGMENT)}else u+=percentEncode(o,pathPercentEncodeSet);break;case CANNOT_BE_A_BASE_URL_PATH:"?"==o?(e.query="",l=QUERY):"#"==o?(e.fragment="",l=FRAGMENT):o!=EOF&&(e.path[0]+=percentEncode(o,C0ControlPercentEncodeSet));break;case QUERY:n||"#"!=o?o!=EOF&&("'"==o&&isSpecial(e)?e.query+="%27":e.query+="#"==o?"%23":percentEncode(o,C0ControlPercentEncodeSet)):(e.fragment="",l=FRAGMENT);break;case FRAGMENT:o!=EOF&&(e.fragment+=percentEncode(o,fragmentPercentEncodeSet))}c++}},URLConstructor=function(e){var t,n,r=anInstance(this,URLConstructor,"URL"),i=arguments.length>1?arguments[1]:void 0,o=String(e),a=setInternalState$4(r,{type:"URL"});if(void 0!==i)if(i instanceof URLConstructor)t=getInternalURLState(i);else if(n=parseURL(t={},String(i)))throw TypeError(n);if(n=parseURL(a,o,null,t))throw TypeError(n);var s=a.searchParams=new URLSearchParams$1,l=getInternalSearchParamsState(s);l.updateSearchParams(a.query),l.updateURL=function(){a.query=String(s)||null},descriptors||(r.href=serializeURL.call(r),r.origin=getOrigin.call(r),r.protocol=getProtocol.call(r),r.username=getUsername.call(r),r.password=getPassword.call(r),r.host=getHost.call(r),r.hostname=getHostname.call(r),r.port=getPort.call(r),r.pathname=getPathname.call(r),r.search=getSearch.call(r),r.searchParams=getSearchParams.call(r),r.hash=getHash.call(r))},URLPrototype=URLConstructor.prototype,serializeURL=function(){var e=getInternalURLState(this),t=e.scheme,n=e.username,r=e.password,i=e.host,o=e.port,a=e.path,s=e.query,l=e.fragment,c=t+":";return null!==i?(c+="//",includesCredentials(e)&&(c+=n+(r?":"+r:"")+"@"),c+=serializeHost(i),null!==o&&(c+=":"+o)):"file"==t&&(c+="//"),c+=e.cannotBeABaseURL?a[0]:a.length?"/"+a.join("/"):"",null!==s&&(c+="?"+s),null!==l&&(c+="#"+l),c},getOrigin=function(){var e=getInternalURLState(this),t=e.scheme,n=e.port;if("blob"==t)try{return new URL(t.path[0]).origin}catch(e){return"null"}return"file"!=t&&isSpecial(e)?t+"://"+serializeHost(e.host)+(null!==n?":"+n:""):"null"},getProtocol=function(){return getInternalURLState(this).scheme+":"},getUsername=function(){return getInternalURLState(this).username},getPassword=function(){return getInternalURLState(this).password},getHost=function(){var e=getInternalURLState(this),t=e.host,n=e.port;return null===t?"":null===n?serializeHost(t):serializeHost(t)+":"+n},getHostname=function(){var e=getInternalURLState(this).host;return null===e?"":serializeHost(e)},getPort=function(){var e=getInternalURLState(this).port;return null===e?"":String(e)},getPathname=function(){var e=getInternalURLState(this),t=e.path;return e.cannotBeABaseURL?t[0]:t.length?"/"+t.join("/"):""},getSearch=function(){var e=getInternalURLState(this).query;return e?"?"+e:""},getSearchParams=function(){return getInternalURLState(this).searchParams},getHash=function(){var e=getInternalURLState(this).fragment;return e?"#"+e:""},accessorDescriptor=function(e,t){return{get:e,set:t,configurable:!0,enumerable:!0}};if(descriptors&&objectDefineProperties(URLPrototype,{href:accessorDescriptor(serializeURL,(function(e){var t=getInternalURLState(this),n=String(e),r=parseURL(t,n);if(r)throw TypeError(r);getInternalSearchParamsState(t.searchParams).updateSearchParams(t.query)})),origin:accessorDescriptor(getOrigin),protocol:accessorDescriptor(getProtocol,(function(e){var t=getInternalURLState(this);parseURL(t,String(e)+":",SCHEME_START)})),username:accessorDescriptor(getUsername,(function(e){var t=getInternalURLState(this),n=arrayFrom(String(e));if(!cannotHaveUsernamePasswordPort(t)){t.username="";for(var r=0;r<n.length;r++)t.username+=percentEncode(n[r],userinfoPercentEncodeSet)}})),password:accessorDescriptor(getPassword,(function(e){var t=getInternalURLState(this),n=arrayFrom(String(e));if(!cannotHaveUsernamePasswordPort(t)){t.password="";for(var r=0;r<n.length;r++)t.password+=percentEncode(n[r],userinfoPercentEncodeSet)}})),host:accessorDescriptor(getHost,(function(e){var t=getInternalURLState(this);t.cannotBeABaseURL||parseURL(t,String(e),HOST)})),hostname:accessorDescriptor(getHostname,(function(e){var t=getInternalURLState(this);t.cannotBeABaseURL||parseURL(t,String(e),HOSTNAME)})),port:accessorDescriptor(getPort,(function(e){var t=getInternalURLState(this);cannotHaveUsernamePasswordPort(t)||(""==(e=String(e))?t.port=null:parseURL(t,e,PORT))})),pathname:accessorDescriptor(getPathname,(function(e){var t=getInternalURLState(this);t.cannotBeABaseURL||(t.path=[],parseURL(t,e+"",PATH_START))})),search:accessorDescriptor(getSearch,(function(e){var t=getInternalURLState(this);""==(e=String(e))?t.query=null:("?"==e.charAt(0)&&(e=e.slice(1)),t.query="",parseURL(t,e,QUERY)),getInternalSearchParamsState(t.searchParams).updateSearchParams(t.query)})),searchParams:accessorDescriptor(getSearchParams),hash:accessorDescriptor(getHash,(function(e){var t=getInternalURLState(this);""!=(e=String(e))?("#"==e.charAt(0)&&(e=e.slice(1)),t.fragment="",parseURL(t,e,FRAGMENT)):t.fragment=null}))}),redefine(URLPrototype,"toJSON",(function(){return serializeURL.call(this)}),{enumerable:!0}),redefine(URLPrototype,"toString",(function(){return serializeURL.call(this)}),{enumerable:!0}),NativeURL){var nativeCreateObjectURL=NativeURL.createObjectURL,nativeRevokeObjectURL=NativeURL.revokeObjectURL;nativeCreateObjectURL&&redefine(URLConstructor,"createObjectURL",(function(e){return nativeCreateObjectURL.apply(NativeURL,arguments)})),nativeRevokeObjectURL&&redefine(URLConstructor,"revokeObjectURL",(function(e){return nativeRevokeObjectURL.apply(NativeURL,arguments)}))}function _typeof(e){return(_typeof="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(e)}function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys$1(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys$1(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys$1(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function _objectWithoutPropertiesLoose(e,t){if(null==e)return{};var n,r,i={},o=Object.keys(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||(i[n]=e[n]);return i}function _objectWithoutProperties(e,t){if(null==e)return{};var n,r,i=_objectWithoutPropertiesLoose(e,t);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(r=0;r<o.length;r++)n=o[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(i[n]=e[n])}return i}function _slicedToArray(e,t){return _arrayWithHoles(e)||_iterableToArrayLimit(e,t)||_unsupportedIterableToArray(e,t)||_nonIterableRest()}function _toConsumableArray(e){return _arrayWithoutHoles(e)||_iterableToArray(e)||_unsupportedIterableToArray(e)||_nonIterableSpread()}function _arrayWithoutHoles(e){if(Array.isArray(e))return _arrayLikeToArray(e)}function _arrayWithHoles(e){if(Array.isArray(e))return e}function _iterableToArray(e){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e))return Array.from(e)}function _iterableToArrayLimit(e,t){if("undefined"!=typeof Symbol&&Symbol.iterator in Object(e)){var n=[],r=!0,i=!1,o=void 0;try{for(var a,s=e[Symbol.iterator]();!(r=(a=s.next()).done)&&(n.push(a.value),!t||n.length!==t);r=!0);}catch(e){i=!0,o=e}finally{try{r||null==s.return||s.return()}finally{if(i)throw o}}return n}}function _unsupportedIterableToArray(e,t){if(e){if("string"==typeof e)return _arrayLikeToArray(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?_arrayLikeToArray(e,t):void 0}}function _arrayLikeToArray(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function _nonIterableSpread(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}setToStringTag(URLConstructor,"URL"),_export({global:!0,forced:!nativeUrl,sham:!descriptors},{URL:URLConstructor}),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},r=function(e){return encodeURIComponent(e).replace(/%20/g,"+")},i=function(e){return decodeURIComponent(String(e).replace(/\+/g," "))};(function(){try{var t=e.URLSearchParams;return"a=1"===new t("?a=1").toString()&&"function"==typeof t.prototype.set&&"function"==typeof t.prototype.entries}catch(e){return!1}})()||function(){var i=function e(t){Object.defineProperty(this,"_entries",{writable:!0,value:{}});var n=_typeof(t);if("undefined"===n);else if("string"===n)""!==t&&this._fromString(t);else if(t instanceof e){var r=this;t.forEach((function(e,t){r.append(t,e)}))}else{if(null===t||"object"!==n)throw new TypeError("Unsupported input's type for URLSearchParams");if("[object Array]"===Object.prototype.toString.call(t))for(var i=0;i<t.length;i++){var o=t[i];if("[object Array]"!==Object.prototype.toString.call(o)&&2===o.length)throw new TypeError("Expected [string, any] as entry at index "+i+" of URLSearchParams's input");this.append(o[0],o[1])}else for(var a in t)t.hasOwnProperty(a)&&this.append(a,t[a])}},o=i.prototype;o.append=function(e,t){e in this._entries?this._entries[e].push(String(t)):this._entries[e]=[String(t)]},o.delete=function(e){delete this._entries[e]},o.get=function(e){return e in this._entries?this._entries[e][0]:null},o.getAll=function(e){return e in this._entries?this._entries[e].slice(0):[]},o.has=function(e){return e in this._entries},o.set=function(e,t){this._entries[e]=[String(t)]},o.forEach=function(e,t){var n;for(var r in this._entries)if(this._entries.hasOwnProperty(r)){n=this._entries[r];for(var i=0;i<n.length;i++)e.call(t,n[i],r,this)}},o.keys=function(){var e=[];return this.forEach((function(t,n){e.push(n)})),n(e)},o.values=function(){var e=[];return this.forEach((function(t){e.push(t)})),n(e)},o.entries=function(){var e=[];return this.forEach((function(t,n){e.push([n,t])})),n(e)},t&&(o[Symbol.iterator]=o.entries),o.toString=function(){var e=[];return this.forEach((function(t,n){e.push(r(n)+"="+r(t))})),e.join("&")},e.URLSearchParams=i}();var o=e.URLSearchParams.prototype;"function"!=typeof o.sort&&(o.sort=function(){var e=this,t=[];this.forEach((function(n,r){t.push([r,n]),e._entries||e.delete(r)})),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])}),"function"!=typeof o._fromString&&Object.defineProperty(o,"_fromString",{enumerable:!1,configurable:!1,writable:!1,value:function(e){if(this._entries)this._entries={};else{var t=[];this.forEach((function(e,n){t.push(n)}));for(var n=0;n<t.length;n++)this.delete(t[n])}var r,o=(e=e.replace(/^\?/,"")).split("&");for(n=0;n<o.length;n++)r=o[n].split("="),this.append(i(r[0]),r.length>1?i(r[1]):"")}})}(void 0!==commonjsGlobal?commonjsGlobal:"undefined"!=typeof window?window:"undefined"!=typeof self?self:commonjsGlobal),function(e){if(function(){try{var t=new e.URL("b","http://a");return t.pathname="c d","http://a/c%20d"===t.href&&t.searchParams}catch(e){return!1}}()||function(){var t=e.URL,n=function(t,n){"string"!=typeof t&&(t=String(t)),n&&"string"!=typeof n&&(n=String(n));var r,i=document;if(n&&(void 0===e.location||n!==e.location.href)){n=n.toLowerCase(),(r=(i=document.implementation.createHTMLDocument("")).createElement("base")).href=n,i.head.appendChild(r);try{if(0!==r.href.indexOf(n))throw new Error(r.href)}catch(e){throw new Error("URL unable to set base "+n+" due to "+e)}}var o=i.createElement("a");o.href=t,r&&(i.body.appendChild(o),o.href=o.href);var a=i.createElement("input");if(a.type="url",a.value=t,":"===o.protocol||!/:/.test(o.href)||!a.checkValidity()&&!n)throw new TypeError("Invalid URL");Object.defineProperty(this,"_anchorElement",{value:o});var s=new e.URLSearchParams(this.search),l=!0,c=!0,u=this;["append","delete","set"].forEach((function(e){var t=s[e];s[e]=function(){t.apply(s,arguments),l&&(c=!1,u.search=s.toString(),c=!0)}})),Object.defineProperty(this,"searchParams",{value:s,enumerable:!0});var d=void 0;Object.defineProperty(this,"_updateSearchParams",{enumerable:!1,configurable:!1,writable:!1,value:function(){this.search!==d&&(d=this.search,c&&(l=!1,this.searchParams._fromString(this.search),l=!0))}})},r=n.prototype;["hash","host","hostname","port","protocol"].forEach((function(e){!function(e){Object.defineProperty(r,e,{get:function(){return this._anchorElement[e]},set:function(t){this._anchorElement[e]=t},enumerable:!0})}(e)})),Object.defineProperty(r,"search",{get:function(){return this._anchorElement.search},set:function(e){this._anchorElement.search=e,this._updateSearchParams()},enumerable:!0}),Object.defineProperties(r,{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!==commonjsGlobal?commonjsGlobal:"undefined"!=typeof window?window:"undefined"!=typeof self?self:commonjsGlobal);var IS_CONCAT_SPREADABLE=wellKnownSymbol("isConcatSpreadable"),MAX_SAFE_INTEGER=9007199254740991,MAXIMUM_ALLOWED_INDEX_EXCEEDED="Maximum allowed index exceeded",IS_CONCAT_SPREADABLE_SUPPORT=engineV8Version>=51||!fails((function(){var e=[];return e[IS_CONCAT_SPREADABLE]=!1,e.concat()[0]!==e})),SPECIES_SUPPORT=arrayMethodHasSpeciesSupport("concat"),isConcatSpreadable=function(e){if(!isObject(e))return!1;var t=e[IS_CONCAT_SPREADABLE];return void 0!==t?!!t:isArray(e)},FORCED=!IS_CONCAT_SPREADABLE_SUPPORT||!SPECIES_SUPPORT;_export({target:"Array",proto:!0,forced:FORCED},{concat:function(e){var t,n,r,i,o,a=toObject(this),s=arraySpeciesCreate(a,0),l=0;for(t=-1,r=arguments.length;t<r;t++)if(isConcatSpreadable(o=-1===t?a:arguments[t])){if(l+(i=toLength(o.length))>MAX_SAFE_INTEGER)throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);for(n=0;n<i;n++,l++)n in o&&createProperty(s,l,o[n])}else{if(l>=MAX_SAFE_INTEGER)throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);createProperty(s,l++,o)}return s.length=l,s}});var $filter=arrayIteration.filter,HAS_SPECIES_SUPPORT$1=arrayMethodHasSpeciesSupport("filter"),USES_TO_LENGTH$3=arrayMethodUsesToLength("filter");_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT$1||!USES_TO_LENGTH$3},{filter:function(e){return $filter(this,e,arguments.length>1?arguments[1]:void 0)}});var $find=arrayIteration.find,FIND="find",SKIPS_HOLES=!0,USES_TO_LENGTH$4=arrayMethodUsesToLength(FIND);FIND in[]&&Array(1)[FIND]((function(){SKIPS_HOLES=!1})),_export({target:"Array",proto:!0,forced:SKIPS_HOLES||!USES_TO_LENGTH$4},{find:function(e){return $find(this,e,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables(FIND);var ITERATOR$7=wellKnownSymbol("iterator"),SAFE_CLOSING=!1;try{var called=0,iteratorWithReturn={next:function(){return{done:!!called++}},return:function(){SAFE_CLOSING=!0}};iteratorWithReturn[ITERATOR$7]=function(){return this},Array.from(iteratorWithReturn,(function(){throw 2}))}catch(e){}var checkCorrectnessOfIteration=function(e,t){if(!t&&!SAFE_CLOSING)return!1;var n=!1;try{var r={};r[ITERATOR$7]=function(){return{next:function(){return{done:n=!0}}}},e(r)}catch(e){}return n},INCORRECT_ITERATION=!checkCorrectnessOfIteration((function(e){Array.from(e)}));_export({target:"Array",stat:!0,forced:INCORRECT_ITERATION},{from:arrayFrom});var $includes=arrayIncludes.includes,USES_TO_LENGTH$5=arrayMethodUsesToLength("indexOf",{ACCESSORS:!0,1:0});_export({target:"Array",proto:!0,forced:!USES_TO_LENGTH$5},{includes:function(e){return $includes(this,e,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables("includes");var $map=arrayIteration.map,HAS_SPECIES_SUPPORT$2=arrayMethodHasSpeciesSupport("map"),USES_TO_LENGTH$6=arrayMethodUsesToLength("map");_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT$2||!USES_TO_LENGTH$6},{map:function(e){return $map(this,e,arguments.length>1?arguments[1]:void 0)}});var inheritIfRequired=function(e,t,n){var r,i;return objectSetPrototypeOf&&"function"==typeof(r=t.constructor)&&r!==n&&isObject(i=r.prototype)&&i!==n.prototype&&objectSetPrototypeOf(e,i),e},whitespaces="\t\n\v\f\r                 \u2028\u2029\ufeff",whitespace="["+whitespaces+"]",ltrim=RegExp("^"+whitespace+whitespace+"*"),rtrim=RegExp(whitespace+whitespace+"*$"),createMethod$3=function(e){return function(t){var n=String(requireObjectCoercible(t));return 1&e&&(n=n.replace(ltrim,"")),2&e&&(n=n.replace(rtrim,"")),n}},stringTrim={start:createMethod$3(1),end:createMethod$3(2),trim:createMethod$3(3)},getOwnPropertyNames=objectGetOwnPropertyNames.f,getOwnPropertyDescriptor$2=objectGetOwnPropertyDescriptor.f,defineProperty$5=objectDefineProperty.f,trim=stringTrim.trim,NUMBER="Number",NativeNumber=global_1[NUMBER],NumberPrototype=NativeNumber.prototype,BROKEN_CLASSOF=classofRaw(objectCreate(NumberPrototype))==NUMBER,toNumber=function(e){var t,n,r,i,o,a,s,l,c=toPrimitive(e,!1);if("string"==typeof c&&c.length>2)if(43===(t=(c=trim(c)).charCodeAt(0))||45===t){if(88===(n=c.charCodeAt(2))||120===n)return NaN}else if(48===t){switch(c.charCodeAt(1)){case 66:case 98:r=2,i=49;break;case 79:case 111:r=8,i=55;break;default:return+c}for(a=(o=c.slice(2)).length,s=0;s<a;s++)if((l=o.charCodeAt(s))<48||l>i)return NaN;return parseInt(o,r)}return+c};if(isForced_1(NUMBER,!NativeNumber(" 0o1")||!NativeNumber("0b1")||NativeNumber("+0x1"))){for(var key,NumberWrapper=function(e){var t=arguments.length<1?0:e,n=this;return n instanceof NumberWrapper&&(BROKEN_CLASSOF?fails((function(){NumberPrototype.valueOf.call(n)})):classofRaw(n)!=NUMBER)?inheritIfRequired(new NativeNumber(toNumber(t)),n,NumberWrapper):toNumber(t)},keys$1=descriptors?getOwnPropertyNames(NativeNumber):"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger".split(","),j=0;keys$1.length>j;j++)has(NativeNumber,key=keys$1[j])&&!has(NumberWrapper,key)&&defineProperty$5(NumberWrapper,key,getOwnPropertyDescriptor$2(NativeNumber,key));NumberWrapper.prototype=NumberPrototype,NumberPrototype.constructor=NumberWrapper,redefine(global_1,NUMBER,NumberWrapper)}var FAILS_ON_PRIMITIVES=fails((function(){objectKeys(1)}));_export({target:"Object",stat:!0,forced:FAILS_ON_PRIMITIVES},{keys:function(e){return objectKeys(toObject(e))}});var propertyIsEnumerable=objectPropertyIsEnumerable.f,createMethod$4=function(e){return function(t){for(var n,r=toIndexedObject(t),i=objectKeys(r),o=i.length,a=0,s=[];o>a;)n=i[a++],descriptors&&!propertyIsEnumerable.call(r,n)||s.push(e?[n,r[n]]:r[n]);return s}},objectToArray={entries:createMethod$4(!0),values:createMethod$4(!1)},$values=objectToArray.values;_export({target:"Object",stat:!0},{values:function(e){return $values(e)}});var notARegexp=function(e){if(isRegexp(e))throw TypeError("The method doesn't accept regular expressions");return e},MATCH$1=wellKnownSymbol("match"),correctIsRegexpLogic=function(e){var t=/./;try{"/./"[e](t)}catch(n){try{return t[MATCH$1]=!1,"/./"[e](t)}catch(e){}}return!1};_export({target:"String",proto:!0,forced:!correctIsRegexpLogic("includes")},{includes:function(e){return!!~String(requireObjectCoercible(this)).indexOf(notARegexp(e),arguments.length>1?arguments[1]:void 0)}});var freezing=!fails((function(){return Object.isExtensible(Object.preventExtensions({}))})),internalMetadata=createCommonjsModule((function(e){var t=objectDefineProperty.f,n=uid("meta"),r=0,i=Object.isExtensible||function(){return!0},o=function(e){t(e,n,{value:{objectID:"O"+ ++r,weakData:{}}})},a=e.exports={REQUIRED:!1,fastKey:function(e,t){if(!isObject(e))return"symbol"==typeof e?e:("string"==typeof e?"S":"P")+e;if(!has(e,n)){if(!i(e))return"F";if(!t)return"E";o(e)}return e[n].objectID},getWeakData:function(e,t){if(!has(e,n)){if(!i(e))return!0;if(!t)return!1;o(e)}return e[n].weakData},onFreeze:function(e){return freezing&&a.REQUIRED&&i(e)&&!has(e,n)&&o(e),e}};hiddenKeys[n]=!0})),internalMetadata_1=internalMetadata.REQUIRED,internalMetadata_2=internalMetadata.fastKey,internalMetadata_3=internalMetadata.getWeakData,internalMetadata_4=internalMetadata.onFreeze,Result=function(e,t){this.stopped=e,this.result=t},iterate=function(e,t,n){var r,i,o,a,s,l,c,u=n&&n.that,d=!(!n||!n.AS_ENTRIES),p=!(!n||!n.IS_ITERATOR),f=!(!n||!n.INTERRUPTED),h=functionBindContext(t,u,1+d+f),m=function(e){return r&&iteratorClose(r),new Result(!0,e)},g=function(e){return d?(anObject(e),f?h(e[0],e[1],m):h(e[0],e[1])):f?h(e,m):h(e)};if(p)r=e;else{if("function"!=typeof(i=getIteratorMethod(e)))throw TypeError("Target is not iterable");if(isArrayIteratorMethod(i)){for(o=0,a=toLength(e.length);a>o;o++)if((s=g(e[o]))&&s instanceof Result)return s;return new Result(!1)}r=i.call(e)}for(l=r.next;!(c=l.call(r)).done;){try{s=g(c.value)}catch(e){throw iteratorClose(r),e}if("object"==typeof s&&s&&s instanceof Result)return s}return new Result(!1)},collection=function(e,t,n){var r=-1!==e.indexOf("Map"),i=-1!==e.indexOf("Weak"),o=r?"set":"add",a=global_1[e],s=a&&a.prototype,l=a,c={},u=function(e){var t=s[e];redefine(s,e,"add"==e?function(e){return t.call(this,0===e?0:e),this}:"delete"==e?function(e){return!(i&&!isObject(e))&&t.call(this,0===e?0:e)}:"get"==e?function(e){return i&&!isObject(e)?void 0:t.call(this,0===e?0:e)}:"has"==e?function(e){return!(i&&!isObject(e))&&t.call(this,0===e?0:e)}:function(e,n){return t.call(this,0===e?0:e,n),this})};if(isForced_1(e,"function"!=typeof a||!(i||s.forEach&&!fails((function(){(new a).entries().next()})))))l=n.getConstructor(t,e,r,o),internalMetadata.REQUIRED=!0;else if(isForced_1(e,!0)){var d=new l,p=d[o](i?{}:-0,1)!=d,f=fails((function(){d.has(1)})),h=checkCorrectnessOfIteration((function(e){new a(e)})),m=!i&&fails((function(){for(var e=new a,t=5;t--;)e[o](t,t);return!e.has(-0)}));h||((l=t((function(t,n){anInstance(t,l,e);var i=inheritIfRequired(new a,t,l);return null!=n&&iterate(n,i[o],{that:i,AS_ENTRIES:r}),i}))).prototype=s,s.constructor=l),(f||m)&&(u("delete"),u("has"),r&&u("get")),(m||p)&&u(o),i&&s.clear&&delete s.clear}return c[e]=l,_export({global:!0,forced:l!=a},c),setToStringTag(l,e),i||n.setStrong(l,e,r),l},getWeakData=internalMetadata.getWeakData,setInternalState$5=internalState.set,internalStateGetterFor=internalState.getterFor,find$1=arrayIteration.find,findIndex=arrayIteration.findIndex,id$1=0,uncaughtFrozenStore=function(e){return e.frozen||(e.frozen=new UncaughtFrozenStore)},UncaughtFrozenStore=function(){this.entries=[]},findUncaughtFrozen=function(e,t){return find$1(e.entries,(function(e){return e[0]===t}))};UncaughtFrozenStore.prototype={get:function(e){var t=findUncaughtFrozen(this,e);if(t)return t[1]},has:function(e){return!!findUncaughtFrozen(this,e)},set:function(e,t){var n=findUncaughtFrozen(this,e);n?n[1]=t:this.entries.push([e,t])},delete:function(e){var t=findIndex(this.entries,(function(t){return t[0]===e}));return~t&&this.entries.splice(t,1),!!~t}};var collectionWeak={getConstructor:function(e,t,n,r){var i=e((function(e,o){anInstance(e,i,t),setInternalState$5(e,{type:t,id:id$1++,frozen:void 0}),null!=o&&iterate(o,e[r],{that:e,AS_ENTRIES:n})})),o=internalStateGetterFor(t),a=function(e,t,n){var r=o(e),i=getWeakData(anObject(t),!0);return!0===i?uncaughtFrozenStore(r).set(t,n):i[r.id]=n,e};return redefineAll(i.prototype,{delete:function(e){var t=o(this);if(!isObject(e))return!1;var n=getWeakData(e);return!0===n?uncaughtFrozenStore(t).delete(e):n&&has(n,t.id)&&delete n[t.id]},has:function(e){var t=o(this);if(!isObject(e))return!1;var n=getWeakData(e);return!0===n?uncaughtFrozenStore(t).has(e):n&&has(n,t.id)}}),redefineAll(i.prototype,n?{get:function(e){var t=o(this);if(isObject(e)){var n=getWeakData(e);return!0===n?uncaughtFrozenStore(t).get(e):n?n[t.id]:void 0}},set:function(e,t){return a(this,e,t)}}:{add:function(e){return a(this,e,!0)}}),i}},es_weakMap=createCommonjsModule((function(e){var t,n=internalState.enforce,r=!global_1.ActiveXObject&&"ActiveXObject"in global_1,i=Object.isExtensible,o=function(e){return function(){return e(this,arguments.length?arguments[0]:void 0)}},a=e.exports=collection("WeakMap",o,collectionWeak);if(nativeWeakMap&&r){t=collectionWeak.getConstructor(o,"WeakMap",!0),internalMetadata.REQUIRED=!0;var s=a.prototype,l=s.delete,c=s.has,u=s.get,d=s.set;redefineAll(s,{delete:function(e){if(isObject(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),l.call(this,e)||r.frozen.delete(e)}return l.call(this,e)},has:function(e){if(isObject(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),c.call(this,e)||r.frozen.has(e)}return c.call(this,e)},get:function(e){if(isObject(e)&&!i(e)){var r=n(this);return r.frozen||(r.frozen=new t),c.call(this,e)?u.call(this,e):r.frozen.get(e)}return u.call(this,e)},set:function(e,r){if(isObject(e)&&!i(e)){var o=n(this);o.frozen||(o.frozen=new t),c.call(this,e)?d.call(this,e,r):o.frozen.set(e,r)}else d.call(this,e,r);return this}})}})),$every=arrayIteration.every,STRICT_METHOD$3=arrayMethodIsStrict("every"),USES_TO_LENGTH$7=arrayMethodUsesToLength("every");_export({target:"Array",proto:!0,forced:!STRICT_METHOD$3||!USES_TO_LENGTH$7},{every:function(e){return $every(this,e,arguments.length>1?arguments[1]:void 0)}}),_export({target:"Object",stat:!0,forced:Object.assign!==objectAssign},{assign:objectAssign});var non="​…᠎",stringTrimForced=function(e){return fails((function(){return!!whitespaces[e]()||non[e]()!=non||whitespaces[e].name!==e}))},$trim=stringTrim.trim;_export({target:"String",proto:!0,forced:stringTrimForced("trim")},{trim:function(){return $trim(this)}});var $some=arrayIteration.some,STRICT_METHOD$4=arrayMethodIsStrict("some"),USES_TO_LENGTH$8=arrayMethodUsesToLength("some");_export({target:"Array",proto:!0,forced:!STRICT_METHOD$4||!USES_TO_LENGTH$8},{some:function(e){return $some(this,e,arguments.length>1?arguments[1]:void 0)}});var thisNumberValue=function(e){if("number"!=typeof e&&"Number"!=classofRaw(e))throw TypeError("Incorrect invocation");return+e},stringRepeat="".repeat||function(e){var t=String(requireObjectCoercible(this)),n="",r=toInteger(e);if(r<0||r==1/0)throw RangeError("Wrong number of repetitions");for(;r>0;(r>>>=1)&&(t+=t))1&r&&(n+=t);return n},nativeToFixed=1..toFixed,floor$4=Math.floor,pow$1=function(e,t,n){return 0===t?n:t%2==1?pow$1(e,t-1,n*e):pow$1(e*e,t/2,n)},log=function(e){for(var t=0,n=e;n>=4096;)t+=12,n/=4096;for(;n>=2;)t+=1,n/=2;return t},FORCED$1=nativeToFixed&&("0.000"!==8e-5.toFixed(3)||"1"!==.9.toFixed(0)||"1.25"!==1.255.toFixed(2)||"1000000000000000128"!==(0xde0b6b3a7640080).toFixed(0))||!fails((function(){nativeToFixed.call({})}));_export({target:"Number",proto:!0,forced:FORCED$1},{toFixed:function(e){var t,n,r,i,o=thisNumberValue(this),a=toInteger(e),s=[0,0,0,0,0,0],l="",c="0",u=function(e,t){for(var n=-1,r=t;++n<6;)r+=e*s[n],s[n]=r%1e7,r=floor$4(r/1e7)},d=function(e){for(var t=6,n=0;--t>=0;)n+=s[t],s[t]=floor$4(n/e),n=n%e*1e7},p=function(){for(var e=6,t="";--e>=0;)if(""!==t||0===e||0!==s[e]){var n=String(s[e]);t=""===t?n:t+stringRepeat.call("0",7-n.length)+n}return t};if(a<0||a>20)throw RangeError("Incorrect fraction digits");if(o!=o)return"NaN";if(o<=-1e21||o>=1e21)return String(o);if(o<0&&(l="-",o=-o),o>1e-21)if(n=(t=log(o*pow$1(2,69,1))-69)<0?o*pow$1(2,-t,1):o/pow$1(2,t,1),n*=4503599627370496,(t=52-t)>0){for(u(0,n),r=a;r>=7;)u(1e7,0),r-=7;for(u(pow$1(10,r,1),0),r=t-1;r>=23;)d(1<<23),r-=23;d(1<<r),u(1,1),d(2),c=p()}else u(0,n),u(1<<-t,0),c=p()+stringRepeat.call("0",a);return c=a>0?l+((i=c.length)<=a?"0."+stringRepeat.call("0",a-i)+c:c.slice(0,i-a)+"."+c.slice(i-a)):l+c}});var $entries=objectToArray.entries;_export({target:"Object",stat:!0},{entries:function(e){return $entries(e)}}),_export({target:"Number",stat:!0},{isNaN:function(e){return e!=e}});var nativeGetOwnPropertyDescriptor$2=objectGetOwnPropertyDescriptor.f,FAILS_ON_PRIMITIVES$1=fails((function(){nativeGetOwnPropertyDescriptor$2(1)})),FORCED$2=!descriptors||FAILS_ON_PRIMITIVES$1;function _classCallCheck$1(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function _defineProperties$1(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass$1(e,t,n){return t&&_defineProperties$1(e.prototype,t),n&&_defineProperties$1(e,n),e}function _defineProperty$1(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys$2(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2$1(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys$2(Object(n),!0).forEach((function(t){_defineProperty$1(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys$2(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}_export({target:"Object",stat:!0,forced:FORCED$2,sham:!descriptors},{getOwnPropertyDescriptor:function(e,t){return nativeGetOwnPropertyDescriptor$2(toIndexedObject(e),t)}}),_export({target:"Object",stat:!0,sham:!descriptors},{getOwnPropertyDescriptors:function(e){for(var t,n,r=toIndexedObject(e),i=objectGetOwnPropertyDescriptor.f,o=ownKeys(r),a={},s=0;o.length>s;)void 0!==(n=i(r,t=o[s++]))&&createProperty(a,t,n);return a}}),fixRegexpWellKnownSymbolLogic("match",1,(function(e,t,n){return[function(t){var n=requireObjectCoercible(this),r=null==t?void 0:t[e];return void 0!==r?r.call(t,n):new RegExp(t)[e](String(n))},function(e){var r=n(t,e,this);if(r.done)return r.value;var i=anObject(e),o=String(this);if(!i.global)return regexpExecAbstract(i,o);var a=i.unicode;i.lastIndex=0;for(var s,l=[],c=0;null!==(s=regexpExecAbstract(i,o));){var u=String(s[0]);l[c]=u,""===u&&(i.lastIndex=advanceStringIndex(o,toLength(i.lastIndex),a)),c++}return 0===c?null:l}]}));var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject$1=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray$1=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray$1(e)||isNodeList(e))&&!e.length||isObject$1(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject$1,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray$1,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t="".concat(e).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var defer,channel,port,RangeTouch=function(){function e(t,n){_classCallCheck$1(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2$1({},defaults,{},n),this.init())}return _createClass$1(e,[{key:"init",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="none",this.element.style.webKitUserSelect="none",this.element.style.touchAction="manipulation"),this.listeners(!0),this.element.rangeTouch=this)}},{key:"destroy",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect="",this.element.style.webKitUserSelect="",this.element.style.touchAction=""),this.listeners(!1),this.element.rangeTouch=null)}},{key:"listeners",value:function(e){var t=this,n=e?"addEventListener":"removeEventListener";["touchstart","touchmove","touchend"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:"get",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute("min"))||0,a=parseFloat(r.getAttribute("max"))||100,s=parseFloat(r.getAttribute("step"))||1,l=r.getBoundingClientRect(),c=100/l.width*(this.config.thumbWidth/2)/100;return 0>(n=100/l.width*(i.clientX-l.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*c:50<n&&(n+=2*(n-50)*c),o+round(n/100*(a-o),s)}},{key:"set",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,"touchend"===t.type?"change":"input"))}}],[{key:"setup",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type="range"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2$1({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:"enabled",get:function(){return"ontouchstart"in document.documentElement}}]),e}(),nativePromiseConstructor=global_1.Promise,SPECIES$5=wellKnownSymbol("species"),setSpecies=function(e){var t=getBuiltIn(e),n=objectDefineProperty.f;descriptors&&t&&!t[SPECIES$5]&&n(t,SPECIES$5,{configurable:!0,get:function(){return this}})},engineIsIos=/(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent),engineIsNode="process"==classofRaw(global_1.process),location=global_1.location,set$1=global_1.setImmediate,clear=global_1.clearImmediate,process$1=global_1.process,MessageChannel=global_1.MessageChannel,Dispatch=global_1.Dispatch,counter=0,queue={},ONREADYSTATECHANGE="onreadystatechange",run=function(e){if(queue.hasOwnProperty(e)){var t=queue[e];delete queue[e],t()}},runner=function(e){return function(){run(e)}},listener=function(e){run(e.data)},post=function(e){global_1.postMessage(e+"",location.protocol+"//"+location.host)};set$1&&clear||(set$1=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return queue[++counter]=function(){("function"==typeof e?e:Function(e)).apply(void 0,t)},defer(counter),counter},clear=function(e){delete queue[e]},engineIsNode?defer=function(e){process$1.nextTick(runner(e))}:Dispatch&&Dispatch.now?defer=function(e){Dispatch.now(runner(e))}:MessageChannel&&!engineIsIos?(port=(channel=new MessageChannel).port2,channel.port1.onmessage=listener,defer=functionBindContext(port.postMessage,port,1)):global_1.addEventListener&&"function"==typeof postMessage&&!global_1.importScripts&&location&&"file:"!==location.protocol&&!fails(post)?(defer=post,global_1.addEventListener("message",listener,!1)):defer=ONREADYSTATECHANGE in documentCreateElement("script")?function(e){html.appendChild(documentCreateElement("script"))[ONREADYSTATECHANGE]=function(){html.removeChild(this),run(e)}}:function(e){setTimeout(runner(e),0)});var flush,head,last,notify,toggle,node,promise,then,task={set:set$1,clear:clear},getOwnPropertyDescriptor$3=objectGetOwnPropertyDescriptor.f,macrotask=task.set,MutationObserver$1=global_1.MutationObserver||global_1.WebKitMutationObserver,document$2=global_1.document,process$2=global_1.process,Promise$1=global_1.Promise,queueMicrotaskDescriptor=getOwnPropertyDescriptor$3(global_1,"queueMicrotask"),queueMicrotask=queueMicrotaskDescriptor&&queueMicrotaskDescriptor.value;queueMicrotask||(flush=function(){var e,t;for(engineIsNode&&(e=process$2.domain)&&e.exit();head;){t=head.fn,head=head.next;try{t()}catch(e){throw head?notify():last=void 0,e}}last=void 0,e&&e.enter()},!engineIsIos&&!engineIsNode&&MutationObserver$1&&document$2?(toggle=!0,node=document$2.createTextNode(""),new MutationObserver$1(flush).observe(node,{characterData:!0}),notify=function(){node.data=toggle=!toggle}):Promise$1&&Promise$1.resolve?(promise=Promise$1.resolve(void 0),then=promise.then,notify=function(){then.call(promise,flush)}):notify=engineIsNode?function(){process$2.nextTick(flush)}:function(){macrotask.call(global_1,flush)});var Internal,OwnPromiseCapability,PromiseWrapper,nativeThen,microtask=queueMicrotask||function(e){var t={fn:e,next:void 0};last&&(last.next=t),head||(head=t,notify()),last=t},PromiseCapability=function(e){var t,n;this.promise=new e((function(e,r){if(void 0!==t||void 0!==n)throw TypeError("Bad Promise constructor");t=e,n=r})),this.resolve=aFunction$1(t),this.reject=aFunction$1(n)},f$7=function(e){return new PromiseCapability(e)},newPromiseCapability={f:f$7},promiseResolve=function(e,t){if(anObject(e),isObject(t)&&t.constructor===e)return t;var n=newPromiseCapability.f(e);return(0,n.resolve)(t),n.promise},hostReportErrors=function(e,t){var n=global_1.console;n&&n.error&&(1===arguments.length?n.error(e):n.error(e,t))},perform=function(e){try{return{error:!1,value:e()}}catch(e){return{error:!0,value:e}}},task$1=task.set,SPECIES$6=wellKnownSymbol("species"),PROMISE="Promise",getInternalState$3=internalState.get,setInternalState$6=internalState.set,getInternalPromiseState=internalState.getterFor(PROMISE),PromiseConstructor=nativePromiseConstructor,TypeError$1=global_1.TypeError,document$3=global_1.document,process$3=global_1.process,$fetch$1=getBuiltIn("fetch"),newPromiseCapability$1=newPromiseCapability.f,newGenericPromiseCapability=newPromiseCapability$1,DISPATCH_EVENT=!!(document$3&&document$3.createEvent&&global_1.dispatchEvent),NATIVE_REJECTION_EVENT="function"==typeof PromiseRejectionEvent,UNHANDLED_REJECTION="unhandledrejection",REJECTION_HANDLED="rejectionhandled",PENDING=0,FULFILLED=1,REJECTED=2,HANDLED=1,UNHANDLED=2,FORCED$3=isForced_1(PROMISE,(function(){if(!(inspectSource(PromiseConstructor)!==String(PromiseConstructor))){if(66===engineV8Version)return!0;if(!engineIsNode&&!NATIVE_REJECTION_EVENT)return!0}if(engineV8Version>=51&&/native code/.test(PromiseConstructor))return!1;var e=PromiseConstructor.resolve(1),t=function(e){e((function(){}),(function(){}))};return(e.constructor={})[SPECIES$6]=t,!(e.then((function(){}))instanceof t)})),INCORRECT_ITERATION$1=FORCED$3||!checkCorrectnessOfIteration((function(e){PromiseConstructor.all(e).catch((function(){}))})),isThenable=function(e){var t;return!(!isObject(e)||"function"!=typeof(t=e.then))&&t},notify$1=function(e,t){if(!e.notified){e.notified=!0;var n=e.reactions;microtask((function(){for(var r=e.value,i=e.state==FULFILLED,o=0;n.length>o;){var a,s,l,c=n[o++],u=i?c.ok:c.fail,d=c.resolve,p=c.reject,f=c.domain;try{u?(i||(e.rejection===UNHANDLED&&onHandleUnhandled(e),e.rejection=HANDLED),!0===u?a=r:(f&&f.enter(),a=u(r),f&&(f.exit(),l=!0)),a===c.promise?p(TypeError$1("Promise-chain cycle")):(s=isThenable(a))?s.call(a,d,p):d(a)):p(r)}catch(e){f&&!l&&f.exit(),p(e)}}e.reactions=[],e.notified=!1,t&&!e.rejection&&onUnhandled(e)}))}},dispatchEvent=function(e,t,n){var r,i;DISPATCH_EVENT?((r=document$3.createEvent("Event")).promise=t,r.reason=n,r.initEvent(e,!1,!0),global_1.dispatchEvent(r)):r={promise:t,reason:n},!NATIVE_REJECTION_EVENT&&(i=global_1["on"+e])?i(r):e===UNHANDLED_REJECTION&&hostReportErrors("Unhandled promise rejection",n)},onUnhandled=function(e){task$1.call(global_1,(function(){var t,n=e.facade,r=e.value;if(isUnhandled(e)&&(t=perform((function(){engineIsNode?process$3.emit("unhandledRejection",r,n):dispatchEvent(UNHANDLED_REJECTION,n,r)})),e.rejection=engineIsNode||isUnhandled(e)?UNHANDLED:HANDLED,t.error))throw t.value}))},isUnhandled=function(e){return e.rejection!==HANDLED&&!e.parent},onHandleUnhandled=function(e){task$1.call(global_1,(function(){var t=e.facade;engineIsNode?process$3.emit("rejectionHandled",t):dispatchEvent(REJECTION_HANDLED,t,e.value)}))},bind=function(e,t,n){return function(r){e(t,r,n)}},internalReject=function(e,t,n){e.done||(e.done=!0,n&&(e=n),e.value=t,e.state=REJECTED,notify$1(e,!0))},internalResolve=function(e,t,n){if(!e.done){e.done=!0,n&&(e=n);try{if(e.facade===t)throw TypeError$1("Promise can't be resolved itself");var r=isThenable(t);r?microtask((function(){var n={done:!1};try{r.call(t,bind(internalResolve,n,e),bind(internalReject,n,e))}catch(t){internalReject(n,t,e)}})):(e.value=t,e.state=FULFILLED,notify$1(e,!1))}catch(t){internalReject({done:!1},t,e)}}};FORCED$3&&(PromiseConstructor=function(e){anInstance(this,PromiseConstructor,PROMISE),aFunction$1(e),Internal.call(this);var t=getInternalState$3(this);try{e(bind(internalResolve,t),bind(internalReject,t))}catch(e){internalReject(t,e)}},(Internal=function(e){setInternalState$6(this,{type:PROMISE,done:!1,notified:!1,parent:!1,reactions:[],rejection:!1,state:PENDING,value:void 0})}).prototype=redefineAll(PromiseConstructor.prototype,{then:function(e,t){var n=getInternalPromiseState(this),r=newPromiseCapability$1(speciesConstructor(this,PromiseConstructor));return r.ok="function"!=typeof e||e,r.fail="function"==typeof t&&t,r.domain=engineIsNode?process$3.domain:void 0,n.parent=!0,n.reactions.push(r),n.state!=PENDING&&notify$1(n,!1),r.promise},catch:function(e){return this.then(void 0,e)}}),OwnPromiseCapability=function(){var e=new Internal,t=getInternalState$3(e);this.promise=e,this.resolve=bind(internalResolve,t),this.reject=bind(internalReject,t)},newPromiseCapability.f=newPromiseCapability$1=function(e){return e===PromiseConstructor||e===PromiseWrapper?new OwnPromiseCapability(e):newGenericPromiseCapability(e)},"function"==typeof nativePromiseConstructor&&(nativeThen=nativePromiseConstructor.prototype.then,redefine(nativePromiseConstructor.prototype,"then",(function(e,t){var n=this;return new PromiseConstructor((function(e,t){nativeThen.call(n,e,t)})).then(e,t)}),{unsafe:!0}),"function"==typeof $fetch$1&&_export({global:!0,enumerable:!0,forced:!0},{fetch:function(e){return promiseResolve(PromiseConstructor,$fetch$1.apply(global_1,arguments))}}))),_export({global:!0,wrap:!0,forced:FORCED$3},{Promise:PromiseConstructor}),setToStringTag(PromiseConstructor,PROMISE,!1),setSpecies(PROMISE),PromiseWrapper=getBuiltIn(PROMISE),_export({target:PROMISE,stat:!0,forced:FORCED$3},{reject:function(e){var t=newPromiseCapability$1(this);return t.reject.call(void 0,e),t.promise}}),_export({target:PROMISE,stat:!0,forced:FORCED$3},{resolve:function(e){return promiseResolve(this,e)}}),_export({target:PROMISE,stat:!0,forced:INCORRECT_ITERATION$1},{all:function(e){var t=this,n=newPromiseCapability$1(t),r=n.resolve,i=n.reject,o=perform((function(){var n=aFunction$1(t.resolve),o=[],a=0,s=1;iterate(e,(function(e){var l=a++,c=!1;o.push(void 0),s++,n.call(t,e).then((function(e){c||(c=!0,o[l]=e,--s||r(o))}),i)})),--s||r(o)}));return o.error&&i(o.value),n.promise},race:function(e){var t=this,n=newPromiseCapability$1(t),r=n.reject,i=perform((function(){var i=aFunction$1(t.resolve);iterate(e,(function(e){i.call(t,e).then(n.resolve,r)}))}));return i.error&&r(i.value),n.promise}});var getOwnPropertyDescriptor$4=objectGetOwnPropertyDescriptor.f,nativeStartsWith="".startsWith,min$4=Math.min,CORRECT_IS_REGEXP_LOGIC=correctIsRegexpLogic("startsWith"),MDN_POLYFILL_BUG=!CORRECT_IS_REGEXP_LOGIC&&!!function(){var e=getOwnPropertyDescriptor$4(String.prototype,"startsWith");return e&&!e.writable}();_export({target:"String",proto:!0,forced:!MDN_POLYFILL_BUG&&!CORRECT_IS_REGEXP_LOGIC},{startsWith:function(e){var t=String(requireObjectCoercible(this));notARegexp(e);var n=toLength(min$4(arguments.length>1?arguments[1]:void 0,t.length)),r=String(e);return nativeStartsWith?nativeStartsWith.call(t,r,n):t.slice(n,n+r.length)===r}});var getConstructor$1=function(e){return null!=e?e.constructor:null},instanceOf$1=function(e,t){return Boolean(e&&t&&e instanceof t)},isNullOrUndefined$1=function(e){return null==e},isObject$2=function(e){return getConstructor$1(e)===Object},isNumber$1=function(e){return getConstructor$1(e)===Number&&!Number.isNaN(e)},isString$1=function(e){return getConstructor$1(e)===String},isBoolean$1=function(e){return getConstructor$1(e)===Boolean},isFunction$1=function(e){return getConstructor$1(e)===Function},isArray$2=function(e){return Array.isArray(e)},isWeakMap=function(e){return instanceOf$1(e,WeakMap)},isNodeList$1=function(e){return instanceOf$1(e,NodeList)},isTextNode=function(e){return getConstructor$1(e)===Text},isEvent$1=function(e){return instanceOf$1(e,Event)},isKeyboardEvent=function(e){return instanceOf$1(e,KeyboardEvent)},isCue=function(e){return instanceOf$1(e,window.TextTrackCue)||instanceOf$1(e,window.VTTCue)},isTrack=function(e){return instanceOf$1(e,TextTrack)||!isNullOrUndefined$1(e)&&isString$1(e.kind)},isPromise=function(e){return instanceOf$1(e,Promise)&&isFunction$1(e.then)},isElement$1=function(e){return null!==e&&"object"===_typeof(e)&&1===e.nodeType&&"object"===_typeof(e.style)&&"object"===_typeof(e.ownerDocument)},isEmpty$1=function(e){return isNullOrUndefined$1(e)||(isString$1(e)||isArray$2(e)||isNodeList$1(e))&&!e.length||isObject$2(e)&&!Object.keys(e).length},isUrl=function(e){if(instanceOf$1(e,window.URL))return!0;if(!isString$1(e))return!1;var t=e;e.startsWith("http://")&&e.startsWith("https://")||(t="http://".concat(e));try{return!isEmpty$1(new URL(t).hostname)}catch(e){return!1}},is$1={nullOrUndefined:isNullOrUndefined$1,object:isObject$2,number:isNumber$1,string:isString$1,boolean:isBoolean$1,function:isFunction$1,array:isArray$2,weakMap:isWeakMap,nodeList:isNodeList$1,element:isElement$1,textNode:isTextNode,event:isEvent$1,keyboardEvent:isKeyboardEvent,cue:isCue,track:isTrack,promise:isPromise,url:isUrl,empty:isEmpty$1},transitionEndEvent=function(){var e=document.createElement("span"),t={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"},n=Object.keys(t).find((function(t){return void 0!==e.style[t]}));return!!is$1.string(n)&&t[n]}();function repaint(e,t){setTimeout((function(){try{e.hidden=!0,e.offsetHeight,e.hidden=!1}catch(e){}}),t)}var browser={isIE:
/* @cc_on!@ */
-!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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)},createMethod$5=function(e){return function(t,n,r,i){aFunction$1(n);var o=toObject(t),a=indexedObject(o),s=toLength(o.length),l=e?s-1:0,c=e?-1:1;if(r<2)for(;;){if(l in a){i=a[l],l+=c;break}if(l+=c,e?l<0:s<=l)throw TypeError("Reduce of empty array with no initial value")}for(;e?l>=0:s>l;l+=c)l in a&&(i=n(i,a[l],l,o));return i}},arrayReduce={left:createMethod$5(!1),right:createMethod$5(!0)},$reduce=arrayReduce.left,STRICT_METHOD$5=arrayMethodIsStrict("reduce"),USES_TO_LENGTH$9=arrayMethodUsesToLength("reduce",{1:0}),CHROME_BUG=!engineIsNode&&engineV8Version>79&&engineV8Version<83;function cloneDeep(e){return JSON.parse(JSON.stringify(e))}function getDeep(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function extend(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(!n.length)return e;var i=n.shift();return is$1.object(i)?(Object.keys(i).forEach((function(t){is$1.object(i[t])?(Object.keys(e).includes(t)||Object.assign(e,_defineProperty({},t,{})),extend(e[t],i[t])):Object.assign(e,_defineProperty({},t,i[t]))})),extend.apply(void 0,[e].concat(n))):e}function wrap$1(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach((function(e,n){var r=n>0?t.cloneNode(!0):t,i=e.parentNode,o=e.nextSibling;r.appendChild(e),o?i.insertBefore(r,o):i.appendChild(r)}))}function setAttributes(e,t){is$1.element(e)&&!is$1.empty(t)&&Object.entries(t).filter((function(e){var t=_slicedToArray(e,2)[1];return!is$1.nullOrUndefined(t)})).forEach((function(t){var n=_slicedToArray(t,2),r=n[0],i=n[1];return e.setAttribute(r,i)}))}function createElement(e,t,n){var r=document.createElement(e);return is$1.object(t)&&setAttributes(r,t),is$1.string(n)&&(r.innerText=n),r}function insertAfter(e,t){is$1.element(e)&&is$1.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)}function insertElement(e,t,n,r){is$1.element(t)&&t.appendChild(createElement(e,n,r))}function removeElement(e){is$1.nodeList(e)||is$1.array(e)?Array.from(e).forEach(removeElement):is$1.element(e)&&is$1.element(e.parentNode)&&e.parentNode.removeChild(e)}function emptyElement(e){if(is$1.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function replaceElement(e,t){return is$1.element(t)&&is$1.element(t.parentNode)&&is$1.element(e)?(t.parentNode.replaceChild(e,t),e):null}function getAttributesFromSelector(e,t){if(!is$1.string(e)||is$1.empty(e))return{};var n={},r=extend({},t);return e.split(",").forEach((function(e){var t=e.trim(),i=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=_slicedToArray(o,1)[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":is$1.string(r.class)?n.class="".concat(r.class," ").concat(i):n.class=i;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}})),extend(r,n)}function toggleHidden(e,t){if(is$1.element(e)){var n=t;is$1.boolean(n)||(n=!e.hidden),e.hidden=n}}function toggleClass(e,t,n){if(is$1.nodeList(e))return Array.from(e).map((function(e){return toggleClass(e,t,n)}));if(is$1.element(e)){var r="toggle";return void 0!==n&&(r=n?"add":"remove"),e.classList[r](t),e.classList.contains(t)}return!1}function hasClass(e,t){return is$1.element(e)&&e.classList.contains(t)}function matches$1(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function closest(e,t){return(Element.prototype.closest||function(){var e=this;do{if(matches$1.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}function getElements(e){return this.elements.container.querySelectorAll(e)}function getElement(e){return this.elements.container.querySelector(e)}function setFocus(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];is$1.element(e)&&(e.focus({preventScroll:!0}),t&&toggleClass(e,this.config.classNames.tabFocus))}_export({target:"Array",proto:!0,forced:!STRICT_METHOD$5||!USES_TO_LENGTH$9||CHROME_BUG},{reduce:function(e){return $reduce(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var defaultCodecs={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},support={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var r=browser.isIPhone&&n&&support.playsinline,i=support[e]||"html5"!==t;return{api:i,ui:i&&support.rangeInput&&("video"!==e||!browser.isIPhone||r)}},pip:!(browser.isIPhone||!is$1.function(createElement("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||createElement("video").disablePictureInPicture)),airplay:is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(is$1.empty(e))return!1;var t=_slicedToArray(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(defaultCodecs).includes(n)&&(n+='; codecs="'.concat(defaultCodecs[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:function(){var e=document.createElement("input");return e.type="range","range"===e.type}(),touch:"ontouchstart"in document.documentElement,transitions:!1!==transitionEndEvent,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},supportsPassiveListeners=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 toggleListener(e,t,n){var r=this,i=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&&!is$1.empty(t)&&is$1.function(n)){var s=t.split(" "),l=a;supportsPassiveListeners&&(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 on(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,n,!0,r,i)}function off(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,n,!1,r,i)}function once(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],a=function a(){off(e,n,a,i,o);for(var s=arguments.length,l=new Array(s),c=0;c<s;c++)l[c]=arguments[c];r.apply(t,l)};toggleListener.call(this,e,n,a,!0,i,o)}function triggerEvent(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(is$1.element(e)&&!is$1.empty(t)){var i=new CustomEvent(t,{bubbles:n,detail:_objectSpread2(_objectSpread2({},r),{},{plyr:this})});e.dispatchEvent(i)}}function unbindListeners(){this&&this.eventListeners&&(this.eventListeners.forEach((function(e){var t=e.element,n=e.type,r=e.callback,i=e.options;t.removeEventListener(n,r,i)})),this.eventListeners=[])}function ready(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):on.call(e,e.elements.container,"ready",t)})).then((function(){}))}function silencePromise(e){is$1.promise(e)&&e.then(null,(function(){}))}function validateRatio(e){return!!(is$1.array(e)||is$1.string(e)&&e.includes(":"))&&(is$1.array(e)?e:e.split(":")).map(Number).every(is$1.number)}function reduceAspectRatio(e){if(!is$1.array(e)||!e.every(is$1.number))return null;var t=_slicedToArray(e,2),n=t[0],r=t[1],i=function e(t,n){return 0===n?t:e(n,t%n)}(n,r);return[n/i,r/i]}function getAspectRatio(e){var t=function(e){return validateRatio(e)?e.split(":").map(Number):null},n=t(e);if(null===n&&(n=t(this.config.ratio)),null===n&&!is$1.empty(this.embed)&&is$1.array(this.embed.ratio)&&(n=this.embed.ratio),null===n&&this.isHTML5){var r=this.media;n=reduceAspectRatio([r.videoWidth,r.videoHeight])}return n}function setAspectRatio(e){if(!this.isVideo)return{};var t=this.elements.wrapper,n=getAspectRatio.call(this,e),r=_slicedToArray(is$1.array(n)?n:[0,0],2),i=100/r[0]*r[1];if(t.style.paddingBottom="".concat(i,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var o=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),a=(o-i)/(o/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(a,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==n);return{padding:i,ratio:n}}var html5={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var n=t.getAttribute("type");return!!is$1.empty(n)||support.mime.call(e,n)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:html5.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,is$1.empty(this.config.ratio)||setAspectRatio.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=html5.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&is$1.function(e.config.quality.onChange))e.config.quality.onChange(t);else{var n=html5.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!n)return;var r=e.media,i=r.currentTime,o=r.paused,a=r.preload,s=r.readyState,l=r.playbackRate;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",(function(){e.speed=l,e.currentTime=i,o||silencePromise(e.play())})),e.media.load())}triggerEvent.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(removeElement(html5.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function dedupe(e){return is$1.array(e)?e.filter((function(t,n){return e.indexOf(t)===n})):e}function closest$1(e,t){return is$1.array(e)&&e.length?e.reduce((function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e})):null}var defineProperty$6=objectDefineProperty.f,getOwnPropertyNames$1=objectGetOwnPropertyNames.f,setInternalState$7=internalState.set,MATCH$2=wellKnownSymbol("match"),NativeRegExp=global_1.RegExp,RegExpPrototype$1=NativeRegExp.prototype,re1=/a/g,re2=/a/g,CORRECT_NEW=new NativeRegExp(re1)!==re1,UNSUPPORTED_Y$2=regexpStickyHelpers.UNSUPPORTED_Y,FORCED$4=descriptors&&isForced_1("RegExp",!CORRECT_NEW||UNSUPPORTED_Y$2||fails((function(){return re2[MATCH$2]=!1,NativeRegExp(re1)!=re1||NativeRegExp(re2)==re2||"/a/i"!=NativeRegExp(re1,"i")})));if(FORCED$4){for(var RegExpWrapper=function(e,t){var n,r=this instanceof RegExpWrapper,i=isRegexp(e),o=void 0===t;if(!r&&i&&e.constructor===RegExpWrapper&&o)return e;CORRECT_NEW?i&&!o&&(e=e.source):e instanceof RegExpWrapper&&(o&&(t=regexpFlags.call(e)),e=e.source),UNSUPPORTED_Y$2&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var a=inheritIfRequired(CORRECT_NEW?new NativeRegExp(e,t):NativeRegExp(e,t),r?this:RegExpPrototype$1,RegExpWrapper);return UNSUPPORTED_Y$2&&n&&setInternalState$7(a,{sticky:n}),a},proxy=function(e){e in RegExpWrapper||defineProperty$6(RegExpWrapper,e,{configurable:!0,get:function(){return NativeRegExp[e]},set:function(t){NativeRegExp[e]=t}})},keys$2=getOwnPropertyNames$1(NativeRegExp),index=0;keys$2.length>index;)proxy(keys$2[index++]);RegExpPrototype$1.constructor=RegExpWrapper,RegExpWrapper.prototype=RegExpPrototype$1,redefine(global_1,"RegExp",RegExpWrapper)}function generateId(e){return"".concat(e,"-").concat(Math.floor(1e4*Math.random()))}function format(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return is$1.empty(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return n[t].toString()}))}function getPercentage(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}setSpecies("RegExp");var replaceAll=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())},toTitleCase=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function toPascalCase(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=replaceAll(t,"-"," "),t=replaceAll(t,"_"," "),t=toTitleCase(t),replaceAll(t," ","")}function toCamelCase(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return(t=toPascalCase(t)).charAt(0).toLowerCase()+t.slice(1)}function stripHTML(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}function getHTML(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var resources={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},i18n={get:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(is$1.empty(e)||is$1.empty(t))return"";var n=getDeep(t.i18n,e);if(is$1.empty(n))return Object.keys(resources).includes(e)?resources[e]:"";var r={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(r).forEach((function(e){var t=_slicedToArray(e,2),r=t[0],i=t[1];n=replaceAll(n,r,i)})),n}},Storage=function(){function e(t){_classCallCheck(this,e),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return _createClass(e,[{key:"get",value:function(t){if(!e.supported||!this.enabled)return null;var n=window.localStorage.getItem(this.key);if(is$1.empty(n))return null;var r=JSON.parse(n);return is$1.string(t)&&t.length?r[t]:r}},{key:"set",value:function(t){if(e.supported&&this.enabled&&is$1.object(t)){var n=this.get();is$1.empty(n)&&(n={}),extend(n,t),window.localStorage.setItem(this.key,JSON.stringify(n))}}}],[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function fetch(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise((function(n,r){try{var i=new XMLHttpRequest;if(!("withCredentials"in i))return;i.addEventListener("load",(function(){if("text"===t)try{n(JSON.parse(i.responseText))}catch(e){n(i.responseText)}else n(i.response)})),i.addEventListener("error",(function(){throw new Error(i.status)})),i.open("GET",e,!0),i.responseType=t,i.send()}catch(e){r(e)}}))}function loadSprite(e,t){if(is$1.string(e)){var n="cache",r=is$1.string(t),i=function(){return null!==document.getElementById(t)},o=function(e,t){e.innerHTML=t,r&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!r||!i()){var a=Storage.supported,s=document.createElement("div");if(s.setAttribute("hidden",""),r&&s.setAttribute("id",t),a){var l=window.localStorage.getItem("".concat(n,"-").concat(t));if(null!==l){var c=JSON.parse(l);o(s,c.content)}}fetch(e).then((function(e){is$1.empty(e)||(a&&window.localStorage.setItem("".concat(n,"-").concat(t),JSON.stringify({content:e})),o(s,e))})).catch((function(){}))}}}var ceil$1=Math.ceil,floor$5=Math.floor;_export({target:"Math",stat:!0},{trunc:function(e){return(e>0?floor$5:ceil$1)(e)}});var getHours=function(e){return Math.trunc(e/60/60%60,10)},getMinutes=function(e){return Math.trunc(e/60%60,10)},getSeconds=function(e){return Math.trunc(e%60,10)};function formatTime(){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(!is$1.number(e))return formatTime(void 0,t,n);var r=function(e){return"0".concat(e).slice(-2)},i=getHours(e),o=getMinutes(e),a=getSeconds(e);return i=t||i>0?"".concat(i,":"):"","".concat(n&&e>0?"-":"").concat(i).concat(r(o),":").concat(r(a))}var controls={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||browser.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=getElement.call(this,this.config.selectors.controls.wrapper),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)},this.elements.progress=getElement.call(this,this.config.selectors.progress),this.elements.inputs={seek:getElement.call(this,this.config.selectors.inputs.seek),volume:getElement.call(this,this.config.selectors.inputs.volume)},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)},is$1.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="http://www.w3.org/2000/svg",r=controls.getIconUrl.call(this),i="".concat(r.cors?"":r.url,"#").concat(this.config.iconPrefix),o=document.createElementNS(n,"svg");setAttributes(o,extend(t,{"aria-hidden":"true",focusable:"false"}));var a=document.createElementNS(n,"use"),s="".concat(i,"-").concat(e);return"href"in a&&a.setAttributeNS("http://www.w3.org/1999/xlink","href",s),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",s),o.appendChild(a),o},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i18n.get(e,this.config),r=_objectSpread2(_objectSpread2({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return createElement("span",r,n)},createBadge:function(e){if(is$1.empty(e))return null;var t=createElement("span",{class:this.config.classNames.menu.value});return t.appendChild(createElement("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=this,r=extend({},t),i=toCamelCase(e),o={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(r).includes(e)&&(o[e]=r[e],delete r[e])})),"button"!==o.element||Object.keys(r).includes("type")||(r.type="button"),Object.keys(r).includes("class")?r.class.split(" ").some((function(e){return e===n.config.classNames.control}))||extend(r,{class:"".concat(r.class," ").concat(this.config.classNames.control)}):r.class=this.config.classNames.control,e){case"play":o.toggle=!0,o.label="play",o.labelPressed="pause",o.icon="play",o.iconPressed="pause";break;case"mute":o.toggle=!0,o.label="mute",o.labelPressed="unmute",o.icon="volume",o.iconPressed="muted";break;case"captions":o.toggle=!0,o.label="enableCaptions",o.labelPressed="disableCaptions",o.icon="captions-off",o.iconPressed="captions-on";break;case"fullscreen":o.toggle=!0,o.label="enterFullscreen",o.labelPressed="exitFullscreen",o.icon="enter-fullscreen",o.iconPressed="exit-fullscreen";break;case"play-large":r.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",o.label="play",o.icon="play";break;default:is$1.empty(o.label)&&(o.label=i),is$1.empty(o.icon)&&(o.icon=e)}var a=createElement(o.element);return o.toggle?(a.appendChild(controls.createIcon.call(this,o.iconPressed,{class:"icon--pressed"})),a.appendChild(controls.createIcon.call(this,o.icon,{class:"icon--not-pressed"})),a.appendChild(controls.createLabel.call(this,o.labelPressed,{class:"label--pressed"})),a.appendChild(controls.createLabel.call(this,o.label,{class:"label--not-pressed"}))):(a.appendChild(controls.createIcon.call(this,o.icon)),a.appendChild(controls.createLabel.call(this,o.label))),extend(r,getAttributesFromSelector(this.config.selectors.buttons[i],r)),setAttributes(a,r),"play"===i?(is$1.array(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(a)):this.elements.buttons[i]=a,a},createRange:function(e,t){var n=createElement("input",extend(getAttributesFromSelector(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":i18n.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,controls.updateRangeFill.call(this,n),RangeTouch.setup(n),n},createProgress:function(e,t){var n=createElement("progress",extend(getAttributesFromSelector(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(createElement("span",null,"0"));var r={played:"played",buffer:"buffered"}[e],i=r?i18n.get(r,this.config):"";n.innerText="% ".concat(i.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e,t){var n=getAttributesFromSelector(this.config.selectors.display[e],t),r=createElement("div",extend(n,{class:"".concat(n.class?n.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":i18n.get(e,this.config)}),"00:00");return this.elements.display[e]=r,r},bindMenuItemShortcuts:function(e,t){var n=this;on.call(this,e,"keydown keyup",(function(r){if([32,38,39,40].includes(r.which)&&(r.preventDefault(),r.stopPropagation(),"keydown"!==r.type)){var i,o=matches$1(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(r.which))controls.showMenuPanel.call(n,t,!0);else 32!==r.which&&(40===r.which||o&&39===r.which?(i=e.nextElementSibling,is$1.element(i)||(i=e.parentNode.firstElementChild)):(i=e.previousElementSibling,is$1.element(i)||(i=e.parentNode.lastElementChild)),setFocus.call(n,i,!0))}}),!1),on.call(this,e,"keyup",(function(e){13===e.which&&controls.focusFirstMenuItem.call(n,null,!0)}))},createMenuItem:function(e){var t=this,n=e.value,r=e.list,i=e.type,o=e.title,a=e.badge,s=void 0===a?null:a,l=e.checked,c=void 0!==l&&l,u=getAttributesFromSelector(this.config.selectors.inputs[i]),d=createElement("button",extend(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),h=createElement("span");h.innerHTML=o,is$1.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 matches$1(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(!is$1.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,i){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}controls.showMenuPanel.call(t,"home",is$1.keyboardEvent(e))}}),i,!1),controls.bindMenuItemShortcuts.call(this,d,i),r.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];if(!is$1.number(e))return e;var n=getHours(this.duration)>0;return formatTime(e,n,t)},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];is$1.element(e)&&is$1.number(t)&&(e.innerText=controls.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(is$1.element(this.elements.inputs.volume)&&controls.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),is$1.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;is$1.element(e)&&(e.value=t,controls.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&is$1.event(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=getPercentage(this.currentTime,this.duration),"timeupdate"===e.type&&controls.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var r=is$1.number(n)?n:0,i=is$1.element(e)?e:t.elements.display.buffer;if(is$1.element(i)){i.value=r;var o=i.getElementsByTagName("span")[0];is$1.element(o)&&(o.childNodes[0].nodeValue=r)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=is$1.event(e)?e.target:e;if(is$1.element(t)&&"range"===t.getAttribute("type")){if(matches$1(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=controls.formatTime(this.currentTime),r=controls.formatTime(this.duration),i=i18n.get("seekLabel",this.config);t.setAttribute("aria-valuetext",i.replace("{currentTime}",n).replace("{duration}",r))}else if(matches$1(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);browser.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&is$1.element(this.elements.inputs.seek)&&is$1.element(this.elements.display.seekTooltip)&&0!==this.duration){var n="".concat(this.config.classNames.tooltip,"--visible"),r=function(e){return toggleClass(t.elements.display.seekTooltip,n,e)};if(this.touch)r(!1);else{var i=0,o=this.elements.progress.getBoundingClientRect();if(is$1.event(e))i=100/o.width*(e.pageX-o.left);else{if(!hasClass(this.elements.display.seekTooltip,n))return;i=parseFloat(this.elements.display.seekTooltip.style.left,10)}i<0?i=0:i>100&&(i=100),controls.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*i),this.elements.display.seekTooltip.style.left="".concat(i,"%"),is$1.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&r("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!is$1.element(this.elements.display.duration)&&this.config.invertTime;controls.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||controls.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return toggleHidden(this.elements.display.currentTime,!0),void toggleHidden(this.elements.progress,!0);is$1.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=is$1.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&controls.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&controls.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),controls.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){toggleHidden(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var r=this.elements.settings.panels[e],i=null,o=t;if("captions"===e)i=this.currentTrack;else{if(i=is$1.empty(n)?this[e]:n,is$1.empty(i)&&(i=this.config[e].default),!is$1.empty(this.options[e])&&!this.options[e].includes(i))return void this.debug.warn("Unsupported value of '".concat(i,"' for ").concat(e));if(!this.config[e].options.includes(i))return void this.debug.warn("Disabled value of '".concat(i,"' for ").concat(e))}if(is$1.element(o)||(o=r&&r.querySelector('[role="menu"]')),is$1.element(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=controls.getLabel.call(this,e,i);var a=o&&o.querySelector('[value="'.concat(i,'"]'));is$1.element(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?i18n.get("normal",this.config):"".concat(t,"&times;");case"quality":if(is$1.number(t)){var n=i18n.get("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return toTitleCase(t);case"captions":return captions.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(is$1.element(this.elements.settings.panels.quality)){var n="quality",r=this.elements.settings.panels.quality.querySelector('[role="menu"]');is$1.array(e)&&(this.options.quality=dedupe(e).filter((function(e){return t.config.quality.options.includes(e)})));var i=!is$1.empty(this.options.quality)&&this.options.quality.length>1;if(controls.toggleMenuButton.call(this,n,i),emptyElement(r),controls.checkMenu.call(this),i){var o=function(e){var n=i18n.get("qualityBadge.".concat(e),t.config);return n.length?controls.createBadge.call(t,n):null};this.options.quality.sort((function(e,n){var r=t.config.quality.options;return r.indexOf(e)>r.indexOf(n)?1:-1})).forEach((function(e){controls.createMenuItem.call(t,{value:e,list:r,type:n,title:controls.getLabel.call(t,"quality",e),badge:o(e)})})),controls.updateSetting.call(this,n,r)}}},setCaptionsMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.captions)){var t="captions",n=this.elements.settings.panels.captions.querySelector('[role="menu"]'),r=captions.getTracks.call(this),i=Boolean(r.length);if(controls.toggleMenuButton.call(this,t,i),emptyElement(n),controls.checkMenu.call(this),i){var o=r.map((function(t,r){return{value:r,checked:e.captions.toggled&&e.currentTrack===r,title:captions.getLabel.call(e,t),badge:t.language&&controls.createBadge.call(e,t.language.toUpperCase()),list:n,type:"language"}}));o.unshift({value:-1,checked:!this.captions.toggled,title:i18n.get("disabled",this.config),list:n,type:"language"}),o.forEach(controls.createMenuItem.bind(this)),controls.updateSetting.call(this,t,n)}}},setSpeedMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.speed)){var t="speed",n=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var r=!is$1.empty(this.options.speed)&&this.options.speed.length>1;controls.toggleMenuButton.call(this,t,r),emptyElement(n),controls.checkMenu.call(this),r&&(this.options.speed.forEach((function(r){controls.createMenuItem.call(e,{value:r,list:n,type:t,title:controls.getLabel.call(e,"speed",r)})})),controls.updateSetting.call(this,t,n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!is$1.empty(e)&&Object.values(e).some((function(e){return!e.hidden}));toggleHidden(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;is$1.element(n)||(n=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var r=n.querySelector('[role^="menuitem"]');setFocus.call(this,r,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(is$1.element(t)&&is$1.element(n)){var r=t.hidden,i=r;if(is$1.boolean(e))i=e;else if(is$1.keyboardEvent(e)&&27===e.which)i=!1;else if(is$1.event(e)){var o=is$1.function(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(o);if(a||!a&&e.target!==n&&i)return}n.setAttribute("aria-expanded",i),toggleHidden(t,!i),toggleClass(this.elements.container,this.config.classNames.menu.open,i),i&&is$1.keyboardEvent(e)?controls.focusFirstMenuItem.call(this,null,!0):i||r||setFocus.call(this,n,is$1.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,r=t.scrollHeight;return removeElement(t),{width:n,height:r}},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],r=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(is$1.element(r)){var i=r.parentNode,o=Array.from(i.children).find((function(e){return!e.hidden}));if(support.transitions&&!support.reducedMotion){i.style.width="".concat(o.scrollWidth,"px"),i.style.height="".concat(o.scrollHeight,"px");var a=controls.getMenuSize.call(this,r),s=function t(n){n.target===i&&["width","height"].includes(n.propertyName)&&(i.style.width="",i.style.height="",off.call(e,i,transitionEndEvent,t))};on.call(this,i,transitionEndEvent,s),i.style.width="".concat(a.width,"px"),i.style.height="".concat(a.height,"px")}toggleHidden(o,!0),toggleHidden(r,!1),controls.focusFirstMenuItem.call(this,r,n)}},setDownloadUrl:function(){var e=this.elements.buttons.download;is$1.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=controls.bindMenuItemShortcuts,r=controls.createButton,i=controls.createProgress,o=controls.createRange,a=controls.createTime,s=controls.setQualityMenu,l=controls.setSpeedMenu,c=controls.showMenuPanel;this.elements.controls=null,is$1.array(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(r.call(this,"play-large"));var u=createElement("div",getAttributesFromSelector(this.config.selectors.controls.wrapper));this.elements.controls=u;var d={class:"plyr__controls__item"};return dedupe(is$1.array(this.config.controls)?this.config.controls:[]).forEach((function(s){if("restart"===s&&u.appendChild(r.call(t,"restart",d)),"rewind"===s&&u.appendChild(r.call(t,"rewind",d)),"play"===s&&u.appendChild(r.call(t,"play",d)),"fast-forward"===s&&u.appendChild(r.call(t,"fast-forward",d)),"progress"===s){var l=createElement("div",{class:"".concat(d.class," plyr__progress__container")}),h=createElement("div",getAttributesFromSelector(t.config.selectors.progress));if(h.appendChild(o.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),h.appendChild(i.call(t,"buffer")),t.config.tooltips.seek){var p=createElement("span",{class:t.config.classNames.tooltip},"00:00");h.appendChild(p),t.elements.display.seekTooltip=p}t.elements.progress=h,l.appendChild(t.elements.progress),u.appendChild(l)}if("current-time"===s&&u.appendChild(a.call(t,"currentTime",d)),"duration"===s&&u.appendChild(a.call(t,"duration",d)),"mute"===s||"volume"===s){var f=t.elements.volume;if(is$1.element(f)&&u.contains(f)||(f=createElement("div",extend({},d,{class:"".concat(d.class," plyr__volume").trim()})),t.elements.volume=f,u.appendChild(f)),"mute"===s&&f.appendChild(r.call(t,"mute")),"volume"===s&&!browser.isIos){var m={max:1,step:.05,value:t.config.volume};f.appendChild(o.call(t,"volume",extend(m,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===s&&u.appendChild(r.call(t,"captions",d)),"settings"===s&&!is$1.empty(t.config.settings)){var g=createElement("div",extend({},d,{class:"".concat(d.class," plyr__menu").trim(),hidden:""}));g.appendChild(r.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var y=createElement("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),b=createElement("div"),v=createElement("div",{id:"plyr-settings-".concat(e.id,"-home")}),E=createElement("div",{role:"menu"});v.appendChild(E),b.appendChild(v),t.elements.settings.panels.home=v,t.config.settings.forEach((function(r){var i=createElement("button",extend(getAttributesFromSelector(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:""}));n.call(t,i,r),on.call(t,i,"click",(function(){c.call(t,r,!1)}));var o=createElement("span",null,i18n.get(r,t.config)),a=createElement("span",{class:t.config.classNames.menu.value});a.innerHTML=e[r],o.appendChild(a),i.appendChild(o),E.appendChild(i);var s=createElement("div",{id:"plyr-settings-".concat(e.id,"-").concat(r),hidden:""}),l=createElement("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});l.appendChild(createElement("span",{"aria-hidden":!0},i18n.get(r,t.config))),l.appendChild(createElement("span",{class:t.config.classNames.hidden},i18n.get("menuBack",t.config))),on.call(t,s,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),c.call(t,"home",!0))}),!1),on.call(t,l,"click",(function(){c.call(t,"home",!1)})),s.appendChild(l),s.appendChild(createElement("div",{role:"menu"})),b.appendChild(s),t.elements.settings.buttons[r]=i,t.elements.settings.panels[r]=s})),y.appendChild(b),g.appendChild(y),u.appendChild(g),t.elements.settings.popup=y,t.elements.settings.menu=g}if("pip"===s&&support.pip&&u.appendChild(r.call(t,"pip",d)),"airplay"===s&&support.airplay&&u.appendChild(r.call(t,"airplay",d)),"download"===s){var S=extend({},d,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(S.download="");var T=t.config.urls.download;!is$1.url(T)&&t.isEmbed&&extend(S,{icon:"logo-".concat(t.provider),label:t.provider}),u.appendChild(r.call(t,"download",S))}"fullscreen"===s&&u.appendChild(r.call(t,"fullscreen",d))})),this.isHTML5&&s.call(this,html5.getQualityOptions.call(this)),l.call(this),u},inject:function(){var e=this;if(this.config.loadSprite){var t=controls.getIconUrl.call(this);t.cors&&loadSprite(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var r={id:this.id,seektime:this.config.seekTime,title:this.config.title},i=!0;is$1.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,r)),this.config.controls||(this.config.controls=[]),is$1.element(this.config.controls)||is$1.string(this.config.controls)?n=this.config.controls:(n=controls.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:captions.getLabel.call(this)}),i=!1);var o,a;if(i&&is$1.string(this.config.controls)&&(o=n,Object.entries(r).forEach((function(e){var t=_slicedToArray(e,2),n=t[0],r=t[1];o=replaceAll(o,"{".concat(n,"}"),r)})),n=o),is$1.string(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),is$1.element(a)||(a=this.elements.container),a[is$1.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),is$1.element(this.elements.controls)||controls.findElements.call(this),!is$1.empty(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return hasClass(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];toggleClass(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){is$1.array(e)||is$1.nodeList(e)?Array.from(e).filter(Boolean).forEach(s):s(e)}))}if(browser.isEdge&&repaint(a),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=getElements.call(this,d);Array.from(h).forEach((function(t){toggleClass(t,e.config.classNames.hidden,!1),toggleClass(t,e.config.classNames.tooltip,!0)}))}}};function parseUrl(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=e;if(t){var r=document.createElement("a");r.href=n,n=r.href}try{return new URL(n)}catch(e){return null}}function buildUrlParams(e){var t=new URLSearchParams;return is$1.object(e)&&Object.entries(e).forEach((function(e){var n=_slicedToArray(e,2),r=n[0],i=n[1];t.set(r,i)})),t}var captions={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!support.textTracks)is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this);else{if(is$1.element(this.elements.captions)||(this.elements.captions=createElement("div",getAttributesFromSelector(this.config.selectors.captions)),insertAfter(this.elements.captions,this.elements.wrapper)),browser.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),n=parseUrl(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&fetch(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){removeElement(e)}))}))}var t=dedupe((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=_slicedToArray(t,1)[0];var r=this.storage.get("captions");if(is$1.boolean(r)||(r=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:r,language:n,languages:t}),this.isHTML5){var i=this.config.captions.update?"addtrack removetrack":"removetrack";on.call(this,this.media.textTracks,i,captions.update.bind(this))}setTimeout(captions.update.bind(this),0)}},update:function(){var e=this,t=captions.getTracks.call(this,!0),n=this.captions,r=n.active,i=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find((function(e){return e.language===i})));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}),"showing"===t.mode&&(t.mode="hidden"),on.call(e,t,"cuechange",(function(){return captions.updateCues.call(e)}))})),(s&&this.language!==i||!t.includes(a))&&(captions.setLanguage.call(this,i),captions.toggle.call(this,r&&s)),toggleClass(this.elements.container,this.config.classNames.captions.enabled,!is$1.empty(t)),is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this)},toggle:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var r=this.captions.toggled,i=this.config.classNames.captions.active,o=is$1.nullOrUndefined(e)?!r:e;if(o!==r){if(n||(this.captions.active=o,this.storage.set({captions:o})),!this.language&&o&&!n){var a=captions.getTracks.call(this),s=captions.findTrack.call(this,[this.captions.language].concat(_toConsumableArray(this.captions.languages)),!0);return this.captions.language=s.language,void captions.set.call(this,a.indexOf(s))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=o),toggleClass(this.elements.container,i,o),this.captions.toggled=o,controls.updateSetting.call(this,"captions"),triggerEvent.call(this,this.media,o?"captionsenabled":"captionsdisabled")}setTimeout((function(){o&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=captions.getTracks.call(this);if(-1!==e)if(is$1.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var r=n[e],i=r||{},o=i.language;this.captions.currentTrackNode=r,controls.updateSetting.call(this,"captions"),t||(this.captions.language=o,this.storage.set({language:o})),this.isVimeo&&this.embed.enableTextTrack(o),triggerEvent.call(this,this.media,"languagechange")}captions.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&captions.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else captions.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(is$1.string(e)){var n=e.toLowerCase();this.captions.language=n;var r=captions.getTracks.call(this),i=captions.findTrack.call(this,[n]);captions.set.call(this,r.indexOf(i),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=Array.from((this.media||{}).textTracks||[]);return n.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,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=captions.getTracks.call(this),o=function(e){return Number((n.captions.meta.get(e)||{}).default)},a=Array.from(i).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||(r?a[0]:void 0)},getCurrentTrack:function(){return captions.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!is$1.track(t)&&support.textTracks&&this.captions.toggled&&(t=captions.getCurrentTrack.call(this)),is$1.track(t)?is$1.empty(t.label)?is$1.empty(t.language)?i18n.get("enabled",this.config):e.language.toUpperCase():t.label:i18n.get("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(is$1.element(this.elements.captions))if(is$1.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=captions.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(getHTML)}var r=t.map((function(e){return e.trim()})).join("\n");if(r!==this.elements.captions.innerHTML){emptyElement(this.elements.captions);var i=createElement("span",getAttributesFromSelector(this.config.selectors.caption));i.innerHTML=r,this.elements.captions.appendChild(i),triggerEvent.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},defaults$1={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.3/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},pip={active:"picture-in-picture",inactive:"inline"},providers={html5:"html5",youtube:"youtube",vimeo:"vimeo"},types={audio:"audio",video:"video"};function getProviderByUrl(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?providers.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?providers.vimeo:null}var noop=function(){},Console=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];_classCallCheck(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return _createClass(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):noop}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):noop}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):noop}}]),e}(),Fullscreen=function(){function e(t){var n=this;_classCallCheck(this,e),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&closest(this.player.elements.container,t.config.fullscreen.container),on.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){n.onChange()})),on.call(this.player,this.player.elements.container,"dblclick",(function(e){is$1.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.player.listeners.proxy(e,n.toggle,"fullscreen")})),on.call(this,this.player.elements.container,"keydown",(function(e){return n.trapFocus(e)})),this.update()}return _createClass(e,[{key:"onChange",value:function(){if(this.enabled){var e=this.player.elements.buttons.fullscreen;is$1.element(e)&&(e.pressed=this.active);var t=this.target===this.player.media?this.target:this.player.elements.container;triggerEvent.call(this.player,t,this.active?"enterfullscreen":"exitfullscreen",!0)}}},{key:"toggleFallback",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(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":"",toggleClass(this.target,this.player.config.classNames.fullscreen.fallback,e),browser.isIos){var t=document.head.querySelector('meta[name="viewport"]'),n="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var r=is$1.string(t.content)&&t.content.includes(n);e?(this.cleanupViewport=!r,r||(t.content+=",".concat(n))):this.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==n})).join(","))}this.onChange()}},{key:"trapFocus",value:function(e){if(!browser.isIos&&this.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,n=getElements.call(this.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),r=_slicedToArray(n,1)[0],i=n[n.length-1];t!==i||e.shiftKey?t===r&&e.shiftKey&&(i.focus(),e.preventDefault()):(r.focus(),e.preventDefault())}}},{key:"update",value:function(){var t;this.enabled?(t=this.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",this.player.debug.log("".concat(t," fullscreen enabled"))):this.player.debug.log("Fullscreen not supported and fallback disabled");toggleClass(this.player.elements.container,this.player.config.classNames.fullscreen.enabled,this.enabled)}},{key:"enter",value:function(){this.enabled&&(browser.isIos&&this.player.config.fullscreen.iosNative?this.target.webkitEnterFullscreen():!e.native||this.forceFallback?this.toggleFallback(!0):this.prefix?is$1.empty(this.prefix)||this.target["".concat(this.prefix,"Request").concat(this.property)]():this.target.requestFullscreen({navigationUI:"hide"}))}},{key:"exit",value:function(){if(this.enabled)if(browser.isIos&&this.player.config.fullscreen.iosNative)this.target.webkitExitFullscreen(),silencePromise(this.player.play());else if(!e.native||this.forceFallback)this.toggleFallback(!1);else if(this.prefix){if(!is$1.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)}},{key:"toggle",value:function(){this.active?this.exit():this.enter()}},{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return hasClass(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return browser.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(is$1.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!is$1.function(document["".concat(t,"ExitFullscreen")])&&!is$1.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),mathSign=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function loadImage(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise((function(n,r){var i=new Image,o=function(){delete i.onload,delete i.onerror,(i.naturalWidth>=t?n:r)(i)};Object.assign(i,{onload:o,onerror:o,src:e})}))}_export({target:"Math",stat:!0},{sign:mathSign});var ui={addStyleHook:function(){toggleClass(this.elements.container,this.config.selectors.container.replace(".",""),!0),toggleClass(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 ui.toggleNativeControls.call(this,!0);is$1.element(this.elements.controls)||(controls.inject.call(this),this.listeners.controls()),ui.toggleNativeControls.call(this),this.isHTML5&&captions.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,controls.updateVolume.call(this),controls.timeUpdate.call(this),ui.checkPlaying.call(this),toggleClass(this.elements.container,this.config.classNames.pip.supported,support.pip&&this.isHTML5&&this.isVideo),toggleClass(this.elements.container,this.config.classNames.airplay.supported,support.airplay&&this.isHTML5),toggleClass(this.elements.container,this.config.classNames.isIos,browser.isIos),toggleClass(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){triggerEvent.call(e,e.media,"ready")}),0),ui.setTitle.call(this),this.poster&&ui.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&controls.durationUpdate.call(this)},setTitle:function(){var e=i18n.get("play",this.config);if(is$1.string(this.config.title)&&!is$1.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=getElement.call(this,"iframe");if(!is$1.element(t))return;var n=is$1.empty(this.config.title)?"video":this.config.title,r=i18n.get("frameTitle",this.config);t.setAttribute("title",r.replace("{title}",n))}},togglePoster:function(e){toggleClass(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),ready.call(this).then((function(){return loadImage(e)})).catch((function(n){throw e===t.poster&&ui.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:""}),ui.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;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),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",i18n.get(t.playing?"pause":"play",t.config))})),is$1.event(e)&&"timeupdate"===e.type||ui.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(){toggleClass(t.elements.container,t.config.classNames.loading,t.loading),ui.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}},migrateStyles:function(){var e=this;Object.values(_objectSpread2({},this.media.style)).filter((function(e){return!is$1.empty(e)&&is$1.string(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),is$1.empty(this.media.style)&&this.media.removeAttribute("style")}},Listeners=function(){function e(t){_classCallCheck(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 _createClass(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,r=e.keyCode?e.keyCode:e.which,i="keydown"===e.type,o=i&&r===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&is$1.number(r)){if(i){var a=document.activeElement;if(is$1.element(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&matches$1(a,s))return;if(32===e.which&&matches$1(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(r)&&(e.preventDefault(),e.stopPropagation()),r){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*(r-48));break;case 32:case 75:o||silencePromise(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}27===r&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=r}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){controls.toggleMenu.call(this.player,e)}},{key:"firstTouch",value:function(){var e=this.player,t=e.elements;e.touch=!0,toggleClass(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 r,i=e.timeStamp-this.lastKeyDown<=20;if("focus"!==e.type||i)r=t.config.classNames.tabFocus,toggleClass(getElements.call(t,".".concat(r)),r,!1),"focusout"!==e.type&&(this.focusTimer=setTimeout((function(){var e=document.activeElement;n.container.contains(e)&&toggleClass(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&&toggleListener.call(t,window,"keydown keyup",this.handleKey,e,!1),toggleListener.call(t,document.body,"click",this.toggleMenu,e),once.call(t,document.body,"touchstart",this.firstTouch),toggleListener.call(t,document.body,"keydown focus blur focusout",this.setTabFocus,e,!1,!0)}},{key:"container",value:function(){var e=this.player,t=e.config,n=e.elements,r=e.timers;!t.keyboard.global&&t.keyboard.focused&&on.call(e,n.container,"keydown keyup",this.handleKey,!1),on.call(e,n.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var i=n.controls;i&&"enterfullscreen"===t.type&&(i.pressed=!1,i.hover=!1);var o=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(ui.toggleControls.call(e,!0),o=e.touch?3e3:2e3),clearTimeout(r.controls),r.controls=setTimeout((function(){return ui.toggleControls.call(e,!1)}),o)}));var i=function(t){if(!t)return setAspectRatio.call(e);var r=n.container.getBoundingClientRect(),i=r.width,o=r.height;return setAspectRatio.call(e,"".concat(i,":").concat(o))},o=function(){clearTimeout(r.resized),r.resized=setTimeout(i,50)};on.call(e,n.container,"enterfullscreen exitfullscreen",(function(t){var r=e.fullscreen,a=r.target,s=r.usingNative;if(a===n.container&&(e.isEmbed||!is$1.empty(e.config.ratio))){var l="enterfullscreen"===t.type,c=i(l);c.padding;!function(t,n,r){if(e.isVimeo&&!e.config.vimeo.premium){var i=e.elements.wrapper.firstChild,o=_slicedToArray(t,2)[1],a=_slicedToArray(getAspectRatio.call(e),2),s=a[0],l=a[1];i.style.maxWidth=r?"".concat(o/l*s,"px"):null,i.style.margin=r?"0 auto":null}}(c.ratio,0,l),l&&setTimeout((function(){return repaint(n.container)}),100),s||(l?on.call(e,window,"resize",o):off.call(e,window,"resize",o))}}))}},{key:"media",value:function(){var e=this,t=this.player,n=t.elements;if(on.call(t,t.media,"timeupdate seeking seeked",(function(e){return controls.timeUpdate.call(t,e)})),on.call(t,t.media,"durationchange loadeddata loadedmetadata",(function(e){return controls.durationUpdate.call(t,e)})),on.call(t,t.media,"ended",(function(){t.isHTML5&&t.isVideo&&t.config.resetOnEnd&&(t.restart(),t.pause())})),on.call(t,t.media,"progress playing seeking seeked",(function(e){return controls.updateProgress.call(t,e)})),on.call(t,t.media,"volumechange",(function(e){return controls.updateVolume.call(t,e)})),on.call(t,t.media,"playing play pause ended emptied timeupdate",(function(e){return ui.checkPlaying.call(t,e)})),on.call(t,t.media,"waiting canplay seeked playing",(function(e){return ui.checkLoading.call(t,e)})),t.supported.ui&&t.config.clickToPlay&&!t.isAudio){var r=getElement.call(t,".".concat(t.config.classNames.video));if(!is$1.element(r))return;on.call(t,n.container,"click",(function(i){([n.container,r].includes(i.target)||r.contains(i.target))&&(t.touch&&t.config.hideControls||(t.ended?(e.proxy(i,t.restart,"restart"),e.proxy(i,(function(){silencePromise(t.play())}),"play")):e.proxy(i,(function(){silencePromise(t.togglePlay())}),"play")))}))}t.supported.ui&&t.config.disableContextMenu&&on.call(t,n.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),on.call(t,t.media,"volumechange",(function(){t.storage.set({volume:t.volume,muted:t.muted})})),on.call(t,t.media,"ratechange",(function(){controls.updateSetting.call(t,"speed"),t.storage.set({speed:t.speed})})),on.call(t,t.media,"qualitychange",(function(e){controls.updateSetting.call(t,"quality",null,e.detail.quality)})),on.call(t,t.media,"ready qualitychange",(function(){controls.setDownloadUrl.call(t)}));var i=t.config.events.concat(["keyup","keydown"]).join(" ");on.call(t,t.media,i,(function(e){var r=e.detail,i=void 0===r?{}:r;"error"===e.type&&(i=t.media.error),triggerEvent.call(t,n.container,e.type,!0,i)}))}},{key:"proxy",value:function(e,t,n){var r=this.player,i=r.config.listeners[n],o=!0;is$1.function(i)&&(o=i.call(r,e)),!1!==o&&is$1.function(t)&&t.call(r,e)}},{key:"bind",value:function(e,t,n,r){var i=this,o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=this.player,s=a.config.listeners[r],l=is$1.function(s);on.call(a,e,t,(function(e){return i.proxy(e,n,r)}),o&&!l)}},{key:"controls",value:function(){var e=this,t=this.player,n=t.elements,r=browser.isIE?"change":"input";if(n.buttons.play&&Array.from(n.buttons.play).forEach((function(n){e.bind(n,"click",(function(){silencePromise(t.togglePlay())}),"play")})),this.bind(n.buttons.restart,"click",t.restart,"restart"),this.bind(n.buttons.rewind,"click",(function(){t.lastSeekTime=Date.now(),t.rewind()}),"rewind"),this.bind(n.buttons.fastForward,"click",(function(){t.lastSeekTime=Date.now(),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.download,"click",(function(){triggerEvent.call(t,t.media,"download")}),"download"),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(),e.preventDefault(),controls.toggleMenu.call(t,e)}),null,!1),this.bind(n.buttons.settings,"keyup",(function(e){var n=e.which;[13,32].includes(n)&&(13!==n?(e.preventDefault(),e.stopPropagation(),controls.toggleMenu.call(t,e)):controls.focusFirstMenuItem.call(t,null,!0))}),null,!1),this.bind(n.settings.menu,"keydown",(function(e){27===e.which&&controls.toggleMenu.call(t,e)})),this.bind(n.inputs.seek,"mousedown mousemove",(function(e){var t=n.progress.getBoundingClientRect(),r=100/t.width*(e.pageX-t.left);e.currentTarget.setAttribute("seek-value",r)})),this.bind(n.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(function(e){var n=e.currentTarget,r=e.keyCode?e.keyCode:e.which,i="play-on-seeked";if(!is$1.keyboardEvent(e)||39===r||37===r){t.lastSeekTime=Date.now();var o=n.hasAttribute(i),a=["mouseup","touchend","keyup"].includes(e.type);o&&a?(n.removeAttribute(i),silencePromise(t.play())):!a&&t.playing&&(n.setAttribute(i,""),t.pause())}})),browser.isIos){var i=getElements.call(t,'input[type="range"]');Array.from(i).forEach((function(t){return e.bind(t,r,(function(e){return repaint(e.target)}))}))}this.bind(n.inputs.seek,r,(function(e){var n=e.currentTarget,r=n.getAttribute("seek-value");is$1.empty(r)&&(r=n.value),n.removeAttribute("seek-value"),t.currentTime=r/n.max*t.duration}),"seek"),this.bind(n.progress,"mouseenter mouseleave mousemove",(function(e){return controls.updateSeekTooltip.call(t,e)})),this.bind(n.progress,"mousemove touchmove",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startMove(e)})),this.bind(n.progress,"mouseleave touchend click",(function(){var e=t.previewThumbnails;e&&e.loaded&&e.endMove(!1,!0)})),this.bind(n.progress,"mousedown touchstart",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.startScrubbing(e)})),this.bind(n.progress,"mouseup touchend",(function(e){var n=t.previewThumbnails;n&&n.loaded&&n.endScrubbing(e)})),browser.isWebkit&&Array.from(getElements.call(t,'input[type="range"]')).forEach((function(n){e.bind(n,"input",(function(e){return controls.updateRangeFill.call(t,e.target)}))})),t.config.toggleInvert&&!is$1.element(n.display.duration)&&this.bind(n.display.currentTime,"click",(function(){0!==t.currentTime&&(t.config.invertTime=!t.config.invertTime,controls.timeUpdate.call(t))})),this.bind(n.inputs.volume,r,(function(e){t.volume=e.target.value}),"volume"),this.bind(n.controls,"mouseenter mouseleave",(function(e){n.controls.hover=!t.touch&&"mouseenter"===e.type})),n.fullscreen&&Array.from(n.fullscreen.children).filter((function(e){return!e.contains(n.container)})).forEach((function(r){e.bind(r,"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",(function(){var r=t.config,i=t.timers;toggleClass(n.controls,r.classNames.noTransition,!0),ui.toggleControls.call(t,!0),setTimeout((function(){toggleClass(n.controls,r.classNames.noTransition,!1)}),0);var o=e.touch?3e3:4e3;clearTimeout(i.controls),i.controls=setTimeout((function(){return ui.toggleControls.call(t,!1)}),o)})),this.bind(n.inputs.volume,"wheel",(function(e){var n=e.webkitDirectionInvertedFromDevice,r=_slicedToArray([e.deltaX,-e.deltaY].map((function(e){return n?-e:e})),2),i=r[0],o=r[1],a=Math.sign(Math.abs(i)>Math.abs(o)?i:o);t.increaseVolume(a/50);var s=t.media.volume;(1===a&&s<1||-1===a&&s>0)&&e.preventDefault()}),"volume",!1)}}]),e}(),HAS_SPECIES_SUPPORT$3=arrayMethodHasSpeciesSupport("splice"),USES_TO_LENGTH$a=arrayMethodUsesToLength("splice",{ACCESSORS:!0,0:0,1:2}),max$3=Math.max,min$5=Math.min,MAX_SAFE_INTEGER$1=9007199254740991,MAXIMUM_ALLOWED_LENGTH_EXCEEDED="Maximum allowed length exceeded";_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT$3||!USES_TO_LENGTH$a},{splice:function(e,t){var n,r,i,o,a,s,l=toObject(this),c=toLength(l.length),u=toAbsoluteIndex(e,c),d=arguments.length;if(0===d?n=r=0:1===d?(n=0,r=c-u):(n=d-2,r=min$5(max$3(toInteger(t),0),c-u)),c+n-r>MAX_SAFE_INTEGER$1)throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);for(i=arraySpeciesCreate(l,r),o=0;o<r;o++)(a=u+o)in l&&createProperty(i,o,l[a]);if(i.length=r,n<r){for(o=u;o<c-r;o++)s=o+n,(a=o+r)in l?l[s]=l[a]:delete l[s];for(o=c;o>c-r+n;o--)delete l[o-1]}else if(n>r)for(o=c-r;o>u;o--)s=o+n-1,(a=o+r-1)in l?l[s]=l[a]:delete l[s];for(o=0;o<n;o++)l[o+u]=arguments[o+2];return l.length=c-r+n,i}});var loadjs_umd=createCommonjsModule((function(e,t){e.exports=function(){var e=function(){},t={},n={},r={};function i(e,t){e=e.push?e:[e];var i,o,a,s=[],l=e.length,c=l;for(i=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)o=e[l],(a=n[o])?i(o,a):(r[o]=r[o]||[]).push(i)}function o(e,t){if(e){var i=r[e];if(n[e]=t,i)for(;i.length;)i[0](e,t),i.splice(0,1)}}function a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function s(t,n,r,i){var o,a,l=document,c=r.async,u=(r.numRetries||0)+1,d=r.before||e,h=t.replace(/[\?|#].*$/,""),p=t.replace(/^(css|img)!/,"");i=i||0,/(^css!|\.css$)/.test(h)?((a=l.createElement("link")).rel="stylesheet",a.href=p,(o="hideFocus"in a)&&a.relList&&(o=0,a.rel="preload",a.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(h)?(a=l.createElement("img")).src=p:((a=l.createElement("script")).src=t,a.async=void 0===c||c),a.onload=a.onerror=a.onbeforeload=function(e){var l=e.type[0];if(o)try{a.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l){if((i+=1)<u)return s(t,n,r,i)}else if("preload"==a.rel&&"style"==a.as)return a.rel="stylesheet";n(t,l,e.defaultPrevented)},!1!==d(t,a)&&l.head.appendChild(a)}function l(e,t,n){var r,i,o=(e=e.push?e:[e]).length,a=o,l=[];for(r=function(e,n,r){if("e"==n&&l.push(e),"b"==n){if(!r)return;l.push(e)}--o||t(l)},i=0;i<a;i++)s(e[i],r,n)}function c(e,n,r){var i,s;if(n&&n.trim&&(i=n),s=(i?r:n)||{},i){if(i in t)throw"LoadJS";t[i]=!0}function c(t,n){l(e,(function(e){a(s,e),t&&a({success:t,error:n},e),o(i,e)}),s)}if(s.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return i(e,(function(e){a(t,e)})),c},c.done=function(e){o(e,[])},c.reset=function(){t={},n={},r={}},c.isDefined=function(e){return e in t},c}()}));function loadScript(e){return new Promise((function(t,n){loadjs_umd(e,{success:t,error:n})}))}function parseId(e){if(is$1.empty(e))return null;if(is$1.number(Number(e)))return e;return e.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:e}function assurePlaybackState(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}var vimeo={setup:function(){var e=this;toggleClass(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,setAspectRatio.call(e),is$1.object(window.Vimeo)?vimeo.ready.call(e):loadScript(e.config.urls.vimeo.sdk).then((function(){vimeo.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,n=t.config.vimeo,r=n.premium,i=n.referrerPolicy,o=_objectWithoutProperties(n,["premium","referrerPolicy"]);r&&Object.assign(o,{controls:!1,sidedock:!1});var a=buildUrlParams(_objectSpread2({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},o)),s=t.media.getAttribute("src");is$1.empty(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var l=parseId(s),c=createElement("iframe"),u=format(t.config.urls.vimeo.iframe,l,a);if(c.setAttribute("src",u),c.setAttribute("allowfullscreen",""),c.setAttribute("allow","autoplay,fullscreen,picture-in-picture"),is$1.empty(i)||c.setAttribute("referrerPolicy",i),r||!n.customControls)c.setAttribute("data-poster",t.poster),t.media=replaceElement(c,t.media);else{var d=createElement("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});d.appendChild(c),t.media=replaceElement(d,t.media)}n.customControls||fetch(format(t.config.urls.vimeo.api,u)).then((function(e){!is$1.empty(e)&&e.thumbnail_url&&ui.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(c,{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 assurePlaybackState.call(t,!0),t.embed.play()},t.media.pause=function(){return assurePlaybackState.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var h=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return h},set:function(e){var n=t.embed,r=t.media,i=t.paused,o=t.volume,a=i&&!n.hasPlayed;r.seeking=!0,triggerEvent.call(t,r,"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 p=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return p},set:function(e){t.embed.setPlaybackRate(e).then((function(){p=e,triggerEvent.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});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,triggerEvent.call(t,t.media,"volumechange")}))}});var m=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return m},set:function(e){var n=!!is$1.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then((function(){m=n,triggerEvent.call(t,t.media,"volumechange")}))}});var g,y=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return y},set:function(e){var n=is$1.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then((function(){y=n}))}}),t.embed.getVideoUrl().then((function(e){g=e,controls.setDownloadUrl.call(t)})).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(n){var r=_slicedToArray(n,2),i=r[0],o=r[1];t.embed.ratio=[i,o],setAspectRatio.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(n){t.config.title=n,ui.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){h=e,triggerEvent.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,triggerEvent.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,captions.setup.call(t)})),t.embed.on("cuechange",(function(e){var n=e.cues,r=(void 0===n?[]:n).map((function(e){return stripHTML(e.text)}));captions.updateCues.call(t,r)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){assurePlaybackState.call(t,!e),e||triggerEvent.call(t,t.media,"playing")})),is$1.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){triggerEvent.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){triggerEvent.call(t,t.media,"playing")})),t.embed.on("play",(function(){assurePlaybackState.call(t,!0),triggerEvent.call(t,t.media,"playing")})),t.embed.on("pause",(function(){assurePlaybackState.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,h=e.seconds,triggerEvent.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,triggerEvent.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&triggerEvent.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,triggerEvent.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,triggerEvent.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,triggerEvent.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,triggerEvent.call(t,t.media,"error")})),n.customControls&&setTimeout((function(){return ui.build.call(t)}),0)}};function parseId$1(e){if(is$1.empty(e))return null;return e.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:e}function assurePlaybackState$1(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}function getHost$1(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var youtube={setup:function(){var e=this;if(toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),is$1.object(window.YT)&&is$1.function(window.YT.Player))youtube.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){is$1.function(t)&&t(),youtube.ready.call(e)},loadScript(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;fetch(format(this.config.urls.youtube.api,e)).then((function(e){if(is$1.object(e)){var n=e.title,r=e.height,i=e.width;t.config.title=n,ui.setTitle.call(t),t.embed.ratio=[i,r]}setAspectRatio.call(t)})).catch((function(){setAspectRatio.call(t)}))},ready:function(){var e=this,t=e.config.youtube,n=e.media&&e.media.getAttribute("id");if(is$1.empty(n)||!n.startsWith("youtube-")){var r=e.media.getAttribute("src");is$1.empty(r)&&(r=e.media.getAttribute(this.config.attributes.embed.id));var i=parseId$1(r),o=createElement("div",{id:generateId(e.provider),"data-poster":t.customControls?e.poster:void 0});if(e.media=replaceElement(o,e.media),t.customControls){var a=function(e){return"https://i.ytimg.com/vi/".concat(i,"/").concat(e,"default.jpg")};loadImage(a("maxres"),121).catch((function(){return loadImage(a("sd"),121)})).catch((function(){return loadImage(a("hq"))})).then((function(t){return ui.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(e.media,{videoId:i,host:getHost$1(t),playerVars:extend({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError:function(t){if(!e.media.error){var n=t.data,r={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:r},triggerEvent.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),triggerEvent.call(e,e.media,"ratechange")},onReady:function(n){if(!is$1.function(e.media.play)){var r=n.target;youtube.getTitle.call(e,i),e.media.play=function(){assurePlaybackState$1.call(e,!0),r.playVideo()},e.media.pause=function(){assurePlaybackState$1.call(e,!1),r.pauseVideo()},e.media.stop=function(){r.stopVideo()},e.media.duration=r.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(r.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,triggerEvent.call(e,e.media,"seeking"),r.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return r.getPlaybackRate()},set:function(e){r.setPlaybackRate(e)}});var o=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return o},set:function(t){o=t,r.setVolume(100*o),triggerEvent.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var n=is$1.boolean(t)?t:a;a=n,r[n?"mute":"unMute"](),r.setVolume(100*o),triggerEvent.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return r.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}});var s=r.getAvailablePlaybackRates();e.options.speed=s.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),triggerEvent.call(e,e.media,"timeupdate"),triggerEvent.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval((function(){e.media.buffered=r.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&triggerEvent.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),triggerEvent.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return ui.build.call(e)}),50)}},onStateChange:function(n){var r=n.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(n.data)&&(e.media.seeking=!1,triggerEvent.call(e,e.media,"seeked")),n.data){case-1:triggerEvent.call(e,e.media,"timeupdate"),e.media.buffered=r.getVideoLoadedFraction(),triggerEvent.call(e,e.media,"progress");break;case 0:assurePlaybackState$1.call(e,!1),e.media.loop?(r.stopVideo(),r.playVideo()):triggerEvent.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(assurePlaybackState$1.call(e,!0),triggerEvent.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){triggerEvent.call(e,e.media,"timeupdate")}),50),e.media.duration!==r.getDuration()&&(e.media.duration=r.getDuration(),triggerEvent.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),assurePlaybackState$1.call(e,!1);break;case 3:triggerEvent.call(e,e.media,"waiting")}triggerEvent.call(e,e.elements.container,"statechange",!1,{code:n.data})}}})}}},media={setup:function(){this.media?(toggleClass(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),toggleClass(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&toggleClass(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=createElement("div",{class:this.config.classNames.video}),wrap$1(this.media,this.elements.wrapper),this.elements.poster=createElement("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?html5.setup.call(this):this.isYouTube?youtube.setup.call(this):this.isVimeo&&vimeo.setup.call(this)):this.debug.warn("No media element found!")}},destroy=function(e){e.manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()},Ads=function(){function e(t){var n=this;_classCallCheck(this,e),this.player=t,this.config=t.config.ads,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 _createClass(e,[{key:"load",value:function(){var e=this;this.enabled&&(is$1.object(window.google)&&is$1.object(window.google.ima)?this.ready():loadScript(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.enabled||destroy(this),this.startSafetyTimer(12e3,"ready()"),this.managerPromise.then((function(){e.clearSafetyTimer("onAdsManagerLoaded()")})),this.listeners(),this.setupIMA()}},{key:"setupIMA",value:function(){var e=this;this.elements.container=createElement("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),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline),this.elements.displayContainer=new google.ima.AdDisplayContainer(this.elements.container,this.player.media),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),this.requestAds()}},{key:"requestAds",value:function(){var e=this.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=this.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!this.player.muted),this.loader.requestAds(t)}catch(e){this.onAdError(e)}}},{key:"pollCountdown",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!t)return clearInterval(this.countdownTimer),void this.elements.container.removeAttribute("data-badge-text");var n=function(){var t=formatTime(Math.max(e.manager.getRemainingTime(),0)),n="".concat(i18n.get("advertisement",e.player.config)," - ").concat(t);e.elements.container.setAttribute("data-badge-text",n)};this.countdownTimer=setInterval(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(),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:"addCuePoints",value:function(){var e=this;is$1.empty(this.cuePoints)||this.cuePoints.forEach((function(t){if(0!==t&&-1!==t&&t<e.player.duration){var n=e.player.elements.progress;if(is$1.element(n)){var r=100/e.player.duration*t,i=createElement("span",{class:e.player.config.classNames.cues});i.style.left="".concat(r.toString(),"%"),n.appendChild(i)}}}))}},{key:"onAdEvent",value:function(e){var t,n=this,r=this.player.elements.container,i=e.getAd(),o=e.getAdData();switch(t=e.type,triggerEvent.call(n.player,n.player.media,"ads".concat(t.replace(/_/g,"").toLowerCase())),e.type){case google.ima.AdEvent.Type.LOADED:this.trigger("loaded"),this.pollCountdown(!0),i.isLinear()||(i.width=r.offsetWidth,i.height=r.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:this.manager.setVolume(this.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:this.player.ended?this.loadAds():this.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:this.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:this.pollCountdown(),this.resumeContent();break;case google.ima.AdEvent.Type.LOG:o.adError&&this.player.debug.warn("Non-fatal ad error: ".concat(o.adError.getMessage()))}}},{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("canplay",(function(){t.addCuePoints()})),this.player.on("ended",(function(){t.loader.contentComplete()})),this.player.on("timeupdate",(function(){e=t.player.currentTime})),this.player.on("seeked",(function(){var n=t.player.currentTime;is$1.empty(t.cuePoints)||t.cuePoints.forEach((function(r,i){e<r&&r<n&&(t.manager.discardAdBreak(),t.cuePoints.splice(i,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.manager.setVolume(e.player.volume),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,silencePromise(this.player.media.play())}},{key:"pauseContent",value:function(){this.elements.container.style.zIndex=3,this.playing=!0,this.player.media.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.initialized=!1,e.requestAds()})).catch((function(){}))}},{key:"trigger",value:function(e){for(var t=this,n=arguments.length,r=new Array(n>1?n-1:0),i=1;i<n;i++)r[i-1]=arguments[i];var o=this.events[e];is$1.array(o)&&o.forEach((function(e){is$1.function(e)&&e.apply(t,r)}))}},{key:"on",value:function(e,t){return is$1.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){is$1.nullOrUndefined(this.safetyTimer)||(this.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(this.safetyTimer),this.safetyTimer=null)}},{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!is$1.empty(e.publisherId)||is$1.url(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(is$1.url(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(buildUrlParams(t))}}]),e}(),$findIndex=arrayIteration.findIndex,FIND_INDEX="findIndex",SKIPS_HOLES$1=!0,USES_TO_LENGTH$b=arrayMethodUsesToLength(FIND_INDEX);FIND_INDEX in[]&&Array(1)[FIND_INDEX]((function(){SKIPS_HOLES$1=!1})),_export({target:"Array",proto:!0,forced:SKIPS_HOLES$1||!USES_TO_LENGTH$b},{findIndex:function(e){return $findIndex(this,e,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables(FIND_INDEX);var min$6=Math.min,nativeLastIndexOf=[].lastIndexOf,NEGATIVE_ZERO$1=!!nativeLastIndexOf&&1/[1].lastIndexOf(1,-0)<0,STRICT_METHOD$6=arrayMethodIsStrict("lastIndexOf"),USES_TO_LENGTH$c=arrayMethodUsesToLength("indexOf",{ACCESSORS:!0,1:0}),FORCED$5=NEGATIVE_ZERO$1||!STRICT_METHOD$6||!USES_TO_LENGTH$c,arrayLastIndexOf=FORCED$5?function(e){if(NEGATIVE_ZERO$1)return nativeLastIndexOf.apply(this,arguments)||0;var t=toIndexedObject(this),n=toLength(t.length),r=n-1;for(arguments.length>1&&(r=min$6(r,toInteger(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:nativeLastIndexOf;_export({target:"Array",proto:!0,forced:arrayLastIndexOf!==[].lastIndexOf},{lastIndexOf:arrayLastIndexOf});var parseVtt=function(e){var t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var n={};e.split(/\r\n|\n|\r/).forEach((function(e){if(is$1.number(n.startTime)){if(!is$1.empty(e.trim())&&is$1.empty(n.text)){var t=e.trim().split("#xywh="),r=_slicedToArray(t,1);if(n.text=r[0],t[1]){var i=_slicedToArray(t[1].split(","),4);n.x=i[0],n.y=i[1],n.w=i[2],n.h=i[3]}}}else{var o=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);o&&(n.startTime=60*Number(o[1]||0)*60+60*Number(o[2])+Number(o[3])+Number("0.".concat(o[4])),n.endTime=60*Number(o[6]||0)*60+60*Number(o[7])+Number(o[8])+Number("0.".concat(o[9])))}})),n.text&&t.push(n)})),t},fitRatio=function(e,t){var n={};return e>t.width/t.height?(n.width=t.width,n.height=1/e*t.width):(n.height=t.height,n.width=e*t.height),n},PreviewThumbnails=function(){function e(t){_classCallCheck(this,e),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return _createClass(e,[{key:"load",value:function(){var e=this;this.player.elements.display.seekTooltip&&(this.player.elements.display.seekTooltip.hidden=this.enabled),this.enabled&&this.getThumbnails().then((function(){e.enabled&&(e.render(),e.determineContainerAutoSizing(),e.loaded=!0)}))}},{key:"getThumbnails",value:function(){var e=this;return new Promise((function(t){var n=e.player.config.previewThumbnails.src;if(is$1.empty(n))throw new Error("Missing previewThumbnails.src config attribute");var r=function(){e.thumbnails.sort((function(e,t){return e.height-t.height})),e.player.debug.log("Preview thumbnails",e.thumbnails),t()};if(is$1.function(n))n((function(t){e.thumbnails=t,r()}));else{var i=(is$1.string(n)?[n]:n).map((function(t){return e.getThumbnail(t)}));Promise.all(i).then(r)}}))}},{key:"getThumbnail",value:function(e){var t=this;return new Promise((function(n){fetch(e).then((function(r){var i={frames:parseVtt(r),height:null,urlPrefix:""};i.frames[0].text.startsWith("/")||i.frames[0].text.startsWith("http://")||i.frames[0].text.startsWith("https://")||(i.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var o=new Image;o.onload=function(){i.height=o.naturalHeight,i.width=o.naturalWidth,t.thumbnails.push(i),n()},o.src=i.urlPrefix+i.frames[0].text}))}))}},{key:"startMove",value:function(e){if(this.loaded&&is$1.event(e)&&["touchmove","mousemove"].includes(e.type)&&this.player.media.duration){if("touchmove"===e.type)this.seekTime=this.player.media.duration*(this.player.elements.inputs.seek.value/100);else{var t=this.player.elements.progress.getBoundingClientRect(),n=100/t.width*(e.pageX-t.left);this.seekTime=this.player.media.duration*(n/100),this.seekTime<0&&(this.seekTime=0),this.seekTime>this.player.media.duration-1&&(this.seekTime=this.player.media.duration-1),this.mousePosX=e.pageX,this.elements.thumb.time.innerText=formatTime(this.seekTime)}this.showImageAtCurrentTime()}}},{key:"endMove",value:function(){this.toggleThumbContainer(!1,!0)}},{key:"startScrubbing",value:function(e){(is$1.nullOrUndefined(e.button)||!1===e.button||0===e.button)&&(this.mouseDown=!0,this.player.media.duration&&(this.toggleScrubbingContainer(!0),this.toggleThumbContainer(!1,!0),this.showImageAtCurrentTime()))}},{key:"endScrubbing",value:function(){var e=this;this.mouseDown=!1,Math.ceil(this.lastTime)===Math.ceil(this.player.media.currentTime)?this.toggleScrubbingContainer(!1):once.call(this.player,this.player.media,"timeupdate",(function(){e.mouseDown||e.toggleScrubbingContainer(!1)}))}},{key:"listeners",value:function(){var e=this;this.player.on("play",(function(){e.toggleThumbContainer(!1,!0)})),this.player.on("seeked",(function(){e.toggleThumbContainer(!1)})),this.player.on("timeupdate",(function(){e.lastTime=e.player.media.currentTime}))}},{key:"render",value:function(){this.elements.thumb.container=createElement("div",{class:this.player.config.classNames.previewThumbnails.thumbContainer}),this.elements.thumb.imageContainer=createElement("div",{class:this.player.config.classNames.previewThumbnails.imageContainer}),this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);var e=createElement("div",{class:this.player.config.classNames.previewThumbnails.timeContainer});this.elements.thumb.time=createElement("span",{},"00:00"),e.appendChild(this.elements.thumb.time),this.elements.thumb.container.appendChild(e),is$1.element(this.player.elements.progress)&&this.player.elements.progress.appendChild(this.elements.thumb.container),this.elements.scrubbing.container=createElement("div",{class:this.player.config.classNames.previewThumbnails.scrubbingContainer}),this.player.elements.wrapper.appendChild(this.elements.scrubbing.container)}},{key:"destroy",value:function(){this.elements.thumb.container&&this.elements.thumb.container.remove(),this.elements.scrubbing.container&&this.elements.scrubbing.container.remove()}},{key:"showImageAtCurrentTime",value:function(){var e=this;this.mouseDown?this.setScrubbingContainerSize():this.setThumbContainerSizeAndPos();var t=this.thumbnails[0].frames.findIndex((function(t){return e.seekTime>=t.startTime&&e.seekTime<=t.endTime})),n=t>=0,r=0;this.mouseDown||this.toggleThumbContainer(n),n&&(this.thumbnails.forEach((function(n,i){e.loadedImages.includes(n.frames[t].text)&&(r=i)})),t!==this.showingThumb&&(this.showingThumb=t,this.loadImage(r)))}},{key:"loadImage",value:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,n=this.showingThumb,r=this.thumbnails[t],i=r.urlPrefix,o=r.frames[n],a=r.frames[n].text,s=i+a;if(this.currentImageElement&&this.currentImageElement.dataset.filename===a)this.showImage(this.currentImageElement,o,t,n,a,!1),this.currentImageElement.dataset.index=n,this.removeOldImages(this.currentImageElement);else{this.loadingImage&&this.usingSprites&&(this.loadingImage.onload=null);var l=new Image;l.src=s,l.dataset.index=n,l.dataset.filename=a,this.showingThumbFilename=a,this.player.debug.log("Loading image: ".concat(s)),l.onload=function(){return e.showImage(l,o,t,n,a,!0)},this.loadingImage=l,this.removeOldImages(l)}}},{key:"showImage",value:function(e,t,n,r,i){var o=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];this.player.debug.log("Showing thumb: ".concat(i,". num: ").concat(r,". qual: ").concat(n,". newimg: ").concat(o)),this.setImageSizeAndOffset(e,t),o&&(this.currentImageContainer.appendChild(e),this.currentImageElement=e,this.loadedImages.includes(i)||this.loadedImages.push(i)),this.preloadNearby(r,!0).then(this.preloadNearby(r,!1)).then(this.getHigherQuality(n,e,t,i))}},{key:"removeOldImages",value:function(e){var t=this;Array.from(this.currentImageContainer.children).forEach((function(n){if("img"===n.tagName.toLowerCase()){var r=t.usingSprites?500:1e3;if(n.dataset.index!==e.dataset.index&&!n.dataset.deleting){n.dataset.deleting=!0;var i=t.currentImageContainer;setTimeout((function(){i.removeChild(n),t.player.debug.log("Removing thumb: ".concat(n.dataset.filename))}),r)}}}))}},{key:"preloadNearby",value:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(r){setTimeout((function(){var i=t.thumbnails[0].frames[e].text;if(t.showingThumbFilename===i){var o;o=n?t.thumbnails[0].frames.slice(e):t.thumbnails[0].frames.slice(0,e).reverse();var a=!1;o.forEach((function(e){var n=e.text;if(n!==i&&!t.loadedImages.includes(n)){a=!0,t.player.debug.log("Preloading thumb filename: ".concat(n));var o=t.thumbnails[0].urlPrefix+n,s=new Image;s.src=o,s.onload=function(){t.player.debug.log("Preloaded thumb filename: ".concat(n)),t.loadedImages.includes(n)||t.loadedImages.push(n),r()}}})),a||r()}}),300)}))}},{key:"getHigherQuality",value:function(e,t,n,r){var i=this;if(e<this.thumbnails.length-1){var o=t.naturalHeight;this.usingSprites&&(o=n.h),o<this.thumbContainerHeight&&setTimeout((function(){i.showingThumbFilename===r&&(i.player.debug.log("Showing higher quality thumb for: ".concat(r)),i.loadImage(e+1))}),300)}}},{key:"toggleThumbContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],n=this.player.config.classNames.previewThumbnails.thumbContainerShown;this.elements.thumb.container.classList.toggle(n,e),!e&&t&&(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"toggleScrubbingContainer",value:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.player.config.classNames.previewThumbnails.scrubbingContainerShown;this.elements.scrubbing.container.classList.toggle(t,e),e||(this.showingThumb=null,this.showingThumbFilename=null)}},{key:"determineContainerAutoSizing",value:function(){(this.elements.thumb.imageContainer.clientHeight>20||this.elements.thumb.imageContainer.clientWidth>20)&&(this.sizeSpecifiedInCSS=!0)}},{key:"setThumbContainerSizeAndPos",value:function(){if(this.sizeSpecifiedInCSS){if(this.elements.thumb.imageContainer.clientHeight>20&&this.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(this.elements.thumb.imageContainer.clientHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(this.elements.thumb.imageContainer.clientHeight<20&&this.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(this.elements.thumb.imageContainer.clientWidth/this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var n=Math.floor(this.thumbContainerHeight*this.thumbAspectRatio);this.elements.thumb.imageContainer.style.height="".concat(this.thumbContainerHeight,"px"),this.elements.thumb.imageContainer.style.width="".concat(n,"px")}this.setThumbContainerPos()}},{key:"setThumbContainerPos",value:function(){var e=this.player.elements.progress.getBoundingClientRect(),t=this.player.elements.container.getBoundingClientRect(),n=this.elements.thumb.container,r=t.left-e.left+10,i=t.right-e.left-n.clientWidth-10,o=this.mousePosX-e.left-n.clientWidth/2;o<r&&(o=r),o>i&&(o=i),n.style.left="".concat(o,"px")}},{key:"setScrubbingContainerSize",value:function(){var e=fitRatio(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}),t=e.width,n=e.height;this.elements.scrubbing.container.style.width="".concat(t,"px"),this.elements.scrubbing.container.style.height="".concat(n,"px")}},{key:"setImageSizeAndOffset",value:function(e,t){if(this.usingSprites){var n=this.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*n,"px"),e.style.width="".concat(e.naturalWidth*n,"px"),e.style.left="-".concat(t.x*n,"px"),e.style.top="-".concat(t.y*n,"px")}}},{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?fitRatio(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),source={insertElements:function(e,t){var n=this;is$1.string(t)?insertElement(e,this.media,{src:t}):is$1.array(t)&&t.forEach((function(t){insertElement(e,n.media,t)}))},change:function(e){var t=this;getDeep(e,"sources.length")?(html5.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],removeElement(t.media),t.media=null,is$1.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,r=e.type,i=_slicedToArray(n,1)[0],o=i.provider,a=void 0===o?providers.html5:o,s=i.src,l="html5"===a?r:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:r,supported:support.check(r,a,t.config.playsinline),media:createElement(l,c)}),t.elements.container.appendChild(t.media),is$1.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),is$1.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","")),ui.addStyleHook.call(t),t.isHTML5&&source.insertElements.call(t,"source",n),t.config.title=e.title,media.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&source.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&ui.build.call(t),t.isHTML5&&t.media.load(),is$1.empty(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new PreviewThumbnails(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};function clamp(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),n)}var Plyr=function(){function e(t,n){var r=this;if(_classCallCheck(this,e),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=support.touch,this.media=t,is$1.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||is$1.nodeList(this.media)||is$1.array(this.media))&&(this.media=this.media[0]),this.config=extend({},defaults$1,e.defaults,n||{},function(){try{return JSON.parse(r.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 Console(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",support),!is$1.nullOrUndefined(this.media)&&is$1.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(support.check().api){var i=this.media.cloneNode(!0);i.autoplay=!1,this.elements.original=i;var o=this.media.tagName.toLowerCase(),a=null,s=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),is$1.element(a)){if(s=parseUrl(a.getAttribute("src")),this.provider=getProviderByUrl(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.youtube.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(is$1.empty(this.provider)||!Object.keys(providers).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=types.video;break;case"video":case"audio":this.type=o,this.provider=providers.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=support.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Listeners(this),this.storage=new Storage(this),this.media.plyr=this,is$1.element(this.elements.container)||(this.elements.container=createElement("div",{tabindex:0}),wrap$1(this.media,this.elements.container)),ui.migrateStyles.call(this),ui.addStyleHook.call(this),media.setup.call(this),this.config.debug&&on.call(this,this.elements.container,this.config.events.join(" "),(function(e){r.debug.log("event: ".concat(e.type))})),this.fullscreen=new Fullscreen(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&ui.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Ads(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return silencePromise(r.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new PreviewThumbnails(this))):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 _createClass(e,[{key:"play",value:function(){var e=this;return is$1.function(this.media.play)?(this.ads&&this.ads.enabled&&this.ads.managerPromise.then((function(){return e.ads.play()})).catch((function(){return silencePromise(e.media.play())})),this.media.play()):null}},{key:"pause",value:function(){return this.playing&&is$1.function(this.media.pause)?this.media.pause():null}},{key:"togglePlay",value:function(e){return(is$1.boolean(e)?e:!this.playing)?this.play():this.pause()}},{key:"stop",value:function(){this.isHTML5?(this.pause(),this.restart()):is$1.function(this.media.stop)&&this.media.stop()}},{key:"restart",value:function(){this.currentTime=0}},{key:"rewind",value:function(e){this.currentTime-=is$1.number(e)?e:this.config.seekTime}},{key:"forward",value:function(e){this.currentTime+=is$1.number(e)?e:this.config.seekTime}},{key:"increaseVolume",value:function(e){var t=this.media.muted?0:this.volume;this.volume=t+(is$1.number(e)?e:0)}},{key:"decreaseVolume",value:function(e){this.increaseVolume(-e)}},{key:"toggleCaptions",value:function(e){captions.toggle.call(this,e,!1)}},{key:"airplay",value:function(){support.airplay&&this.media.webkitShowPlaybackTargetPicker()}},{key:"toggleControls",value:function(e){if(this.supported.ui&&!this.isAudio){var t=hasClass(this.elements.container,this.config.classNames.hideControls),n=void 0===e?void 0:!e,r=toggleClass(this.elements.container,this.config.classNames.hideControls,n);if(r&&is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&!is$1.empty(this.config.settings)&&controls.toggleMenu.call(this,!1),r!==t){var i=r?"controlshidden":"controlsshown";triggerEvent.call(this,this.media,i)}return!r}return!1}},{key:"on",value:function(e,t){on.call(this,this.elements.container,e,t)}},{key:"once",value:function(e,t){once.call(this,this.elements.container,e,t)}},{key:"off",value:function(e,t){off(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 r=function(){document.body.style.overflow="",t.embed=null,n?(Object.keys(t.elements).length&&(removeElement(t.elements.buttons.play),removeElement(t.elements.captions),removeElement(t.elements.controls),removeElement(t.elements.wrapper),t.elements.buttons.play=null,t.elements.captions=null,t.elements.controls=null,t.elements.wrapper=null),is$1.function(e)&&e()):(unbindListeners.call(t),html5.cancelRequests.call(t),replaceElement(t.elements.original,t.elements.container),triggerEvent.call(t,t.elements.original,"destroyed",!0),is$1.function(e)&&e.call(t.elements.original),t.ready=!1,setTimeout((function(){t.elements=null,t.media=null}),200))};this.stop(),clearTimeout(this.timers.loading),clearTimeout(this.timers.controls),clearTimeout(this.timers.resized),this.isHTML5?(ui.toggleNativeControls.call(this,!0),r()):this.isYouTube?(clearInterval(this.timers.buffering),clearInterval(this.timers.playing),null!==this.embed&&is$1.function(this.embed.destroy)&&this.embed.destroy(),r()):this.isVimeo&&(null!==this.embed&&this.embed.unload().then(r),setTimeout(r,200))}}},{key:"supports",value:function(e){return support.mime.call(this,e)}},{key:"isHTML5",get:function(){return this.provider===providers.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===providers.youtube}},{key:"isVimeo",get:function(){return this.provider===providers.vimeo}},{key:"isVideo",get:function(){return this.type===types.video}},{key:"isAudio",get:function(){return this.type===types.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=is$1.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 is$1.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=is$1.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;is$1.string(t)&&(t=Number(t)),is$1.number(t)||(t=this.storage.get("volume")),is$1.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!is$1.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;is$1.boolean(t)||(t=this.storage.get("muted")),is$1.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=this,n=null;is$1.number(e)&&(n=e),is$1.number(n)||(n=this.storage.get("speed")),is$1.number(n)||(n=this.config.speed.selected);var r=this.minimumSpeed,i=this.maximumSpeed;n=clamp(n,r,i),this.config.speed.selected=n,setTimeout((function(){t.media.playbackRate=n}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,_toConsumableArray(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,_toConsumableArray(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var r=[!is$1.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(is$1.number),i=!0;if(!n.includes(r)){var o=closest$1(n,r);this.debug.warn("Unsupported quality option: ".concat(r,", using ").concat(o," instead")),r=o,i=!1}t.selected=r,this.media.quality=r,i&&this.storage.set({quality:r})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=is$1.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){source.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return is$1.url(e)?e:this.source},set:function(e){is$1.url(e)&&(this.config.urls.download=e,controls.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?ui.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=reduceAspectRatio(getAspectRatio.call(this));return is$1.array(e)?e.join(":"):e},set:function(e){this.isVideo?is$1.string(e)&&validateRatio(e)?(this.config.ratio=e,setAspectRatio.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=is$1.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){captions.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){captions.setLanguage.call(this,e,!1)},get:function(){return(captions.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(support.pip){var t=is$1.boolean(e)?e:!this.pip;is$1.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?pip.active:pip.inactive),is$1.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return support.pip?is$1.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===pip.active:null}}],[{key:"supported",value:function(e,t,n){return support.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return loadSprite(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=null;return is$1.string(t)?r=Array.from(document.querySelectorAll(t)):is$1.nodeList(t)?r=Array.from(t):is$1.array(t)&&(r=t.filter(is$1.element)),is$1.empty(r)?null:r.map((function(t){return new e(t,n)}))}}]),e}();Plyr.defaults=cloneDeep(defaults$1);export default Plyr; \ No newline at end of file
+!!document.documentMode,isEdge:window.navigator.userAgent.includes("Edge"),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)},createMethod$5=function(e){return function(t,n,r,i){aFunction$1(n);var o=toObject(t),a=indexedObject(o),s=toLength(o.length),l=e?s-1:0,c=e?-1:1;if(r<2)for(;;){if(l in a){i=a[l],l+=c;break}if(l+=c,e?l<0:s<=l)throw TypeError("Reduce of empty array with no initial value")}for(;e?l>=0:s>l;l+=c)l in a&&(i=n(i,a[l],l,o));return i}},arrayReduce={left:createMethod$5(!1),right:createMethod$5(!0)},$reduce=arrayReduce.left,STRICT_METHOD$5=arrayMethodIsStrict("reduce"),USES_TO_LENGTH$9=arrayMethodUsesToLength("reduce",{1:0}),CHROME_BUG=!engineIsNode&&engineV8Version>79&&engineV8Version<83;function cloneDeep(e){return JSON.parse(JSON.stringify(e))}function getDeep(e,t){return t.split(".").reduce((function(e,t){return e&&e[t]}),e)}function extend(){for(var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];if(!n.length)return e;var i=n.shift();return is$1.object(i)?(Object.keys(i).forEach((function(t){is$1.object(i[t])?(Object.keys(e).includes(t)||Object.assign(e,_defineProperty({},t,{})),extend(e[t],i[t])):Object.assign(e,_defineProperty({},t,i[t]))})),extend.apply(void 0,[e].concat(n))):e}function wrap$1(e,t){var n=e.length?e:[e];Array.from(n).reverse().forEach((function(e,n){var r=n>0?t.cloneNode(!0):t,i=e.parentNode,o=e.nextSibling;r.appendChild(e),o?i.insertBefore(r,o):i.appendChild(r)}))}function setAttributes(e,t){is$1.element(e)&&!is$1.empty(t)&&Object.entries(t).filter((function(e){var t=_slicedToArray(e,2)[1];return!is$1.nullOrUndefined(t)})).forEach((function(t){var n=_slicedToArray(t,2),r=n[0],i=n[1];return e.setAttribute(r,i)}))}function createElement(e,t,n){var r=document.createElement(e);return is$1.object(t)&&setAttributes(r,t),is$1.string(n)&&(r.innerText=n),r}function insertAfter(e,t){is$1.element(e)&&is$1.element(t)&&t.parentNode.insertBefore(e,t.nextSibling)}function insertElement(e,t,n,r){is$1.element(t)&&t.appendChild(createElement(e,n,r))}function removeElement(e){is$1.nodeList(e)||is$1.array(e)?Array.from(e).forEach(removeElement):is$1.element(e)&&is$1.element(e.parentNode)&&e.parentNode.removeChild(e)}function emptyElement(e){if(is$1.element(e))for(var t=e.childNodes.length;t>0;)e.removeChild(e.lastChild),t-=1}function replaceElement(e,t){return is$1.element(t)&&is$1.element(t.parentNode)&&is$1.element(e)?(t.parentNode.replaceChild(e,t),e):null}function getAttributesFromSelector(e,t){if(!is$1.string(e)||is$1.empty(e))return{};var n={},r=extend({},t);return e.split(",").forEach((function(e){var t=e.trim(),i=t.replace(".",""),o=t.replace(/[[\]]/g,"").split("="),a=_slicedToArray(o,1)[0],s=o.length>1?o[1].replace(/["']/g,""):"";switch(t.charAt(0)){case".":is$1.string(r.class)?n.class="".concat(r.class," ").concat(i):n.class=i;break;case"#":n.id=t.replace("#","");break;case"[":n[a]=s}})),extend(r,n)}function toggleHidden(e,t){if(is$1.element(e)){var n=t;is$1.boolean(n)||(n=!e.hidden),e.hidden=n}}function toggleClass(e,t,n){if(is$1.nodeList(e))return Array.from(e).map((function(e){return toggleClass(e,t,n)}));if(is$1.element(e)){var r="toggle";return void 0!==n&&(r=n?"add":"remove"),e.classList[r](t),e.classList.contains(t)}return!1}function hasClass(e,t){return is$1.element(e)&&e.classList.contains(t)}function matches$1(e,t){var n=Element.prototype;return(n.matches||n.webkitMatchesSelector||n.mozMatchesSelector||n.msMatchesSelector||function(){return Array.from(document.querySelectorAll(t)).includes(this)}).call(e,t)}function closest(e,t){return(Element.prototype.closest||function(){var e=this;do{if(matches$1.matches(e,t))return e;e=e.parentElement||e.parentNode}while(null!==e&&1===e.nodeType);return null}).call(e,t)}function getElements(e){return this.elements.container.querySelectorAll(e)}function getElement(e){return this.elements.container.querySelector(e)}function setFocus(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null,t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];is$1.element(e)&&(e.focus({preventScroll:!0}),t&&toggleClass(e,this.config.classNames.tabFocus))}_export({target:"Array",proto:!0,forced:!STRICT_METHOD$5||!USES_TO_LENGTH$9||CHROME_BUG},{reduce:function(e){return $reduce(this,e,arguments.length,arguments.length>1?arguments[1]:void 0)}});var defaultCodecs={"audio/ogg":"vorbis","audio/wav":"1","video/webm":"vp8, vorbis","video/mp4":"avc1.42E01E, mp4a.40.2","video/ogg":"theora"},support={audio:"canPlayType"in document.createElement("audio"),video:"canPlayType"in document.createElement("video"),check:function(e,t,n){var r=browser.isIPhone&&n&&support.playsinline,i=support[e]||"html5"!==t;return{api:i,ui:i&&support.rangeInput&&("video"!==e||!browser.isIPhone||r)}},pip:!(browser.isIPhone||!is$1.function(createElement("video").webkitSetPresentationMode)&&(!document.pictureInPictureEnabled||createElement("video").disablePictureInPicture)),airplay:is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),playsinline:"playsInline"in document.createElement("video"),mime:function(e){if(is$1.empty(e))return!1;var t=_slicedToArray(e.split("/"),1)[0],n=e;if(!this.isHTML5||t!==this.type)return!1;Object.keys(defaultCodecs).includes(n)&&(n+='; codecs="'.concat(defaultCodecs[e],'"'));try{return Boolean(n&&this.media.canPlayType(n).replace(/no/,""))}catch(e){return!1}},textTracks:"textTracks"in document.createElement("video"),rangeInput:function(){var e=document.createElement("input");return e.type="range","range"===e.type}(),touch:"ontouchstart"in document.documentElement,transitions:!1!==transitionEndEvent,reducedMotion:"matchMedia"in window&&window.matchMedia("(prefers-reduced-motion)").matches},supportsPassiveListeners=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 toggleListener(e,t,n){var r=this,i=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&&!is$1.empty(t)&&is$1.function(n)){var s=t.split(" "),l=a;supportsPassiveListeners&&(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 on(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,n,!0,r,i)}function off(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2?arguments[2]:void 0,r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];toggleListener.call(this,e,t,n,!1,r,i)}function once(e){var t=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",r=arguments.length>2?arguments[2]:void 0,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=arguments.length>4&&void 0!==arguments[4]&&arguments[4],a=function a(){off(e,n,a,i,o);for(var s=arguments.length,l=new Array(s),c=0;c<s;c++)l[c]=arguments[c];r.apply(t,l)};toggleListener.call(this,e,n,a,!0,i,o)}function triggerEvent(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"",n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};if(is$1.element(e)&&!is$1.empty(t)){var i=new CustomEvent(t,{bubbles:n,detail:_objectSpread2(_objectSpread2({},r),{},{plyr:this})});e.dispatchEvent(i)}}function unbindListeners(){this&&this.eventListeners&&(this.eventListeners.forEach((function(e){var t=e.element,n=e.type,r=e.callback,i=e.options;t.removeEventListener(n,r,i)})),this.eventListeners=[])}function ready(){var e=this;return new Promise((function(t){return e.ready?setTimeout(t,0):on.call(e,e.elements.container,"ready",t)})).then((function(){}))}function silencePromise(e){is$1.promise(e)&&e.then(null,(function(){}))}function validateRatio(e){return!!(is$1.array(e)||is$1.string(e)&&e.includes(":"))&&(is$1.array(e)?e:e.split(":")).map(Number).every(is$1.number)}function reduceAspectRatio(e){if(!is$1.array(e)||!e.every(is$1.number))return null;var t=_slicedToArray(e,2),n=t[0],r=t[1],i=function e(t,n){return 0===n?t:e(n,t%n)}(n,r);return[n/i,r/i]}function getAspectRatio(e){var t=function(e){return validateRatio(e)?e.split(":").map(Number):null},n=t(e);if(null===n&&(n=t(this.config.ratio)),null===n&&!is$1.empty(this.embed)&&is$1.array(this.embed.ratio)&&(n=this.embed.ratio),null===n&&this.isHTML5){var r=this.media;n=reduceAspectRatio([r.videoWidth,r.videoHeight])}return n}function setAspectRatio(e){if(!this.isVideo)return{};var t=this.elements.wrapper,n=getAspectRatio.call(this,e),r=_slicedToArray(is$1.array(n)?n:[0,0],2),i=100/r[0]*r[1];if(t.style.paddingBottom="".concat(i,"%"),this.isVimeo&&!this.config.vimeo.premium&&this.supported.ui){var o=100/this.media.offsetWidth*parseInt(window.getComputedStyle(this.media).paddingBottom,10),a=(o-i)/(o/50);this.fullscreen.active?t.style.paddingBottom=null:this.media.style.transform="translateY(-".concat(a,"%)")}else this.isHTML5&&t.classList.toggle(this.config.classNames.videoFixedRatio,null!==n);return{padding:i,ratio:n}}var html5={getSources:function(){var e=this;return this.isHTML5?Array.from(this.media.querySelectorAll("source")).filter((function(t){var n=t.getAttribute("type");return!!is$1.empty(n)||support.mime.call(e,n)})):[]},getQualityOptions:function(){return this.config.quality.forced?this.config.quality.options:html5.getSources.call(this).map((function(e){return Number(e.getAttribute("size"))})).filter(Boolean)},setup:function(){if(this.isHTML5){var e=this;e.options.speed=e.config.speed.options,is$1.empty(this.config.ratio)||setAspectRatio.call(e),Object.defineProperty(e.media,"quality",{get:function(){var t=html5.getSources.call(e).find((function(t){return t.getAttribute("src")===e.source}));return t&&Number(t.getAttribute("size"))},set:function(t){if(e.quality!==t){if(e.config.quality.forced&&is$1.function(e.config.quality.onChange))e.config.quality.onChange(t);else{var n=html5.getSources.call(e).find((function(e){return Number(e.getAttribute("size"))===t}));if(!n)return;var r=e.media,i=r.currentTime,o=r.paused,a=r.preload,s=r.readyState,l=r.playbackRate;e.media.src=n.getAttribute("src"),("none"!==a||s)&&(e.once("loadedmetadata",(function(){e.speed=l,e.currentTime=i,o||silencePromise(e.play())})),e.media.load())}triggerEvent.call(e,e.media,"qualitychange",!1,{quality:t})}}})}},cancelRequests:function(){this.isHTML5&&(removeElement(html5.getSources.call(this)),this.media.setAttribute("src",this.config.blankVideo),this.media.load(),this.debug.log("Cancelled network requests"))}};function dedupe(e){return is$1.array(e)?e.filter((function(t,n){return e.indexOf(t)===n})):e}function closest$1(e,t){return is$1.array(e)&&e.length?e.reduce((function(e,n){return Math.abs(n-t)<Math.abs(e-t)?n:e})):null}var defineProperty$6=objectDefineProperty.f,getOwnPropertyNames$1=objectGetOwnPropertyNames.f,setInternalState$7=internalState.set,MATCH$2=wellKnownSymbol("match"),NativeRegExp=global_1.RegExp,RegExpPrototype$1=NativeRegExp.prototype,re1=/a/g,re2=/a/g,CORRECT_NEW=new NativeRegExp(re1)!==re1,UNSUPPORTED_Y$2=regexpStickyHelpers.UNSUPPORTED_Y,FORCED$4=descriptors&&isForced_1("RegExp",!CORRECT_NEW||UNSUPPORTED_Y$2||fails((function(){return re2[MATCH$2]=!1,NativeRegExp(re1)!=re1||NativeRegExp(re2)==re2||"/a/i"!=NativeRegExp(re1,"i")})));if(FORCED$4){for(var RegExpWrapper=function(e,t){var n,r=this instanceof RegExpWrapper,i=isRegexp(e),o=void 0===t;if(!r&&i&&e.constructor===RegExpWrapper&&o)return e;CORRECT_NEW?i&&!o&&(e=e.source):e instanceof RegExpWrapper&&(o&&(t=regexpFlags.call(e)),e=e.source),UNSUPPORTED_Y$2&&(n=!!t&&t.indexOf("y")>-1)&&(t=t.replace(/y/g,""));var a=inheritIfRequired(CORRECT_NEW?new NativeRegExp(e,t):NativeRegExp(e,t),r?this:RegExpPrototype$1,RegExpWrapper);return UNSUPPORTED_Y$2&&n&&setInternalState$7(a,{sticky:n}),a},proxy=function(e){e in RegExpWrapper||defineProperty$6(RegExpWrapper,e,{configurable:!0,get:function(){return NativeRegExp[e]},set:function(t){NativeRegExp[e]=t}})},keys$2=getOwnPropertyNames$1(NativeRegExp),index=0;keys$2.length>index;)proxy(keys$2[index++]);RegExpPrototype$1.constructor=RegExpWrapper,RegExpWrapper.prototype=RegExpPrototype$1,redefine(global_1,"RegExp",RegExpWrapper)}function generateId(e){return"".concat(e,"-").concat(Math.floor(1e4*Math.random()))}function format(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r<t;r++)n[r-1]=arguments[r];return is$1.empty(e)?e:e.toString().replace(/{(\d+)}/g,(function(e,t){return n[t].toString()}))}function getPercentage(e,t){return 0===e||0===t||Number.isNaN(e)||Number.isNaN(t)?0:(e/t*100).toFixed(2)}setSpecies("RegExp");var replaceAll=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())},toTitleCase=function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";return e.toString().replace(/\w\S*/g,(function(e){return e.charAt(0).toUpperCase()+e.substr(1).toLowerCase()}))};function toPascalCase(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return t=replaceAll(t,"-"," "),t=replaceAll(t,"_"," "),t=toTitleCase(t),replaceAll(t," ","")}function toCamelCase(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=e.toString();return(t=toPascalCase(t)).charAt(0).toLowerCase()+t.slice(1)}function stripHTML(e){var t=document.createDocumentFragment(),n=document.createElement("div");return t.appendChild(n),n.innerHTML=e,t.firstChild.innerText}function getHTML(e){var t=document.createElement("div");return t.appendChild(e),t.innerHTML}var resources={pip:"PIP",airplay:"AirPlay",html5:"HTML5",vimeo:"Vimeo",youtube:"YouTube"},i18n={get:function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};if(is$1.empty(e)||is$1.empty(t))return"";var n=getDeep(t.i18n,e);if(is$1.empty(n))return Object.keys(resources).includes(e)?resources[e]:"";var r={"{seektime}":t.seekTime,"{title}":t.title};return Object.entries(r).forEach((function(e){var t=_slicedToArray(e,2),r=t[0],i=t[1];n=replaceAll(n,r,i)})),n}},Storage=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"get",(function(t){if(!e.supported||!n.enabled)return null;var r=window.localStorage.getItem(n.key);if(is$1.empty(r))return null;var i=JSON.parse(r);return is$1.string(t)&&t.length?i[t]:i})),_defineProperty(this,"set",(function(t){if(e.supported&&n.enabled&&is$1.object(t)){var r=n.get();is$1.empty(r)&&(r={}),extend(r,t),window.localStorage.setItem(n.key,JSON.stringify(r))}})),this.enabled=t.config.storage.enabled,this.key=t.config.storage.key}return _createClass(e,null,[{key:"supported",get:function(){try{if(!("localStorage"in window))return!1;var e="___test";return window.localStorage.setItem(e,e),window.localStorage.removeItem(e),!0}catch(e){return!1}}}]),e}();function fetch(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"text";return new Promise((function(n,r){try{var i=new XMLHttpRequest;if(!("withCredentials"in i))return;i.addEventListener("load",(function(){if("text"===t)try{n(JSON.parse(i.responseText))}catch(e){n(i.responseText)}else n(i.response)})),i.addEventListener("error",(function(){throw new Error(i.status)})),i.open("GET",e,!0),i.responseType=t,i.send()}catch(e){r(e)}}))}function loadSprite(e,t){if(is$1.string(e)){var n="cache",r=is$1.string(t),i=function(){return null!==document.getElementById(t)},o=function(e,t){e.innerHTML=t,r&&i()||document.body.insertAdjacentElement("afterbegin",e)};if(!r||!i()){var a=Storage.supported,s=document.createElement("div");if(s.setAttribute("hidden",""),r&&s.setAttribute("id",t),a){var l=window.localStorage.getItem("".concat(n,"-").concat(t));if(null!==l){var c=JSON.parse(l);o(s,c.content)}}fetch(e).then((function(e){is$1.empty(e)||(a&&window.localStorage.setItem("".concat(n,"-").concat(t),JSON.stringify({content:e})),o(s,e))})).catch((function(){}))}}}var ceil$1=Math.ceil,floor$5=Math.floor;_export({target:"Math",stat:!0},{trunc:function(e){return(e>0?floor$5:ceil$1)(e)}});var getHours=function(e){return Math.trunc(e/60/60%60,10)},getMinutes=function(e){return Math.trunc(e/60%60,10)},getSeconds=function(e){return Math.trunc(e%60,10)};function formatTime(){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(!is$1.number(e))return formatTime(void 0,t,n);var r=function(e){return"0".concat(e).slice(-2)},i=getHours(e),o=getMinutes(e),a=getSeconds(e);return i=t||i>0?"".concat(i,":"):"","".concat(n&&e>0?"-":"").concat(i).concat(r(o),":").concat(r(a))}var controls={getIconUrl:function(){var e=new URL(this.config.iconUrl,window.location).host!==window.location.host||browser.isIE&&!window.svg4everybody;return{url:this.config.iconUrl,cors:e}},findElements:function(){try{return this.elements.controls=getElement.call(this,this.config.selectors.controls.wrapper),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)},this.elements.progress=getElement.call(this,this.config.selectors.progress),this.elements.inputs={seek:getElement.call(this,this.config.selectors.inputs.seek),volume:getElement.call(this,this.config.selectors.inputs.volume)},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)},is$1.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="http://www.w3.org/2000/svg",r=controls.getIconUrl.call(this),i="".concat(r.cors?"":r.url,"#").concat(this.config.iconPrefix),o=document.createElementNS(n,"svg");setAttributes(o,extend(t,{"aria-hidden":"true",focusable:"false"}));var a=document.createElementNS(n,"use"),s="".concat(i,"-").concat(e);return"href"in a&&a.setAttributeNS("http://www.w3.org/1999/xlink","href",s),a.setAttributeNS("http://www.w3.org/1999/xlink","xlink:href",s),o.appendChild(a),o},createLabel:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=i18n.get(e,this.config),r=_objectSpread2(_objectSpread2({},t),{},{class:[t.class,this.config.classNames.hidden].filter(Boolean).join(" ")});return createElement("span",r,n)},createBadge:function(e){if(is$1.empty(e))return null;var t=createElement("span",{class:this.config.classNames.menu.value});return t.appendChild(createElement("span",{class:this.config.classNames.menu.badge},e)),t},createButton:function(e,t){var n=this,r=extend({},t),i=toCamelCase(e),o={element:"button",toggle:!1,label:null,icon:null,labelPressed:null,iconPressed:null};switch(["element","icon","label"].forEach((function(e){Object.keys(r).includes(e)&&(o[e]=r[e],delete r[e])})),"button"!==o.element||Object.keys(r).includes("type")||(r.type="button"),Object.keys(r).includes("class")?r.class.split(" ").some((function(e){return e===n.config.classNames.control}))||extend(r,{class:"".concat(r.class," ").concat(this.config.classNames.control)}):r.class=this.config.classNames.control,e){case"play":o.toggle=!0,o.label="play",o.labelPressed="pause",o.icon="play",o.iconPressed="pause";break;case"mute":o.toggle=!0,o.label="mute",o.labelPressed="unmute",o.icon="volume",o.iconPressed="muted";break;case"captions":o.toggle=!0,o.label="enableCaptions",o.labelPressed="disableCaptions",o.icon="captions-off",o.iconPressed="captions-on";break;case"fullscreen":o.toggle=!0,o.label="enterFullscreen",o.labelPressed="exitFullscreen",o.icon="enter-fullscreen",o.iconPressed="exit-fullscreen";break;case"play-large":r.class+=" ".concat(this.config.classNames.control,"--overlaid"),i="play",o.label="play",o.icon="play";break;default:is$1.empty(o.label)&&(o.label=i),is$1.empty(o.icon)&&(o.icon=e)}var a=createElement(o.element);return o.toggle?(a.appendChild(controls.createIcon.call(this,o.iconPressed,{class:"icon--pressed"})),a.appendChild(controls.createIcon.call(this,o.icon,{class:"icon--not-pressed"})),a.appendChild(controls.createLabel.call(this,o.labelPressed,{class:"label--pressed"})),a.appendChild(controls.createLabel.call(this,o.label,{class:"label--not-pressed"}))):(a.appendChild(controls.createIcon.call(this,o.icon)),a.appendChild(controls.createLabel.call(this,o.label))),extend(r,getAttributesFromSelector(this.config.selectors.buttons[i],r)),setAttributes(a,r),"play"===i?(is$1.array(this.elements.buttons[i])||(this.elements.buttons[i]=[]),this.elements.buttons[i].push(a)):this.elements.buttons[i]=a,a},createRange:function(e,t){var n=createElement("input",extend(getAttributesFromSelector(this.config.selectors.inputs[e]),{type:"range",min:0,max:100,step:.01,value:0,autocomplete:"off",role:"slider","aria-label":i18n.get(e,this.config),"aria-valuemin":0,"aria-valuemax":100,"aria-valuenow":0},t));return this.elements.inputs[e]=n,controls.updateRangeFill.call(this,n),RangeTouch.setup(n),n},createProgress:function(e,t){var n=createElement("progress",extend(getAttributesFromSelector(this.config.selectors.display[e]),{min:0,max:100,value:0,role:"progressbar","aria-hidden":!0},t));if("volume"!==e){n.appendChild(createElement("span",null,"0"));var r={played:"played",buffer:"buffered"}[e],i=r?i18n.get(r,this.config):"";n.innerText="% ".concat(i.toLowerCase())}return this.elements.display[e]=n,n},createTime:function(e,t){var n=getAttributesFromSelector(this.config.selectors.display[e],t),r=createElement("div",extend(n,{class:"".concat(n.class?n.class:""," ").concat(this.config.classNames.display.time," ").trim(),"aria-label":i18n.get(e,this.config)}),"00:00");return this.elements.display[e]=r,r},bindMenuItemShortcuts:function(e,t){var n=this;on.call(this,e,"keydown keyup",(function(r){if([32,38,39,40].includes(r.which)&&(r.preventDefault(),r.stopPropagation(),"keydown"!==r.type)){var i,o=matches$1(e,'[role="menuitemradio"]');if(!o&&[32,39].includes(r.which))controls.showMenuPanel.call(n,t,!0);else 32!==r.which&&(40===r.which||o&&39===r.which?(i=e.nextElementSibling,is$1.element(i)||(i=e.parentNode.firstElementChild)):(i=e.previousElementSibling,is$1.element(i)||(i=e.parentNode.lastElementChild)),setFocus.call(n,i,!0))}}),!1),on.call(this,e,"keyup",(function(e){13===e.which&&controls.focusFirstMenuItem.call(n,null,!0)}))},createMenuItem:function(e){var t=this,n=e.value,r=e.list,i=e.type,o=e.title,a=e.badge,s=void 0===a?null:a,l=e.checked,c=void 0!==l&&l,u=getAttributesFromSelector(this.config.selectors.inputs[i]),d=createElement("button",extend(u,{type:"button",role:"menuitemradio",class:"".concat(this.config.classNames.control," ").concat(u.class?u.class:"").trim(),"aria-checked":c,value:n})),p=createElement("span");p.innerHTML=o,is$1.element(s)&&p.appendChild(s),d.appendChild(p),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 matches$1(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(!is$1.keyboardEvent(e)||32===e.which){switch(e.preventDefault(),e.stopPropagation(),d.checked=!0,i){case"language":t.currentTrack=Number(n);break;case"quality":t.quality=n;break;case"speed":t.speed=parseFloat(n)}controls.showMenuPanel.call(t,"home",is$1.keyboardEvent(e))}}),i,!1),controls.bindMenuItemShortcuts.call(this,d,i),r.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];if(!is$1.number(e))return e;var n=getHours(this.duration)>0;return formatTime(e,n,t)},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];is$1.element(e)&&is$1.number(t)&&(e.innerText=controls.formatTime(t,n))},updateVolume:function(){this.supported.ui&&(is$1.element(this.elements.inputs.volume)&&controls.setRange.call(this,this.elements.inputs.volume,this.muted?0:this.volume),is$1.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;is$1.element(e)&&(e.value=t,controls.updateRangeFill.call(this,e))},updateProgress:function(e){var t=this;if(this.supported.ui&&is$1.event(e)){var n=0;if(e)switch(e.type){case"timeupdate":case"seeking":case"seeked":n=getPercentage(this.currentTime,this.duration),"timeupdate"===e.type&&controls.setRange.call(this,this.elements.inputs.seek,n);break;case"playing":case"progress":!function(e,n){var r=is$1.number(n)?n:0,i=is$1.element(e)?e:t.elements.display.buffer;if(is$1.element(i)){i.value=r;var o=i.getElementsByTagName("span")[0];is$1.element(o)&&(o.childNodes[0].nodeValue=r)}}(this.elements.display.buffer,100*this.buffered)}}},updateRangeFill:function(e){var t=is$1.event(e)?e.target:e;if(is$1.element(t)&&"range"===t.getAttribute("type")){if(matches$1(t,this.config.selectors.inputs.seek)){t.setAttribute("aria-valuenow",this.currentTime);var n=controls.formatTime(this.currentTime),r=controls.formatTime(this.duration),i=i18n.get("seekLabel",this.config);t.setAttribute("aria-valuetext",i.replace("{currentTime}",n).replace("{duration}",r))}else if(matches$1(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);browser.isWebkit&&t.style.setProperty("--value","".concat(t.value/t.max*100,"%"))}},updateSeekTooltip:function(e){var t=this;if(this.config.tooltips.seek&&is$1.element(this.elements.inputs.seek)&&is$1.element(this.elements.display.seekTooltip)&&0!==this.duration){var n="".concat(this.config.classNames.tooltip,"--visible"),r=function(e){return toggleClass(t.elements.display.seekTooltip,n,e)};if(this.touch)r(!1);else{var i=0,o=this.elements.progress.getBoundingClientRect();if(is$1.event(e))i=100/o.width*(e.pageX-o.left);else{if(!hasClass(this.elements.display.seekTooltip,n))return;i=parseFloat(this.elements.display.seekTooltip.style.left,10)}i<0?i=0:i>100&&(i=100),controls.updateTimeDisplay.call(this,this.elements.display.seekTooltip,this.duration/100*i),this.elements.display.seekTooltip.style.left="".concat(i,"%"),is$1.event(e)&&["mouseenter","mouseleave"].includes(e.type)&&r("mouseenter"===e.type)}}},timeUpdate:function(e){var t=!is$1.element(this.elements.display.duration)&&this.config.invertTime;controls.updateTimeDisplay.call(this,this.elements.display.currentTime,t?this.duration-this.currentTime:this.currentTime,t),e&&"timeupdate"===e.type&&this.media.seeking||controls.updateProgress.call(this,e)},durationUpdate:function(){if(this.supported.ui&&(this.config.invertTime||!this.currentTime)){if(this.duration>=Math.pow(2,32))return toggleHidden(this.elements.display.currentTime,!0),void toggleHidden(this.elements.progress,!0);is$1.element(this.elements.inputs.seek)&&this.elements.inputs.seek.setAttribute("aria-valuemax",this.duration);var e=is$1.element(this.elements.display.duration);!e&&this.config.displayDuration&&this.paused&&controls.updateTimeDisplay.call(this,this.elements.display.currentTime,this.duration),e&&controls.updateTimeDisplay.call(this,this.elements.display.duration,this.duration),controls.updateSeekTooltip.call(this)}},toggleMenuButton:function(e,t){toggleHidden(this.elements.settings.buttons[e],!t)},updateSetting:function(e,t,n){var r=this.elements.settings.panels[e],i=null,o=t;if("captions"===e)i=this.currentTrack;else{if(i=is$1.empty(n)?this[e]:n,is$1.empty(i)&&(i=this.config[e].default),!is$1.empty(this.options[e])&&!this.options[e].includes(i))return void this.debug.warn("Unsupported value of '".concat(i,"' for ").concat(e));if(!this.config[e].options.includes(i))return void this.debug.warn("Disabled value of '".concat(i,"' for ").concat(e))}if(is$1.element(o)||(o=r&&r.querySelector('[role="menu"]')),is$1.element(o)){this.elements.settings.buttons[e].querySelector(".".concat(this.config.classNames.menu.value)).innerHTML=controls.getLabel.call(this,e,i);var a=o&&o.querySelector('[value="'.concat(i,'"]'));is$1.element(a)&&(a.checked=!0)}},getLabel:function(e,t){switch(e){case"speed":return 1===t?i18n.get("normal",this.config):"".concat(t,"&times;");case"quality":if(is$1.number(t)){var n=i18n.get("qualityLabel.".concat(t),this.config);return n.length?n:"".concat(t,"p")}return toTitleCase(t);case"captions":return captions.getLabel.call(this);default:return null}},setQualityMenu:function(e){var t=this;if(is$1.element(this.elements.settings.panels.quality)){var n="quality",r=this.elements.settings.panels.quality.querySelector('[role="menu"]');is$1.array(e)&&(this.options.quality=dedupe(e).filter((function(e){return t.config.quality.options.includes(e)})));var i=!is$1.empty(this.options.quality)&&this.options.quality.length>1;if(controls.toggleMenuButton.call(this,n,i),emptyElement(r),controls.checkMenu.call(this),i){var o=function(e){var n=i18n.get("qualityBadge.".concat(e),t.config);return n.length?controls.createBadge.call(t,n):null};this.options.quality.sort((function(e,n){var r=t.config.quality.options;return r.indexOf(e)>r.indexOf(n)?1:-1})).forEach((function(e){controls.createMenuItem.call(t,{value:e,list:r,type:n,title:controls.getLabel.call(t,"quality",e),badge:o(e)})})),controls.updateSetting.call(this,n,r)}}},setCaptionsMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.captions)){var t="captions",n=this.elements.settings.panels.captions.querySelector('[role="menu"]'),r=captions.getTracks.call(this),i=Boolean(r.length);if(controls.toggleMenuButton.call(this,t,i),emptyElement(n),controls.checkMenu.call(this),i){var o=r.map((function(t,r){return{value:r,checked:e.captions.toggled&&e.currentTrack===r,title:captions.getLabel.call(e,t),badge:t.language&&controls.createBadge.call(e,t.language.toUpperCase()),list:n,type:"language"}}));o.unshift({value:-1,checked:!this.captions.toggled,title:i18n.get("disabled",this.config),list:n,type:"language"}),o.forEach(controls.createMenuItem.bind(this)),controls.updateSetting.call(this,t,n)}}},setSpeedMenu:function(){var e=this;if(is$1.element(this.elements.settings.panels.speed)){var t="speed",n=this.elements.settings.panels.speed.querySelector('[role="menu"]');this.options.speed=this.options.speed.filter((function(t){return t>=e.minimumSpeed&&t<=e.maximumSpeed}));var r=!is$1.empty(this.options.speed)&&this.options.speed.length>1;controls.toggleMenuButton.call(this,t,r),emptyElement(n),controls.checkMenu.call(this),r&&(this.options.speed.forEach((function(r){controls.createMenuItem.call(e,{value:r,list:n,type:t,title:controls.getLabel.call(e,"speed",r)})})),controls.updateSetting.call(this,t,n))}},checkMenu:function(){var e=this.elements.settings.buttons,t=!is$1.empty(e)&&Object.values(e).some((function(e){return!e.hidden}));toggleHidden(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;is$1.element(n)||(n=Object.values(this.elements.settings.panels).find((function(e){return!e.hidden})));var r=n.querySelector('[role^="menuitem"]');setFocus.call(this,r,t)}},toggleMenu:function(e){var t=this.elements.settings.popup,n=this.elements.buttons.settings;if(is$1.element(t)&&is$1.element(n)){var r=t.hidden,i=r;if(is$1.boolean(e))i=e;else if(is$1.keyboardEvent(e)&&27===e.which)i=!1;else if(is$1.event(e)){var o=is$1.function(e.composedPath)?e.composedPath()[0]:e.target,a=t.contains(o);if(a||!a&&e.target!==n&&i)return}n.setAttribute("aria-expanded",i),toggleHidden(t,!i),toggleClass(this.elements.container,this.config.classNames.menu.open,i),i&&is$1.keyboardEvent(e)?controls.focusFirstMenuItem.call(this,null,!0):i||r||setFocus.call(this,n,is$1.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,r=t.scrollHeight;return removeElement(t),{width:n,height:r}},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],r=this.elements.container.querySelector("#plyr-settings-".concat(this.id,"-").concat(t));if(is$1.element(r)){var i=r.parentNode,o=Array.from(i.children).find((function(e){return!e.hidden}));if(support.transitions&&!support.reducedMotion){i.style.width="".concat(o.scrollWidth,"px"),i.style.height="".concat(o.scrollHeight,"px");var a=controls.getMenuSize.call(this,r),s=function t(n){n.target===i&&["width","height"].includes(n.propertyName)&&(i.style.width="",i.style.height="",off.call(e,i,transitionEndEvent,t))};on.call(this,i,transitionEndEvent,s),i.style.width="".concat(a.width,"px"),i.style.height="".concat(a.height,"px")}toggleHidden(o,!0),toggleHidden(r,!1),controls.focusFirstMenuItem.call(this,r,n)}},setDownloadUrl:function(){var e=this.elements.buttons.download;is$1.element(e)&&e.setAttribute("href",this.download)},create:function(e){var t=this,n=controls.bindMenuItemShortcuts,r=controls.createButton,i=controls.createProgress,o=controls.createRange,a=controls.createTime,s=controls.setQualityMenu,l=controls.setSpeedMenu,c=controls.showMenuPanel;this.elements.controls=null,is$1.array(this.config.controls)&&this.config.controls.includes("play-large")&&this.elements.container.appendChild(r.call(this,"play-large"));var u=createElement("div",getAttributesFromSelector(this.config.selectors.controls.wrapper));this.elements.controls=u;var d={class:"plyr__controls__item"};return dedupe(is$1.array(this.config.controls)?this.config.controls:[]).forEach((function(s){if("restart"===s&&u.appendChild(r.call(t,"restart",d)),"rewind"===s&&u.appendChild(r.call(t,"rewind",d)),"play"===s&&u.appendChild(r.call(t,"play",d)),"fast-forward"===s&&u.appendChild(r.call(t,"fast-forward",d)),"progress"===s){var l=createElement("div",{class:"".concat(d.class," plyr__progress__container")}),p=createElement("div",getAttributesFromSelector(t.config.selectors.progress));if(p.appendChild(o.call(t,"seek",{id:"plyr-seek-".concat(e.id)})),p.appendChild(i.call(t,"buffer")),t.config.tooltips.seek){var f=createElement("span",{class:t.config.classNames.tooltip},"00:00");p.appendChild(f),t.elements.display.seekTooltip=f}t.elements.progress=p,l.appendChild(t.elements.progress),u.appendChild(l)}if("current-time"===s&&u.appendChild(a.call(t,"currentTime",d)),"duration"===s&&u.appendChild(a.call(t,"duration",d)),"mute"===s||"volume"===s){var h=t.elements.volume;if(is$1.element(h)&&u.contains(h)||(h=createElement("div",extend({},d,{class:"".concat(d.class," plyr__volume").trim()})),t.elements.volume=h,u.appendChild(h)),"mute"===s&&h.appendChild(r.call(t,"mute")),"volume"===s&&!browser.isIos){var m={max:1,step:.05,value:t.config.volume};h.appendChild(o.call(t,"volume",extend(m,{id:"plyr-volume-".concat(e.id)})))}}if("captions"===s&&u.appendChild(r.call(t,"captions",d)),"settings"===s&&!is$1.empty(t.config.settings)){var g=createElement("div",extend({},d,{class:"".concat(d.class," plyr__menu").trim(),hidden:""}));g.appendChild(r.call(t,"settings",{"aria-haspopup":!0,"aria-controls":"plyr-settings-".concat(e.id),"aria-expanded":!1}));var y=createElement("div",{class:"plyr__menu__container",id:"plyr-settings-".concat(e.id),hidden:""}),b=createElement("div"),v=createElement("div",{id:"plyr-settings-".concat(e.id,"-home")}),E=createElement("div",{role:"menu"});v.appendChild(E),b.appendChild(v),t.elements.settings.panels.home=v,t.config.settings.forEach((function(r){var i=createElement("button",extend(getAttributesFromSelector(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:""}));n.call(t,i,r),on.call(t,i,"click",(function(){c.call(t,r,!1)}));var o=createElement("span",null,i18n.get(r,t.config)),a=createElement("span",{class:t.config.classNames.menu.value});a.innerHTML=e[r],o.appendChild(a),i.appendChild(o),E.appendChild(i);var s=createElement("div",{id:"plyr-settings-".concat(e.id,"-").concat(r),hidden:""}),l=createElement("button",{type:"button",class:"".concat(t.config.classNames.control," ").concat(t.config.classNames.control,"--back")});l.appendChild(createElement("span",{"aria-hidden":!0},i18n.get(r,t.config))),l.appendChild(createElement("span",{class:t.config.classNames.hidden},i18n.get("menuBack",t.config))),on.call(t,s,"keydown",(function(e){37===e.which&&(e.preventDefault(),e.stopPropagation(),c.call(t,"home",!0))}),!1),on.call(t,l,"click",(function(){c.call(t,"home",!1)})),s.appendChild(l),s.appendChild(createElement("div",{role:"menu"})),b.appendChild(s),t.elements.settings.buttons[r]=i,t.elements.settings.panels[r]=s})),y.appendChild(b),g.appendChild(y),u.appendChild(g),t.elements.settings.popup=y,t.elements.settings.menu=g}if("pip"===s&&support.pip&&u.appendChild(r.call(t,"pip",d)),"airplay"===s&&support.airplay&&u.appendChild(r.call(t,"airplay",d)),"download"===s){var S=extend({},d,{element:"a",href:t.download,target:"_blank"});t.isHTML5&&(S.download="");var T=t.config.urls.download;!is$1.url(T)&&t.isEmbed&&extend(S,{icon:"logo-".concat(t.provider),label:t.provider}),u.appendChild(r.call(t,"download",S))}"fullscreen"===s&&u.appendChild(r.call(t,"fullscreen",d))})),this.isHTML5&&s.call(this,html5.getQualityOptions.call(this)),l.call(this),u},inject:function(){var e=this;if(this.config.loadSprite){var t=controls.getIconUrl.call(this);t.cors&&loadSprite(t.url,"sprite-plyr")}this.id=Math.floor(1e4*Math.random());var n=null;this.elements.controls=null;var r={id:this.id,seektime:this.config.seekTime,title:this.config.title},i=!0;is$1.function(this.config.controls)&&(this.config.controls=this.config.controls.call(this,r)),this.config.controls||(this.config.controls=[]),is$1.element(this.config.controls)||is$1.string(this.config.controls)?n=this.config.controls:(n=controls.create.call(this,{id:this.id,seektime:this.config.seekTime,speed:this.speed,quality:this.quality,captions:captions.getLabel.call(this)}),i=!1);var o,a;if(i&&is$1.string(this.config.controls)&&(o=n,Object.entries(r).forEach((function(e){var t=_slicedToArray(e,2),n=t[0],r=t[1];o=replaceAll(o,"{".concat(n,"}"),r)})),n=o),is$1.string(this.config.selectors.controls.container)&&(a=document.querySelector(this.config.selectors.controls.container)),is$1.element(a)||(a=this.elements.container),a[is$1.element(n)?"insertAdjacentElement":"insertAdjacentHTML"]("afterbegin",n),is$1.element(this.elements.controls)||controls.findElements.call(this),!is$1.empty(this.elements.buttons)){var s=function(t){var n=e.config.classNames.controlPressed;Object.defineProperty(t,"pressed",{enumerable:!0,get:function(){return hasClass(t,n)},set:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];toggleClass(t,n,e)}})};Object.values(this.elements.buttons).filter(Boolean).forEach((function(e){is$1.array(e)||is$1.nodeList(e)?Array.from(e).filter(Boolean).forEach(s):s(e)}))}if(browser.isEdge&&repaint(a),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),p=getElements.call(this,d);Array.from(p).forEach((function(t){toggleClass(t,e.config.classNames.hidden,!1),toggleClass(t,e.config.classNames.tooltip,!0)}))}}};function parseUrl(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=e;if(t){var r=document.createElement("a");r.href=n,n=r.href}try{return new URL(n)}catch(e){return null}}function buildUrlParams(e){var t=new URLSearchParams;return is$1.object(e)&&Object.entries(e).forEach((function(e){var n=_slicedToArray(e,2),r=n[0],i=n[1];t.set(r,i)})),t}var captions={setup:function(){if(this.supported.ui)if(!this.isVideo||this.isYouTube||this.isHTML5&&!support.textTracks)is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this);else{if(is$1.element(this.elements.captions)||(this.elements.captions=createElement("div",getAttributesFromSelector(this.config.selectors.captions)),insertAfter(this.elements.captions,this.elements.wrapper)),browser.isIE&&window.URL){var e=this.media.querySelectorAll("track");Array.from(e).forEach((function(e){var t=e.getAttribute("src"),n=parseUrl(t);null!==n&&n.hostname!==window.location.href.hostname&&["http:","https:"].includes(n.protocol)&&fetch(t,"blob").then((function(t){e.setAttribute("src",window.URL.createObjectURL(t))})).catch((function(){removeElement(e)}))}))}var t=dedupe((navigator.languages||[navigator.language||navigator.userLanguage||"en"]).map((function(e){return e.split("-")[0]}))),n=(this.storage.get("language")||this.config.captions.language||"auto").toLowerCase();if("auto"===n)n=_slicedToArray(t,1)[0];var r=this.storage.get("captions");if(is$1.boolean(r)||(r=this.config.captions.active),Object.assign(this.captions,{toggled:!1,active:r,language:n,languages:t}),this.isHTML5){var i=this.config.captions.update?"addtrack removetrack":"removetrack";on.call(this,this.media.textTracks,i,captions.update.bind(this))}setTimeout(captions.update.bind(this),0)}},update:function(){var e=this,t=captions.getTracks.call(this,!0),n=this.captions,r=n.active,i=n.language,o=n.meta,a=n.currentTrackNode,s=Boolean(t.find((function(e){return e.language===i})));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}),"showing"===t.mode&&(t.mode="hidden"),on.call(e,t,"cuechange",(function(){return captions.updateCues.call(e)}))})),(s&&this.language!==i||!t.includes(a))&&(captions.setLanguage.call(this,i),captions.toggle.call(this,r&&s)),toggleClass(this.elements.container,this.config.classNames.captions.enabled,!is$1.empty(t)),is$1.array(this.config.controls)&&this.config.controls.includes("settings")&&this.config.settings.includes("captions")&&controls.setCaptionsMenu.call(this)},toggle:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(this.supported.ui){var r=this.captions.toggled,i=this.config.classNames.captions.active,o=is$1.nullOrUndefined(e)?!r:e;if(o!==r){if(n||(this.captions.active=o,this.storage.set({captions:o})),!this.language&&o&&!n){var a=captions.getTracks.call(this),s=captions.findTrack.call(this,[this.captions.language].concat(_toConsumableArray(this.captions.languages)),!0);return this.captions.language=s.language,void captions.set.call(this,a.indexOf(s))}this.elements.buttons.captions&&(this.elements.buttons.captions.pressed=o),toggleClass(this.elements.container,i,o),this.captions.toggled=o,controls.updateSetting.call(this,"captions"),triggerEvent.call(this,this.media,o?"captionsenabled":"captionsdisabled")}setTimeout((function(){o&&t.captions.toggled&&(t.captions.currentTrackNode.mode="hidden")}))}},set:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=captions.getTracks.call(this);if(-1!==e)if(is$1.number(e))if(e in n){if(this.captions.currentTrack!==e){this.captions.currentTrack=e;var r=n[e],i=r||{},o=i.language;this.captions.currentTrackNode=r,controls.updateSetting.call(this,"captions"),t||(this.captions.language=o,this.storage.set({language:o})),this.isVimeo&&this.embed.enableTextTrack(o),triggerEvent.call(this,this.media,"languagechange")}captions.toggle.call(this,!0,t),this.isHTML5&&this.isVideo&&captions.updateCues.call(this)}else this.debug.warn("Track not found",e);else this.debug.warn("Invalid caption argument",e);else captions.toggle.call(this,!1,t)},setLanguage:function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];if(is$1.string(e)){var n=e.toLowerCase();this.captions.language=n;var r=captions.getTracks.call(this),i=captions.findTrack.call(this,[n]);captions.set.call(this,r.indexOf(i),t)}else this.debug.warn("Invalid language argument",e)},getTracks:function(){var e=this,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0],n=Array.from((this.media||{}).textTracks||[]);return n.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,r=arguments.length>1&&void 0!==arguments[1]&&arguments[1],i=captions.getTracks.call(this),o=function(e){return Number((n.captions.meta.get(e)||{}).default)},a=Array.from(i).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||(r?a[0]:void 0)},getCurrentTrack:function(){return captions.getTracks.call(this)[this.currentTrack]},getLabel:function(e){var t=e;return!is$1.track(t)&&support.textTracks&&this.captions.toggled&&(t=captions.getCurrentTrack.call(this)),is$1.track(t)?is$1.empty(t.label)?is$1.empty(t.language)?i18n.get("enabled",this.config):e.language.toUpperCase():t.label:i18n.get("disabled",this.config)},updateCues:function(e){if(this.supported.ui)if(is$1.element(this.elements.captions))if(is$1.nullOrUndefined(e)||Array.isArray(e)){var t=e;if(!t){var n=captions.getCurrentTrack.call(this);t=Array.from((n||{}).activeCues||[]).map((function(e){return e.getCueAsHTML()})).map(getHTML)}var r=t.map((function(e){return e.trim()})).join("\n");if(r!==this.elements.captions.innerHTML){emptyElement(this.elements.captions);var i=createElement("span",getAttributesFromSelector(this.config.selectors.caption));i.innerHTML=r,this.elements.captions.appendChild(i),triggerEvent.call(this,this.media,"cuechange")}}else this.debug.warn("updateCues: Invalid input",e);else this.debug.warn("No captions element to render to")}},defaults$1={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:null,clickToPlay:!0,hideControls:!0,resetOnEnd:!1,disableContextMenu:!0,loadSprite:!0,iconPrefix:"plyr",iconUrl:"https://cdn.plyr.io/3.6.4/plyr.svg",blankVideo:"https://cdn.plyr.io/static/blank.mp4",quality:{default:576,options:[4320,2880,2160,1440,1080,720,576,480,360,240],forced:!1,onChange:null},loop:{active:!1},speed:{selected:1,options:[.5,.75,1,1.25,1.5,1.75,2,4]},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",download:"Download",enterFullscreen:"Enter fullscreen",exitFullscreen:"Exit fullscreen",frameTitle:"Player for {title}",captions:"Captions",settings:"Settings",pip:"PIP",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:{download:null,vimeo:{sdk:"https://player.vimeo.com/api/player.js",iframe:"https://player.vimeo.com/video/{0}?{1}",api:"https://vimeo.com/api/oembed.json?url={0}"},youtube:{sdk:"https://www.youtube.com/iframe_api",api:"https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}"},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,download: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","download","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"]',download:'[data-plyr="download"]',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"},classNames:{type:"plyr--{0}",provider:"plyr--{0}",video:"plyr__video-wrapper",embed:"plyr__video-embed",videoFixedRatio:"plyr__video-wrapper--fixed-ratio",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",previewThumbnails:{thumbContainer:"plyr__preview-thumb",thumbContainerShown:"plyr__preview-thumb--is-shown",imageContainer:"plyr__preview-thumb__image-container",timeContainer:"plyr__preview-thumb__time-container",scrubbingContainer:"plyr__preview-scrubbing",scrubbingContainerShown:"plyr__preview-scrubbing--is-shown"}},attributes:{embed:{provider:"data-plyr-provider",id:"data-plyr-embed-id"}},ads:{enabled:!1,publisherId:"",tagUrl:""},previewThumbnails:{enabled:!1,src:""},vimeo:{byline:!1,portrait:!1,title:!1,speed:!0,transparent:!1,customControls:!0,referrerPolicy:null,premium:!1},youtube:{rel:0,showinfo:0,iv_load_policy:3,modestbranding:1,customControls:!0,noCookie:!1}},pip={active:"picture-in-picture",inactive:"inline"},providers={html5:"html5",youtube:"youtube",vimeo:"vimeo"},types={audio:"audio",video:"video"};function getProviderByUrl(e){return/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(e)?providers.youtube:/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(e)?providers.vimeo:null}var noop=function(){},Console=function(){function e(){var t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];_classCallCheck(this,e),this.enabled=window.console&&t,this.enabled&&this.log("Debugging enabled")}return _createClass(e,[{key:"log",get:function(){return this.enabled?Function.prototype.bind.call(console.log,console):noop}},{key:"warn",get:function(){return this.enabled?Function.prototype.bind.call(console.warn,console):noop}},{key:"error",get:function(){return this.enabled?Function.prototype.bind.call(console.error,console):noop}}]),e}(),Fullscreen=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"onChange",(function(){if(n.enabled){var e=n.player.elements.buttons.fullscreen;is$1.element(e)&&(e.pressed=n.active);var t=n.target===n.player.media?n.target:n.player.elements.container;triggerEvent.call(n.player,t,n.active?"enterfullscreen":"exitfullscreen",!0)}})),_defineProperty(this,"toggleFallback",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(e?n.scrollPosition={x:window.scrollX||0,y:window.scrollY||0}:window.scrollTo(n.scrollPosition.x,n.scrollPosition.y),document.body.style.overflow=e?"hidden":"",toggleClass(n.target,n.player.config.classNames.fullscreen.fallback,e),browser.isIos){var t=document.head.querySelector('meta[name="viewport"]'),r="viewport-fit=cover";t||(t=document.createElement("meta")).setAttribute("name","viewport");var i=is$1.string(t.content)&&t.content.includes(r);e?(n.cleanupViewport=!i,i||(t.content+=",".concat(r))):n.cleanupViewport&&(t.content=t.content.split(",").filter((function(e){return e.trim()!==r})).join(","))}n.onChange()})),_defineProperty(this,"trapFocus",(function(e){if(!browser.isIos&&n.active&&"Tab"===e.key&&9===e.keyCode){var t=document.activeElement,r=getElements.call(n.player,"a[href], button:not(:disabled), input:not(:disabled), [tabindex]"),i=_slicedToArray(r,1)[0],o=r[r.length-1];t!==o||e.shiftKey?t===i&&e.shiftKey&&(o.focus(),e.preventDefault()):(i.focus(),e.preventDefault())}})),_defineProperty(this,"update",(function(){var t;n.enabled?(t=n.forceFallback?"Fallback (forced)":e.native?"Native":"Fallback",n.player.debug.log("".concat(t," fullscreen enabled"))):n.player.debug.log("Fullscreen not supported and fallback disabled");toggleClass(n.player.elements.container,n.player.config.classNames.fullscreen.enabled,n.enabled)})),_defineProperty(this,"enter",(function(){n.enabled&&(browser.isIos&&n.player.config.fullscreen.iosNative?n.player.isVimeo?n.player.embed.requestFullscreen():n.target.webkitEnterFullscreen():!e.native||n.forceFallback?n.toggleFallback(!0):n.prefix?is$1.empty(n.prefix)||n.target["".concat(n.prefix,"Request").concat(n.property)]():n.target.requestFullscreen({navigationUI:"hide"}))})),_defineProperty(this,"exit",(function(){if(n.enabled)if(browser.isIos&&n.player.config.fullscreen.iosNative)n.target.webkitExitFullscreen(),silencePromise(n.player.play());else if(!e.native||n.forceFallback)n.toggleFallback(!1);else if(n.prefix){if(!is$1.empty(n.prefix)){var t="moz"===n.prefix?"Cancel":"Exit";document["".concat(n.prefix).concat(t).concat(n.property)]()}}else(document.cancelFullScreen||document.exitFullscreen).call(document)})),_defineProperty(this,"toggle",(function(){n.active?n.exit():n.enter()})),this.player=t,this.prefix=e.prefix,this.property=e.property,this.scrollPosition={x:0,y:0},this.forceFallback="force"===t.config.fullscreen.fallback,this.player.elements.fullscreen=t.config.fullscreen.container&&closest(this.player.elements.container,t.config.fullscreen.container),on.call(this.player,document,"ms"===this.prefix?"MSFullscreenChange":"".concat(this.prefix,"fullscreenchange"),(function(){n.onChange()})),on.call(this.player,this.player.elements.container,"dblclick",(function(e){is$1.element(n.player.elements.controls)&&n.player.elements.controls.contains(e.target)||n.player.listeners.proxy(e,n.toggle,"fullscreen")})),on.call(this,this.player.elements.container,"keydown",(function(e){return n.trapFocus(e)})),this.update()}return _createClass(e,[{key:"usingNative",get:function(){return e.native&&!this.forceFallback}},{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(){if(!this.enabled)return!1;if(!e.native||this.forceFallback)return hasClass(this.target,this.player.config.classNames.fullscreen.fallback);var t=this.prefix?document["".concat(this.prefix).concat(this.property,"Element")]:document.fullscreenElement;return t&&t.shadowRoot?t===this.target.getRootNode().host:t===this.target}},{key:"target",get:function(){return browser.isIos&&this.player.config.fullscreen.iosNative?this.player.media:this.player.elements.fullscreen||this.player.elements.container}}],[{key:"native",get:function(){return!!(document.fullscreenEnabled||document.webkitFullscreenEnabled||document.mozFullScreenEnabled||document.msFullscreenEnabled)}},{key:"prefix",get:function(){if(is$1.function(document.exitFullscreen))return"";var e="";return["webkit","moz","ms"].some((function(t){return!(!is$1.function(document["".concat(t,"ExitFullscreen")])&&!is$1.function(document["".concat(t,"CancelFullScreen")]))&&(e=t,!0)})),e}},{key:"property",get:function(){return"moz"===this.prefix?"FullScreen":"Fullscreen"}}]),e}(),mathSign=Math.sign||function(e){return 0==(e=+e)||e!=e?e:e<0?-1:1};function loadImage(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1;return new Promise((function(n,r){var i=new Image,o=function(){delete i.onload,delete i.onerror,(i.naturalWidth>=t?n:r)(i)};Object.assign(i,{onload:o,onerror:o,src:e})}))}_export({target:"Math",stat:!0},{sign:mathSign});var ui={addStyleHook:function(){toggleClass(this.elements.container,this.config.selectors.container.replace(".",""),!0),toggleClass(this.elements.container,this.config.classNames.uiSupported,this.supported.ui)},toggleNativeControls:function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];e&&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 ui.toggleNativeControls.call(this,!0);is$1.element(this.elements.controls)||(controls.inject.call(this),this.listeners.controls()),ui.toggleNativeControls.call(this),this.isHTML5&&captions.setup.call(this),this.volume=null,this.muted=null,this.loop=null,this.quality=null,this.speed=null,controls.updateVolume.call(this),controls.timeUpdate.call(this),ui.checkPlaying.call(this),toggleClass(this.elements.container,this.config.classNames.pip.supported,support.pip&&this.isHTML5&&this.isVideo),toggleClass(this.elements.container,this.config.classNames.airplay.supported,support.airplay&&this.isHTML5),toggleClass(this.elements.container,this.config.classNames.isIos,browser.isIos),toggleClass(this.elements.container,this.config.classNames.isTouch,this.touch),this.ready=!0,setTimeout((function(){triggerEvent.call(e,e.media,"ready")}),0),ui.setTitle.call(this),this.poster&&ui.setPoster.call(this,this.poster,!1).catch((function(){})),this.config.duration&&controls.durationUpdate.call(this)},setTitle:function(){var e=i18n.get("play",this.config);if(is$1.string(this.config.title)&&!is$1.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=getElement.call(this,"iframe");if(!is$1.element(t))return;var n=is$1.empty(this.config.title)?"video":this.config.title,r=i18n.get("frameTitle",this.config);t.setAttribute("title",r.replace("{title}",n))}},togglePoster:function(e){toggleClass(this.elements.container,this.config.classNames.posterEnabled,e)},setPoster:function(e){var t=this,n=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return n&&this.poster?Promise.reject(new Error("Poster already set")):(this.media.setAttribute("data-poster",e),this.elements.poster.removeAttribute("hidden"),ready.call(this).then((function(){return loadImage(e)})).catch((function(n){throw e===t.poster&&ui.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:""}),ui.togglePoster.call(t,!0),e})))},checkPlaying:function(e){var t=this;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),Array.from(this.elements.buttons.play||[]).forEach((function(e){Object.assign(e,{pressed:t.playing}),e.setAttribute("aria-label",i18n.get(t.playing?"pause":"play",t.config))})),is$1.event(e)&&"timeupdate"===e.type||ui.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(){toggleClass(t.elements.container,t.config.classNames.loading,t.loading),ui.toggleControls.call(t)}),this.loading?250:0)},toggleControls:function(e){var t=this.elements.controls;if(t&&this.config.hideControls){var n=this.touch&&this.lastSeekTime+2e3>Date.now();this.toggleControls(Boolean(e||this.loading||this.paused||t.pressed||t.hover||n))}},migrateStyles:function(){var e=this;Object.values(_objectSpread2({},this.media.style)).filter((function(e){return!is$1.empty(e)&&is$1.string(e)&&e.startsWith("--plyr")})).forEach((function(t){e.elements.container.style.setProperty(t,e.media.style.getPropertyValue(t)),e.media.style.removeProperty(t)})),is$1.empty(this.media.style)&&this.media.removeAttribute("style")}},Listeners=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"firstTouch",(function(){var e=n.player,t=e.elements;e.touch=!0,toggleClass(t.container,e.config.classNames.isTouch,!0)})),_defineProperty(this,"setTabFocus",(function(e){var t=n.player,r=t.elements;if(clearTimeout(n.focusTimer),"keydown"!==e.type||9===e.which){"keydown"===e.type&&(n.lastKeyDown=e.timeStamp);var i,o=e.timeStamp-n.lastKeyDown<=20;if("focus"!==e.type||o)i=t.config.classNames.tabFocus,toggleClass(getElements.call(t,".".concat(i)),i,!1),"focusout"!==e.type&&(n.focusTimer=setTimeout((function(){var e=document.activeElement;r.container.contains(e)&&toggleClass(document.activeElement,t.config.classNames.tabFocus,!0)}),10))}})),_defineProperty(this,"global",(function(){var e=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],t=n.player;t.config.keyboard.global&&toggleListener.call(t,window,"keydown keyup",n.handleKey,e,!1),toggleListener.call(t,document.body,"click",n.toggleMenu,e),once.call(t,document.body,"touchstart",n.firstTouch),toggleListener.call(t,document.body,"keydown focus blur focusout",n.setTabFocus,e,!1,!0)})),_defineProperty(this,"container",(function(){var e=n.player,t=e.config,r=e.elements,i=e.timers;!t.keyboard.global&&t.keyboard.focused&&on.call(e,r.container,"keydown keyup",n.handleKey,!1),on.call(e,r.container,"mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen",(function(t){var n=r.controls;n&&"enterfullscreen"===t.type&&(n.pressed=!1,n.hover=!1);var o=0;["touchstart","touchmove","mousemove"].includes(t.type)&&(ui.toggleControls.call(e,!0),o=e.touch?3e3:2e3),clearTimeout(i.controls),i.controls=setTimeout((function(){return ui.toggleControls.call(e,!1)}),o)}));var o=function(t){if(!t)return setAspectRatio.call(e);var n=r.container.getBoundingClientRect(),i=n.width,o=n.height;return setAspectRatio.call(e,"".concat(i,":").concat(o))},a=function(){clearTimeout(i.resized),i.resized=setTimeout(o,50)};on.call(e,r.container,"enterfullscreen exitfullscreen",(function(t){var n=e.fullscreen,i=n.target,s=n.usingNative;if(i===r.container&&(e.isEmbed||!is$1.empty(e.config.ratio))){var l="enterfullscreen"===t.type,c=o(l);c.padding;!function(t,n,r){if(e.isVimeo&&!e.config.vimeo.premium){var i=e.elements.wrapper.firstChild,o=_slicedToArray(t,2)[1],a=_slicedToArray(getAspectRatio.call(e),2),s=a[0],l=a[1];i.style.maxWidth=r?"".concat(o/l*s,"px"):null,i.style.margin=r?"0 auto":null}}(c.ratio,0,l),l&&setTimeout((function(){return repaint(r.container)}),100),s||(l?on.call(e,window,"resize",a):off.call(e,window,"resize",a))}}))})),_defineProperty(this,"media",(function(){var e=n.player,t=e.elements;if(on.call(e,e.media,"timeupdate seeking seeked",(function(t){return controls.timeUpdate.call(e,t)})),on.call(e,e.media,"durationchange loadeddata loadedmetadata",(function(t){return controls.durationUpdate.call(e,t)})),on.call(e,e.media,"ended",(function(){e.isHTML5&&e.isVideo&&e.config.resetOnEnd&&(e.restart(),e.pause())})),on.call(e,e.media,"progress playing seeking seeked",(function(t){return controls.updateProgress.call(e,t)})),on.call(e,e.media,"volumechange",(function(t){return controls.updateVolume.call(e,t)})),on.call(e,e.media,"playing play pause ended emptied timeupdate",(function(t){return ui.checkPlaying.call(e,t)})),on.call(e,e.media,"waiting canplay seeked playing",(function(t){return ui.checkLoading.call(e,t)})),e.supported.ui&&e.config.clickToPlay&&!e.isAudio){var r=getElement.call(e,".".concat(e.config.classNames.video));if(!is$1.element(r))return;on.call(e,t.container,"click",(function(i){([t.container,r].includes(i.target)||r.contains(i.target))&&(e.touch&&e.config.hideControls||(e.ended?(n.proxy(i,e.restart,"restart"),n.proxy(i,(function(){silencePromise(e.play())}),"play")):n.proxy(i,(function(){silencePromise(e.togglePlay())}),"play")))}))}e.supported.ui&&e.config.disableContextMenu&&on.call(e,t.wrapper,"contextmenu",(function(e){e.preventDefault()}),!1),on.call(e,e.media,"volumechange",(function(){e.storage.set({volume:e.volume,muted:e.muted})})),on.call(e,e.media,"ratechange",(function(){controls.updateSetting.call(e,"speed"),e.storage.set({speed:e.speed})})),on.call(e,e.media,"qualitychange",(function(t){controls.updateSetting.call(e,"quality",null,t.detail.quality)})),on.call(e,e.media,"ready qualitychange",(function(){controls.setDownloadUrl.call(e)}));var i=e.config.events.concat(["keyup","keydown"]).join(" ");on.call(e,e.media,i,(function(n){var r=n.detail,i=void 0===r?{}:r;"error"===n.type&&(i=e.media.error),triggerEvent.call(e,t.container,n.type,!0,i)}))})),_defineProperty(this,"proxy",(function(e,t,r){var i=n.player,o=i.config.listeners[r],a=!0;is$1.function(o)&&(a=o.call(i,e)),!1!==a&&is$1.function(t)&&t.call(i,e)})),_defineProperty(this,"bind",(function(e,t,r,i){var o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=n.player,s=a.config.listeners[i],l=is$1.function(s);on.call(a,e,t,(function(e){return n.proxy(e,r,i)}),o&&!l)})),_defineProperty(this,"controls",(function(){var e=n.player,t=e.elements,r=browser.isIE?"change":"input";if(t.buttons.play&&Array.from(t.buttons.play).forEach((function(t){n.bind(t,"click",(function(){silencePromise(e.togglePlay())}),"play")})),n.bind(t.buttons.restart,"click",e.restart,"restart"),n.bind(t.buttons.rewind,"click",(function(){e.lastSeekTime=Date.now(),e.rewind()}),"rewind"),n.bind(t.buttons.fastForward,"click",(function(){e.lastSeekTime=Date.now(),e.forward()}),"fastForward"),n.bind(t.buttons.mute,"click",(function(){e.muted=!e.muted}),"mute"),n.bind(t.buttons.captions,"click",(function(){return e.toggleCaptions()})),n.bind(t.buttons.download,"click",(function(){triggerEvent.call(e,e.media,"download")}),"download"),n.bind(t.buttons.fullscreen,"click",(function(){e.fullscreen.toggle()}),"fullscreen"),n.bind(t.buttons.pip,"click",(function(){e.pip="toggle"}),"pip"),n.bind(t.buttons.airplay,"click",e.airplay,"airplay"),n.bind(t.buttons.settings,"click",(function(t){t.stopPropagation(),t.preventDefault(),controls.toggleMenu.call(e,t)}),null,!1),n.bind(t.buttons.settings,"keyup",(function(t){var n=t.which;[13,32].includes(n)&&(13!==n?(t.preventDefault(),t.stopPropagation(),controls.toggleMenu.call(e,t)):controls.focusFirstMenuItem.call(e,null,!0))}),null,!1),n.bind(t.settings.menu,"keydown",(function(t){27===t.which&&controls.toggleMenu.call(e,t)})),n.bind(t.inputs.seek,"mousedown mousemove",(function(e){var n=t.progress.getBoundingClientRect(),r=100/n.width*(e.pageX-n.left);e.currentTarget.setAttribute("seek-value",r)})),n.bind(t.inputs.seek,"mousedown mouseup keydown keyup touchstart touchend",(function(t){var n=t.currentTarget,r=t.keyCode?t.keyCode:t.which,i="play-on-seeked";if(!is$1.keyboardEvent(t)||39===r||37===r){e.lastSeekTime=Date.now();var o=n.hasAttribute(i),a=["mouseup","touchend","keyup"].includes(t.type);o&&a?(n.removeAttribute(i),silencePromise(e.play())):!a&&e.playing&&(n.setAttribute(i,""),e.pause())}})),browser.isIos){var i=getElements.call(e,'input[type="range"]');Array.from(i).forEach((function(e){return n.bind(e,r,(function(e){return repaint(e.target)}))}))}n.bind(t.inputs.seek,r,(function(t){var n=t.currentTarget,r=n.getAttribute("seek-value");is$1.empty(r)&&(r=n.value),n.removeAttribute("seek-value"),e.currentTime=r/n.max*e.duration}),"seek"),n.bind(t.progress,"mouseenter mouseleave mousemove",(function(t){return controls.updateSeekTooltip.call(e,t)})),n.bind(t.progress,"mousemove touchmove",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startMove(t)})),n.bind(t.progress,"mouseleave touchend click",(function(){var t=e.previewThumbnails;t&&t.loaded&&t.endMove(!1,!0)})),n.bind(t.progress,"mousedown touchstart",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.startScrubbing(t)})),n.bind(t.progress,"mouseup touchend",(function(t){var n=e.previewThumbnails;n&&n.loaded&&n.endScrubbing(t)})),browser.isWebkit&&Array.from(getElements.call(e,'input[type="range"]')).forEach((function(t){n.bind(t,"input",(function(t){return controls.updateRangeFill.call(e,t.target)}))})),e.config.toggleInvert&&!is$1.element(t.display.duration)&&n.bind(t.display.currentTime,"click",(function(){0!==e.currentTime&&(e.config.invertTime=!e.config.invertTime,controls.timeUpdate.call(e))})),n.bind(t.inputs.volume,r,(function(t){e.volume=t.target.value}),"volume"),n.bind(t.controls,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type})),t.fullscreen&&Array.from(t.fullscreen.children).filter((function(e){return!e.contains(t.container)})).forEach((function(r){n.bind(r,"mouseenter mouseleave",(function(n){t.controls.hover=!e.touch&&"mouseenter"===n.type}))})),n.bind(t.controls,"mousedown mouseup touchstart touchend touchcancel",(function(e){t.controls.pressed=["mousedown","touchstart"].includes(e.type)})),n.bind(t.controls,"focusin",(function(){var r=e.config,i=e.timers;toggleClass(t.controls,r.classNames.noTransition,!0),ui.toggleControls.call(e,!0),setTimeout((function(){toggleClass(t.controls,r.classNames.noTransition,!1)}),0);var o=n.touch?3e3:4e3;clearTimeout(i.controls),i.controls=setTimeout((function(){return ui.toggleControls.call(e,!1)}),o)})),n.bind(t.inputs.volume,"wheel",(function(t){var n=t.webkitDirectionInvertedFromDevice,r=_slicedToArray([t.deltaX,-t.deltaY].map((function(e){return n?-e:e})),2),i=r[0],o=r[1],a=Math.sign(Math.abs(i)>Math.abs(o)?i:o);e.increaseVolume(a/50);var s=e.media.volume;(1===a&&s<1||-1===a&&s>0)&&t.preventDefault()}),"volume",!1)})),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 _createClass(e,[{key:"handleKey",value:function(e){var t=this.player,n=t.elements,r=e.keyCode?e.keyCode:e.which,i="keydown"===e.type,o=i&&r===this.lastKey;if(!(e.altKey||e.ctrlKey||e.metaKey||e.shiftKey)&&is$1.number(r)){if(i){var a=document.activeElement;if(is$1.element(a)){var s=t.config.selectors.editable;if(a!==n.inputs.seek&&matches$1(a,s))return;if(32===e.which&&matches$1(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(r)&&(e.preventDefault(),e.stopPropagation()),r){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*(r-48));break;case 32:case 75:o||silencePromise(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}27===r&&!t.fullscreen.usingNative&&t.fullscreen.active&&t.fullscreen.toggle(),this.lastKey=r}else this.lastKey=null}}},{key:"toggleMenu",value:function(e){controls.toggleMenu.call(this.player,e)}}]),e}(),HAS_SPECIES_SUPPORT$3=arrayMethodHasSpeciesSupport("splice"),USES_TO_LENGTH$a=arrayMethodUsesToLength("splice",{ACCESSORS:!0,0:0,1:2}),max$3=Math.max,min$5=Math.min,MAX_SAFE_INTEGER$1=9007199254740991,MAXIMUM_ALLOWED_LENGTH_EXCEEDED="Maximum allowed length exceeded";_export({target:"Array",proto:!0,forced:!HAS_SPECIES_SUPPORT$3||!USES_TO_LENGTH$a},{splice:function(e,t){var n,r,i,o,a,s,l=toObject(this),c=toLength(l.length),u=toAbsoluteIndex(e,c),d=arguments.length;if(0===d?n=r=0:1===d?(n=0,r=c-u):(n=d-2,r=min$5(max$3(toInteger(t),0),c-u)),c+n-r>MAX_SAFE_INTEGER$1)throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);for(i=arraySpeciesCreate(l,r),o=0;o<r;o++)(a=u+o)in l&&createProperty(i,o,l[a]);if(i.length=r,n<r){for(o=u;o<c-r;o++)s=o+n,(a=o+r)in l?l[s]=l[a]:delete l[s];for(o=c;o>c-r+n;o--)delete l[o-1]}else if(n>r)for(o=c-r;o>u;o--)s=o+n-1,(a=o+r-1)in l?l[s]=l[a]:delete l[s];for(o=0;o<n;o++)l[o+u]=arguments[o+2];return l.length=c-r+n,i}});var loadjs_umd=createCommonjsModule((function(e,t){e.exports=function(){var e=function(){},t={},n={},r={};function i(e,t){e=e.push?e:[e];var i,o,a,s=[],l=e.length,c=l;for(i=function(e,n){n.length&&s.push(e),--c||t(s)};l--;)o=e[l],(a=n[o])?i(o,a):(r[o]=r[o]||[]).push(i)}function o(e,t){if(e){var i=r[e];if(n[e]=t,i)for(;i.length;)i[0](e,t),i.splice(0,1)}}function a(t,n){t.call&&(t={success:t}),n.length?(t.error||e)(n):(t.success||e)(t)}function s(t,n,r,i){var o,a,l=document,c=r.async,u=(r.numRetries||0)+1,d=r.before||e,p=t.replace(/[\?|#].*$/,""),f=t.replace(/^(css|img)!/,"");i=i||0,/(^css!|\.css$)/.test(p)?((a=l.createElement("link")).rel="stylesheet",a.href=f,(o="hideFocus"in a)&&a.relList&&(o=0,a.rel="preload",a.as="style")):/(^img!|\.(png|gif|jpg|svg|webp)$)/.test(p)?(a=l.createElement("img")).src=f:((a=l.createElement("script")).src=t,a.async=void 0===c||c),a.onload=a.onerror=a.onbeforeload=function(e){var l=e.type[0];if(o)try{a.sheet.cssText.length||(l="e")}catch(e){18!=e.code&&(l="e")}if("e"==l){if((i+=1)<u)return s(t,n,r,i)}else if("preload"==a.rel&&"style"==a.as)return a.rel="stylesheet";n(t,l,e.defaultPrevented)},!1!==d(t,a)&&l.head.appendChild(a)}function l(e,t,n){var r,i,o=(e=e.push?e:[e]).length,a=o,l=[];for(r=function(e,n,r){if("e"==n&&l.push(e),"b"==n){if(!r)return;l.push(e)}--o||t(l)},i=0;i<a;i++)s(e[i],r,n)}function c(e,n,r){var i,s;if(n&&n.trim&&(i=n),s=(i?r:n)||{},i){if(i in t)throw"LoadJS";t[i]=!0}function c(t,n){l(e,(function(e){a(s,e),t&&a({success:t,error:n},e),o(i,e)}),s)}if(s.returnPromise)return new Promise(c);c()}return c.ready=function(e,t){return i(e,(function(e){a(t,e)})),c},c.done=function(e){o(e,[])},c.reset=function(){t={},n={},r={}},c.isDefined=function(e){return e in t},c}()}));function loadScript(e){return new Promise((function(t,n){loadjs_umd(e,{success:t,error:n})}))}function parseId(e){if(is$1.empty(e))return null;if(is$1.number(Number(e)))return e;return e.match(/^.*(vimeo.com\/|video\/)(\d+).*/)?RegExp.$2:e}function assurePlaybackState(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}var vimeo={setup:function(){var e=this;toggleClass(e.elements.wrapper,e.config.classNames.embed,!0),e.options.speed=e.config.speed.options,setAspectRatio.call(e),is$1.object(window.Vimeo)?vimeo.ready.call(e):loadScript(e.config.urls.vimeo.sdk).then((function(){vimeo.ready.call(e)})).catch((function(t){e.debug.warn("Vimeo SDK (player.js) failed to load",t)}))},ready:function(){var e=this,t=this,n=t.config.vimeo,r=n.premium,i=n.referrerPolicy,o=_objectWithoutProperties(n,["premium","referrerPolicy"]);r&&Object.assign(o,{controls:!1,sidedock:!1});var a=buildUrlParams(_objectSpread2({loop:t.config.loop.active,autoplay:t.autoplay,muted:t.muted,gesture:"media",playsinline:!this.config.fullscreen.iosNative},o)),s=t.media.getAttribute("src");is$1.empty(s)&&(s=t.media.getAttribute(t.config.attributes.embed.id));var l=parseId(s),c=createElement("iframe"),u=format(t.config.urls.vimeo.iframe,l,a);if(c.setAttribute("src",u),c.setAttribute("allowfullscreen",""),c.setAttribute("allow",["autoplay","fullscreen","picture-in-picture"].join("; ")),is$1.empty(i)||c.setAttribute("referrerPolicy",i),r||!n.customControls)c.setAttribute("data-poster",t.poster),t.media=replaceElement(c,t.media);else{var d=createElement("div",{class:t.config.classNames.embedContainer,"data-poster":t.poster});d.appendChild(c),t.media=replaceElement(d,t.media)}n.customControls||fetch(format(t.config.urls.vimeo.api,u)).then((function(e){!is$1.empty(e)&&e.thumbnail_url&&ui.setPoster.call(t,e.thumbnail_url).catch((function(){}))})),t.embed=new window.Vimeo.Player(c,{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 assurePlaybackState.call(t,!0),t.embed.play()},t.media.pause=function(){return assurePlaybackState.call(t,!1),t.embed.pause()},t.media.stop=function(){t.pause(),t.currentTime=0};var p=t.media.currentTime;Object.defineProperty(t.media,"currentTime",{get:function(){return p},set:function(e){var n=t.embed,r=t.media,i=t.paused,o=t.volume,a=i&&!n.hasPlayed;r.seeking=!0,triggerEvent.call(t,r,"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 f=t.config.speed.selected;Object.defineProperty(t.media,"playbackRate",{get:function(){return f},set:function(e){t.embed.setPlaybackRate(e).then((function(){f=e,triggerEvent.call(t,t.media,"ratechange")})).catch((function(){t.options.speed=[1]}))}});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,triggerEvent.call(t,t.media,"volumechange")}))}});var m=t.config.muted;Object.defineProperty(t.media,"muted",{get:function(){return m},set:function(e){var n=!!is$1.boolean(e)&&e;t.embed.setVolume(n?0:t.config.volume).then((function(){m=n,triggerEvent.call(t,t.media,"volumechange")}))}});var g,y=t.config.loop;Object.defineProperty(t.media,"loop",{get:function(){return y},set:function(e){var n=is$1.boolean(e)?e:t.config.loop.active;t.embed.setLoop(n).then((function(){y=n}))}}),t.embed.getVideoUrl().then((function(e){g=e,controls.setDownloadUrl.call(t)})).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(n){var r=_slicedToArray(n,2),i=r[0],o=r[1];t.embed.ratio=[i,o],setAspectRatio.call(e)})),t.embed.setAutopause(t.config.autopause).then((function(e){t.config.autopause=e})),t.embed.getVideoTitle().then((function(n){t.config.title=n,ui.setTitle.call(e)})),t.embed.getCurrentTime().then((function(e){p=e,triggerEvent.call(t,t.media,"timeupdate")})),t.embed.getDuration().then((function(e){t.media.duration=e,triggerEvent.call(t,t.media,"durationchange")})),t.embed.getTextTracks().then((function(e){t.media.textTracks=e,captions.setup.call(t)})),t.embed.on("cuechange",(function(e){var n=e.cues,r=(void 0===n?[]:n).map((function(e){return stripHTML(e.text)}));captions.updateCues.call(t,r)})),t.embed.on("loaded",(function(){(t.embed.getPaused().then((function(e){assurePlaybackState.call(t,!e),e||triggerEvent.call(t,t.media,"playing")})),is$1.element(t.embed.element)&&t.supported.ui)&&t.embed.element.setAttribute("tabindex",-1)})),t.embed.on("bufferstart",(function(){triggerEvent.call(t,t.media,"waiting")})),t.embed.on("bufferend",(function(){triggerEvent.call(t,t.media,"playing")})),t.embed.on("play",(function(){assurePlaybackState.call(t,!0),triggerEvent.call(t,t.media,"playing")})),t.embed.on("pause",(function(){assurePlaybackState.call(t,!1)})),t.embed.on("timeupdate",(function(e){t.media.seeking=!1,p=e.seconds,triggerEvent.call(t,t.media,"timeupdate")})),t.embed.on("progress",(function(e){t.media.buffered=e.percent,triggerEvent.call(t,t.media,"progress"),1===parseInt(e.percent,10)&&triggerEvent.call(t,t.media,"canplaythrough"),t.embed.getDuration().then((function(e){e!==t.media.duration&&(t.media.duration=e,triggerEvent.call(t,t.media,"durationchange"))}))})),t.embed.on("seeked",(function(){t.media.seeking=!1,triggerEvent.call(t,t.media,"seeked")})),t.embed.on("ended",(function(){t.media.paused=!0,triggerEvent.call(t,t.media,"ended")})),t.embed.on("error",(function(e){t.media.error=e,triggerEvent.call(t,t.media,"error")})),n.customControls&&setTimeout((function(){return ui.build.call(t)}),0)}};function parseId$1(e){if(is$1.empty(e))return null;return e.match(/^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/)?RegExp.$2:e}function assurePlaybackState$1(e){e&&!this.embed.hasPlayed&&(this.embed.hasPlayed=!0),this.media.paused===e&&(this.media.paused=!e,triggerEvent.call(this,this.media,e?"play":"pause"))}function getHost$1(e){return e.noCookie?"https://www.youtube-nocookie.com":"http:"===window.location.protocol?"http://www.youtube.com":void 0}var youtube={setup:function(){var e=this;if(toggleClass(this.elements.wrapper,this.config.classNames.embed,!0),is$1.object(window.YT)&&is$1.function(window.YT.Player))youtube.ready.call(this);else{var t=window.onYouTubeIframeAPIReady;window.onYouTubeIframeAPIReady=function(){is$1.function(t)&&t(),youtube.ready.call(e)},loadScript(this.config.urls.youtube.sdk).catch((function(t){e.debug.warn("YouTube API failed to load",t)}))}},getTitle:function(e){var t=this;fetch(format(this.config.urls.youtube.api,e)).then((function(e){if(is$1.object(e)){var n=e.title,r=e.height,i=e.width;t.config.title=n,ui.setTitle.call(t),t.embed.ratio=[i,r]}setAspectRatio.call(t)})).catch((function(){setAspectRatio.call(t)}))},ready:function(){var e=this,t=e.config.youtube,n=e.media&&e.media.getAttribute("id");if(is$1.empty(n)||!n.startsWith("youtube-")){var r=e.media.getAttribute("src");is$1.empty(r)&&(r=e.media.getAttribute(this.config.attributes.embed.id));var i=parseId$1(r),o=createElement("div",{id:generateId(e.provider),"data-poster":t.customControls?e.poster:void 0});if(e.media=replaceElement(o,e.media),t.customControls){var a=function(e){return"https://i.ytimg.com/vi/".concat(i,"/").concat(e,"default.jpg")};loadImage(a("maxres"),121).catch((function(){return loadImage(a("sd"),121)})).catch((function(){return loadImage(a("hq"))})).then((function(t){return ui.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(e.media,{videoId:i,host:getHost$1(t),playerVars:extend({},{autoplay:e.config.autoplay?1:0,hl:e.config.hl,controls:e.supported.ui&&t.customControls?0:1,disablekb:1,playsinline:e.config.fullscreen.iosNative?0:1,cc_load_policy:e.captions.active?1:0,cc_lang_pref:e.config.captions.language,widget_referrer:window?window.location.href:null},t),events:{onError:function(t){if(!e.media.error){var n=t.data,r={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:r},triggerEvent.call(e,e.media,"error")}},onPlaybackRateChange:function(t){var n=t.target;e.media.playbackRate=n.getPlaybackRate(),triggerEvent.call(e,e.media,"ratechange")},onReady:function(n){if(!is$1.function(e.media.play)){var r=n.target;youtube.getTitle.call(e,i),e.media.play=function(){assurePlaybackState$1.call(e,!0),r.playVideo()},e.media.pause=function(){assurePlaybackState$1.call(e,!1),r.pauseVideo()},e.media.stop=function(){r.stopVideo()},e.media.duration=r.getDuration(),e.media.paused=!0,e.media.currentTime=0,Object.defineProperty(e.media,"currentTime",{get:function(){return Number(r.getCurrentTime())},set:function(t){e.paused&&!e.embed.hasPlayed&&e.embed.mute(),e.media.seeking=!0,triggerEvent.call(e,e.media,"seeking"),r.seekTo(t)}}),Object.defineProperty(e.media,"playbackRate",{get:function(){return r.getPlaybackRate()},set:function(e){r.setPlaybackRate(e)}});var o=e.config.volume;Object.defineProperty(e.media,"volume",{get:function(){return o},set:function(t){o=t,r.setVolume(100*o),triggerEvent.call(e,e.media,"volumechange")}});var a=e.config.muted;Object.defineProperty(e.media,"muted",{get:function(){return a},set:function(t){var n=is$1.boolean(t)?t:a;a=n,r[n?"mute":"unMute"](),r.setVolume(100*o),triggerEvent.call(e,e.media,"volumechange")}}),Object.defineProperty(e.media,"currentSrc",{get:function(){return r.getVideoUrl()}}),Object.defineProperty(e.media,"ended",{get:function(){return e.currentTime===e.duration}});var s=r.getAvailablePlaybackRates();e.options.speed=s.filter((function(t){return e.config.speed.options.includes(t)})),e.supported.ui&&t.customControls&&e.media.setAttribute("tabindex",-1),triggerEvent.call(e,e.media,"timeupdate"),triggerEvent.call(e,e.media,"durationchange"),clearInterval(e.timers.buffering),e.timers.buffering=setInterval((function(){e.media.buffered=r.getVideoLoadedFraction(),(null===e.media.lastBuffered||e.media.lastBuffered<e.media.buffered)&&triggerEvent.call(e,e.media,"progress"),e.media.lastBuffered=e.media.buffered,1===e.media.buffered&&(clearInterval(e.timers.buffering),triggerEvent.call(e,e.media,"canplaythrough"))}),200),t.customControls&&setTimeout((function(){return ui.build.call(e)}),50)}},onStateChange:function(n){var r=n.target;switch(clearInterval(e.timers.playing),e.media.seeking&&[1,2].includes(n.data)&&(e.media.seeking=!1,triggerEvent.call(e,e.media,"seeked")),n.data){case-1:triggerEvent.call(e,e.media,"timeupdate"),e.media.buffered=r.getVideoLoadedFraction(),triggerEvent.call(e,e.media,"progress");break;case 0:assurePlaybackState$1.call(e,!1),e.media.loop?(r.stopVideo(),r.playVideo()):triggerEvent.call(e,e.media,"ended");break;case 1:t.customControls&&!e.config.autoplay&&e.media.paused&&!e.embed.hasPlayed?e.media.pause():(assurePlaybackState$1.call(e,!0),triggerEvent.call(e,e.media,"playing"),e.timers.playing=setInterval((function(){triggerEvent.call(e,e.media,"timeupdate")}),50),e.media.duration!==r.getDuration()&&(e.media.duration=r.getDuration(),triggerEvent.call(e,e.media,"durationchange")));break;case 2:e.muted||e.embed.unMute(),assurePlaybackState$1.call(e,!1);break;case 3:triggerEvent.call(e,e.media,"waiting")}triggerEvent.call(e,e.elements.container,"statechange",!1,{code:n.data})}}})}}},media={setup:function(){this.media?(toggleClass(this.elements.container,this.config.classNames.type.replace("{0}",this.type),!0),toggleClass(this.elements.container,this.config.classNames.provider.replace("{0}",this.provider),!0),this.isEmbed&&toggleClass(this.elements.container,this.config.classNames.type.replace("{0}","video"),!0),this.isVideo&&(this.elements.wrapper=createElement("div",{class:this.config.classNames.video}),wrap$1(this.media,this.elements.wrapper),this.elements.poster=createElement("div",{class:this.config.classNames.poster,hidden:""}),this.elements.wrapper.appendChild(this.elements.poster)),this.isHTML5?html5.setup.call(this):this.isYouTube?youtube.setup.call(this):this.isVimeo&&vimeo.setup.call(this)):this.debug.warn("No media element found!")}},destroy=function(e){e.manager&&e.manager.destroy(),e.elements.displayContainer&&e.elements.displayContainer.destroy(),e.elements.container.remove()},Ads=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"load",(function(){n.enabled&&(is$1.object(window.google)&&is$1.object(window.google.ima)?n.ready():loadScript(n.player.config.urls.googleIMA.sdk).then((function(){n.ready()})).catch((function(){n.trigger("error",new Error("Google IMA SDK failed to load"))})))})),_defineProperty(this,"ready",(function(){n.enabled||destroy(n),n.startSafetyTimer(12e3,"ready()"),n.managerPromise.then((function(){n.clearSafetyTimer("onAdsManagerLoaded()")})),n.listeners(),n.setupIMA()})),_defineProperty(this,"setupIMA",(function(){n.elements.container=createElement("div",{class:n.player.config.classNames.ads}),n.player.elements.container.appendChild(n.elements.container),google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED),google.ima.settings.setLocale(n.player.config.ads.language),google.ima.settings.setDisableCustomPlaybackForIOS10Plus(n.player.config.playsinline),n.elements.displayContainer=new google.ima.AdDisplayContainer(n.elements.container,n.player.media),n.loader=new google.ima.AdsLoader(n.elements.displayContainer),n.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED,(function(e){return n.onAdsManagerLoaded(e)}),!1),n.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return n.onAdError(e)}),!1),n.requestAds()})),_defineProperty(this,"requestAds",(function(){var e=n.player.elements.container;try{var t=new google.ima.AdsRequest;t.adTagUrl=n.tagUrl,t.linearAdSlotWidth=e.offsetWidth,t.linearAdSlotHeight=e.offsetHeight,t.nonLinearAdSlotWidth=e.offsetWidth,t.nonLinearAdSlotHeight=e.offsetHeight,t.forceNonLinearFullSlot=!1,t.setAdWillPlayMuted(!n.player.muted),n.loader.requestAds(t)}catch(e){n.onAdError(e)}})),_defineProperty(this,"pollCountdown",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0];if(!e)return clearInterval(n.countdownTimer),void n.elements.container.removeAttribute("data-badge-text");var t=function(){var e=formatTime(Math.max(n.manager.getRemainingTime(),0)),t="".concat(i18n.get("advertisement",n.player.config)," - ").concat(e);n.elements.container.setAttribute("data-badge-text",t)};n.countdownTimer=setInterval(t,100)})),_defineProperty(this,"onAdsManagerLoaded",(function(e){if(n.enabled){var t=new google.ima.AdsRenderingSettings;t.restoreCustomPlaybackStateOnAdBreakComplete=!0,t.enablePreloading=!0,n.manager=e.getAdsManager(n.player,t),n.cuePoints=n.manager.getCuePoints(),n.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR,(function(e){return n.onAdError(e)})),Object.keys(google.ima.AdEvent.Type).forEach((function(e){n.manager.addEventListener(google.ima.AdEvent.Type[e],(function(e){return n.onAdEvent(e)}))})),n.trigger("loaded")}})),_defineProperty(this,"addCuePoints",(function(){is$1.empty(n.cuePoints)||n.cuePoints.forEach((function(e){if(0!==e&&-1!==e&&e<n.player.duration){var t=n.player.elements.progress;if(is$1.element(t)){var r=100/n.player.duration*e,i=createElement("span",{class:n.player.config.classNames.cues});i.style.left="".concat(r.toString(),"%"),t.appendChild(i)}}}))})),_defineProperty(this,"onAdEvent",(function(e){var t,r=n.player.elements.container,i=e.getAd(),o=e.getAdData();switch(t=e.type,triggerEvent.call(n.player,n.player.media,"ads".concat(t.replace(/_/g,"").toLowerCase())),e.type){case google.ima.AdEvent.Type.LOADED:n.trigger("loaded"),n.pollCountdown(!0),i.isLinear()||(i.width=r.offsetWidth,i.height=r.offsetHeight);break;case google.ima.AdEvent.Type.STARTED:n.manager.setVolume(n.player.volume);break;case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:n.player.ended?n.loadAds():n.loader.contentComplete();break;case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:n.pauseContent();break;case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:n.pollCountdown(),n.resumeContent();break;case google.ima.AdEvent.Type.LOG:o.adError&&n.player.debug.warn("Non-fatal ad error: ".concat(o.adError.getMessage()))}})),_defineProperty(this,"onAdError",(function(e){n.cancel(),n.player.debug.warn("Ads error",e)})),_defineProperty(this,"listeners",(function(){var e,t=n.player.elements.container;n.player.on("canplay",(function(){n.addCuePoints()})),n.player.on("ended",(function(){n.loader.contentComplete()})),n.player.on("timeupdate",(function(){e=n.player.currentTime})),n.player.on("seeked",(function(){var t=n.player.currentTime;is$1.empty(n.cuePoints)||n.cuePoints.forEach((function(r,i){e<r&&r<t&&(n.manager.discardAdBreak(),n.cuePoints.splice(i,1))}))})),window.addEventListener("resize",(function(){n.manager&&n.manager.resize(t.offsetWidth,t.offsetHeight,google.ima.ViewMode.NORMAL)}))})),_defineProperty(this,"play",(function(){var e=n.player.elements.container;n.managerPromise||n.resumeContent(),n.managerPromise.then((function(){n.manager.setVolume(n.player.volume),n.elements.displayContainer.initialize();try{n.initialized||(n.manager.init(e.offsetWidth,e.offsetHeight,google.ima.ViewMode.NORMAL),n.manager.start()),n.initialized=!0}catch(e){n.onAdError(e)}})).catch((function(){}))})),_defineProperty(this,"resumeContent",(function(){n.elements.container.style.zIndex="",n.playing=!1,silencePromise(n.player.media.play())})),_defineProperty(this,"pauseContent",(function(){n.elements.container.style.zIndex=3,n.playing=!0,n.player.media.pause()})),_defineProperty(this,"cancel",(function(){n.initialized&&n.resumeContent(),n.trigger("error"),n.loadAds()})),_defineProperty(this,"loadAds",(function(){n.managerPromise.then((function(){n.manager&&n.manager.destroy(),n.managerPromise=new Promise((function(e){n.on("loaded",e),n.player.debug.log(n.manager)})),n.initialized=!1,n.requestAds()})).catch((function(){}))})),_defineProperty(this,"trigger",(function(e){for(var t=arguments.length,r=new Array(t>1?t-1:0),i=1;i<t;i++)r[i-1]=arguments[i];var o=n.events[e];is$1.array(o)&&o.forEach((function(e){is$1.function(e)&&e.apply(n,r)}))})),_defineProperty(this,"on",(function(e,t){return is$1.array(n.events[e])||(n.events[e]=[]),n.events[e].push(t),n})),_defineProperty(this,"startSafetyTimer",(function(e,t){n.player.debug.log("Safety timer invoked from: ".concat(t)),n.safetyTimer=setTimeout((function(){n.cancel(),n.clearSafetyTimer("startSafetyTimer()")}),e)})),_defineProperty(this,"clearSafetyTimer",(function(e){is$1.nullOrUndefined(n.safetyTimer)||(n.player.debug.log("Safety timer cleared from: ".concat(e)),clearTimeout(n.safetyTimer),n.safetyTimer=null)})),this.player=t,this.config=t.config.ads,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 _createClass(e,[{key:"enabled",get:function(){var e=this.config;return this.player.isHTML5&&this.player.isVideo&&e.enabled&&(!is$1.empty(e.publisherId)||is$1.url(e.tagUrl))}},{key:"tagUrl",get:function(){var e=this.config;if(is$1.url(e.tagUrl))return e.tagUrl;var t={AV_PUBLISHERID:"58c25bb0073ef448b1087ad6",AV_CHANNELID:"5a0458dc28a06145e4519d21",AV_URL:window.location.hostname,cb:Date.now(),AV_WIDTH:640,AV_HEIGHT:480,AV_CDIM2:e.publisherId};return"".concat("https://go.aniview.com/api/adserver6/vast/","?").concat(buildUrlParams(t))}}]),e}(),$findIndex=arrayIteration.findIndex,FIND_INDEX="findIndex",SKIPS_HOLES$1=!0,USES_TO_LENGTH$b=arrayMethodUsesToLength(FIND_INDEX);FIND_INDEX in[]&&Array(1)[FIND_INDEX]((function(){SKIPS_HOLES$1=!1})),_export({target:"Array",proto:!0,forced:SKIPS_HOLES$1||!USES_TO_LENGTH$b},{findIndex:function(e){return $findIndex(this,e,arguments.length>1?arguments[1]:void 0)}}),addToUnscopables(FIND_INDEX);var min$6=Math.min,nativeLastIndexOf=[].lastIndexOf,NEGATIVE_ZERO$1=!!nativeLastIndexOf&&1/[1].lastIndexOf(1,-0)<0,STRICT_METHOD$6=arrayMethodIsStrict("lastIndexOf"),USES_TO_LENGTH$c=arrayMethodUsesToLength("indexOf",{ACCESSORS:!0,1:0}),FORCED$5=NEGATIVE_ZERO$1||!STRICT_METHOD$6||!USES_TO_LENGTH$c,arrayLastIndexOf=FORCED$5?function(e){if(NEGATIVE_ZERO$1)return nativeLastIndexOf.apply(this,arguments)||0;var t=toIndexedObject(this),n=toLength(t.length),r=n-1;for(arguments.length>1&&(r=min$6(r,toInteger(arguments[1]))),r<0&&(r=n+r);r>=0;r--)if(r in t&&t[r]===e)return r||0;return-1}:nativeLastIndexOf;_export({target:"Array",proto:!0,forced:arrayLastIndexOf!==[].lastIndexOf},{lastIndexOf:arrayLastIndexOf});var parseVtt=function(e){var t=[];return e.split(/\r\n\r\n|\n\n|\r\r/).forEach((function(e){var n={};e.split(/\r\n|\n|\r/).forEach((function(e){if(is$1.number(n.startTime)){if(!is$1.empty(e.trim())&&is$1.empty(n.text)){var t=e.trim().split("#xywh="),r=_slicedToArray(t,1);if(n.text=r[0],t[1]){var i=_slicedToArray(t[1].split(","),4);n.x=i[0],n.y=i[1],n.w=i[2],n.h=i[3]}}}else{var o=e.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/);o&&(n.startTime=60*Number(o[1]||0)*60+60*Number(o[2])+Number(o[3])+Number("0.".concat(o[4])),n.endTime=60*Number(o[6]||0)*60+60*Number(o[7])+Number(o[8])+Number("0.".concat(o[9])))}})),n.text&&t.push(n)})),t},fitRatio=function(e,t){var n={};return e>t.width/t.height?(n.width=t.width,n.height=1/e*t.width):(n.height=t.height,n.width=e*t.height),n},PreviewThumbnails=function(){function e(t){var n=this;_classCallCheck(this,e),_defineProperty(this,"load",(function(){n.player.elements.display.seekTooltip&&(n.player.elements.display.seekTooltip.hidden=n.enabled),n.enabled&&n.getThumbnails().then((function(){n.enabled&&(n.render(),n.determineContainerAutoSizing(),n.loaded=!0)}))})),_defineProperty(this,"getThumbnails",(function(){return new Promise((function(e){var t=n.player.config.previewThumbnails.src;if(is$1.empty(t))throw new Error("Missing previewThumbnails.src config attribute");var r=function(){n.thumbnails.sort((function(e,t){return e.height-t.height})),n.player.debug.log("Preview thumbnails",n.thumbnails),e()};if(is$1.function(t))t((function(e){n.thumbnails=e,r()}));else{var i=(is$1.string(t)?[t]:t).map((function(e){return n.getThumbnail(e)}));Promise.all(i).then(r)}}))})),_defineProperty(this,"getThumbnail",(function(e){return new Promise((function(t){fetch(e).then((function(r){var i={frames:parseVtt(r),height:null,urlPrefix:""};i.frames[0].text.startsWith("/")||i.frames[0].text.startsWith("http://")||i.frames[0].text.startsWith("https://")||(i.urlPrefix=e.substring(0,e.lastIndexOf("/")+1));var o=new Image;o.onload=function(){i.height=o.naturalHeight,i.width=o.naturalWidth,n.thumbnails.push(i),t()},o.src=i.urlPrefix+i.frames[0].text}))}))})),_defineProperty(this,"startMove",(function(e){if(n.loaded&&is$1.event(e)&&["touchmove","mousemove"].includes(e.type)&&n.player.media.duration){if("touchmove"===e.type)n.seekTime=n.player.media.duration*(n.player.elements.inputs.seek.value/100);else{var t=n.player.elements.progress.getBoundingClientRect(),r=100/t.width*(e.pageX-t.left);n.seekTime=n.player.media.duration*(r/100),n.seekTime<0&&(n.seekTime=0),n.seekTime>n.player.media.duration-1&&(n.seekTime=n.player.media.duration-1),n.mousePosX=e.pageX,n.elements.thumb.time.innerText=formatTime(n.seekTime)}n.showImageAtCurrentTime()}})),_defineProperty(this,"endMove",(function(){n.toggleThumbContainer(!1,!0)})),_defineProperty(this,"startScrubbing",(function(e){(is$1.nullOrUndefined(e.button)||!1===e.button||0===e.button)&&(n.mouseDown=!0,n.player.media.duration&&(n.toggleScrubbingContainer(!0),n.toggleThumbContainer(!1,!0),n.showImageAtCurrentTime()))})),_defineProperty(this,"endScrubbing",(function(){n.mouseDown=!1,Math.ceil(n.lastTime)===Math.ceil(n.player.media.currentTime)?n.toggleScrubbingContainer(!1):once.call(n.player,n.player.media,"timeupdate",(function(){n.mouseDown||n.toggleScrubbingContainer(!1)}))})),_defineProperty(this,"listeners",(function(){n.player.on("play",(function(){n.toggleThumbContainer(!1,!0)})),n.player.on("seeked",(function(){n.toggleThumbContainer(!1)})),n.player.on("timeupdate",(function(){n.lastTime=n.player.media.currentTime}))})),_defineProperty(this,"render",(function(){n.elements.thumb.container=createElement("div",{class:n.player.config.classNames.previewThumbnails.thumbContainer}),n.elements.thumb.imageContainer=createElement("div",{class:n.player.config.classNames.previewThumbnails.imageContainer}),n.elements.thumb.container.appendChild(n.elements.thumb.imageContainer);var e=createElement("div",{class:n.player.config.classNames.previewThumbnails.timeContainer});n.elements.thumb.time=createElement("span",{},"00:00"),e.appendChild(n.elements.thumb.time),n.elements.thumb.container.appendChild(e),is$1.element(n.player.elements.progress)&&n.player.elements.progress.appendChild(n.elements.thumb.container),n.elements.scrubbing.container=createElement("div",{class:n.player.config.classNames.previewThumbnails.scrubbingContainer}),n.player.elements.wrapper.appendChild(n.elements.scrubbing.container)})),_defineProperty(this,"destroy",(function(){n.elements.thumb.container&&n.elements.thumb.container.remove(),n.elements.scrubbing.container&&n.elements.scrubbing.container.remove()})),_defineProperty(this,"showImageAtCurrentTime",(function(){n.mouseDown?n.setScrubbingContainerSize():n.setThumbContainerSizeAndPos();var e=n.thumbnails[0].frames.findIndex((function(e){return n.seekTime>=e.startTime&&n.seekTime<=e.endTime})),t=e>=0,r=0;n.mouseDown||n.toggleThumbContainer(t),t&&(n.thumbnails.forEach((function(t,i){n.loadedImages.includes(t.frames[e].text)&&(r=i)})),e!==n.showingThumb&&(n.showingThumb=e,n.loadImage(r)))})),_defineProperty(this,"loadImage",(function(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=n.showingThumb,r=n.thumbnails[e],i=r.urlPrefix,o=r.frames[t],a=r.frames[t].text,s=i+a;if(n.currentImageElement&&n.currentImageElement.dataset.filename===a)n.showImage(n.currentImageElement,o,e,t,a,!1),n.currentImageElement.dataset.index=t,n.removeOldImages(n.currentImageElement);else{n.loadingImage&&n.usingSprites&&(n.loadingImage.onload=null);var l=new Image;l.src=s,l.dataset.index=t,l.dataset.filename=a,n.showingThumbFilename=a,n.player.debug.log("Loading image: ".concat(s)),l.onload=function(){return n.showImage(l,o,e,t,a,!0)},n.loadingImage=l,n.removeOldImages(l)}})),_defineProperty(this,"showImage",(function(e,t,r,i,o){var a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];n.player.debug.log("Showing thumb: ".concat(o,". num: ").concat(i,". qual: ").concat(r,". newimg: ").concat(a)),n.setImageSizeAndOffset(e,t),a&&(n.currentImageContainer.appendChild(e),n.currentImageElement=e,n.loadedImages.includes(o)||n.loadedImages.push(o)),n.preloadNearby(i,!0).then(n.preloadNearby(i,!1)).then(n.getHigherQuality(r,e,t,o))})),_defineProperty(this,"removeOldImages",(function(e){Array.from(n.currentImageContainer.children).forEach((function(t){if("img"===t.tagName.toLowerCase()){var r=n.usingSprites?500:1e3;if(t.dataset.index!==e.dataset.index&&!t.dataset.deleting){t.dataset.deleting=!0;var i=n.currentImageContainer;setTimeout((function(){i.removeChild(t),n.player.debug.log("Removing thumb: ".concat(t.dataset.filename))}),r)}}}))})),_defineProperty(this,"preloadNearby",(function(e){var t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];return new Promise((function(r){setTimeout((function(){var i=n.thumbnails[0].frames[e].text;if(n.showingThumbFilename===i){var o;o=t?n.thumbnails[0].frames.slice(e):n.thumbnails[0].frames.slice(0,e).reverse();var a=!1;o.forEach((function(e){var t=e.text;if(t!==i&&!n.loadedImages.includes(t)){a=!0,n.player.debug.log("Preloading thumb filename: ".concat(t));var o=n.thumbnails[0].urlPrefix+t,s=new Image;s.src=o,s.onload=function(){n.player.debug.log("Preloaded thumb filename: ".concat(t)),n.loadedImages.includes(t)||n.loadedImages.push(t),r()}}})),a||r()}}),300)}))})),_defineProperty(this,"getHigherQuality",(function(e,t,r,i){if(e<n.thumbnails.length-1){var o=t.naturalHeight;n.usingSprites&&(o=r.h),o<n.thumbContainerHeight&&setTimeout((function(){n.showingThumbFilename===i&&(n.player.debug.log("Showing higher quality thumb for: ".concat(i)),n.loadImage(e+1))}),300)}})),_defineProperty(this,"toggleThumbContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=arguments.length>1&&void 0!==arguments[1]&&arguments[1],r=n.player.config.classNames.previewThumbnails.thumbContainerShown;n.elements.thumb.container.classList.toggle(r,e),!e&&t&&(n.showingThumb=null,n.showingThumbFilename=null)})),_defineProperty(this,"toggleScrubbingContainer",(function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=n.player.config.classNames.previewThumbnails.scrubbingContainerShown;n.elements.scrubbing.container.classList.toggle(t,e),e||(n.showingThumb=null,n.showingThumbFilename=null)})),_defineProperty(this,"determineContainerAutoSizing",(function(){(n.elements.thumb.imageContainer.clientHeight>20||n.elements.thumb.imageContainer.clientWidth>20)&&(n.sizeSpecifiedInCSS=!0)})),_defineProperty(this,"setThumbContainerSizeAndPos",(function(){if(n.sizeSpecifiedInCSS){if(n.elements.thumb.imageContainer.clientHeight>20&&n.elements.thumb.imageContainer.clientWidth<20){var e=Math.floor(n.elements.thumb.imageContainer.clientHeight*n.thumbAspectRatio);n.elements.thumb.imageContainer.style.width="".concat(e,"px")}else if(n.elements.thumb.imageContainer.clientHeight<20&&n.elements.thumb.imageContainer.clientWidth>20){var t=Math.floor(n.elements.thumb.imageContainer.clientWidth/n.thumbAspectRatio);n.elements.thumb.imageContainer.style.height="".concat(t,"px")}}else{var r=Math.floor(n.thumbContainerHeight*n.thumbAspectRatio);n.elements.thumb.imageContainer.style.height="".concat(n.thumbContainerHeight,"px"),n.elements.thumb.imageContainer.style.width="".concat(r,"px")}n.setThumbContainerPos()})),_defineProperty(this,"setThumbContainerPos",(function(){var e=n.player.elements.progress.getBoundingClientRect(),t=n.player.elements.container.getBoundingClientRect(),r=n.elements.thumb.container,i=t.left-e.left+10,o=t.right-e.left-r.clientWidth-10,a=n.mousePosX-e.left-r.clientWidth/2;a<i&&(a=i),a>o&&(a=o),r.style.left="".concat(a,"px")})),_defineProperty(this,"setScrubbingContainerSize",(function(){var e=fitRatio(n.thumbAspectRatio,{width:n.player.media.clientWidth,height:n.player.media.clientHeight}),t=e.width,r=e.height;n.elements.scrubbing.container.style.width="".concat(t,"px"),n.elements.scrubbing.container.style.height="".concat(r,"px")})),_defineProperty(this,"setImageSizeAndOffset",(function(e,t){if(n.usingSprites){var r=n.thumbContainerHeight/t.h;e.style.height="".concat(e.naturalHeight*r,"px"),e.style.width="".concat(e.naturalWidth*r,"px"),e.style.left="-".concat(t.x*r,"px"),e.style.top="-".concat(t.y*r,"px")}})),this.player=t,this.thumbnails=[],this.loaded=!1,this.lastMouseMoveTime=Date.now(),this.mouseDown=!1,this.loadedImages=[],this.elements={thumb:{},scrubbing:{}},this.load()}return _createClass(e,[{key:"enabled",get:function(){return this.player.isHTML5&&this.player.isVideo&&this.player.config.previewThumbnails.enabled}},{key:"currentImageContainer",get:function(){return this.mouseDown?this.elements.scrubbing.container:this.elements.thumb.imageContainer}},{key:"usingSprites",get:function(){return Object.keys(this.thumbnails[0].frames[0]).includes("w")}},{key:"thumbAspectRatio",get:function(){return this.usingSprites?this.thumbnails[0].frames[0].w/this.thumbnails[0].frames[0].h:this.thumbnails[0].width/this.thumbnails[0].height}},{key:"thumbContainerHeight",get:function(){return this.mouseDown?fitRatio(this.thumbAspectRatio,{width:this.player.media.clientWidth,height:this.player.media.clientHeight}).height:this.sizeSpecifiedInCSS?this.elements.thumb.imageContainer.clientHeight:Math.floor(this.player.media.clientWidth/this.thumbAspectRatio/4)}},{key:"currentImageElement",get:function(){return this.mouseDown?this.currentScrubbingImageElement:this.currentThumbnailImageElement},set:function(e){this.mouseDown?this.currentScrubbingImageElement=e:this.currentThumbnailImageElement=e}}]),e}(),source={insertElements:function(e,t){var n=this;is$1.string(t)?insertElement(e,this.media,{src:t}):is$1.array(t)&&t.forEach((function(t){insertElement(e,n.media,t)}))},change:function(e){var t=this;getDeep(e,"sources.length")?(html5.cancelRequests.call(this),this.destroy.call(this,(function(){t.options.quality=[],removeElement(t.media),t.media=null,is$1.element(t.elements.container)&&t.elements.container.removeAttribute("class");var n=e.sources,r=e.type,i=_slicedToArray(n,1)[0],o=i.provider,a=void 0===o?providers.html5:o,s=i.src,l="html5"===a?r:"div",c="html5"===a?{}:{src:s};Object.assign(t,{provider:a,type:r,supported:support.check(r,a,t.config.playsinline),media:createElement(l,c)}),t.elements.container.appendChild(t.media),is$1.boolean(e.autoplay)&&(t.config.autoplay=e.autoplay),t.isHTML5&&(t.config.crossorigin&&t.media.setAttribute("crossorigin",""),t.config.autoplay&&t.media.setAttribute("autoplay",""),is$1.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","")),ui.addStyleHook.call(t),t.isHTML5&&source.insertElements.call(t,"source",n),t.config.title=e.title,media.setup.call(t),t.isHTML5&&Object.keys(e).includes("tracks")&&source.insertElements.call(t,"track",e.tracks),(t.isHTML5||t.isEmbed&&!t.supported.ui)&&ui.build.call(t),t.isHTML5&&t.media.load(),is$1.empty(e.previewThumbnails)||(Object.assign(t.config.previewThumbnails,e.previewThumbnails),t.previewThumbnails&&t.previewThumbnails.loaded&&(t.previewThumbnails.destroy(),t.previewThumbnails=null),t.config.previewThumbnails.enabled&&(t.previewThumbnails=new PreviewThumbnails(t))),t.fullscreen.update()}),!0)):this.debug.warn("Invalid source format")}};function clamp(){var e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:255;return Math.min(Math.max(e,t),n)}var Plyr=function(){function e(t,n){var r=this;if(_classCallCheck(this,e),_defineProperty(this,"play",(function(){return is$1.function(r.media.play)?(r.ads&&r.ads.enabled&&r.ads.managerPromise.then((function(){return r.ads.play()})).catch((function(){return silencePromise(r.media.play())})),r.media.play()):null})),_defineProperty(this,"pause",(function(){return r.playing&&is$1.function(r.media.pause)?r.media.pause():null})),_defineProperty(this,"togglePlay",(function(e){return(is$1.boolean(e)?e:!r.playing)?r.play():r.pause()})),_defineProperty(this,"stop",(function(){r.isHTML5?(r.pause(),r.restart()):is$1.function(r.media.stop)&&r.media.stop()})),_defineProperty(this,"restart",(function(){r.currentTime=0})),_defineProperty(this,"rewind",(function(e){r.currentTime-=is$1.number(e)?e:r.config.seekTime})),_defineProperty(this,"forward",(function(e){r.currentTime+=is$1.number(e)?e:r.config.seekTime})),_defineProperty(this,"increaseVolume",(function(e){var t=r.media.muted?0:r.volume;r.volume=t+(is$1.number(e)?e:0)})),_defineProperty(this,"decreaseVolume",(function(e){r.increaseVolume(-e)})),_defineProperty(this,"airplay",(function(){support.airplay&&r.media.webkitShowPlaybackTargetPicker()})),_defineProperty(this,"toggleControls",(function(e){if(r.supported.ui&&!r.isAudio){var t=hasClass(r.elements.container,r.config.classNames.hideControls),n=void 0===e?void 0:!e,i=toggleClass(r.elements.container,r.config.classNames.hideControls,n);if(i&&is$1.array(r.config.controls)&&r.config.controls.includes("settings")&&!is$1.empty(r.config.settings)&&controls.toggleMenu.call(r,!1),i!==t){var o=i?"controlshidden":"controlsshown";triggerEvent.call(r,r.media,o)}return!i}return!1})),_defineProperty(this,"on",(function(e,t){on.call(r,r.elements.container,e,t)})),_defineProperty(this,"once",(function(e,t){once.call(r,r.elements.container,e,t)})),_defineProperty(this,"off",(function(e,t){off(r.elements.container,e,t)})),_defineProperty(this,"destroy",(function(e){var t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];if(r.ready){var n=function(){document.body.style.overflow="",r.embed=null,t?(Object.keys(r.elements).length&&(removeElement(r.elements.buttons.play),removeElement(r.elements.captions),removeElement(r.elements.controls),removeElement(r.elements.wrapper),r.elements.buttons.play=null,r.elements.captions=null,r.elements.controls=null,r.elements.wrapper=null),is$1.function(e)&&e()):(unbindListeners.call(r),html5.cancelRequests.call(r),replaceElement(r.elements.original,r.elements.container),triggerEvent.call(r,r.elements.original,"destroyed",!0),is$1.function(e)&&e.call(r.elements.original),r.ready=!1,setTimeout((function(){r.elements=null,r.media=null}),200))};r.stop(),clearTimeout(r.timers.loading),clearTimeout(r.timers.controls),clearTimeout(r.timers.resized),r.isHTML5?(ui.toggleNativeControls.call(r,!0),n()):r.isYouTube?(clearInterval(r.timers.buffering),clearInterval(r.timers.playing),null!==r.embed&&is$1.function(r.embed.destroy)&&r.embed.destroy(),n()):r.isVimeo&&(null!==r.embed&&r.embed.unload().then(n),setTimeout(n,200))}})),_defineProperty(this,"supports",(function(e){return support.mime.call(r,e)})),this.timers={},this.ready=!1,this.loading=!1,this.failed=!1,this.touch=support.touch,this.media=t,is$1.string(this.media)&&(this.media=document.querySelectorAll(this.media)),(window.jQuery&&this.media instanceof jQuery||is$1.nodeList(this.media)||is$1.array(this.media))&&(this.media=this.media[0]),this.config=extend({},defaults$1,e.defaults,n||{},function(){try{return JSON.parse(r.media.getAttribute("data-plyr-config"))}catch(e){return{}}}()),this.elements={container:null,fullscreen: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 Console(this.config.debug),this.debug.log("Config",this.config),this.debug.log("Support",support),!is$1.nullOrUndefined(this.media)&&is$1.element(this.media))if(this.media.plyr)this.debug.warn("Target already setup");else if(this.config.enabled)if(support.check().api){var i=this.media.cloneNode(!0);i.autoplay=!1,this.elements.original=i;var o=this.media.tagName.toLowerCase(),a=null,s=null;switch(o){case"div":if(a=this.media.querySelector("iframe"),is$1.element(a)){if(s=parseUrl(a.getAttribute("src")),this.provider=getProviderByUrl(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.youtube.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(is$1.empty(this.provider)||!Object.values(providers).includes(this.provider))return void this.debug.error("Setup failed: Invalid provider");this.type=types.video;break;case"video":case"audio":this.type=o,this.provider=providers.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=support.check(this.type,this.provider,this.config.playsinline),this.supported.api?(this.eventListeners=[],this.listeners=new Listeners(this),this.storage=new Storage(this),this.media.plyr=this,is$1.element(this.elements.container)||(this.elements.container=createElement("div",{tabindex:0}),wrap$1(this.media,this.elements.container)),ui.migrateStyles.call(this),ui.addStyleHook.call(this),media.setup.call(this),this.config.debug&&on.call(this,this.elements.container,this.config.events.join(" "),(function(e){r.debug.log("event: ".concat(e.type))})),this.fullscreen=new Fullscreen(this),(this.isHTML5||this.isEmbed&&!this.supported.ui)&&ui.build.call(this),this.listeners.container(),this.listeners.global(),this.config.ads.enabled&&(this.ads=new Ads(this)),this.isHTML5&&this.config.autoplay&&this.once("canplay",(function(){return silencePromise(r.play())})),this.lastSeekTime=0,this.config.previewThumbnails.enabled&&(this.previewThumbnails=new PreviewThumbnails(this))):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 _createClass(e,[{key:"toggleCaptions",value:function(e){captions.toggle.call(this,e,!1)}},{key:"isHTML5",get:function(){return this.provider===providers.html5}},{key:"isEmbed",get:function(){return this.isYouTube||this.isVimeo}},{key:"isYouTube",get:function(){return this.provider===providers.youtube}},{key:"isVimeo",get:function(){return this.provider===providers.vimeo}},{key:"isVideo",get:function(){return this.type===types.video}},{key:"isAudio",get:function(){return this.type===types.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=is$1.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 is$1.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=is$1.number(t)&&t!==1/0?t:0;return e||n}},{key:"volume",set:function(e){var t=e;is$1.string(t)&&(t=Number(t)),is$1.number(t)||(t=this.storage.get("volume")),is$1.number(t)||(t=this.config.volume),t>1&&(t=1),t<0&&(t=0),this.config.volume=t,this.media.volume=t,!is$1.empty(e)&&this.muted&&t>0&&(this.muted=!1)},get:function(){return Number(this.media.volume)}},{key:"muted",set:function(e){var t=e;is$1.boolean(t)||(t=this.storage.get("muted")),is$1.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=this,n=null;is$1.number(e)&&(n=e),is$1.number(n)||(n=this.storage.get("speed")),is$1.number(n)||(n=this.config.speed.selected);var r=this.minimumSpeed,i=this.maximumSpeed;n=clamp(n,r,i),this.config.speed.selected=n,setTimeout((function(){t.media.playbackRate=n}),0)},get:function(){return Number(this.media.playbackRate)}},{key:"minimumSpeed",get:function(){return this.isYouTube?Math.min.apply(Math,_toConsumableArray(this.options.speed)):this.isVimeo?.5:.0625}},{key:"maximumSpeed",get:function(){return this.isYouTube?Math.max.apply(Math,_toConsumableArray(this.options.speed)):this.isVimeo?2:16}},{key:"quality",set:function(e){var t=this.config.quality,n=this.options.quality;if(n.length){var r=[!is$1.empty(e)&&Number(e),this.storage.get("quality"),t.selected,t.default].find(is$1.number),i=!0;if(!n.includes(r)){var o=closest$1(n,r);this.debug.warn("Unsupported quality option: ".concat(r,", using ").concat(o," instead")),r=o,i=!1}t.selected=r,this.media.quality=r,i&&this.storage.set({quality:r})}},get:function(){return this.media.quality}},{key:"loop",set:function(e){var t=is$1.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){source.change.call(this,e)},get:function(){return this.media.currentSrc}},{key:"download",get:function(){var e=this.config.urls.download;return is$1.url(e)?e:this.source},set:function(e){is$1.url(e)&&(this.config.urls.download=e,controls.setDownloadUrl.call(this))}},{key:"poster",set:function(e){this.isVideo?ui.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")||this.media.getAttribute("data-poster"):null}},{key:"ratio",get:function(){if(!this.isVideo)return null;var e=reduceAspectRatio(getAspectRatio.call(this));return is$1.array(e)?e.join(":"):e},set:function(e){this.isVideo?is$1.string(e)&&validateRatio(e)?(this.config.ratio=e,setAspectRatio.call(this)):this.debug.error("Invalid aspect ratio specified (".concat(e,")")):this.debug.warn("Aspect ratio can only be set for video")}},{key:"autoplay",set:function(e){var t=is$1.boolean(e)?e:this.config.autoplay;this.config.autoplay=t},get:function(){return Boolean(this.config.autoplay)}},{key:"currentTrack",set:function(e){captions.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){captions.setLanguage.call(this,e,!1)},get:function(){return(captions.getCurrentTrack.call(this)||{}).language}},{key:"pip",set:function(e){if(support.pip){var t=is$1.boolean(e)?e:!this.pip;is$1.function(this.media.webkitSetPresentationMode)&&this.media.webkitSetPresentationMode(t?pip.active:pip.inactive),is$1.function(this.media.requestPictureInPicture)&&(!this.pip&&t?this.media.requestPictureInPicture():this.pip&&!t&&document.exitPictureInPicture())}},get:function(){return support.pip?is$1.empty(this.media.webkitPresentationMode)?this.media===document.pictureInPictureElement:this.media.webkitPresentationMode===pip.active:null}}],[{key:"supported",value:function(e,t,n){return support.check(e,t,n)}},{key:"loadSprite",value:function(e,t){return loadSprite(e,t)}},{key:"setup",value:function(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},r=null;return is$1.string(t)?r=Array.from(document.querySelectorAll(t)):is$1.nodeList(t)?r=Array.from(t):is$1.array(t)&&(r=t.filter(is$1.element)),is$1.empty(r)?null:r.map((function(t){return new e(t,n)}))}}]),e}();Plyr.defaults=cloneDeep(defaults$1);export default Plyr; \ No newline at end of file
diff --git a/dist/plyr.polyfilled.min.mjs.map b/dist/plyr.polyfilled.min.mjs.map
index 29c3e37c..31cd1c69 100644
--- a/dist/plyr.polyfilled.min.mjs.map
+++ b/dist/plyr.polyfilled.min.mjs.map
@@ -1 +1 @@
-{"version":3,"sources":["node_modules/custom-event-polyfill/polyfill.js","plyr.polyfilled.mjs","node_modules/core-js/internals/global.js","node_modules/core-js/internals/fails.js","node_modules/core-js/internals/descriptors.js","node_modules/core-js/internals/object-property-is-enumerable.js","node_modules/core-js/internals/create-property-descriptor.js","node_modules/core-js/internals/classof-raw.js","node_modules/core-js/internals/indexed-object.js","node_modules/core-js/internals/require-object-coercible.js","node_modules/core-js/internals/to-indexed-object.js","node_modules/core-js/internals/is-object.js","node_modules/core-js/internals/to-primitive.js","node_modules/core-js/internals/has.js","node_modules/core-js/internals/document-create-element.js","node_modules/core-js/internals/ie8-dom-define.js","node_modules/core-js/internals/object-get-own-property-descriptor.js","node_modules/core-js/internals/an-object.js","node_modules/core-js/internals/object-define-property.js","node_modules/core-js/internals/create-non-enumerable-property.js","node_modules/core-js/internals/set-global.js","node_modules/core-js/internals/shared-store.js","node_modules/core-js/internals/inspect-source.js","node_modules/core-js/internals/internal-state.js","node_modules/core-js/internals/native-weak-map.js","node_modules/core-js/internals/is-pure.js","node_modules/core-js/internals/shared.js","node_modules/core-js/internals/uid.js","node_modules/core-js/internals/shared-key.js","node_modules/core-js/internals/hidden-keys.js","node_modules/core-js/internals/object-create.js","node_modules/core-js/internals/redefine.js","node_modules/core-js/internals/path.js","node_modules/core-js/internals/get-built-in.js","node_modules/core-js/internals/to-integer.js","node_modules/core-js/internals/to-length.js","node_modules/core-js/internals/to-absolute-index.js","node_modules/core-js/internals/array-includes.js","node_modules/core-js/internals/object-keys-internal.js","node_modules/core-js/internals/enum-bug-keys.js","node_modules/core-js/internals/object-get-own-property-names.js","node_modules/core-js/internals/object-get-own-property-symbols.js","node_modules/core-js/internals/own-keys.js","node_modules/core-js/internals/copy-constructor-properties.js","node_modules/core-js/internals/is-forced.js","node_modules/core-js/internals/export.js","node_modules/core-js/internals/native-symbol.js","node_modules/core-js/internals/use-symbol-as-uid.js","node_modules/core-js/internals/is-array.js","node_modules/core-js/internals/to-object.js","node_modules/core-js/internals/object-keys.js","node_modules/core-js/internals/object-define-properties.js","node_modules/core-js/internals/html.js","node_modules/core-js/internals/object-get-own-property-names-external.js","node_modules/core-js/internals/well-known-symbol.js","node_modules/core-js/internals/well-known-symbol-wrapped.js","node_modules/core-js/internals/define-well-known-symbol.js","node_modules/core-js/internals/set-to-string-tag.js","node_modules/core-js/internals/a-function.js","node_modules/core-js/internals/function-bind-context.js","node_modules/core-js/internals/array-species-create.js","node_modules/core-js/internals/array-iteration.js","node_modules/core-js/modules/es.symbol.js","node_modules/core-js/modules/es.symbol.description.js","node_modules/core-js/modules/es.symbol.iterator.js","node_modules/core-js/internals/array-method-is-strict.js","node_modules/core-js/internals/array-method-uses-to-length.js","node_modules/core-js/internals/array-for-each.js","node_modules/core-js/modules/es.array.for-each.js","node_modules/core-js/modules/es.array.index-of.js","node_modules/core-js/internals/add-to-unscopables.js","node_modules/core-js/internals/iterators-core.js","node_modules/core-js/internals/iterators.js","node_modules/core-js/internals/correct-prototype-getter.js","node_modules/core-js/internals/object-get-prototype-of.js","node_modules/core-js/internals/create-iterator-constructor.js","node_modules/core-js/internals/a-possible-prototype.js","node_modules/core-js/internals/object-set-prototype-of.js","node_modules/core-js/internals/define-iterator.js","node_modules/core-js/modules/es.array.iterator.js","node_modules/core-js/modules/es.array.join.js","node_modules/core-js/internals/create-property.js","node_modules/core-js/internals/engine-v8-version.js","node_modules/core-js/internals/engine-user-agent.js","node_modules/core-js/internals/array-method-has-species-support.js","node_modules/core-js/modules/es.array.slice.js","node_modules/core-js/internals/to-string-tag-support.js","node_modules/core-js/internals/classof.js","node_modules/core-js/internals/object-to-string.js","node_modules/core-js/modules/es.object.to-string.js","node_modules/core-js/internals/regexp-flags.js","node_modules/core-js/internals/regexp-sticky-helpers.js","node_modules/core-js/internals/regexp-exec.js","node_modules/core-js/modules/es.regexp.exec.js","node_modules/core-js/modules/es.regexp.to-string.js","node_modules/core-js/internals/string-multibyte.js","node_modules/core-js/modules/es.string.iterator.js","node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","node_modules/core-js/internals/advance-string-index.js","node_modules/core-js/internals/regexp-exec-abstract.js","node_modules/core-js/modules/es.string.replace.js","node_modules/core-js/internals/same-value.js","node_modules/core-js/modules/es.string.search.js","node_modules/core-js/internals/is-regexp.js","node_modules/core-js/internals/species-constructor.js","node_modules/core-js/modules/es.string.split.js","node_modules/core-js/internals/dom-iterables.js","node_modules/core-js/modules/web.dom-collections.for-each.js","node_modules/core-js/modules/web.dom-collections.iterator.js","node_modules/core-js/internals/native-url.js","node_modules/core-js/internals/an-instance.js","node_modules/core-js/internals/object-assign.js","node_modules/core-js/internals/iterator-close.js","node_modules/core-js/internals/call-with-safe-iteration-closing.js","node_modules/core-js/internals/is-array-iterator-method.js","node_modules/core-js/internals/get-iterator-method.js","node_modules/core-js/internals/array-from.js","node_modules/core-js/internals/string-punycode-to-ascii.js","node_modules/core-js/internals/redefine-all.js","node_modules/core-js/internals/get-iterator.js","node_modules/core-js/modules/web.url-search-params.js","node_modules/core-js/modules/web.url.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/es.array.concat.js","node_modules/core-js/modules/es.array.filter.js","node_modules/core-js/modules/es.array.find.js","node_modules/core-js/internals/check-correctness-of-iteration.js","node_modules/core-js/modules/es.array.from.js","node_modules/core-js/modules/es.array.includes.js","node_modules/core-js/modules/es.array.map.js","node_modules/core-js/internals/inherit-if-required.js","node_modules/core-js/internals/whitespaces.js","node_modules/core-js/internals/string-trim.js","node_modules/core-js/modules/es.number.constructor.js","node_modules/core-js/modules/es.object.keys.js","node_modules/core-js/internals/not-a-regexp.js","node_modules/core-js/internals/correct-is-regexp-logic.js","node_modules/core-js/modules/es.string.includes.js","node_modules/core-js/internals/freezing.js","node_modules/core-js/internals/internal-metadata.js","node_modules/core-js/internals/iterate.js","node_modules/core-js/internals/collection.js","node_modules/core-js/internals/collection-weak.js","node_modules/core-js/modules/es.weak-map.js","node_modules/core-js/modules/es.array.every.js","node_modules/core-js/modules/es.object.assign.js","node_modules/core-js/internals/string-trim-forced.js","node_modules/core-js/modules/es.string.trim.js","node_modules/core-js/modules/es.array.some.js","node_modules/core-js/internals/this-number-value.js","node_modules/core-js/internals/string-repeat.js","node_modules/core-js/modules/es.number.to-fixed.js","node_modules/core-js/internals/object-to-array.js","node_modules/core-js/modules/es.object.entries.js","node_modules/core-js/modules/es.object.values.js","node_modules/core-js/modules/es.number.is-nan.js","node_modules/core-js/modules/es.object.get-own-property-descriptor.js","node_modules/rangetouch/dist/rangetouch.mjs","node_modules/core-js/modules/es.object.get-own-property-descriptors.js","node_modules/core-js/modules/es.string.match.js","node_modules/core-js/internals/task.js","node_modules/core-js/internals/native-promise-constructor.js","node_modules/core-js/internals/set-species.js","node_modules/core-js/internals/engine-is-ios.js","node_modules/core-js/internals/engine-is-node.js","node_modules/core-js/internals/microtask.js","node_modules/core-js/modules/es.promise.js","node_modules/core-js/internals/new-promise-capability.js","node_modules/core-js/internals/promise-resolve.js","node_modules/core-js/internals/host-report-errors.js","node_modules/core-js/internals/perform.js","node_modules/core-js/modules/es.string.starts-with.js","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","node_modules/core-js/internals/array-reduce.js","node_modules/core-js/modules/es.array.reduce.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","node_modules/core-js/modules/es.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/load-sprite.js","node_modules/core-js/modules/es.math.trunc.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/internals/math-sign.js","src/js/utils/load-image.js","node_modules/core-js/modules/es.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es.array.splice.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","node_modules/core-js/modules/es.array.find-index.js","node_modules/core-js/internals/array-last-index-of.js","node_modules/core-js/modules/es.array.last-index-of.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/utils/numbers.js","src/js/plyr.js"],"names":["window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","document","createEvent","initCustomEvent","detail","call","this","Object","defineProperty","get","prototype","Event","commonjsGlobal","globalThis","global","self","createCommonjsModule","fn","module","exports","check","it","Math","global_1","Function","fails","exec","error","descriptors","nativePropertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor","NASHORN_BUG","1","f","V","descriptor","enumerable","objectPropertyIsEnumerable","createPropertyDescriptor","bitmap","value","configurable","writable","toString","classofRaw","slice","split","indexedObject","classof","requireObjectCoercible","undefined","TypeError","toIndexedObject","IndexedObject","isObject","toPrimitive","input","PREFERRED_STRING","val","valueOf","hasOwnProperty","has","key","EXISTS","createElement","documentCreateElement","ie8DomDefine","DESCRIPTORS","a","nativeGetOwnPropertyDescriptor","f$1","O","P","IE8_DOM_DEFINE","propertyIsEnumerableModule","objectGetOwnPropertyDescriptor","anObject","String","nativeDefineProperty","f$2","Attributes","objectDefineProperty","createNonEnumerableProperty","object","definePropertyModule","setGlobal","SHARED","store","sharedStore","functionToString","inspectSource","set","WeakMap","nativeWeakMap","test","isPure","shared","push","version","mode","copyright","id","postfix","random","uid","keys","sharedKey","hiddenKeys","enforce","getterFor","TYPE","state","type","NATIVE_WEAK_MAP","wmget","wmhas","wmset","metadata","facade","STATE","objectHas","activeXDocument","internalState","redefine","getInternalState","InternalStateModule","enforceInternalState","TEMPLATE","options","unsafe","simple","noTargetGet","source","join","path","aFunction","variable","getBuiltIn","namespace","method","arguments","length","ceil","floor","toInteger","argument","isNaN","min","toLength","max","toAbsoluteIndex","index","integer","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayIncludes","includes","indexOf","require$$0","objectKeysInternal","names","i","result","enumBugKeys","concat","f$3","getOwnPropertyNames","internalObjectKeys","objectGetOwnPropertyNames","f$4","getOwnPropertySymbols","objectGetOwnPropertySymbols","ownKeys","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","copyConstructorProperties","target","getOwnPropertyDescriptorModule","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","replace","toLowerCase","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","sham","nativeSymbol","Symbol","useSymbolAsUid","NATIVE_SYMBOL","iterator","isArray","Array","arg","toObject","objectKeys","objectDefineProperties","defineProperties","Properties","html","GT","LT","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","NullProtoObjectViaActiveX","write","close","temp","parentWindow","NullProtoObjectViaIFrame","iframeDocument","iframe","JS","style","display","appendChild","src","contentWindow","open","F","NullProtoObject","domain","ActiveXObject","objectCreate","create","nativeGetOwnPropertyNames","windowNames","getWindowNames","f$5","objectGetOwnPropertyNamesExternal","WellKnownSymbolsStore","createWellKnownSymbol","USE_SYMBOL_AS_UID","withoutSetter","wellKnownSymbol","name","f$6","wellKnownSymbolWrapped","defineWellKnownSymbol","NAME","wrappedWellKnownSymbolModule","TO_STRING_TAG","setToStringTag","TAG","aFunction$1","functionBindContext","that","b","c","apply","SPECIES","arraySpeciesCreate","originalArray","C","constructor","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","callbackfn","specificCreate","boundFunction","bind","arrayIteration","forEach","map","filter","some","every","find","findIndex","$forEach","HIDDEN","SYMBOL","TO_PRIMITIVE","setInternalState","ObjectPrototype","$Symbol","$stringify","getOwnPropertyNamesExternal","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","QObject","USE_SETTER","findChild","setSymbolDescriptor","nativeObjectCreate","ObjectPrototypeDescriptor","wrap","tag","description","symbol","isSymbol","$defineProperty","$defineProperties","properties","$getOwnPropertySymbols","$propertyIsEnumerable","$create","$getOwnPropertyDescriptor","$getOwnPropertyNames","IS_OBJECT_PROTOTYPE","setter","$","for","keyFor","sym","useSetter","useSimple","FORCED_JSON_STRINGIFY","stringify","replacer","space","$replacer","args","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","symbolPrototype","symbolToString","native","regexp","desc","arrayMethodIsStrict","METHOD_NAME","cache","thrower","arrayMethodUsesToLength","ACCESSORS","argument0","argument1","STRICT_METHOD","USES_TO_LENGTH","arrayForEach","proto","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","UNSCOPABLES","ArrayPrototype","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","addToUnscopables","iterators","correctPrototypeGetter","getPrototypeOf","objectGetPrototypeOf","CORRECT_PROTOTYPE_GETTER","ITERATOR","BUGGY_SAFARI_ITERATORS","returnThis","iteratorsCore","createIteratorConstructor","IteratorConstructor","next","Iterators","aPossiblePrototype","objectSetPrototypeOf","setPrototypeOf","CORRECT_SETTER","__proto__","IteratorsCore","KEYS","VALUES","ENTRIES","defineIterator","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","entries","values","ARRAY_ITERATOR","es_array_iterator","iterated","kind","done","Arguments","nativeJoin","ES3_STRINGS","separator","match","createProperty","propertyKey","engineUserAgent","process","versions","v8","userAgent","engineV8Version","arrayMethodHasSpeciesSupport","V8_VERSION","array","foo","Boolean","HAS_SPECIES_SUPPORT","0","nativeSlice","start","end","Constructor","n","k","fin","toStringTagSupport","CORRECT_ARGUMENTS","tryGet","TO_STRING_TAG_SUPPORT","callee","objectToString","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","s","RegExp","UNSUPPORTED_Y","re","lastIndex","BROKEN_CARET","regexpStickyHelpers","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","re1","re2","stickyHelpers","NPCG_INCLUDED","PATCH","str","reCopy","flags","charsAdded","strCopy","regexpExec","TO_STRING","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","R","p","rf","CONVERT_TO_STRING","pos","first","second","S","position","size","charCodeAt","charAt","stringMultibyte","codeAt","STRING_ITERATOR","point","REPLACE_SUPPORTS_NAMED_GROUPS","groups","REPLACE_KEEPS_$0","REPLACE","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","fixRegexpWellKnownSymbolLogic","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","stringMethod","regexMethod","advanceStringIndex","regexpExecAbstract","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","maybeToString","fixRegExpWellKnownSymbolLogic","maybeCallNative","reason","UNSAFE_SUBSTITUTE","searchValue","replaceValue","res","rx","functionalReplace","fullUnicode","results","regExpExec","accumulatedResult","nextSourcePosition","matched","captures","j","namedCaptures","replacerArgs","getSubstitution","tailPos","m","symbols","ch","capture","sameValue","is","x","y","SEARCH","nativeSearch","searcher","previousLastIndex","MATCH","isRegexp","isRegExp","speciesConstructor","defaultConstructor","arrayPush","MAX_UINT32","SUPPORTS_Y","SPLIT","nativeSplit","internalSplit","limit","lim","lastLength","output","lastLastIndex","separatorCopy","splitter","unicodeMatching","callRegExpExec","q","A","z","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","COLLECTION_NAME","DOMIterables","Collection","CollectionPrototype","ArrayValues","ArrayIteratorMethods","nativeUrl","url","URL","searchParams","pathname","IS_PURE","toJSON","sort","href","URLSearchParams","username","host","hash","anInstance","nativeAssign","assign","objectAssign","B","alphabet","chr","T","argumentsLength","iteratorClose","returnMethod","callWithSafeIterationClosing","isArrayIteratorMethod","getIteratorMethod","arrayFrom","arrayLike","step","mapfn","mapping","iteratorMethod","maxInt","base","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexNonASCII","regexSeparators","OVERFLOW_ERROR","baseMinusTMin","stringFromCharCode","fromCharCode","ucs2decode","counter","extra","digitToBasic","digit","adapt","delta","numPoints","firstTime","encode","currentValue","inputLength","bias","basicLength","handledCPCount","handledCPCountPlusOne","RangeError","t","qMinusT","baseMinusT","stringPunycodeToAscii","label","encoded","labels","redefineAll","getIterator","$fetch","Headers","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","getInternalIteratorState","plus","sequences","percentSequence","bytes","percentDecode","sequence","decodeURIComponent","deserialize","!","'","(",")","~","%20","serialize","encodeURIComponent","parseSearchParams","query","attribute","entry","attributes","shift","updateSearchParams","validateArgumentsLength","passed","required","URLSearchParamsIterator","URLSearchParamsConstructor","entryIterator","entryNext","init","updateURL","hasOwn","URLSearchParamsPrototype","append","delete","splice","getAll","found","entriesIndex","sliceIndex","callback","USE_NATIVE_URL","fetch","body","headers","EOF","web_urlSearchParams","getState","require$$1","NativeURL","URLSearchParamsModule","getInternalSearchParamsState","getInternalURLState","pow","INVALID_AUTHORITY","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","parseHost","codePoints","parseIPv6","isSpecial","toASCII","parseIPv4","percentEncode","C0ControlPercentEncodeSet","partsLength","numbers","part","radix","number","ipv4","parts","pop","parseInt","numbersSeen","ipv4Piece","swaps","swap","address","pieceIndex","compress","pointer","char","findLongestZeroSequence","ipv6","maxIndex","maxLength","currStart","currLength","serializeHost","ignore0","unshift","fragmentPercentEncodeSet"," ","\"","<",">","`","pathPercentEncodeSet","#","?","{","}","userinfoPercentEncodeSet","/",":",";","=","@","[","\\","]","^","|","code","specialSchemes","ftp","file","http","https","ws","wss","scheme","includesCredentials","password","cannotHaveUsernamePasswordPort","cannotBeABaseURL","isWindowsDriveLetter","normalized","startsWithWindowsDriveLetter","third","shortenURLsPath","pathSize","isSingleDot","segment","isDoubleDot","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","parseURL","stateOverride","bufferCodePoints","failure","buffer","seenAt","seenBracket","seenPasswordToken","port","fragment","codePoint","encodedCodePoints","URLConstructor","baseState","urlString","searchParamsState","serializeURL","origin","getOrigin","protocol","getProtocol","getUsername","getPassword","getHost","hostname","getHostname","getPort","getPathname","search","getSearch","getSearchParams","getHash","URLPrototype","accessorDescriptor","getter","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","blob","_typeof","obj","_classCallCheck","instance","_defineProperties","props","_createClass","protoProps","staticProps","_defineProperty","ownKeys$1","enumerableOnly","_objectSpread2","getOwnPropertyDescriptors","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","iter","from","_arr","_n","_d","_e","_s","_i","err","o","minLen","len","arr2","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","serializeParam","deserializeParam","checkIfURLSearchParamsSupported","searchString","typeofSearchString","_fromString","_this","_entries","thisArg","searchArray","polyfillURLSearchParams","u","checkIfURLIsSupported","_URL","baseElement","doc","location","implementation","createHTMLDocument","head","anchorElement","inputElement","checkValidity","enableSearchUpdate","enableSearchParamsUpdate","methodName","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","expectedPort","http:","https:","ftp:","addPortToOrigin","polyfillURL","setInterval","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","E","$filter","$find","FIND","SKIPS_HOLES","SAFE_CLOSING","called","iteratorWithReturn","return","checkCorrectnessOfIteration","SKIP_CLOSING","ITERATION_SUPPORT","INCORRECT_ITERATION","iterable","$includes","$map","inheritIfRequired","dummy","Wrapper","NewTarget","NewTargetPrototype","whitespaces","whitespace","ltrim","rtrim","stringTrim","trim","require$$2","require$$3","NUMBER","NativeNumber","NumberPrototype","BROKEN_CLASSOF","toNumber","maxCode","digits","NaN","NumberWrapper","FAILS_ON_PRIMITIVES","nativeKeys","notARegexp","correctIsRegexpLogic","error1","error2","correctIsRegExpLogic","notARegExp","freezing","isExtensible","preventExtensions","internalMetadata","METADATA","setMetadata","objectID","weakData","meta","REQUIRED","fastKey","getWeakData","onFreeze","FREEZING","internalMetadata_1","internalMetadata_2","internalMetadata_3","internalMetadata_4","Result","stopped","iterate","unboundFunction","iterFn","AS_ENTRIES","IS_ITERATOR","INTERRUPTED","stop","condition","callFn","collection","CONSTRUCTOR_NAME","wrapper","common","IS_WEAK","ADDER","NativeConstructor","NativePrototype","exported","fixMethod","getConstructor","InternalMetadataModule","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","clear","setStrong","internalStateGetterFor","ArrayIterationModule","uncaughtFrozenStore","frozen","UncaughtFrozenStore","findUncaughtFrozen","collectionWeak","define","$has","add","es_weakMap","InternalWeakMap","enforceIternalState","IS_IE11","$WeakMap","WeakMapPrototype","nativeDelete","nativeHas","nativeGet","nativeSet","$every","non","stringTrimForced","$trim","forcedStringTrimMethod","$some","thisNumberValue","stringRepeat","repeat","count","Infinity","nativeToFixed","toFixed","acc","log","x2","fractionDigits","fractDigits","sign","multiply","c2","divide","dataToString","TO_ENTRIES","objectToArray","$entries","$values","r","nativeMatch","matcher","matchStr","defaults","addCSS","thumbWidth","watch","matches","querySelectorAll","trigger","dispatchEvent","instanceOf","isNullOrUndefined","isNumber","Number","isString","isBoolean","isFunction","isNodeList","isElement","Element","isEvent","isEmpty","nullOrUndefined","boolean","function","nodeList","element","empty","getDecimalPlaces","round","parseFloat","defer","channel","RangeTouch","querySelector","rangeTouch","config","enabled","userSelect","webKitUserSelect","touchAction","listeners","changedTouches","getAttribute","getBoundingClientRect","width","clientX","left","disabled","MutationObserver","addedNodes","observe","childList","subtree","documentElement","nativePromiseConstructor","Promise","setSpecies","engineIsIos","engineIsNode","setImmediate","clearImmediate","MessageChannel","Dispatch","queue","ONREADYSTATECHANGE","run","runner","listener","post","postMessage","IS_NODE","nextTick","now","IS_IOS","port2","port1","onmessage","addEventListener","importScripts","removeChild","setTimeout","flush","last","notify","toggle","node","promise","then","task","macrotask","WebKitMutationObserver","queueMicrotaskDescriptor","queueMicrotask","parent","exit","enter","createTextNode","characterData","resolve","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","microtask","PromiseCapability","reject","$$resolve","$$reject","f$7","newPromiseCapability","promiseResolve","promiseCapability","hostReportErrors","console","perform","PROMISE","getInternalPromiseState","PromiseConstructor","NativePromise","newPromiseCapabilityModule","newGenericPromiseCapability","DISPATCH_EVENT","NATIVE_REJECTION_EVENT","PromiseRejectionEvent","UNHANDLED_REJECTION","REJECTION_HANDLED","PENDING","FULFILLED","REJECTED","HANDLED","UNHANDLED","FakePromise","all","isThenable","isReject","notified","chain","reactions","ok","exited","reaction","handler","fail","rejection","onHandleUnhandled","onUnhandled","initEvent","isUnhandled","emit","unwrap","internalReject","internalResolve","executor","onFulfilled","onRejected","catch","capability","$promiseResolve","remaining","alreadyCalled","race","nativeStartsWith","startsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","isWeakMap","isTextNode","Text","isKeyboardEvent","KeyboardEvent","isCue","TextTrackCue","VTTCue","isTrack","TextTrack","isPromise","isUrl","is$1","weakMap","textNode","keyboardEvent","cue","track","transitionEndEvent","events","WebkitTransition","MozTransition","OTransition","transition","repaint","delay","hidden","offsetHeight","browser","isIE","documentMode","isEdge","navigator","isWebkit","isIPhone","platform","isIos","IS_RIGHT","memo","arrayReduce","right","$reduce","CHROME_BUG","CHROME_VERSION","cloneDeep","JSON","parse","getDeep","reduce","extend","_len","sources","_key","elements","targets","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","_ref3","_ref4","setAttribute","text","innerText","insertAfter","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","className","class","toggleHidden","hide","toggleClass","force","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","closest","parentElement","nodeType","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","removeEventListener","toggleListener","passive","eventListeners","on","off","once","_this2","onceCallback","triggerEvent","plyr","unbindListeners","item","ready","_this3","silencePromise","validateRatio","reduceAspectRatio","ratio","_ratio","height","divider","getDivider","w","h","getAspectRatio","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","getComputedStyle","offset","fullscreen","active","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","setup","player","speed","onChange","_player$media","currentTime","paused","preload","readyState","playbackRate","play","load","cancelRequests","blankVideo","debug","dedupe","prev","curr","abs","NativeRegExp","CORRECT_NEW","RegExpWrapper","pattern","thisIsRegExp","patternIsRegExp","flagsAreUndefined","getFlags","proxy","generateId","prefix","format","getPercentage","current","replaceAll","toTitleCase","toUpperCase","substr","toPascalCase","toCamelCase","stripHTML","createDocumentFragment","innerHTML","firstChild","getHTML","resources","youtube","i18n","{seektime}","seekTime","{title}","title","v","Storage","storage","localStorage","getItem","json","setItem","removeItem","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","trunc","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","labelPressed","iconPressed","control","button","createRange","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sorting","setCaptionsMenu","_this7","tracks","getTracks","toggled","language","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","popup","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","restore","propertyName","setDownloadUrl","download","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this11","seektime","addProperty","controlPressed","_this$config","parseUrl","safe","parser","buildUrlParams","isYouTube","languages","userLanguage","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","inactive","providers","types","getProviderByUrl","noop","Console","Fullscreen","property","scrollPosition","forceFallback","trapFocus","scrollX","scrollY","scrollTo","overflow","viewport","hasProperty","cleanupViewport","keyCode","activeElement","shiftKey","webkitEnterFullscreen","toggleFallback","requestFullscreen","navigationUI","webkitExitFullscreen","action","cancelFullScreen","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","mathSign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","migrateStyles","getPropertyValue","removeProperty","Listeners","lastKey","focusTimer","lastKeyDown","handleKey","setTabFocus","firstTouch","altKey","ctrlKey","metaKey","togglePlay","increaseVolume","decreaseVolume","forward","toggleCaptions","usingNative","timeStamp","wasKeyDown","setPlayerSize","measure","rect","resized","_player$fullscreen","isEnter","_setPlayerSize","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","MAXIMUM_ALLOWED_LENGTH_EXCEEDED","deleteCount","insertCount","actualDeleteCount","to","actualStart","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","executeCallbacks","success","loadFile","numTries","isLegacyIECss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","loadFiles","paths","loadjs","arg1","loadFn","returnPromise","deps","isDefined","factory","loadScript","parseId","$2","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","data-poster","thumbnail_url","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","getPaused","seconds","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","destroy","manager","displayContainer","remove","Ads","initialized","loader","cuePoints","safetyTimer","countdownTimer","managerPromise","google","ima","startSafetyTimer","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","zIndex","_this12","handlers","_this13","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","$findIndex","FIND_INDEX","nativeLastIndexOf","lastIndexOf","arrayLastIndexOf","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","fitRatio","outer","PreviewThumbnails","thumbnails","lastMouseMoveTime","mouseDown","loadedImages","thumb","scrubbing","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","tempImage","naturalHeight","percentage","mousePosX","showImageAtCurrentTime","toggleThumbContainer","toggleScrubbingContainer","lastTime","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","hasThumb","qualityIndex","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","previewPos","_fitRatio","multiplier","top","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","clamp","Plyr","failed","jQuery","original","truthy","tabindex","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","unload","inputIsValid","fauxDuration","realDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.polyfilled.min.mjs","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 params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\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","// Polyfill for creating CustomEvents on IE9/10/11\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n(function () {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', {\n cancelable: true\n });\n ce.preventDefault();\n\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 CustomEvent(event, params) {\n var evt, origPrevent;\n params = params || {};\n params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n\n evt.preventDefault = function () {\n origPrevent.call(this);\n\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function get() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global_1 =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n\nvar fails = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n\n// Thank's IE8 for his funny defineProperty\nvar descriptors = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nvar f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n\nvar objectPropertyIsEnumerable = {\n\tf: f\n};\n\nvar createPropertyDescriptor = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\nvar toString = {}.toString;\n\nvar classofRaw = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar indexedObject = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nvar requireObjectCoercible = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n// toObject with fallback for non-array-like ES3 strings\n\n\n\nvar toIndexedObject = function (it) {\n return indexedObject(requireObjectCoercible(it));\n};\n\nvar isObject = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nvar toPrimitive = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nvar has = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\nvar document$1 = global_1.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document$1) && isObject(document$1.createElement);\n\nvar documentCreateElement = function (it) {\n return EXISTS ? document$1.createElement(it) : {};\n};\n\n// Thank's IE8 for his funny defineProperty\nvar ie8DomDefine = !descriptors && !fails(function () {\n return Object.defineProperty(documentCreateElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nvar f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (ie8DomDefine) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n};\n\nvar objectGetOwnPropertyDescriptor = {\n\tf: f$1\n};\n\nvar anObject = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nvar f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (ie8DomDefine) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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\nvar objectDefineProperty = {\n\tf: f$2\n};\n\nvar createNonEnumerableProperty = descriptors ? function (object, key, value) {\n return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\nvar setGlobal = function (key, value) {\n try {\n createNonEnumerableProperty(global_1, key, value);\n } catch (error) {\n global_1[key] = value;\n } return value;\n};\n\nvar SHARED = '__core-js_shared__';\nvar store = global_1[SHARED] || setGlobal(SHARED, {});\n\nvar sharedStore = store;\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof sharedStore.inspectSource != 'function') {\n sharedStore.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nvar inspectSource = sharedStore.inspectSource;\n\nvar WeakMap$1 = global_1.WeakMap;\n\nvar nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\n\nvar isPure = false;\n\nvar shared = createCommonjsModule(function (module) {\n(module.exports = function (key, value) {\n return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.7.0',\n mode: 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n});\n\nvar id = 0;\nvar postfix = Math.random();\n\nvar uid = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n\nvar keys = shared('keys');\n\nvar sharedKey = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n\nvar hiddenKeys = {};\n\nvar WeakMap$2 = global_1.WeakMap;\nvar set, get, has$1;\n\nvar enforce = function (it) {\n return has$1(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (nativeWeakMap) {\n var store$1 = sharedStore.state || (sharedStore.state = new WeakMap$2());\n var wmget = store$1.get;\n var wmhas = store$1.has;\n var wmset = store$1.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store$1, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store$1, it) || {};\n };\n has$1 = function (it) {\n return wmhas.call(store$1, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return has(it, STATE) ? it[STATE] : {};\n };\n has$1 = function (it) {\n return has(it, STATE);\n };\n}\n\nvar internalState = {\n set: set,\n get: get,\n has: has$1,\n enforce: enforce,\n getterFor: getterFor\n};\n\nvar redefine = createCommonjsModule(function (module) {\nvar getInternalState = internalState.get;\nvar enforceInternalState = internalState.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global_1) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n});\n\nvar path = global_1;\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nvar getBuiltIn = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])\n : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n};\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nvar toInteger = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nvar toLength = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\nvar max = Math.max;\nvar min$1 = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nvar toAbsoluteIndex = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n};\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nvar arrayIncludes = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n\nvar indexOf = arrayIncludes.indexOf;\n\n\nvar objectKeysInternal = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n// IE8- don't enum bug keys\nvar enumBugKeys = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\nvar hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nvar f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return objectKeysInternal(O, hiddenKeys$1);\n};\n\nvar objectGetOwnPropertyNames = {\n\tf: f$3\n};\n\nvar f$4 = Object.getOwnPropertySymbols;\n\nvar objectGetOwnPropertySymbols = {\n\tf: f$4\n};\n\n// all object keys, includes non-enumerable and symbols\nvar ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = objectGetOwnPropertyNames.f(anObject(it));\n var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n\nvar copyConstructorProperties = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = objectDefineProperty.f;\n var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nvar isForced_1 = isForced;\n\nvar getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nvar _export = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global_1;\n } else if (STATIC) {\n target = global_1[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global_1[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor$1(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n\nvar nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n\nvar useSymbolAsUid = nativeSymbol\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nvar isArray = Array.isArray || function isArray(arg) {\n return classofRaw(arg) == 'Array';\n};\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nvar toObject = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nvar objectKeys = Object.keys || function keys(O) {\n return objectKeysInternal(O, enumBugKeys);\n};\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nvar objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n\nvar html = getBuiltIn('document', 'documentElement');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nvar objectCreate = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : objectDefineProperties(result, Properties);\n};\n\nvar nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;\n\nvar toString$1 = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar f$5 = function getOwnPropertyNames(it) {\n return windowNames && toString$1.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n\nvar objectGetOwnPropertyNamesExternal = {\n\tf: f$5\n};\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol$1 = global_1.Symbol;\nvar createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\n\nvar wellKnownSymbol = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n\nvar f$6 = wellKnownSymbol;\n\nvar wellKnownSymbolWrapped = {\n\tf: f$6\n};\n\nvar defineProperty = objectDefineProperty.f;\n\nvar defineWellKnownSymbol = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wellKnownSymbolWrapped.f(NAME)\n });\n};\n\nvar defineProperty$1 = objectDefineProperty.f;\n\n\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nvar setToStringTag = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty$1(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n\nvar aFunction$1 = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n\n// optional / simple context binding\nvar functionBindContext = function (fn, that, length) {\n aFunction$1(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nvar arraySpeciesCreate = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod$1 = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = indexedObject(O);\n var boundFunction = functionBindContext(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nvar arrayIteration = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod$1(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod$1(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod$1(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod$1(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod$1(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod$1(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod$1(6)\n};\n\nvar $forEach = arrayIteration.forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE$1 = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = internalState.set;\nvar getInternalState = internalState.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE$1];\nvar $Symbol = global_1.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\nvar nativeDefineProperty$1 = objectDefineProperty.f;\nvar nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore$1 = shared('wks');\nvar QObject = global_1.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = descriptors && fails(function () {\n return objectCreate(nativeDefineProperty$1({}, 'a', {\n get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty$1(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty$1(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty$1;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!descriptors) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = useSymbolAsUid ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty$1(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable$1.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!nativeSymbol) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n objectPropertyIsEnumerable.f = $propertyIsEnumerable;\n objectDefineProperty.f = $defineProperty;\n objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;\n objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;\n\n wellKnownSymbolWrapped.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (descriptors) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n_export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore$1), function (name) {\n defineWellKnownSymbol(name);\n});\n\n_export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n_export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n_export({ target: 'Object', stat: true, forced: !nativeSymbol }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n_export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return objectGetOwnPropertySymbols.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n _export({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n\nvar defineProperty$2 = objectDefineProperty.f;\n\n\nvar NativeSymbol = global_1.Symbol;\n\nif (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty$2(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n _export({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n\nvar arrayMethodIsStrict = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n\nvar defineProperty$3 = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nvar arrayMethodUsesToLength = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !descriptors) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty$3(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n\nvar $forEach$1 = arrayIteration.forEach;\n\n\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nvar arrayForEach = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n_export({ target: 'Array', proto: true, forced: [].forEach != arrayForEach }, {\n forEach: arrayForEach\n});\n\nvar $indexOf = arrayIncludes.indexOf;\n\n\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD$1 = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH$1 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n_export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD$1 || !USES_TO_LENGTH$1 }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: objectCreate(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nvar addToUnscopables = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\nvar iterators = {};\n\nvar correctPrototypeGetter = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\nvar IE_PROTO$1 = sharedKey('IE_PROTO');\nvar ObjectPrototype$1 = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nvar objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO$1)) return O[IE_PROTO$1];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype$1 : null;\n};\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif ( !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nvar iteratorsCore = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n\nvar IteratorPrototype$1 = iteratorsCore.IteratorPrototype;\n\n\n\n\n\nvar returnThis$1 = function () { return this; };\n\nvar createIteratorConstructor = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false);\n iterators[TO_STRING_TAG] = returnThis$1;\n return IteratorConstructor;\n};\n\nvar aPossiblePrototype = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n\nvar IteratorPrototype$2 = iteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR$1 = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis$2 = function () { return this; };\n\nvar defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR$1]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {\n if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {\n if (objectSetPrototypeOf) {\n objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);\n } else if (typeof CurrentIteratorPrototype[ITERATOR$1] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$1, returnThis$2);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ( IterablePrototype[ITERATOR$1] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR$1, defaultIterator);\n }\n iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState$1 = internalState.set;\nvar getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nvar es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState$1(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState$1(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\niterators.Arguments = iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = indexedObject != Object;\nvar STRICT_METHOD$2 = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n_export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$2 }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n\nvar createProperty = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n\nvar engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\n\nvar process = global_1.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (engineUserAgent) {\n match = engineUserAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = engineUserAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nvar engineV8Version = version && +version;\n\nvar SPECIES$1 = wellKnownSymbol('species');\n\nvar arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return engineV8Version >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES$1] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH$2 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES$2 = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max$1 = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$2 }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES$2];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n\nvar TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG$1] = 'z';\n\nvar toStringTagSupport = String(test) === '[object z]';\n\nvar TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nvar classof = toStringTagSupport ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$2)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nvar objectToString = toStringTagSupport ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!toStringTagSupport) {\n redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\n}\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\nvar regexpFlags = 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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nvar UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nvar BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n\nvar regexpStickyHelpers = {\n\tUNSUPPORTED_Y: UNSUPPORTED_Y,\n\tBROKEN_CARET: BROKEN_CARET\n};\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y$1 && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nvar regexpExec = patchedExec;\n\n_export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\n exec: regexpExec\n});\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod$2 = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nvar stringMultibyte = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod$2(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod$2(true)\n};\n\nvar charAt = stringMultibyte.charAt;\n\n\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState$2 = internalState.set;\nvar getInternalState$2 = internalState.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState$2(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState$2(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n\n// TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\n\n\n\n\nvar SPECIES$3 = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nvar fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES$3] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n\nvar charAt$1 = stringMultibyte.charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nvar advanceStringIndex = function (S, index, unicode) {\n return index + (unicode ? charAt$1(S, index).length : 1);\n};\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nvar regexpExecAbstract = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classofRaw(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\nvar max$2 = Math.max;\nvar min$2 = Math.min;\nvar floor$1 = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regexpExecAbstract(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max$2(min$2(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor$1(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n\n// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nvar sameValue = 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\n// @@search logic\nfixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regexpExecAbstract(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nvar isRegexp = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\n};\n\nvar SPECIES$4 = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nvar speciesConstructor = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES$4]) == undefined ? defaultConstructor : aFunction$1(S);\n};\n\nvar arrayPush = [].push;\nvar min$3 = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegexp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min$3(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nvar domIterables = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n\nfor (var COLLECTION_NAME in domIterables) {\n var Collection = global_1[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach);\n } catch (error) {\n CollectionPrototype.forEach = arrayForEach;\n }\n}\n\nvar ITERATOR$2 = wellKnownSymbol('iterator');\nvar TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');\nvar ArrayValues = es_array_iterator.values;\n\nfor (var COLLECTION_NAME$1 in domIterables) {\n var Collection$1 = global_1[COLLECTION_NAME$1];\n var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;\n if (CollectionPrototype$1) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype$1[ITERATOR$2] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype$1, ITERATOR$2, ArrayValues);\n } catch (error) {\n CollectionPrototype$1[ITERATOR$2] = ArrayValues;\n }\n if (!CollectionPrototype$1[TO_STRING_TAG$3]) {\n createNonEnumerableProperty(CollectionPrototype$1, TO_STRING_TAG$3, COLLECTION_NAME$1);\n }\n if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME];\n }\n }\n }\n}\n\nvar ITERATOR$3 = wellKnownSymbol('iterator');\n\nvar nativeUrl = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (isPure && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR$3]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n\nvar anInstance = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n\nvar nativeAssign = Object.assign;\nvar defineProperty$4 = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nvar objectAssign = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$4({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty$4(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n while (argumentsLength > index) {\n var S = indexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n\nvar iteratorClose = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n\n// call something on iterator step with safe closing on error\nvar callWithSafeIterationClosing = 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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n\nvar ITERATOR$4 = wellKnownSymbol('iterator');\nvar ArrayPrototype$1 = Array.prototype;\n\n// check on default Array iterator\nvar isArrayIteratorMethod = function (it) {\n return it !== undefined && (iterators.Array === it || ArrayPrototype$1[ITERATOR$4] === it);\n};\n\nvar ITERATOR$5 = wellKnownSymbol('iterator');\n\nvar getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR$5]\n || it['@@iterator']\n || iterators[classof(it)];\n};\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nvar arrayFrom = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor$2 = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor$2(delta / damp) : delta >> 1;\n delta += floor$2(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor$2(delta / baseMinusTMin);\n }\n return floor$2(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor$2((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor$2(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nvar stringPunycodeToAscii = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n\nvar redefineAll = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n\nvar getIterator = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR$6 = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState$3 = internalState.set;\nvar getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState$3(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState$3(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (has(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR$6, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n_export({ global: true, forced: !nativeUrl }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!nativeUrl && typeof $fetch == 'function' && typeof Headers == 'function') {\n _export({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = objectCreate(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nvar web_urlSearchParams = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\nvar codeAt = stringMultibyte.codeAt;\n\n\n\n\n\nvar NativeURL = global_1.URL;\nvar URLSearchParams$1 = web_urlSearchParams.URLSearchParams;\nvar getInternalSearchParamsState = web_urlSearchParams.getState;\nvar setInternalState$4 = internalState.set;\nvar getInternalURLState = internalState.getterFor('URL');\nvar floor$3 = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = stringPunycodeToAscii(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor$3(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState$4(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams$1();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!descriptors) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (descriptors) {\n objectDefineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n_export({ global: true, forced: !nativeUrl, sham: !descriptors }, {\n URL: URLConstructor\n});\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys$1(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys$1(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys$1(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n(function (global) {\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 */\n var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() {\n try {\n return !!Symbol.iterator;\n } catch (error) {\n return false;\n }\n };\n\n var iteratorSupported = checkIfIteratorIsSupported();\n\n var createIterator = function createIterator(items) {\n var iterator = {\n next: function next() {\n var value = items.shift();\n return {\n done: value === void 0,\n value: value\n };\n }\n };\n\n if (iteratorSupported) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n };\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 */\n\n\n var serializeParam = function serializeParam(value) {\n return encodeURIComponent(value).replace(/%20/g, '+');\n };\n\n var deserializeParam = function deserializeParam(value) {\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\n };\n\n var polyfillURLSearchParams = function polyfillURLSearchParams() {\n var URLSearchParams = function URLSearchParams(searchString) {\n Object.defineProperty(this, '_entries', {\n writable: true,\n value: {}\n });\n\n var typeofSearchString = _typeof(searchString);\n\n if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n if (searchString !== '') {\n this._fromString(searchString);\n }\n } else if (searchString instanceof URLSearchParams) {\n var _this = this;\n\n searchString.forEach(function (value, name) {\n _this.append(name, value);\n });\n } else if (searchString !== null && typeofSearchString === 'object') {\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\n for (var i = 0; i < searchString.length; i++) {\n var entry = searchString[i];\n\n if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n this.append(entry[0], entry[1]);\n } else {\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n }\n }\n } else {\n for (var key in searchString) {\n if (searchString.hasOwnProperty(key)) {\n this.append(key, searchString[key]);\n }\n }\n }\n } else {\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n }\n };\n\n var proto = URLSearchParams.prototype;\n\n proto.append = function (name, value) {\n if (name in this._entries) {\n this._entries[name].push(String(value));\n } else {\n this._entries[name] = [String(value)];\n }\n };\n\n proto.delete = function (name) {\n delete this._entries[name];\n };\n\n proto.get = function (name) {\n return name in this._entries ? this._entries[name][0] : null;\n };\n\n proto.getAll = function (name) {\n return name in this._entries ? this._entries[name].slice(0) : [];\n };\n\n proto.has = function (name) {\n return name in this._entries;\n };\n\n proto.set = function (name, value) {\n this._entries[name] = [String(value)];\n };\n\n proto.forEach = function (callback, thisArg) {\n var entries;\n\n for (var name in this._entries) {\n if (this._entries.hasOwnProperty(name)) {\n entries = this._entries[name];\n\n for (var i = 0; i < entries.length; i++) {\n callback.call(thisArg, entries[i], name, this);\n }\n }\n }\n };\n\n proto.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return createIterator(items);\n };\n\n proto.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return createIterator(items);\n };\n\n proto.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return createIterator(items);\n };\n\n if (iteratorSupported) {\n proto[Symbol.iterator] = proto.entries;\n }\n\n proto.toString = function () {\n var searchArray = [];\n this.forEach(function (value, name) {\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n });\n return searchArray.join('&');\n };\n\n global.URLSearchParams = URLSearchParams;\n };\n\n var checkIfURLSearchParamsSupported = function checkIfURLSearchParamsSupported() {\n try {\n var URLSearchParams = global.URLSearchParams;\n return new URLSearchParams('?a=1').toString() === 'a=1' && typeof URLSearchParams.prototype.set === 'function' && typeof URLSearchParams.prototype.entries === 'function';\n } catch (e) {\n return false;\n }\n };\n\n if (!checkIfURLSearchParamsSupported()) {\n polyfillURLSearchParams();\n }\n\n var proto = global.URLSearchParams.prototype;\n\n if (typeof proto.sort !== 'function') {\n proto.sort = function () {\n var _this = this;\n\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n\n if (!_this._entries) {\n _this.delete(name);\n }\n });\n items.sort(function (a, b) {\n if (a[0] < b[0]) {\n return -1;\n } else if (a[0] > b[0]) {\n return +1;\n } else {\n return 0;\n }\n });\n\n if (_this._entries) {\n // force reset because IE keeps keys index\n _this._entries = {};\n }\n\n for (var i = 0; i < items.length; i++) {\n this.append(items[i][0], items[i][1]);\n }\n };\n }\n\n if (typeof proto._fromString !== 'function') {\n Object.defineProperty(proto, '_fromString', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value(searchString) {\n if (this._entries) {\n this._entries = {};\n } else {\n var keys = [];\n this.forEach(function (value, name) {\n keys.push(name);\n });\n\n for (var i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n }\n\n searchString = searchString.replace(/^\\?/, '');\n var attributes = searchString.split('&');\n var attribute;\n\n for (var i = 0; i < attributes.length; i++) {\n attribute = attributes[i].split('=');\n this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n }\n }\n });\n } // HTMLAnchorElement\n\n})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n(function (global) {\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 */\n var checkIfURLIsSupported = function checkIfURLIsSupported() {\n try {\n var u = new global.URL('b', 'http://a');\n u.pathname = 'c d';\n return u.href === 'http://a/c%20d' && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n\n var polyfillURL = function polyfillURL() {\n var _URL = global.URL;\n\n var URL = function URL(url, base) {\n if (typeof url !== 'string') url = String(url);\n if (base && typeof base !== 'string') base = String(base); // Only create another document if the base is different from current location.\n\n var doc = document,\n baseElement;\n\n if (base && (global.location === void 0 || base !== global.location.href)) {\n base = base.toLowerCase();\n doc = document.implementation.createHTMLDocument('');\n baseElement = doc.createElement('base');\n baseElement.href = base;\n doc.head.appendChild(baseElement);\n\n try {\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n } catch (err) {\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\n }\n }\n\n var anchorElement = doc.createElement('a');\n anchorElement.href = url;\n\n if (baseElement) {\n doc.body.appendChild(anchorElement);\n anchorElement.href = anchorElement.href; // force href to refresh\n }\n\n var inputElement = doc.createElement('input');\n inputElement.type = 'url';\n inputElement.value = url;\n\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || !inputElement.checkValidity() && !base) {\n throw new TypeError('Invalid URL');\n }\n\n Object.defineProperty(this, '_anchorElement', {\n value: anchorElement\n }); // create a linked searchParams which reflect its changes on URL\n\n var searchParams = new global.URLSearchParams(this.search);\n var enableSearchUpdate = true;\n var enableSearchParamsUpdate = true;\n\n var _this = this;\n\n ['append', 'delete', 'set'].forEach(function (methodName) {\n var method = searchParams[methodName];\n\n searchParams[methodName] = function () {\n method.apply(searchParams, arguments);\n\n if (enableSearchUpdate) {\n enableSearchParamsUpdate = false;\n _this.search = searchParams.toString();\n enableSearchParamsUpdate = true;\n }\n };\n });\n Object.defineProperty(this, 'searchParams', {\n value: searchParams,\n enumerable: true\n });\n var search = void 0;\n Object.defineProperty(this, '_updateSearchParams', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value() {\n if (this.search !== search) {\n search = this.search;\n\n if (enableSearchParamsUpdate) {\n enableSearchUpdate = false;\n\n this.searchParams._fromString(this.search);\n\n enableSearchUpdate = true;\n }\n }\n }\n });\n };\n\n var proto = URL.prototype;\n\n var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) {\n Object.defineProperty(proto, attributeName, {\n get: function get() {\n return this._anchorElement[attributeName];\n },\n set: function set(value) {\n this._anchorElement[attributeName] = value;\n },\n enumerable: true\n });\n };\n\n ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n linkURLWithAnchorAttribute(attributeName);\n });\n Object.defineProperty(proto, 'search', {\n get: function get() {\n return this._anchorElement['search'];\n },\n set: function set(value) {\n this._anchorElement['search'] = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n });\n Object.defineProperties(proto, {\n 'toString': {\n get: function get() {\n var _this = this;\n\n return function () {\n return _this.href;\n };\n }\n },\n 'href': {\n get: function get() {\n return this._anchorElement.href.replace(/\\?$/, '');\n },\n set: function set(value) {\n this._anchorElement.href = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n },\n 'pathname': {\n get: function get() {\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n },\n set: function set(value) {\n this._anchorElement.pathname = value;\n },\n enumerable: true\n },\n 'origin': {\n get: function get() {\n // get expected port from protocol\n var expectedPort = {\n 'http:': 80,\n 'https:': 443,\n 'ftp:': 21\n }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port\n // and it is not empty f.e http://foo:8080\n // 8080 != 80 && 8080 != ''\n\n var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n },\n enumerable: true\n },\n 'password': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n },\n 'username': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n }\n });\n\n URL.createObjectURL = function (blob) {\n return _URL.createObjectURL.apply(_URL, arguments);\n };\n\n URL.revokeObjectURL = function (url) {\n return _URL.revokeObjectURL.apply(_URL, arguments);\n };\n\n global.URL = URL;\n };\n\n if (!checkIfURLIsSupported()) {\n polyfillURL();\n }\n\n if (global.location !== void 0 && !('origin' in global.location)) {\n var getOrigin = function getOrigin() {\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n };\n\n try {\n Object.defineProperty(global.location, 'origin', {\n get: getOrigin,\n enumerable: true\n });\n } catch (e) {\n setInterval(function () {\n global.location.origin = getOrigin();\n }, 100);\n }\n }\n})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n_export({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n\nvar $filter = arrayIteration.filter;\n\n\n\nvar HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH$3 = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$3 }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nvar $find = arrayIteration.find;\n\n\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH$4 = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n_export({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH$4 }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n\nvar ITERATOR$7 = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR$7] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nvar checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR$7] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n_export({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: arrayFrom\n});\n\nvar $includes = arrayIncludes.includes;\n\n\n\nvar USES_TO_LENGTH$5 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n_export({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$5 }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n\nvar $map = arrayIteration.map;\n\n\n\nvar HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH$6 = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// makes subclassing work correct for wrapped built-ins\nvar inheritIfRequired = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n objectSetPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) objectSetPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n\n// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nvar whitespaces = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod$3 = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nvar stringTrim = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod$3(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod$3(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod$3(3)\n};\n\nvar getOwnPropertyNames = objectGetOwnPropertyNames.f;\nvar getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\nvar defineProperty$5 = objectDefineProperty.f;\nvar trim = stringTrim.trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global_1[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys$1 = descriptors ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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$1.length > j; j++) {\n if (has(NativeNumber, key = keys$1[j]) && !has(NumberWrapper, key)) {\n defineProperty$5(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global_1, NUMBER, NumberWrapper);\n}\n\nvar FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n_export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return objectKeys(toObject(it));\n }\n});\n\nvar notARegexp = function (it) {\n if (isRegexp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n\nvar MATCH$1 = wellKnownSymbol('match');\n\nvar correctIsRegexpLogic = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH$1] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n_export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nvar freezing = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n\nvar internalMetadata = createCommonjsModule(function (module) {\nvar defineProperty = objectDefineProperty.f;\n\n\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n});\nvar internalMetadata_1 = internalMetadata.REQUIRED;\nvar internalMetadata_2 = internalMetadata.fastKey;\nvar internalMetadata_3 = internalMetadata.getWeakData;\nvar internalMetadata_4 = internalMetadata.onFreeze;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar iterate = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = functionBindContext(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n\nvar collection = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global_1[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n internalMetadata.REQUIRED = true;\n } else if (isForced_1(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n _export({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n\nvar getWeakData = internalMetadata.getWeakData;\n\n\n\n\n\n\n\n\nvar setInternalState$5 = internalState.set;\nvar internalStateGetterFor = internalState.getterFor;\nvar find$1 = arrayIteration.find;\nvar findIndex = arrayIteration.findIndex;\nvar id$1 = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find$1(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nvar collectionWeak = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState$5(that, {\n type: CONSTRUCTOR_NAME,\n id: id$1++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && has(data, state.id) && delete data[state.id];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has$1(key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n\nvar es_weakMap = createCommonjsModule(function (module) {\n\n\n\n\n\n\nvar enforceIternalState = internalState.enforce;\n\n\nvar IS_IE11 = !global_1.ActiveXObject && 'ActiveXObject' in global_1;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (nativeWeakMap && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n internalMetadata.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n});\n\nvar $every = arrayIteration.every;\n\n\n\nvar STRICT_METHOD$3 = arrayMethodIsStrict('every');\nvar USES_TO_LENGTH$7 = arrayMethodUsesToLength('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$3 || !USES_TO_LENGTH$7 }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n_export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\n assign: objectAssign\n});\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nvar stringTrimForced = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n\nvar $trim = stringTrim.trim;\n\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n_export({ target: 'String', proto: true, forced: stringTrimForced('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n\nvar $some = arrayIteration.some;\n\n\n\nvar STRICT_METHOD$4 = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH$8 = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 || !USES_TO_LENGTH$8 }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nvar thisNumberValue = function (value) {\n if (typeof value != 'number' && classofRaw(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nvar stringRepeat = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor$4 = Math.floor;\n\nvar pow$1 = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow$1(x, n - 1, acc * x) : pow$1(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED$1 = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n_export({ target: 'Number', proto: true, forced: FORCED$1 }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor$4(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor$4(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow$1(2, 69, 1)) - 69;\n z = e < 0 ? number * pow$1(2, -e, 1) : number / pow$1(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow$1(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + stringRepeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + stringRepeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n\nvar propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod$4 = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!descriptors || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nvar objectToArray = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod$4(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod$4(false)\n};\n\nvar $entries = objectToArray.entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n_export({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n\nvar $values = objectToArray.values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n_export({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n_export({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n\nvar nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\n\nvar FAILS_ON_PRIMITIVES$1 = fails(function () { nativeGetOwnPropertyDescriptor$2(1); });\nvar FORCED$2 = !descriptors || FAILS_ON_PRIMITIVES$1;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n_export({ target: 'Object', stat: true, forced: FORCED$2, sham: !descriptors }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key);\n }\n});\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n_export({ target: 'Object', stat: true, sham: !descriptors }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n});\n\n// @@match logic\nfixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regexpExecAbstract(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regexpExecAbstract(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n\nfunction _classCallCheck$1(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n}\n\nfunction _defineProperties$1(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n}\n\nfunction _createClass$1(e, t, n) {\n return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n}\n\nfunction _defineProperty$1(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n}\n\nfunction ownKeys$2(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n\n return n;\n}\n\nfunction _objectSpread2$1(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys$2(Object(n), !0).forEach(function (t) {\n _defineProperty$1(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$2(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n}\n\nvar defaults = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n};\n\nfunction matches(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n}\n\nfunction trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n}\n\nvar getConstructor = function getConstructor(e) {\n return null != e ? e.constructor : null;\n},\n instanceOf = function instanceOf(e, t) {\n return !!(e && t && e instanceof t);\n},\n isNullOrUndefined = function isNullOrUndefined(e) {\n return null == e;\n},\n isObject$1 = function isObject(e) {\n return getConstructor(e) === Object;\n},\n isNumber = function isNumber(e) {\n return getConstructor(e) === Number && !Number.isNaN(e);\n},\n isString = function isString(e) {\n return getConstructor(e) === String;\n},\n isBoolean = function isBoolean(e) {\n return getConstructor(e) === Boolean;\n},\n isFunction = function isFunction(e) {\n return getConstructor(e) === Function;\n},\n isArray$1 = function isArray(e) {\n return Array.isArray(e);\n},\n isNodeList = function isNodeList(e) {\n return instanceOf(e, NodeList);\n},\n isElement = function isElement(e) {\n return instanceOf(e, Element);\n},\n isEvent = function isEvent(e) {\n return instanceOf(e, Event);\n},\n isEmpty = function isEmpty(e) {\n return isNullOrUndefined(e) || (isString(e) || isArray$1(e) || isNodeList(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n},\n is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject$1,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray$1,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n};\n\nfunction getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n}\n\nfunction round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n\n return Math.round(e / t) * t;\n}\n\nvar RangeTouch = function () {\n function e(t, n) {\n _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());\n }\n\n return _createClass$1(e, [{\n key: \"init\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function value(e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function value(t) {\n if (!e.enabled || !is.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function value(t) {\n e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function value(t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type=\"range\"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\n var i = _objectSpread2$1({}, defaults, {}, n);\n\n if (is.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is.element(n) && matches(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n}();\n\nvar nativePromiseConstructor = global_1.Promise;\n\nvar SPECIES$5 = wellKnownSymbol('species');\n\nvar setSpecies = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = objectDefineProperty.f;\n\n if (descriptors && Constructor && !Constructor[SPECIES$5]) {\n defineProperty(Constructor, SPECIES$5, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n\nvar engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent);\n\nvar engineIsNode = classofRaw(global_1.process) == 'process';\n\nvar location = global_1.location;\nvar set$1 = global_1.setImmediate;\nvar clear = global_1.clearImmediate;\nvar process$1 = global_1.process;\nvar MessageChannel = global_1.MessageChannel;\nvar Dispatch = global_1.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global_1.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set$1 || !clear) {\n set$1 = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (engineIsNode) {\n defer = function (id) {\n process$1.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !engineIsIos) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = functionBindContext(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 (\n global_1.addEventListener &&\n typeof postMessage == 'function' &&\n !global_1.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global_1.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {\n defer = function (id) {\n html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nvar task = {\n set: set$1,\n clear: clear\n};\n\nvar getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;\nvar macrotask = task.set;\n\n\n\nvar MutationObserver$1 = global_1.MutationObserver || global_1.WebKitMutationObserver;\nvar document$2 = global_1.document;\nvar process$2 = global_1.process;\nvar Promise$1 = global_1.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor$3(global_1, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (engineIsNode && (parent = process$2.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!engineIsIos && !engineIsNode && MutationObserver$1 && document$2) {\n toggle = true;\n node = document$2.createTextNode('');\n new MutationObserver$1(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise$1 && Promise$1.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise$1.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (engineIsNode) {\n notify = function () {\n process$2.nextTick(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_1, flush);\n };\n }\n}\n\nvar microtask = queueMicrotask || 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\nvar PromiseCapability = function (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$1(resolve);\n this.reject = aFunction$1(reject);\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar f$7 = function (C) {\n return new PromiseCapability(C);\n};\n\nvar newPromiseCapability = {\n\tf: f$7\n};\n\nvar promiseResolve = 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\nvar hostReportErrors = function (a, b) {\n var console = global_1.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n\nvar perform = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n\nvar task$1 = task.set;\n\n\n\n\n\n\n\n\n\n\n\nvar SPECIES$6 = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState$3 = internalState.get;\nvar setInternalState$6 = internalState.set;\nvar getInternalPromiseState = internalState.getterFor(PROMISE);\nvar PromiseConstructor = nativePromiseConstructor;\nvar TypeError$1 = global_1.TypeError;\nvar document$3 = global_1.document;\nvar process$3 = global_1.process;\nvar $fetch$1 = getBuiltIn('fetch');\nvar newPromiseCapability$1 = newPromiseCapability.f;\nvar newGenericPromiseCapability = newPromiseCapability$1;\nvar DISPATCH_EVENT = !!(document$3 && document$3.createEvent && global_1.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED$3 = isForced_1(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (engineV8Version === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!engineIsNode && !NATIVE_REJECTION_EVENT) return true;\n }\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES$6] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION$1 = FORCED$3 || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify$1 = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError$1('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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document$3.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global_1.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global_1['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n task$1.call(global_1, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (engineIsNode) {\n process$3.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = engineIsNode || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n task$1.call(global_1, function () {\n var promise = state.facade;\n if (engineIsNode) {\n process$3.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify$1(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError$1(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify$1(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED$3) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction$1(executor);\n Internal.call(this);\n var state = getInternalState$3(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState$6(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = engineIsNode ? process$3.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify$1(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState$3(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapability.f = newPromiseCapability$1 = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if ( typeof nativePromiseConstructor == 'function') {\n nativeThen = nativePromiseConstructor.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch$1 == 'function') _export({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch$1.apply(global_1, arguments));\n }\n });\n }\n}\n\n_export({ global: true, wrap: true, forced: FORCED$3 }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n_export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability$1(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n_export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve( this, x);\n }\n});\n\n_export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability$1(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction$1(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability$1(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction$1(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n\nvar getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\nvar nativeStartsWith = ''.startsWith;\nvar min$4 = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor$4(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n_export({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegexp(searchString);\n var index = toLength(min$4(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\nvar getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n};\n\nvar instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n};\n\nvar isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n};\n\nvar isObject$2 = function isObject(input) {\n return getConstructor$1(input) === Object;\n};\n\nvar isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n};\n\nvar isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n};\n\nvar isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n};\n\nvar isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n};\n\nvar isArray$2 = function isArray(input) {\n return Array.isArray(input);\n};\n\nvar isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n};\n\nvar isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n};\n\nvar isElement$1 = function isElement(input) {\n return instanceOf$1(input, Element);\n};\n\nvar isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n};\n\nvar isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n};\n\nvar isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n};\n\nvar isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n};\n\nvar isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n};\n\nvar isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise) && isFunction$1(input.then);\n};\n\nvar isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$2(input) || isNodeList$1(input)) && !input.length || isObject$2(input) && !Object.keys(input).length;\n};\n\nvar isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nvar is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$2,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$2,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n};\n\nvar transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n}(); // Force repaint of element\n\nfunction repaint(element, delay) {\n setTimeout(function () {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n element.hidden = false;\n } catch (e) {// Do nothing\n }\n }, delay);\n}\n\n// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\nvar browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\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\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod$5 = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction$1(callbackfn);\n var O = toObject(that);\n var self = indexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nvar arrayReduce = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod$5(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod$5(true)\n};\n\nvar $reduce = arrayReduce.left;\n\n\n\n\n\nvar STRICT_METHOD$5 = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH$9 = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !engineIsNode && engineV8Version > 79 && engineV8Version < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$5 || !USES_TO_LENGTH$9 || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nfunction cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n} // Get a nested value in an object\n\nfunction getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n} // Deep extend destination object with N more objects\n\nfunction extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n}\n\nfunction wrap$1(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // 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\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n} // Set attributes\n\nfunction setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n} // Create a DocumentFragment\n\nfunction createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n} // Inaert an element after another\n\nfunction insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n} // Insert a DocumentFragment\n\nfunction insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n} // Remove element(s)\n\nfunction removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n} // Remove all child elements\n\nfunction emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n} // Replace element\n\nfunction replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n} // Get an attribute object from a string selector\n\nfunction 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 if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = extend({}, existingAttributes);\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n\n var _parts = _slicedToArray(parts, 1),\n key = _parts[0];\n\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.string(existing.class)) {\n attributes.class = \"\".concat(existing.class, \" \").concat(className);\n } else {\n attributes.class = className;\n }\n\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 break;\n }\n });\n return extend(existing, attributes);\n} // Toggle hidden\n\nfunction toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n } // eslint-disable-next-line no-param-reassign\n\n\n element.hidden = hide;\n} // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\nfunction toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\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} // Has class name\n\nfunction hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n} // Element matches selector\n\nfunction matches$1(element, selector) {\n var _Element = Element,\n prototype = _Element.prototype;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n} // Closest ancestor element matching selector (also tests element itself)\n\nfunction closest(element, selector) {\n var _Element2 = Element,\n prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n function closestElement() {\n var el = this;\n\n do {\n if (matches$1.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n }\n\n var method = prototype.closest || closestElement;\n return method.call(element, selector);\n} // Find all elements\n\nfunction getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n} // Find a single element\n\nfunction getElement(selector) {\n return this.elements.container.querySelector(selector);\n} // Set focus and tab focus class\n\nfunction setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n\nvar 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}; // Check for feature support\n\nvar support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\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: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\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 // Detect transitions support\n transitions: transitionEndEvent !== false,\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\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\n\nvar supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n}(); // Toggle event listener\n\n\nfunction toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n} // Bind event handler\n\nfunction on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n} // Unbind event handler\n\nfunction off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n} // Bind once-only event handler\n\nfunction once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n} // Trigger event\n\nfunction triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n} // Unbind all cached event listeners\n\nfunction unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n} // Run method when / if player is ready\n\nfunction ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n}\n\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n\nfunction silencePromise(value) {\n if (is$1.promise(value)) {\n value.then(null, function () {});\n }\n}\n\nfunction validateRatio(input) {\n if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {\n return false;\n }\n\n var ratio = is$1.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is$1.number);\n}\nfunction reduceAspectRatio(ratio) {\n if (!is$1.array(ratio) || !ratio.every(is$1.number)) {\n return null;\n }\n\n var _ratio = _slicedToArray(ratio, 2),\n width = _ratio[0],\n height = _ratio[1];\n\n var getDivider = function getDivider(w, h) {\n return h === 0 ? w : getDivider(h, w % h);\n };\n\n var divider = getDivider(width, height);\n return [width / divider, height / divider];\n}\nfunction getAspectRatio(input) {\n var parse = function parse(ratio) {\n return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n }; // Try provided ratio\n\n\n var ratio = parse(input); // Get from config\n\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n } // Get from embed\n\n\n if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {\n ratio = this.embed.ratio;\n } // Get from HTML5 video\n\n\n if (ratio === null && this.isHTML5) {\n var _this$media = this.media,\n videoWidth = _this$media.videoWidth,\n videoHeight = _this$media.videoHeight;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n} // Set aspect ratio for responsive container\n\nfunction setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n var wrapper = this.elements.wrapper;\n var ratio = getAspectRatio.call(this, input);\n\n var _ref = is$1.array(ratio) ? ratio : [0, 0],\n _ref2 = _slicedToArray(_ref, 2),\n w = _ref2[0],\n h = _ref2[1];\n\n var padding = 100 / w * h;\n wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n var offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n}\n\nvar html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n } // Get sizes from <source> elements\n\n\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('size'));\n }).filter(Boolean);\n },\n setup: function setup() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n if (!is$1.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n } // Quality\n\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (s) {\n return s.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('size'));\n },\n set: function set(input) {\n if (player.quality === input) {\n return;\n } // If we're using an an external handler...\n\n\n if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (s) {\n return Number(s.getAttribute('size')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState,\n playbackRate = _player$media.playbackRate; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.speed = playbackRate;\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n silencePromise(player.play());\n }\n }); // Load new source\n\n player.media.load();\n }\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // 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\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n};\n\nfunction dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n} // Get the closest value in an array\n\nfunction closest$1(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n}\n\nvar defineProperty$6 = objectDefineProperty.f;\nvar getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;\n\n\n\n\n\nvar setInternalState$7 = internalState.set;\n\n\n\nvar MATCH$2 = wellKnownSymbol('match');\nvar NativeRegExp = global_1.RegExp;\nvar RegExpPrototype$1 = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED$4 = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$2 || fails(function () {\n re2[MATCH$2] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED$4) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegexp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = regexpFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y$2) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype$1,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y$2 && sticky) setInternalState$7(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty$6(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys$2 = getOwnPropertyNames$1(NativeRegExp);\n var index = 0;\n while (keys$2.length > index) proxy(keys$2[index++]);\n RegExpPrototype$1.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype$1;\n redefine(global_1, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n\nfunction generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n} // Format string\n\nfunction format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n} // Get percentage\n\nfunction 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} // Replace all occurances of a string in a string\n\nvar replaceAll = function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}; // Convert to title case\n\nvar toTitleCase = function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n}; // Convert string to pascalCase\n\nfunction toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n} // Convert string to pascalCase\n\nfunction toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n} // Remove HTML from a string\n\nfunction stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n} // Like outerHTML, but also works for DocumentFragment\n\nfunction getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n\nvar resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n};\nvar i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n k = _ref2[0],\n v = _ref2[1];\n\n string = replaceAll(string, k, v);\n });\n return string;\n }\n};\n\nvar Storage = /*#__PURE__*/function () {\n function Storage(player) {\n _classCallCheck(this, Storage);\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, [{\n key: \"get\",\n value: function get(key) {\n if (!Storage.supported || !this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n }\n }, {\n key: \"set\",\n value: function set(object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = this.get(); // Default to empty object\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(this.key, JSON.stringify(storage));\n }\n }], [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // 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\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n}();\n\n// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\nfunction fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\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 request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// ==========================================================================\n\nfunction loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n}\n\nvar ceil$1 = Math.ceil;\nvar floor$5 = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.github.io/ecma262/#sec-math.trunc\n_export({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor$5 : ceil$1)(it);\n }\n});\n\nvar getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n};\nvar getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n};\nvar getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n}; // Format time to UI friendly string\n\nfunction formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n}\n\nvar controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\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 }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\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 }; // Display\n\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 }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\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); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // 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\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n\n var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var _this = this;\n\n var attributes = extend({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some(function (c) {\n return c === _this.config.classNames.control;\n })) {\n extend(attributes, {\n class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.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 // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\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 }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type, attrs) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\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: function bindMenuItemShortcuts(menuItem, type) {\n var _this2 = this;\n\n // Navigate through menus via arrow keys and space\n on.call(this, menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this2, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this2, target, true);\n }\n }\n }, false); // 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\n on.call(this, menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this2, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this3 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(check) {\n // Ensure exclusivity\n if (check) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this3.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this3.quality = value;\n break;\n\n case 'speed':\n _this3.speed = parseFloat(value);\n break;\n }\n\n controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this4 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var val = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = val; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = val;\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); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this5 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(show) {\n return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n\n if (is$1.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 } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function 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 } // 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\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(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 // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this6.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this6, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this6.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this6, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this6, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\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 if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this7.captions.toggled && _this7.currentTrack === value,\n title: captions.getLabel.call(_this7, track),\n badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu() {\n var _this8 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n this.options.speed = this.options.speed.filter(function (o) {\n return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this8, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this8, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (p) {\n return !p.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;\n var isMenuItem = popup.contains(target); // 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\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.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$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this9 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function 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 } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this9, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl: function setDownloadUrl() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set attribute\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create: function create(data) {\n var _this10 = this;\n\n var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n createButton = controls.createButton,\n createProgress = controls.createProgress,\n createRange = controls.createRange,\n createTime = controls.createTime,\n setQualityMenu = controls.setQualityMenu,\n setSpeedMenu = controls.setSpeedMenu,\n showMenuPanel = controls.showMenuPanel;\n this.elements.controls = null; // Larger overlaid play button\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n } // Create the container\n\n\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container; // Default item attributes\n\n var defaultAttributes = {\n class: 'plyr__controls__item'\n }; // Loop through controls in order\n\n dedupe(is$1.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n } // Rewind button\n\n\n if (control === 'rewind') {\n container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n } // Play/Pause button\n\n\n if (control === 'play') {\n container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n } // Fast forward button\n\n\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n } // Progress\n\n\n if (control === 'progress') {\n var progressContainer = createElement('div', {\n class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n });\n var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(createRange.call(_this10, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (_this10.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: _this10.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n _this10.elements.display.seekTooltip = tooltip;\n }\n\n _this10.elements.progress = progress;\n progressContainer.appendChild(_this10.elements.progress);\n container.appendChild(progressContainer);\n } // Media current time display\n\n\n if (control === 'current-time') {\n container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n } // Media duration display\n\n\n if (control === 'duration') {\n container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n } // Volume controls\n\n\n if (control === 'mute' || control === 'volume') {\n var volume = _this10.elements.volume; // Create the volume container if needed\n\n if (!is$1.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n }));\n _this10.elements.volume = volume;\n container.appendChild(volume);\n } // Toggle mute button\n\n\n if (control === 'mute') {\n volume.appendChild(createButton.call(_this10, 'mute'));\n } // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: _this10.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n }\n } // Toggle captions button\n\n\n if (control === 'captions') {\n container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n } // Settings button / menu\n\n\n if (control === 'settings' && !is$1.empty(_this10.config.settings)) {\n var wrapper = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(_this10, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n _this10.elements.settings.panels.home = home; // Build the menu items\n\n _this10.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n on.call(_this10, menuItem, 'click', function () {\n showMenuPanel.call(_this10, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this10.config));\n var value = createElement('span', {\n class: _this10.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this10.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this10.config.classNames.hidden\n }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n on.call(_this10, pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n showMenuPanel.call(_this10, 'home', true);\n }, false); // Go back via button click\n\n on.call(_this10, backButton, 'click', function () {\n showMenuPanel.call(_this10, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this10.elements.settings.buttons[type] = menuItem;\n _this10.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n _this10.elements.settings.popup = popup;\n _this10.elements.settings.menu = wrapper;\n } // Picture in picture button\n\n\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n } // Airplay button\n\n\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n } // Download button\n\n\n if (control === 'download') {\n var _attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: _this10.download,\n target: '_blank'\n }); // Set download attribute for HTML5 only\n\n\n if (_this10.isHTML5) {\n _attributes.download = '';\n }\n\n var download = _this10.config.urls.download;\n\n if (!is$1.url(download) && _this10.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(_this10.provider),\n label: _this10.provider\n });\n }\n\n container.appendChild(createButton.call(_this10, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n }\n }); // Set available quality levels\n\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this11 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.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) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this11.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this11.config.classNames.hidden, false);\n toggleClass(label, _this11.config.classNames.tooltip, true);\n });\n }\n }\n};\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 */\n\nfunction parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var 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} // Convert object to URLSearchParams\n\nfunction buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n}\n\nvar captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\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\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n } // Add event listener for cue changes\n\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n 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\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n } // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n\n\n setTimeout(function () {\n if (active && _this2.captions.toggled) {\n _this2.captions.currentTrackNode.mode = 'hidden';\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: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.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 var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\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 // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\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: function getTracks() {\n var _this3 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // 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\n return tracks.filter(function (track) {\n return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this4 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this4.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (t) {\n return t.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.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 // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var 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 var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n};\n\n// ==========================================================================\n// Plyr default config\n// ==========================================================================\nvar defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\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 // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\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 // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 // URLs\n urls: {\n download: null,\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/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\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 download: '[data-plyr=\"download\"]',\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',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\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 tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n }\n};\n\n// ==========================================================================\n// Plyr states\n// ==========================================================================\nvar pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n};\n\n// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\nvar providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n};\nvar types = {\n audio: 'audio',\n video: 'video'\n};\n/**\n * Get provider by URL\n * @param {String} url\n */\n\nfunction getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\n// ==========================================================================\n// Console wrapper\n// ==========================================================================\nvar noop = function noop() {};\n\nvar Console = /*#__PURE__*/function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n}();\n\nvar Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(player) {\n var _this = this;\n\n _classCallCheck(this, Fullscreen);\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n\n this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n _this.onChange();\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n }); // Tap focus when in fullscreen\n\n on.call(this, this.player.elements.container, 'keydown', function (event) {\n return _this.trapFocus(event);\n }); // Update the UI\n\n this.update();\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"onChange\",\n value: function onChange() {\n if (!this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = this.active;\n } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event\n\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n }, {\n key: \"toggleFallback\",\n value: function toggleFallback() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\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 } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n }\n } // Toggle button and fire events\n\n\n this.onChange();\n } // Trap focus inside container\n\n }, {\n key: \"trapFocus\",\n value: function trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n var _focusable = _slicedToArray(focusable, 1),\n first = _focusable[0];\n\n var last = focusable[focusable.length - 1];\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 } // Update UI\n\n }, {\n key: \"update\",\n value: function update() {\n if (this.enabled) {\n var mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);\n } // Make an element fullscreen\n\n }, {\n key: \"enter\",\n value: function enter() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitEnterFullscreen();\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is$1.empty(this.prefix)) {\n this.target[\"\".concat(this.prefix, \"Request\").concat(this.property)]();\n }\n } // Bail from fullscreen\n\n }, {\n key: \"exit\",\n value: function exit() {\n if (!this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && this.player.config.fullscreen.iosNative) {\n this.target.webkitExitFullscreen();\n silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(false);\n } else if (!this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(this.prefix)) {\n var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(this.prefix).concat(action).concat(this.property)]();\n }\n } // Toggle state\n\n }, {\n key: \"toggle\",\n value: function toggle() {\n if (!this.active) {\n this.enter();\n } else {\n this.exit();\n }\n }\n }, {\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n}();\n\n// `Math.sign` method implementation\n// https://tc39.github.io/ecma262/#sec-math.sign\nvar mathSign = 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// `Math.sign` method\n// https://tc39.github.io/ecma262/#sec-math.sign\n_export({ target: 'Math', stat: true }, {\n sign: mathSign\n});\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// ==========================================================================\nfunction loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n}\n\nvar ui = {\n addStyleHook: function 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 // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset speed\n\n this.speed = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\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\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('data-poster', poster); // Show the poster\n\n this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(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(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\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); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n Object.assign(target, {\n pressed: _this3.playing\n });\n target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controlsElement = this.elements.controls;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles: function migrateStyles() {\n var _this5 = this;\n\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n .filter(function (key) {\n return !is$1.empty(key) && is$1.string(key) && key.startsWith('--plyr');\n }).forEach(function (key) {\n // Set on the container\n _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n _this5.media.style.removeProperty(key);\n }); // Remove attribute if empty\n\n if (is$1.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n};\n\nvar Listeners = /*#__PURE__*/function () {\n function Listeners(player) {\n _classCallCheck(this, Listeners);\n\n this.player = player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\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 } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\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 var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n 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)\n\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\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\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\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\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }, {\n key: \"firstTouch\",\n value: function firstTouch() {\n var player = this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n }\n }, {\n key: \"setTabFocus\",\n value: function setTabFocus(event) {\n var player = this.player;\n var elements = player.elements;\n clearTimeout(this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n if (event.type !== 'focusout') {\n this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n } // Global window & document listeners\n\n }, {\n key: \"global\",\n value: function global() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);\n } // Container listeners\n\n }, {\n key: \"container\",\n value: function container() {\n var player = this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controlsElement = elements.controls; // Remove button states for fullscreen\n\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio = _slicedToArray(ratio, 2),\n y = _ratio[1];\n\n var _getAspectRatio$call = getAspectRatio.call(player),\n _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n videoX = _getAspectRatio$call2[0],\n videoY = _getAspectRatio$call2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n if (target !== elements.container) {\n return;\n } // If it's not an embed and no ratio specified\n\n\n if (!player.isEmbed && is$1.empty(player.config.ratio)) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n if (isEnter) {\n setTimeout(function () {\n return repaint(elements.container);\n }, 100);\n } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n } // Listen for media events\n\n }, {\n key: \"media\",\n value: function media() {\n var _this = this;\n\n var player = this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n player.pause();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, function () {\n silencePromise(player.play());\n }, 'play');\n } else {\n _this.proxy(event, function () {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadUrl.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\n if (event.type === 'error') {\n detail = player.media.error;\n }\n\n triggerEvent.call(player, elements.container, event.type, true, detail);\n });\n } // Run default and custom handlers\n\n }, {\n key: \"proxy\",\n value: function proxy(event, defaultHandler, customHandlerKey) {\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned !== false && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n } // Trigger custom and default handlers\n\n }, {\n key: \"bind\",\n value: function bind(element, type, defaultHandler, customHandlerKey) {\n var _this2 = this;\n\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this2.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n } // Listen for control events\n\n }, {\n key: \"controls\",\n value: function controls$1() {\n var _this3 = this;\n\n var player = this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this3.bind(button, 'click', function () {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n } // Pause\n\n\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n this.bind(elements.buttons.rewind, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind'); // Rewind\n\n this.bind(elements.buttons.fastForward, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward'); // Mute toggle\n\n this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\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\n this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\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\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this3.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n this.bind(elements.progress, 'mouseleave touchend click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this3.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n this.bind(elements.display.currentTime, 'click', function () {\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 } // Volume\n\n\n this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(function (c) {\n return !c.contains(elements.container);\n }).forEach(function (child) {\n _this3.bind(child, 'mouseenter mouseleave', function (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\n\n this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this3.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n }\n }]);\n\n return Listeners;\n}();\n\nvar HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH$a = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max$3 = Math.max;\nvar min$5 = Math.min;\nvar MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$a }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min$5(max$3(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n});\n\nvar loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\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 */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function 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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; // tag IE9+\n\n isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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]; // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // resolve Promise\n\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n } // publish bundle load event\n\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\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 */\n\n\n loadjs.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 return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n});\n\nfunction loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n}\n\nfunction parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nvar vimeo = {\n setup: function setup() {\n var player = this; // Add embed class for responsive\n\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set intial ratio\n\n setAspectRatio.call(player); // Load the SDK if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(player);\n }).catch(function (error) {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready: function ready() {\n var _this = this;\n\n var player = this;\n var config = player.config.vimeo;\n\n var premium = config.premium,\n referrerPolicy = config.referrerPolicy,\n frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n } // Get Vimeo params for the iframe\n\n\n var params = buildUrlParams(_objectSpread2({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, frameParams)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required\n\n if (!is$1.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n } // Inject the package\n\n\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n var wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n } // Get poster image\n\n\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n if (is$1.empty(response) || !response.thumbnail_url) {\n return;\n } // Set and show poster\n\n\n ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n });\n } // Setup instance\n // https://github.com/vimeo/player.js\n\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function () {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(function (error) {\n _this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = [width, height];\n setAspectRatio.call(_this);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', function () {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', function () {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n }\n};\n\nfunction parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nfunction getHost$1(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n } // Use YouTube's default\n\n\n return undefined;\n}\n\nvar youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n // Call global callback if set\n if (is$1.function(callback)) {\n callback();\n }\n\n youtube.ready.call(_this);\n }; // Load the SDK\n\n\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n var url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(function (data) {\n if (is$1.object(data)) {\n var title = data.title,\n height = data.height,\n width = data.width; // Set title\n\n _this2.config.title = title;\n ui.setTitle.call(_this2); // Set aspect ratio\n\n _this2.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(_this2);\n }).catch(function () {\n // Set aspect ratio\n setAspectRatio.call(_this2);\n });\n },\n // API ready\n ready: function ready() {\n var player = this;\n var config = player.config.youtube; // Ignore already setup (race condition)\n\n var currentId = player.media && player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Replace media element\n\n var container = createElement('div', {\n id: id,\n 'data-poster': config.customControls ? player.poster : undefined\n });\n player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n if (config.customControls) {\n var posterSrc = function posterSrc(s) {\n return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (src) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n } // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n\n player.embed = new window.YT.Player(player.media, {\n videoId: videoId,\n host: getHost$1(config),\n playerVars: extend({}, {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\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 player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function 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 } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n player.options.speed = speeds.filter(function (s) {\n return player.config.speed.options.includes(s);\n }); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui && config.customControls) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n }\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var 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 } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\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 (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // 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\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\n assurePlaybackState$1.call(player, false);\n break;\n\n case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n};\n\nvar media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap$1(this.media, this.elements.wrapper); // Poster image container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: ''\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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\nvar destroy = function destroy(instance) {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n } // Destroy our adsManager\n\n\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nvar Ads = /*#__PURE__*/function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n this.player = player;\n this.config = player.config.ads;\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; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"load\",\n\n /**\n * Load the IMA SDK\n */\n value: function load() {\n var _this2 = this;\n\n if (!this.enabled) {\n return;\n } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(this.player.config.urls.googleIMA.sdk).then(function () {\n _this2.ready();\n }).catch(function () {\n // Script failed to load or is blocked\n _this2.trigger('error', new Error('Google IMA SDK failed to load'));\n });\n } else {\n this.ready();\n }\n }\n /**\n * Get the ads instance ready\n */\n\n }, {\n key: \"ready\",\n value: function ready() {\n var _this3 = this;\n\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n } // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n\n\n this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n this.managerPromise.then(function () {\n _this3.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n this.listeners(); // Setup the IMA SDK\n\n this.setupIMA();\n } // Build the tag URL\n\n }, {\n key: \"setupIMA\",\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 value: function setupIMA() {\n var _this4 = this;\n\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); // So we can run VPAID2\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Create ads loader\n\n this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this4.onAdsManagerLoaded(event);\n }, false);\n this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this4.onAdError(error);\n }, false); // Request video ads to be pre-loaded\n\n this.requestAds();\n }\n /**\n * Request advertisements\n */\n\n }, {\n key: \"requestAds\",\n value: function requestAds() {\n var container = this.player.elements.container;\n\n try {\n // Request video ads\n var request = new google.ima.AdsRequest();\n request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!this.player.muted);\n this.loader.requestAds(request);\n } catch (e) {\n this.onAdError(e);\n }\n }\n /**\n * Update the ad countdown\n * @param {Boolean} start\n */\n\n }, {\n key: \"pollCountdown\",\n value: function pollCountdown() {\n var _this5 = this;\n\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(this.countdownTimer);\n this.elements.container.removeAttribute('data-badge-text');\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this5.player.config), \" - \").concat(time);\n\n _this5.elements.container.setAttribute('data-badge-text', label);\n };\n\n this.countdownTimer = setInterval(update, 100);\n }\n /**\n * This method is called whenever the ads are ready inside the AdDisplayContainer\n * @param {Event} adsManagerLoadedEvent\n */\n\n }, {\n key: \"onAdsManagerLoaded\",\n value: function onAdsManagerLoaded(event) {\n var _this6 = this;\n\n // Load could occur after a source change (race condition)\n if (!this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // 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\n this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n this.cuePoints = this.manager.getCuePoints(); // Add listeners to the required events\n // Advertisement error events\n\n this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this6.onAdError(error);\n }); // Advertisement regular events\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n return _this6.onAdEvent(e);\n });\n }); // Resolve our adsManager\n\n this.trigger('loaded');\n }\n }, {\n key: \"addCuePoints\",\n value: function addCuePoints() {\n var _this7 = this;\n\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(this.cuePoints)) {\n this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {\n var seekElement = _this7.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this7.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this7.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\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\n }, {\n key: \"onAdEvent\",\n value: function onAdEvent(event) {\n var _this8 = this;\n\n var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n triggerEvent.call(_this8.player, _this8.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n }; // Bubble the event\n\n\n dispatchEvent(event.type);\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'); // Start countdown\n\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 } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\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 // 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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 this.pauseContent();\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 this.pollCountdown();\n this.resumeContent();\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n }\n }\n /**\n * Any ad error handling comes through here\n * @param {Event} event\n */\n\n }, {\n key: \"onAdError\",\n value: function onAdError(event) {\n this.cancel();\n this.player.debug.warn('Ads error', event);\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\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this9 = this;\n\n var container = this.player.elements.container;\n var time;\n this.player.on('canplay', function () {\n _this9.addCuePoints();\n });\n this.player.on('ended', function () {\n _this9.loader.contentComplete();\n });\n this.player.on('timeupdate', function () {\n time = _this9.player.currentTime;\n });\n this.player.on('seeked', function () {\n var seekedTime = _this9.player.currentTime;\n\n if (is$1.empty(_this9.cuePoints)) {\n return;\n }\n\n _this9.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this9.manager.discardAdBreak();\n\n _this9.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n window.addEventListener('resize', function () {\n if (_this9.manager) {\n _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n }\n /**\n * Initialize the adsManager and start playing advertisements\n */\n\n }, {\n key: \"play\",\n value: function play() {\n var _this10 = this;\n\n var container = this.player.elements.container;\n\n if (!this.managerPromise) {\n this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n this.managerPromise.then(function () {\n // Set volume to match player\n _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\n _this10.elements.displayContainer.initialize();\n\n try {\n if (!_this10.initialized) {\n // Initialize the ads manager. Ad rules playlist will start at this time\n _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // 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\n\n _this10.manager.start();\n }\n\n _this10.initialized = true;\n } catch (adError) {\n // An error may be thrown if there was a problem with the\n // VAST response\n _this10.onAdError(adError);\n }\n }).catch(function () {});\n }\n /**\n * Resume our video\n */\n\n }, {\n key: \"resumeContent\",\n value: function resumeContent() {\n // Hide the advertisement container\n this.elements.container.style.zIndex = ''; // Ad is stopped\n\n this.playing = false; // Play video\n\n silencePromise(this.player.media.play());\n }\n /**\n * Pause our video\n */\n\n }, {\n key: \"pauseContent\",\n value: function pauseContent() {\n // Show the advertisement container\n this.elements.container.style.zIndex = 3; // Ad is playing\n\n this.playing = true; // Pause our video.\n\n this.player.media.pause();\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\n }, {\n key: \"cancel\",\n value: function cancel() {\n // Pause our video\n if (this.initialized) {\n this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n this.trigger('error'); // Re-create our adsManager\n\n this.loadAds();\n }\n /**\n * Re-create our adsManager\n */\n\n }, {\n key: \"loadAds\",\n value: function loadAds() {\n var _this11 = this;\n\n // Tell our adsManager to go bye bye\n this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this11.manager) {\n _this11.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this11.managerPromise = new Promise(function (resolve) {\n _this11.on('loaded', resolve);\n\n _this11.player.debug.log(_this11.manager);\n }); // Now that the manager has been destroyed set it to also be un-initialized\n\n _this11.initialized = false; // Now request some new advertisements\n\n _this11.requestAds();\n }).catch(function () {});\n }\n /**\n * Handles callbacks after an ad event was invoked\n * @param {String} event - Event type\n */\n\n }, {\n key: \"trigger\",\n value: function trigger(event) {\n var _this12 = this;\n\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this12, args);\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\n }, {\n key: \"on\",\n value: function on(event, callback) {\n if (!is$1.array(this.events[event])) {\n this.events[event] = [];\n }\n\n this.events[event].push(callback);\n return this;\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\n }, {\n key: \"startSafetyTimer\",\n value: function startSafetyTimer(time, from) {\n var _this13 = this;\n\n this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n this.safetyTimer = setTimeout(function () {\n _this13.cancel();\n\n _this13.clearSafetyTimer('startSafetyTimer()');\n }, time);\n }\n /**\n * Clear our safety timer(s)\n * @param {String} from\n */\n\n }, {\n key: \"clearSafetyTimer\",\n value: function clearSafetyTimer(from) {\n if (!is$1.nullOrUndefined(this.safetyTimer)) {\n this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n clearTimeout(this.safetyTimer);\n this.safetyTimer = null;\n }\n }\n }, {\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n }, {\n key: \"tagUrl\",\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var 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: config.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\n }\n }]);\n\n return Ads;\n}();\n\nvar $findIndex = arrayIteration.findIndex;\n\n\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES$1 = true;\n\nvar USES_TO_LENGTH$b = arrayMethodUsesToLength(FIND_INDEX);\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES$1 = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n_export({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 || !USES_TO_LENGTH$b }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n\nvar min$6 = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD$6 = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH$c = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED$5 = NEGATIVE_ZERO$1 || !STRICT_METHOD$6 || !USES_TO_LENGTH$c;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nvar arrayLastIndexOf = FORCED$5 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min$6(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n_export({ target: 'Array', proto: true, forced: arrayLastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: arrayLastIndexOf\n});\n\nvar parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n};\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\nvar fitRatio = function fitRatio(ratio, outer) {\n var targetRatio = outer.width / outer.height;\n var result = {};\n\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = 1 / ratio * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nvar PreviewThumbnails = /*#__PURE__*/function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n _classCallCheck(this, PreviewThumbnails);\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"load\",\n value: function load() {\n var _this = this;\n\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(function () {\n if (!_this.enabled) {\n return;\n } // Render DOM elements\n\n\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n } // Download VTT files and parse them\n\n }, {\n key: \"getThumbnails\",\n value: function getThumbnails() {\n var _this2 = this;\n\n return new Promise(function (resolve) {\n var src = _this2.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // Resolve promise\n\n\n var sortAndResolve = function sortAndResolve() {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this2.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);\n\n resolve();\n }; // Via callback()\n\n\n if (is$1.function(src)) {\n src(function (thumbnails) {\n _this2.thumbnails = thumbnails;\n sortAndResolve();\n });\n } // VTT urls\n else {\n // If string, convert into single-element list\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this2.getThumbnail(u);\n }); // Resolve\n\n Promise.all(promises).then(sortAndResolve);\n }\n });\n } // Process individual VTT file\n\n }, {\n key: \"getThumbnail\",\n value: function getThumbnail(url) {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this3.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n }, {\n key: \"startMove\",\n value: function startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = this.player.elements.progress.getBoundingClientRect();\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX; // Set time text inside image container\n\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n } // Download and show image\n\n\n this.showImageAtCurrentTime();\n }\n }, {\n key: \"endMove\",\n value: function endMove() {\n this.toggleThumbContainer(false, true);\n }\n }, {\n key: \"startScrubbing\",\n value: function startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true; // Wait until media has a duration\n\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true); // Download and show image\n\n this.showImageAtCurrentTime();\n }\n }\n }\n }, {\n key: \"endScrubbing\",\n value: function endScrubbing() {\n var _this4 = this;\n\n this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this4.mouseDown) {\n _this4.toggleScrubbingContainer(false);\n }\n });\n }\n }\n /**\n * Setup hooks for Plyr and window events\n */\n\n }, {\n key: \"listeners\",\n value: function listeners() {\n var _this5 = this;\n\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', function () {\n _this5.toggleThumbContainer(false, true);\n });\n this.player.on('seeked', function () {\n _this5.toggleThumbContainer(false);\n });\n this.player.on('timeupdate', function () {\n _this5.lastTime = _this5.player.media.currentTime;\n });\n }\n /**\n * Create HTML elements for image containers\n */\n\n }, {\n key: \"render\",\n value: function render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n var timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer\n });\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n if (is$1.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n } // Create HTML element: plyr__preview-scrubbing-container\n\n\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n }, {\n key: \"destroy\",\n value: function destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n }, {\n key: \"showImageAtCurrentTime\",\n value: function showImageAtCurrentTime() {\n var _this6 = this;\n\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {\n return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;\n });\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n } // No matching thumb found\n\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n this.thumbnails.forEach(function (thumbnail, index) {\n if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n } // Show the image that's currently specified in this.showingThumb\n\n }, {\n key: \"loadImage\",\n value: function loadImage() {\n var _this7 = this;\n\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = this.showingThumb;\n var thumbnail = this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n previewImage.onload = function () {\n return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n }, {\n key: \"showImage\",\n value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n } // Remove all preview images that aren't the designated current image\n\n }, {\n key: \"removeOldImages\",\n value: function removeOldImages(currentImage) {\n var _this8 = this;\n\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this8.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this8.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this8.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n\n }, {\n key: \"preloadNearby\",\n value: function preloadNearby(thumbNum) {\n var _this9 = this;\n\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;\n\n if (_this9.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this9.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this9.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this9.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this9.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n } // If user has been hovering current image for half a second, look for a higher quality one\n\n }, {\n key: \"getHigherQuality\",\n value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n var _this10 = this;\n\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this10.showingThumbFilename === thumbFilename) {\n _this10.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this10.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n }, {\n key: \"toggleThumbContainer\",\n value: function toggleThumbContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"toggleScrubbingContainer\",\n value: function toggleScrubbingContainer() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n }, {\n key: \"determineContainerAutoSizing\",\n value: function determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n\n }, {\n key: \"setThumbContainerSizeAndPos\",\n value: function setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(this.thumbContainerHeight, \"px\");\n this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {\n var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n\n this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {\n var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n }\n\n this.setThumbContainerPos();\n }\n }, {\n key: \"setThumbContainerPos\",\n value: function setThumbContainerPos() {\n var seekbarRect = this.player.elements.progress.getBoundingClientRect();\n var plyrRect = this.player.elements.container.getBoundingClientRect();\n var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n } // Can't use 100% width, in case the video is a different aspect ratio to the video container\n\n }, {\n key: \"setScrubbingContainerSize\",\n value: function setScrubbingContainerSize() {\n var _fitRatio = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n width = _fitRatio.width,\n height = _fitRatio.height;\n\n this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n } // Sprites need to be offset to the correct location\n\n }, {\n key: \"setImageSizeAndOffset\",\n value: function setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n height = _fitRatio2.height;\n\n return height;\n } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n}();\n\nvar source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Update previewThumbnails config & reload plugin\n\n\n if (!is$1.empty(input.previewThumbnails)) {\n Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n _this2.previewThumbnails.destroy();\n\n _this2.previewThumbnails = null;\n } // Create new instance if it is still enabled\n\n\n if (_this2.config.previewThumbnails.enabled) {\n _this2.previewThumbnails = new PreviewThumbnails(_this2);\n }\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n};\n\n/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nfunction clamp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n return Math.min(Math.max(input, min), max);\n}\n\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n// Plyr instance\n\nvar Plyr = /*#__PURE__*/function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n fullscreen: 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 }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var type = this.media.tagName.toLowerCase(); // Embed properties\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.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); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\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 } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap$1(this.media, this.elements.container);\n } // Migrate custom properties from media to container (so they work 😉)\n\n\n ui.migrateStyles.call(this); // Add style hook\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup fullscreen\n\n\n this.fullscreen = new Fullscreen(this); // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', function () {\n return silencePromise(_this.play());\n });\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"play\",\n\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n value: function play() {\n var _this2 = this;\n\n if (!is$1.function(this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(function () {\n return _this2.ads.play();\n }).catch(function () {\n return silencePromise(_this2.media.play());\n });\n } // Return the promise (for HTML5)\n\n\n return this.media.play();\n }\n /**\n * Pause the media\n */\n\n }, {\n key: \"pause\",\n value: function pause() {\n if (!this.playing || !is$1.function(this.media.pause)) {\n return null;\n }\n\n return this.media.pause();\n }\n /**\n * Get playing state\n */\n\n }, {\n key: \"togglePlay\",\n\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n value: function togglePlay(input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !this.playing;\n\n if (toggle) {\n return this.play();\n }\n\n return this.pause();\n }\n /**\n * Stop playback\n */\n\n }, {\n key: \"stop\",\n value: function stop() {\n if (this.isHTML5) {\n this.pause();\n this.restart();\n } else if (is$1.function(this.media.stop)) {\n this.media.stop();\n }\n }\n /**\n * Restart playback\n */\n\n }, {\n key: \"restart\",\n value: function restart() {\n this.currentTime = 0;\n }\n /**\n * Rewind\n * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"rewind\",\n value: function rewind(seekTime) {\n this.currentTime -= is$1.number(seekTime) ? seekTime : this.config.seekTime;\n }\n /**\n * Fast forward\n * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime\n */\n\n }, {\n key: \"forward\",\n value: function forward(seekTime) {\n this.currentTime += is$1.number(seekTime) ? seekTime : this.config.seekTime;\n }\n /**\n * Seek to a time\n * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)\n */\n\n }, {\n key: \"increaseVolume\",\n\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n value: function increaseVolume(step) {\n var volume = this.media.muted ? 0 : this.volume;\n this.volume = volume + (is$1.number(step) ? step : 0);\n }\n /**\n * Decrease volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"decreaseVolume\",\n value: function decreaseVolume(step) {\n this.increaseVolume(-step);\n }\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n\n }, {\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"airplay\",\n\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n value: function airplay() {\n // Show dialog if supported\n if (support.airplay) {\n this.media.webkitShowPlaybackTargetPicker();\n }\n }\n /**\n * Toggle the player controls\n * @param {Boolean} [toggle] - Whether to show the controls\n */\n\n }, {\n key: \"toggleControls\",\n value: function 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 var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && is$1.array(this.config.controls) && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {\n controls.toggleMenu.call(this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(this, this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n }\n /**\n * Add event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"on\",\n value: function on$1(event, callback) {\n on.call(this, this.elements.container, event, callback);\n }\n /**\n * Add event listeners once\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"once\",\n value: function once$1(event, callback) {\n once.call(this, this.elements.container, event, callback);\n }\n /**\n * Remove event listeners\n * @param {String} event - Event type\n * @param {Function} callback - Callback for when event occurs\n */\n\n }, {\n key: \"off\",\n value: function off$1(event, callback) {\n off(this.elements.container, event, callback);\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\n }, {\n key: \"destroy\",\n value: function destroy(callback) {\n var _this3 = this;\n\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this3.embed = null; // If it's a soft destroy, make minimal changes\n\n if (soft) {\n if (Object.keys(_this3.elements).length) {\n // Remove elements\n removeElement(_this3.elements.buttons.play);\n removeElement(_this3.elements.captions);\n removeElement(_this3.elements.controls);\n removeElement(_this3.elements.wrapper); // Clear for GC\n\n _this3.elements.buttons.play = null;\n _this3.elements.captions = null;\n _this3.elements.controls = null;\n _this3.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this3); // Cancel current network requests\n\n html5.cancelRequests.call(_this3); // Replace the container with the original element provided\n\n replaceElement(_this3.elements.original, _this3.elements.container); // Event\n\n triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this3.elements.original);\n } // Reset state\n\n\n _this3.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this3.elements = null;\n _this3.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n this.stop(); // Clear timeouts\n\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized); // Provider specific stuff\n\n if (this.isHTML5) {\n // Restore native video controls\n ui.toggleNativeControls.call(this, true); // Clean up\n\n done();\n } else if (this.isYouTube) {\n // Clear timers\n clearInterval(this.timers.buffering);\n clearInterval(this.timers.playing); // Destroy YouTube API\n\n if (this.embed !== null && is$1.function(this.embed.destroy)) {\n this.embed.destroy();\n } // Clean up\n\n\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 } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n }\n /**\n * Check for support for a mime type (HTML5 only)\n * @param {String} type - Mime type\n */\n\n }, {\n key: \"supports\",\n value: function supports(type) {\n return support.mime.call(this, type);\n }\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return this.provider === providers.html5;\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return this.isYouTube || this.isVimeo;\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return this.provider === providers.youtube;\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return this.provider === providers.vimeo;\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return this.type === types.video;\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return this.type === types.audio;\n }\n }, {\n key: \"playing\",\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n }, {\n key: \"currentTime\",\n set: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\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\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n }, {\n key: \"muted\",\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\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 } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var _this4 = this;\n\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Clamp to min/max\n\n\n var min = this.minimumSpeed,\n max = this.maximumSpeed;\n speed = clamp(speed, min, max); // Update config\n\n this.config.speed.selected = speed; // Set media speed\n\n setTimeout(function () {\n _this4.media.playbackRate = speed;\n }, 0);\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Get the minimum allowed speed\n */\n\n }, {\n key: \"minimumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 0.0625;\n }\n /**\n * Get the maximum allowed speed\n */\n\n }, {\n key: \"maximumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 16;\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest$1(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\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\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\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 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 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 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 default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the download URL\n */\n ,\n set: function set(input) {\n if (!is$1.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n controls.setDownloadUrl.call(this);\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(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(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n }\n /**\n * Get the current aspect ratio in use\n */\n\n }, {\n key: \"ratio\",\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n var ratio = reduceAspectRatio(getAspectRatio.call(this));\n return is$1.array(ratio) ? ratio.join(':') : ratio;\n }\n /**\n * Set video aspect ratio\n */\n ,\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is$1.string(input) || !validateRatio(input)) {\n this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n return;\n }\n\n this.config.ratio = input;\n setAspectRatio.call(this);\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\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\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\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\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n }], [{\n key: \"supported\",\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\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\n }, {\n key: \"loadSprite\",\n value: function loadSprite$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n}();\n\nPlyr.defaults = cloneDeep(defaults$1);\n\n// ==========================================================================\n\nexport default Plyr;\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\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 toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\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 (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","module.exports = false;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.7.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\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 nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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 isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","// `Symbol.prototype.description` getter\n// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar isObject = require('../internals/is-object');\nvar defineProperty = require('../internals/object-define-property').f;\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = global.Symbol;\n\nif (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? 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 ? ObjectPrototype : null;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\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","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var anObject = require('../internals/an-object');\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\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(String(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 var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === '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 } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\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(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\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] = [String(value)];\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\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (\r\n (new URLSearchParams('?a=1').toString() === 'a=1') &&\r\n (typeof URLSearchParams.prototype.set === 'function') &&\r\n (typeof URLSearchParams.prototype.entries === 'function')\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.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 if (typeof proto._fromString !== 'function') {\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 if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\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\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 global.URL('b', 'http://a');\r\n u.pathname = 'c d';\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 if (base && typeof base !== 'string') base = String(base);\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 base = base.toLowerCase();\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 var inputElement = doc.createElement('input');\r\n inputElement.type = 'url';\r\n inputElement.value = url;\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || (!inputElement.checkValidity() && !base)) {\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 global.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","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","'use strict';\nvar redefineAll = require('../internals/redefine-all');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar $has = require('../internals/has');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && $has(data, state.id) && delete data[state.id];\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && $has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n","'use strict';\nvar global = require('../internals/global');\nvar redefineAll = require('../internals/redefine-all');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceIternalState = require('../internals/internal-state').enforce;\nvar NATIVE_WEAK_MAP = require('../internals/native-weak-map');\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar $every = require('../internals/array-iteration').every;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('every');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var classof = require('../internals/classof-raw');\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nmodule.exports = function (value) {\n if (typeof value != 'number' && classof(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toInteger = require('../internals/to-integer');\nvar thisNumberValue = require('../internals/this-number-value');\nvar repeat = require('../internals/string-repeat');\nvar fails = require('../internals/fails');\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor = Math.floor;\n\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n$({ target: 'Number', proto: true, forced: FORCED }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow(2, 69, 1)) - 69;\n z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + repeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + repeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n }\n});\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","var $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar ownKeys = require('../internals/own-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar createProperty = require('../internals/create-property');\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(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 (\n global.addEventListener &&\n typeof postMessage == 'function' &&\n !global.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!IS_IOS && !IS_NODE && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\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 promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(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\nmodule.exports = queueMicrotask || 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","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can 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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\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 $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\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 var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (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\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/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","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 isEdge: window.navigator.userAgent.includes('Edge'),\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","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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","var $ = require('../internals/export');\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.github.io/ecma262/#sec-math.trunc\n$({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor : ceil)(it);\n }\n});\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = (value) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.3/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n }\n\n 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\n // Toggle button and fire events\n this.onChange();\n }\n\n // Trap focus inside container\n trapFocus(event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update() {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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","// `Math.sign` method implementation\n// https://tc39.github.io/ecma262/#sec-math.sign\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","var $ = require('../internals/export');\nvar sign = require('../internals/math-sign');\n\n// `Math.sign` method\n// https://tc39.github.io/ecma262/#sec-math.sign\n$({ target: 'Math', stat: true }, {\n sign: sign\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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n }\n\n // Container listeners\n container() {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', 'autoplay,fullscreen,picture-in-picture');\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load() {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready() {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n }\n\n addCuePoints() {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","'use strict';\nvar $ = require('../internals/export');\nvar $findIndex = require('../internals/array-iteration').findIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","var $ = require('../internals/export');\nvar lastIndexOf = require('../internals/array-last-index-of');\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: lastIndexOf\n});\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load() {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n }\n\n // Download VTT files and parse them\n getThumbnails() {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n }\n\n // Process individual VTT file\n getThumbnail(url) {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n }\n\n startMove(event) {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n\n endMove() {\n this.toggleThumbContainer(false, true);\n }\n\n startScrubbing(event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n }\n\n endScrubbing() {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n }\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners() {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n }\n\n /**\n * Create HTML elements for image containers\n */\n render() {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n }\n\n destroy() {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n }\n\n showImageAtCurrentTime() {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n }\n\n // Show the image that's currently specified in this.showingThumb\n loadImage(qualityIndex = 0) {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n }\n\n showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n }\n\n // Remove all preview images that aren't the designated current image\n removeOldImages(currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n }\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby(thumbNum, forward = true) {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n }\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n }\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer(toggle = false, clearShowing = false) {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n toggleScrubbingContainer(toggle = false) {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n }\n\n determineContainerAutoSizing() {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n }\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos() {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n }\n\n setThumbContainerPos() {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n }\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize() {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n }\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset(previewImage, frame) {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n }\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n","// ==========================================================================\n// Plyr\n// plyr.js v3.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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 {Boolean} 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","plyr.polyfilled.mjs","node_modules/core-js/internals/global.js","node_modules/core-js/internals/fails.js","node_modules/core-js/internals/descriptors.js","node_modules/core-js/internals/object-property-is-enumerable.js","node_modules/core-js/internals/create-property-descriptor.js","node_modules/core-js/internals/classof-raw.js","node_modules/core-js/internals/indexed-object.js","node_modules/core-js/internals/require-object-coercible.js","node_modules/core-js/internals/to-indexed-object.js","node_modules/core-js/internals/is-object.js","node_modules/core-js/internals/to-primitive.js","node_modules/core-js/internals/has.js","node_modules/core-js/internals/document-create-element.js","node_modules/core-js/internals/ie8-dom-define.js","node_modules/core-js/internals/object-get-own-property-descriptor.js","node_modules/core-js/internals/an-object.js","node_modules/core-js/internals/object-define-property.js","node_modules/core-js/internals/create-non-enumerable-property.js","node_modules/core-js/internals/set-global.js","node_modules/core-js/internals/shared-store.js","node_modules/core-js/internals/inspect-source.js","node_modules/core-js/internals/internal-state.js","node_modules/core-js/internals/native-weak-map.js","node_modules/core-js/internals/is-pure.js","node_modules/core-js/internals/shared.js","node_modules/core-js/internals/uid.js","node_modules/core-js/internals/shared-key.js","node_modules/core-js/internals/hidden-keys.js","node_modules/core-js/internals/object-create.js","node_modules/core-js/internals/redefine.js","node_modules/core-js/internals/path.js","node_modules/core-js/internals/get-built-in.js","node_modules/core-js/internals/to-integer.js","node_modules/core-js/internals/to-length.js","node_modules/core-js/internals/to-absolute-index.js","node_modules/core-js/internals/array-includes.js","node_modules/core-js/internals/object-keys-internal.js","node_modules/core-js/internals/enum-bug-keys.js","node_modules/core-js/internals/object-get-own-property-names.js","node_modules/core-js/internals/object-get-own-property-symbols.js","node_modules/core-js/internals/own-keys.js","node_modules/core-js/internals/copy-constructor-properties.js","node_modules/core-js/internals/is-forced.js","node_modules/core-js/internals/export.js","node_modules/core-js/internals/native-symbol.js","node_modules/core-js/internals/use-symbol-as-uid.js","node_modules/core-js/internals/is-array.js","node_modules/core-js/internals/to-object.js","node_modules/core-js/internals/object-keys.js","node_modules/core-js/internals/object-define-properties.js","node_modules/core-js/internals/html.js","node_modules/core-js/internals/object-get-own-property-names-external.js","node_modules/core-js/internals/well-known-symbol.js","node_modules/core-js/internals/well-known-symbol-wrapped.js","node_modules/core-js/internals/define-well-known-symbol.js","node_modules/core-js/internals/set-to-string-tag.js","node_modules/core-js/internals/a-function.js","node_modules/core-js/internals/function-bind-context.js","node_modules/core-js/internals/array-species-create.js","node_modules/core-js/internals/array-iteration.js","node_modules/core-js/modules/es.symbol.js","node_modules/core-js/modules/es.symbol.description.js","node_modules/core-js/modules/es.symbol.iterator.js","node_modules/core-js/internals/array-method-is-strict.js","node_modules/core-js/internals/array-method-uses-to-length.js","node_modules/core-js/internals/array-for-each.js","node_modules/core-js/modules/es.array.for-each.js","node_modules/core-js/modules/es.array.index-of.js","node_modules/core-js/internals/add-to-unscopables.js","node_modules/core-js/internals/iterators-core.js","node_modules/core-js/internals/iterators.js","node_modules/core-js/internals/correct-prototype-getter.js","node_modules/core-js/internals/object-get-prototype-of.js","node_modules/core-js/internals/create-iterator-constructor.js","node_modules/core-js/internals/a-possible-prototype.js","node_modules/core-js/internals/object-set-prototype-of.js","node_modules/core-js/internals/define-iterator.js","node_modules/core-js/modules/es.array.iterator.js","node_modules/core-js/modules/es.array.join.js","node_modules/core-js/internals/create-property.js","node_modules/core-js/internals/engine-v8-version.js","node_modules/core-js/internals/engine-user-agent.js","node_modules/core-js/internals/array-method-has-species-support.js","node_modules/core-js/modules/es.array.slice.js","node_modules/core-js/internals/to-string-tag-support.js","node_modules/core-js/internals/classof.js","node_modules/core-js/internals/object-to-string.js","node_modules/core-js/modules/es.object.to-string.js","node_modules/core-js/internals/regexp-flags.js","node_modules/core-js/internals/regexp-sticky-helpers.js","node_modules/core-js/internals/regexp-exec.js","node_modules/core-js/modules/es.regexp.exec.js","node_modules/core-js/modules/es.regexp.to-string.js","node_modules/core-js/internals/string-multibyte.js","node_modules/core-js/modules/es.string.iterator.js","node_modules/core-js/internals/fix-regexp-well-known-symbol-logic.js","node_modules/core-js/internals/advance-string-index.js","node_modules/core-js/internals/regexp-exec-abstract.js","node_modules/core-js/modules/es.string.replace.js","node_modules/core-js/internals/same-value.js","node_modules/core-js/modules/es.string.search.js","node_modules/core-js/internals/is-regexp.js","node_modules/core-js/internals/species-constructor.js","node_modules/core-js/modules/es.string.split.js","node_modules/core-js/internals/dom-iterables.js","node_modules/core-js/modules/web.dom-collections.for-each.js","node_modules/core-js/modules/web.dom-collections.iterator.js","node_modules/core-js/internals/native-url.js","node_modules/core-js/internals/an-instance.js","node_modules/core-js/internals/object-assign.js","node_modules/core-js/internals/iterator-close.js","node_modules/core-js/internals/call-with-safe-iteration-closing.js","node_modules/core-js/internals/is-array-iterator-method.js","node_modules/core-js/internals/get-iterator-method.js","node_modules/core-js/internals/array-from.js","node_modules/core-js/internals/string-punycode-to-ascii.js","node_modules/core-js/internals/redefine-all.js","node_modules/core-js/internals/get-iterator.js","node_modules/core-js/modules/web.url-search-params.js","node_modules/core-js/modules/web.url.js","node_modules/url-polyfill/url-polyfill.js","node_modules/core-js/modules/es.array.concat.js","node_modules/core-js/modules/es.array.filter.js","node_modules/core-js/modules/es.array.find.js","node_modules/core-js/internals/check-correctness-of-iteration.js","node_modules/core-js/modules/es.array.from.js","node_modules/core-js/modules/es.array.includes.js","node_modules/core-js/modules/es.array.map.js","node_modules/core-js/internals/inherit-if-required.js","node_modules/core-js/internals/whitespaces.js","node_modules/core-js/internals/string-trim.js","node_modules/core-js/modules/es.number.constructor.js","node_modules/core-js/modules/es.object.keys.js","node_modules/core-js/internals/object-to-array.js","node_modules/core-js/modules/es.object.values.js","node_modules/core-js/internals/not-a-regexp.js","node_modules/core-js/internals/correct-is-regexp-logic.js","node_modules/core-js/modules/es.string.includes.js","node_modules/core-js/internals/freezing.js","node_modules/core-js/internals/internal-metadata.js","node_modules/core-js/internals/iterate.js","node_modules/core-js/internals/collection.js","node_modules/core-js/internals/collection-weak.js","node_modules/core-js/modules/es.weak-map.js","node_modules/core-js/modules/es.array.every.js","node_modules/core-js/modules/es.object.assign.js","node_modules/core-js/internals/string-trim-forced.js","node_modules/core-js/modules/es.string.trim.js","node_modules/core-js/modules/es.array.some.js","node_modules/core-js/internals/this-number-value.js","node_modules/core-js/internals/string-repeat.js","node_modules/core-js/modules/es.number.to-fixed.js","node_modules/core-js/modules/es.object.entries.js","node_modules/core-js/modules/es.number.is-nan.js","node_modules/core-js/modules/es.object.get-own-property-descriptor.js","node_modules/rangetouch/dist/rangetouch.mjs","node_modules/core-js/modules/es.object.get-own-property-descriptors.js","node_modules/core-js/modules/es.string.match.js","node_modules/core-js/internals/task.js","node_modules/core-js/internals/native-promise-constructor.js","node_modules/core-js/internals/set-species.js","node_modules/core-js/internals/engine-is-ios.js","node_modules/core-js/internals/engine-is-node.js","node_modules/core-js/internals/microtask.js","node_modules/core-js/modules/es.promise.js","node_modules/core-js/internals/new-promise-capability.js","node_modules/core-js/internals/promise-resolve.js","node_modules/core-js/internals/host-report-errors.js","node_modules/core-js/internals/perform.js","node_modules/core-js/modules/es.string.starts-with.js","src/js/utils/is.js","src/js/utils/animation.js","src/js/utils/browser.js","node_modules/core-js/internals/array-reduce.js","node_modules/core-js/modules/es.array.reduce.js","src/js/utils/objects.js","src/js/utils/elements.js","src/js/support.js","src/js/utils/events.js","src/js/utils/promise.js","src/js/utils/style.js","src/js/html5.js","src/js/utils/arrays.js","node_modules/core-js/modules/es.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/load-sprite.js","node_modules/core-js/modules/es.math.trunc.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/states.js","src/js/config/types.js","src/js/console.js","src/js/fullscreen.js","node_modules/core-js/internals/math-sign.js","src/js/utils/load-image.js","node_modules/core-js/modules/es.math.sign.js","src/js/ui.js","src/js/listeners.js","node_modules/core-js/modules/es.array.splice.js","node_modules/loadjs/dist/loadjs.umd.js","src/js/utils/load-script.js","src/js/plugins/vimeo.js","src/js/plugins/youtube.js","src/js/media.js","src/js/plugins/ads.js","node_modules/core-js/modules/es.array.find-index.js","node_modules/core-js/internals/array-last-index-of.js","node_modules/core-js/modules/es.array.last-index-of.js","src/js/plugins/preview-thumbnails.js","src/js/source.js","src/js/utils/numbers.js","src/js/plyr.js"],"names":["window","ce","CustomEvent","cancelable","preventDefault","defaultPrevented","Error","e","event","params","evt","origPrevent","bubbles","document","createEvent","initCustomEvent","detail","call","this","Object","defineProperty","get","prototype","Event","commonjsGlobal","globalThis","global","self","createCommonjsModule","fn","module","exports","check","it","Math","global_1","Function","fails","exec","error","descriptors","nativePropertyIsEnumerable","propertyIsEnumerable","getOwnPropertyDescriptor","NASHORN_BUG","1","f","V","descriptor","enumerable","objectPropertyIsEnumerable","createPropertyDescriptor","bitmap","value","configurable","writable","toString","classofRaw","slice","split","indexedObject","classof","requireObjectCoercible","undefined","TypeError","toIndexedObject","IndexedObject","isObject","toPrimitive","input","PREFERRED_STRING","val","valueOf","hasOwnProperty","has","key","EXISTS","createElement","documentCreateElement","ie8DomDefine","DESCRIPTORS","a","nativeGetOwnPropertyDescriptor","f$1","O","P","IE8_DOM_DEFINE","propertyIsEnumerableModule","objectGetOwnPropertyDescriptor","anObject","String","nativeDefineProperty","f$2","Attributes","objectDefineProperty","createNonEnumerableProperty","object","definePropertyModule","setGlobal","SHARED","store","sharedStore","functionToString","inspectSource","set","WeakMap","nativeWeakMap","test","isPure","shared","push","version","mode","copyright","id","postfix","random","uid","keys","sharedKey","hiddenKeys","enforce","getterFor","TYPE","state","type","NATIVE_WEAK_MAP","wmget","wmhas","wmset","metadata","facade","STATE","objectHas","activeXDocument","internalState","redefine","getInternalState","InternalStateModule","enforceInternalState","TEMPLATE","options","unsafe","simple","noTargetGet","source","join","path","aFunction","variable","getBuiltIn","namespace","method","arguments","length","ceil","floor","toInteger","argument","isNaN","min","toLength","max","toAbsoluteIndex","index","integer","createMethod","IS_INCLUDES","$this","el","fromIndex","arrayIncludes","includes","indexOf","require$$0","objectKeysInternal","names","i","result","enumBugKeys","concat","f$3","getOwnPropertyNames","internalObjectKeys","objectGetOwnPropertyNames","f$4","getOwnPropertySymbols","objectGetOwnPropertySymbols","ownKeys","getOwnPropertyNamesModule","getOwnPropertySymbolsModule","copyConstructorProperties","target","getOwnPropertyDescriptorModule","replacement","isForced","feature","detection","data","normalize","POLYFILL","NATIVE","string","replace","toLowerCase","isForced_1","_export","targetProperty","sourceProperty","TARGET","GLOBAL","STATIC","stat","forced","sham","nativeSymbol","Symbol","useSymbolAsUid","NATIVE_SYMBOL","iterator","isArray","Array","arg","toObject","objectKeys","objectDefineProperties","defineProperties","Properties","html","GT","LT","PROTOTYPE","SCRIPT","IE_PROTO","EmptyConstructor","scriptTag","content","NullProtoObjectViaActiveX","write","close","temp","parentWindow","NullProtoObjectViaIFrame","iframeDocument","iframe","JS","style","display","appendChild","src","contentWindow","open","F","NullProtoObject","domain","ActiveXObject","objectCreate","create","nativeGetOwnPropertyNames","windowNames","getWindowNames","f$5","objectGetOwnPropertyNamesExternal","WellKnownSymbolsStore","createWellKnownSymbol","USE_SYMBOL_AS_UID","withoutSetter","wellKnownSymbol","name","f$6","wellKnownSymbolWrapped","defineWellKnownSymbol","NAME","wrappedWellKnownSymbolModule","TO_STRING_TAG","setToStringTag","TAG","aFunction$1","functionBindContext","that","b","c","apply","SPECIES","arraySpeciesCreate","originalArray","C","constructor","IS_MAP","IS_FILTER","IS_SOME","IS_EVERY","IS_FIND_INDEX","NO_HOLES","callbackfn","specificCreate","boundFunction","bind","arrayIteration","forEach","map","filter","some","every","find","findIndex","$forEach","HIDDEN","SYMBOL","TO_PRIMITIVE","setInternalState","ObjectPrototype","$Symbol","$stringify","getOwnPropertyNamesExternal","AllSymbols","ObjectPrototypeSymbols","StringToSymbolRegistry","SymbolToStringRegistry","QObject","USE_SETTER","findChild","setSymbolDescriptor","nativeObjectCreate","ObjectPrototypeDescriptor","wrap","tag","description","symbol","isSymbol","$defineProperty","$defineProperties","properties","$getOwnPropertySymbols","$propertyIsEnumerable","$create","$getOwnPropertyDescriptor","$getOwnPropertyNames","IS_OBJECT_PROTOTYPE","setter","$","for","keyFor","sym","useSetter","useSimple","FORCED_JSON_STRINGIFY","stringify","replacer","space","$replacer","args","NativeSymbol","EmptyStringDescriptionStore","SymbolWrapper","symbolPrototype","symbolToString","native","regexp","desc","arrayMethodIsStrict","METHOD_NAME","cache","thrower","arrayMethodUsesToLength","ACCESSORS","argument0","argument1","STRICT_METHOD","USES_TO_LENGTH","arrayForEach","proto","$indexOf","nativeIndexOf","NEGATIVE_ZERO","searchElement","UNSCOPABLES","ArrayPrototype","IteratorPrototype","PrototypeOfArrayIteratorPrototype","arrayIterator","addToUnscopables","iterators","correctPrototypeGetter","getPrototypeOf","objectGetPrototypeOf","CORRECT_PROTOTYPE_GETTER","ITERATOR","BUGGY_SAFARI_ITERATORS","returnThis","iteratorsCore","createIteratorConstructor","IteratorConstructor","next","Iterators","aPossiblePrototype","objectSetPrototypeOf","setPrototypeOf","CORRECT_SETTER","__proto__","IteratorsCore","KEYS","VALUES","ENTRIES","defineIterator","Iterable","DEFAULT","IS_SET","FORCED","CurrentIteratorPrototype","methods","KEY","getIterationMethod","KIND","defaultIterator","IterablePrototype","INCORRECT_VALUES_NAME","nativeIterator","anyNativeIterator","entries","values","ARRAY_ITERATOR","es_array_iterator","iterated","kind","done","Arguments","nativeJoin","ES3_STRINGS","separator","match","createProperty","propertyKey","engineUserAgent","process","versions","v8","userAgent","engineV8Version","arrayMethodHasSpeciesSupport","V8_VERSION","array","foo","Boolean","HAS_SPECIES_SUPPORT","0","nativeSlice","start","end","Constructor","n","k","fin","toStringTagSupport","CORRECT_ARGUMENTS","tryGet","TO_STRING_TAG_SUPPORT","callee","objectToString","regexpFlags","ignoreCase","multiline","dotAll","unicode","sticky","RE","s","RegExp","UNSUPPORTED_Y","re","lastIndex","BROKEN_CARET","regexpStickyHelpers","nativeExec","nativeReplace","patchedExec","UPDATES_LAST_INDEX_WRONG","re1","re2","stickyHelpers","NPCG_INCLUDED","PATCH","str","reCopy","flags","charsAdded","strCopy","regexpExec","TO_STRING","RegExpPrototype","nativeToString","NOT_GENERIC","INCORRECT_NAME","R","p","rf","CONVERT_TO_STRING","pos","first","second","S","position","size","charCodeAt","charAt","stringMultibyte","codeAt","STRING_ITERATOR","point","REPLACE_SUPPORTS_NAMED_GROUPS","groups","REPLACE_KEEPS_$0","REPLACE","REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE","SPLIT_WORKS_WITH_OVERWRITTEN_EXEC","originalExec","fixRegexpWellKnownSymbolLogic","DELEGATES_TO_SYMBOL","DELEGATES_TO_EXEC","execCalled","nativeRegExpMethod","nativeMethod","arg2","forceStringMethod","stringMethod","regexMethod","advanceStringIndex","regexpExecAbstract","SUBSTITUTION_SYMBOLS","SUBSTITUTION_SYMBOLS_NO_NAMED","maybeToString","fixRegExpWellKnownSymbolLogic","maybeCallNative","reason","UNSAFE_SUBSTITUTE","searchValue","replaceValue","res","rx","functionalReplace","fullUnicode","results","regExpExec","accumulatedResult","nextSourcePosition","matched","captures","j","namedCaptures","replacerArgs","getSubstitution","tailPos","m","symbols","ch","capture","sameValue","is","x","y","SEARCH","nativeSearch","searcher","previousLastIndex","MATCH","isRegexp","isRegExp","speciesConstructor","defaultConstructor","arrayPush","MAX_UINT32","SUPPORTS_Y","SPLIT","nativeSplit","internalSplit","limit","lim","lastLength","output","lastLastIndex","separatorCopy","splitter","unicodeMatching","callRegExpExec","q","A","z","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","COLLECTION_NAME","DOMIterables","Collection","CollectionPrototype","ArrayValues","ArrayIteratorMethods","nativeUrl","url","URL","searchParams","pathname","IS_PURE","toJSON","sort","href","URLSearchParams","username","host","hash","anInstance","nativeAssign","assign","objectAssign","B","alphabet","chr","T","argumentsLength","iteratorClose","returnMethod","callWithSafeIterationClosing","isArrayIteratorMethod","getIteratorMethod","arrayFrom","arrayLike","step","mapfn","mapping","iteratorMethod","maxInt","base","tMin","tMax","skew","damp","initialBias","initialN","delimiter","regexNonASCII","regexSeparators","OVERFLOW_ERROR","baseMinusTMin","stringFromCharCode","fromCharCode","ucs2decode","counter","extra","digitToBasic","digit","adapt","delta","numPoints","firstTime","encode","currentValue","inputLength","bias","basicLength","handledCPCount","handledCPCountPlusOne","RangeError","t","qMinusT","baseMinusT","stringPunycodeToAscii","label","encoded","labels","redefineAll","getIterator","$fetch","Headers","URL_SEARCH_PARAMS","URL_SEARCH_PARAMS_ITERATOR","getInternalParamsState","getInternalIteratorState","plus","sequences","percentSequence","bytes","percentDecode","sequence","decodeURIComponent","deserialize","!","'","(",")","~","%20","serialize","encodeURIComponent","parseSearchParams","query","attribute","entry","attributes","shift","updateSearchParams","validateArgumentsLength","passed","required","URLSearchParamsIterator","URLSearchParamsConstructor","entryIterator","entryNext","init","updateURL","hasOwn","URLSearchParamsPrototype","append","delete","splice","getAll","found","entriesIndex","sliceIndex","callback","USE_NATIVE_URL","fetch","body","headers","EOF","web_urlSearchParams","getState","require$$1","NativeURL","URLSearchParamsModule","getInternalSearchParamsState","getInternalURLState","pow","INVALID_AUTHORITY","INVALID_SCHEME","INVALID_HOST","INVALID_PORT","ALPHA","ALPHANUMERIC","DIGIT","HEX_START","OCT","DEC","HEX","FORBIDDEN_HOST_CODE_POINT","FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT","LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE","TAB_AND_NEW_LINE","parseHost","codePoints","parseIPv6","isSpecial","toASCII","parseIPv4","percentEncode","C0ControlPercentEncodeSet","partsLength","numbers","part","radix","number","ipv4","parts","pop","parseInt","numbersSeen","ipv4Piece","swaps","swap","address","pieceIndex","compress","pointer","char","findLongestZeroSequence","ipv6","maxIndex","maxLength","currStart","currLength","serializeHost","ignore0","unshift","fragmentPercentEncodeSet"," ","\"","<",">","`","pathPercentEncodeSet","#","?","{","}","userinfoPercentEncodeSet","/",":",";","=","@","[","\\","]","^","|","code","specialSchemes","ftp","file","http","https","ws","wss","scheme","includesCredentials","password","cannotHaveUsernamePasswordPort","cannotBeABaseURL","isWindowsDriveLetter","normalized","startsWithWindowsDriveLetter","third","shortenURLsPath","pathSize","isSingleDot","segment","isDoubleDot","SCHEME_START","SCHEME","NO_SCHEME","SPECIAL_RELATIVE_OR_AUTHORITY","PATH_OR_AUTHORITY","RELATIVE","RELATIVE_SLASH","SPECIAL_AUTHORITY_SLASHES","SPECIAL_AUTHORITY_IGNORE_SLASHES","AUTHORITY","HOST","HOSTNAME","PORT","FILE","FILE_SLASH","FILE_HOST","PATH_START","PATH","CANNOT_BE_A_BASE_URL_PATH","QUERY","FRAGMENT","parseURL","stateOverride","bufferCodePoints","failure","buffer","seenAt","seenBracket","seenPasswordToken","port","fragment","codePoint","encodedCodePoints","URLConstructor","baseState","urlString","searchParamsState","serializeURL","origin","getOrigin","protocol","getProtocol","getUsername","getPassword","getHost","hostname","getHostname","getPort","getPathname","search","getSearch","getSearchParams","getHash","URLPrototype","accessorDescriptor","getter","nativeCreateObjectURL","createObjectURL","nativeRevokeObjectURL","revokeObjectURL","blob","_typeof","obj","_classCallCheck","instance","_defineProperties","props","_createClass","protoProps","staticProps","_defineProperty","ownKeys$1","enumerableOnly","_objectSpread2","getOwnPropertyDescriptors","_objectWithoutPropertiesLoose","excluded","sourceKeys","_objectWithoutProperties","sourceSymbolKeys","_slicedToArray","arr","_arrayWithHoles","_iterableToArrayLimit","_unsupportedIterableToArray","_nonIterableRest","_toConsumableArray","_arrayWithoutHoles","_iterableToArray","_nonIterableSpread","_arrayLikeToArray","iter","from","_arr","_n","_d","_e","_s","_i","err","o","minLen","len","arr2","iteratorSupported","checkIfIteratorIsSupported","createIterator","items","serializeParam","deserializeParam","checkIfURLSearchParamsSupported","searchString","typeofSearchString","_fromString","_this","_entries","thisArg","searchArray","polyfillURLSearchParams","u","checkIfURLIsSupported","_URL","baseElement","doc","location","implementation","createHTMLDocument","head","anchorElement","inputElement","checkValidity","enableSearchUpdate","enableSearchParamsUpdate","methodName","attributeName","_anchorElement","linkURLWithAnchorAttribute","_updateSearchParams","expectedPort","http:","https:","ftp:","addPortToOrigin","polyfillURL","setInterval","IS_CONCAT_SPREADABLE","MAX_SAFE_INTEGER","MAXIMUM_ALLOWED_INDEX_EXCEEDED","IS_CONCAT_SPREADABLE_SUPPORT","SPECIES_SUPPORT","isConcatSpreadable","spreadable","E","$filter","$find","FIND","SKIPS_HOLES","SAFE_CLOSING","called","iteratorWithReturn","return","checkCorrectnessOfIteration","SKIP_CLOSING","ITERATION_SUPPORT","INCORRECT_ITERATION","iterable","$includes","$map","inheritIfRequired","dummy","Wrapper","NewTarget","NewTargetPrototype","whitespaces","whitespace","ltrim","rtrim","stringTrim","trim","require$$2","require$$3","NUMBER","NativeNumber","NumberPrototype","BROKEN_CLASSOF","toNumber","maxCode","digits","NaN","NumberWrapper","FAILS_ON_PRIMITIVES","nativeKeys","TO_ENTRIES","objectToArray","$values","notARegexp","correctIsRegexpLogic","error1","error2","correctIsRegExpLogic","notARegExp","freezing","isExtensible","preventExtensions","internalMetadata","METADATA","setMetadata","objectID","weakData","meta","REQUIRED","fastKey","getWeakData","onFreeze","FREEZING","internalMetadata_1","internalMetadata_2","internalMetadata_3","internalMetadata_4","Result","stopped","iterate","unboundFunction","iterFn","AS_ENTRIES","IS_ITERATOR","INTERRUPTED","stop","condition","callFn","collection","CONSTRUCTOR_NAME","wrapper","common","IS_WEAK","ADDER","NativeConstructor","NativePrototype","exported","fixMethod","getConstructor","InternalMetadataModule","HASNT_CHAINING","THROWS_ON_PRIMITIVES","ACCEPT_ITERABLES","BUGGY_ZERO","$instance","clear","setStrong","internalStateGetterFor","ArrayIterationModule","uncaughtFrozenStore","frozen","UncaughtFrozenStore","findUncaughtFrozen","collectionWeak","define","$has","add","es_weakMap","InternalWeakMap","enforceIternalState","IS_IE11","$WeakMap","WeakMapPrototype","nativeDelete","nativeHas","nativeGet","nativeSet","$every","non","stringTrimForced","$trim","forcedStringTrimMethod","$some","thisNumberValue","stringRepeat","repeat","count","Infinity","nativeToFixed","toFixed","acc","log","x2","fractionDigits","fractDigits","sign","multiply","c2","divide","dataToString","$entries","r","nativeMatch","matcher","matchStr","defaults","addCSS","thumbWidth","watch","matches","querySelectorAll","trigger","dispatchEvent","instanceOf","isNullOrUndefined","isNumber","Number","isString","isBoolean","isFunction","isNodeList","isElement","Element","isEvent","isEmpty","nullOrUndefined","boolean","function","nodeList","element","empty","getDecimalPlaces","round","parseFloat","defer","channel","RangeTouch","querySelector","rangeTouch","config","enabled","userSelect","webKitUserSelect","touchAction","listeners","changedTouches","getAttribute","getBoundingClientRect","width","clientX","left","disabled","MutationObserver","addedNodes","observe","childList","subtree","documentElement","nativePromiseConstructor","Promise","setSpecies","engineIsIos","engineIsNode","setImmediate","clearImmediate","MessageChannel","Dispatch","queue","ONREADYSTATECHANGE","run","runner","listener","post","postMessage","IS_NODE","nextTick","now","IS_IOS","port2","port1","onmessage","addEventListener","importScripts","removeChild","setTimeout","flush","last","notify","toggle","node","promise","then","task","macrotask","WebKitMutationObserver","queueMicrotaskDescriptor","queueMicrotask","parent","exit","enter","createTextNode","characterData","resolve","Internal","OwnPromiseCapability","PromiseWrapper","nativeThen","microtask","PromiseCapability","reject","$$resolve","$$reject","f$7","newPromiseCapability","promiseResolve","promiseCapability","hostReportErrors","console","perform","PROMISE","getInternalPromiseState","PromiseConstructor","NativePromise","newPromiseCapabilityModule","newGenericPromiseCapability","DISPATCH_EVENT","NATIVE_REJECTION_EVENT","PromiseRejectionEvent","UNHANDLED_REJECTION","REJECTION_HANDLED","PENDING","FULFILLED","REJECTED","HANDLED","UNHANDLED","FakePromise","all","isThenable","isReject","notified","chain","reactions","ok","exited","reaction","handler","fail","rejection","onHandleUnhandled","onUnhandled","initEvent","isUnhandled","emit","unwrap","internalReject","internalResolve","executor","onFulfilled","onRejected","catch","capability","$promiseResolve","remaining","alreadyCalled","race","nativeStartsWith","startsWith","CORRECT_IS_REGEXP_LOGIC","MDN_POLYFILL_BUG","isWeakMap","isTextNode","Text","isKeyboardEvent","KeyboardEvent","isCue","TextTrackCue","VTTCue","isTrack","TextTrack","isPromise","nodeType","ownerDocument","isUrl","is$1","weakMap","textNode","keyboardEvent","cue","track","transitionEndEvent","events","WebkitTransition","MozTransition","OTransition","transition","repaint","delay","hidden","offsetHeight","browser","isIE","documentMode","isEdge","navigator","isWebkit","isIPhone","platform","isIos","IS_RIGHT","memo","arrayReduce","right","$reduce","CHROME_BUG","CHROME_VERSION","cloneDeep","JSON","parse","getDeep","reduce","extend","_len","sources","_key","elements","targets","reverse","child","cloneNode","parentNode","sibling","nextSibling","insertBefore","setAttributes","_ref","_ref3","_ref4","setAttribute","text","innerText","insertAfter","insertElement","removeElement","emptyElement","childNodes","lastChild","replaceElement","newChild","oldChild","replaceChild","getAttributesFromSelector","sel","existingAttributes","existing","selector","className","class","toggleHidden","hide","toggleClass","force","classList","contains","hasClass","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","closest","parentElement","getElements","container","getElement","setFocus","tabFocus","focus","preventScroll","classNames","defaultCodecs","audio/ogg","audio/wav","video/webm","video/mp4","video/ogg","support","audio","video","provider","playsinline","canPlayInline","api","ui","rangeInput","pip","webkitSetPresentationMode","pictureInPictureEnabled","disablePictureInPicture","airplay","WebKitPlaybackTargetAvailabilityEvent","mime","mediaType","isHTML5","media","canPlayType","textTracks","range","touch","transitions","reducedMotion","matchMedia","supportsPassiveListeners","supported","removeEventListener","toggleListener","passive","eventListeners","on","off","once","_this2","onceCallback","triggerEvent","plyr","unbindListeners","item","ready","_this3","silencePromise","validateRatio","reduceAspectRatio","ratio","_ratio","height","divider","getDivider","w","h","getAspectRatio","embed","_this$media","videoWidth","videoHeight","setAspectRatio","isVideo","_ref2","padding","paddingBottom","isVimeo","vimeo","premium","offsetWidth","getComputedStyle","offset","fullscreen","active","transform","videoFixedRatio","html5","getSources","getQualityOptions","quality","setup","player","speed","onChange","_player$media","currentTime","paused","preload","readyState","playbackRate","play","load","cancelRequests","blankVideo","debug","dedupe","prev","curr","abs","NativeRegExp","CORRECT_NEW","RegExpWrapper","pattern","thisIsRegExp","patternIsRegExp","flagsAreUndefined","getFlags","proxy","generateId","prefix","format","getPercentage","current","replaceAll","toTitleCase","toUpperCase","substr","toPascalCase","toCamelCase","stripHTML","createDocumentFragment","innerHTML","firstChild","getHTML","resources","youtube","i18n","{seektime}","seekTime","{title}","title","v","Storage","localStorage","getItem","json","storage","setItem","removeItem","responseType","request","XMLHttpRequest","responseText","response","status","send","loadSprite","hasId","exists","getElementById","update","insertAdjacentElement","useStorage","cached","trunc","getHours","getMinutes","getSeconds","formatTime","time","displayHours","inverted","hours","mins","secs","controls","getIconUrl","cors","iconUrl","svg4everybody","findElements","selectors","buttons","pause","restart","rewind","fastForward","mute","settings","captions","progress","inputs","seek","volume","duration","seekTooltip","tooltip","warn","toggleNativeControls","createIcon","iconPath","iconPrefix","icon","createElementNS","aria-hidden","focusable","use","setAttributeNS","createLabel","attr","createBadge","badge","menu","createButton","buttonType","labelPressed","iconPressed","control","button","createRange","autocomplete","role","aria-label","aria-valuemin","aria-valuemax","aria-valuenow","updateRangeFill","createProgress","suffixKey","played","suffix","createTime","attrs","bindMenuItemShortcuts","menuItem","which","stopPropagation","isRadioButton","showMenuPanel","nextElementSibling","firstElementChild","previousElementSibling","lastElementChild","focusFirstMenuItem","createMenuItem","list","_ref$badge","_ref$checked","checked","aria-checked","flex","children","currentTrack","forceHours","updateTimeDisplay","updateVolume","setRange","muted","pressed","updateProgress","_this4","getElementsByTagName","nodeValue","setProgress","buffered","percent","setProperty","updateSeekTooltip","_this5","tooltips","visible","show","clientRect","pageX","timeUpdate","invert","invertTime","seeking","durationUpdate","hasDuration","displayDuration","toggleMenuButton","setting","updateSetting","pane","panels","default","getLabel","setQualityMenu","_this6","checkMenu","getBadge","sorting","setCaptionsMenu","_this7","tracks","getTracks","toggled","language","setSpeedMenu","_this8","minimumSpeed","maximumSpeed","popup","firstItem","toggleMenu","composedPath","isMenuItem","getMenuSize","tab","clone","opacity","removeAttribute","scrollWidth","scrollHeight","_this9","restore","propertyName","setDownloadUrl","download","_this10","defaultAttributes","progressContainer","aria-haspopup","aria-controls","aria-expanded","inner","home","backButton","urls","isEmbed","inject","_this11","seektime","addProperty","controlPressed","_this$config","parseUrl","safe","parser","buildUrlParams","isYouTube","languages","userLanguage","trackEvents","_this$captions","currentTrackNode","languageExists","updateCues","setLanguage","activeClass","findTrack","enableTextTrack","sortIsDefault","sorted","getCurrentTrack","cues","activeCues","getCueAsHTML","cueText","caption","autoplay","autopause","toggleInvert","clickToPlay","hideControls","resetOnEnd","disableContextMenu","loop","selected","keyboard","focused","fallback","iosNative","seekLabel","unmute","enableCaptions","disableCaptions","enterFullscreen","exitFullscreen","frameTitle","menuBack","normal","reset","advertisement","qualityBadge","2160","1440","1080","720","576","480","sdk","googleIMA","editable","embedContainer","poster","posterEnabled","ads","playing","loading","hover","isTouch","uiSupported","noTransition","previewThumbnails","thumbContainer","thumbContainerShown","imageContainer","timeContainer","scrubbingContainer","scrubbingContainerShown","publisherId","tagUrl","byline","portrait","transparent","customControls","referrerPolicy","rel","showinfo","iv_load_policy","modestbranding","noCookie","inactive","providers","types","getProviderByUrl","noop","Console","Fullscreen","scrollPosition","scrollX","scrollY","scrollTo","overflow","viewport","property","hasProperty","cleanupViewport","keyCode","activeElement","shiftKey","forceFallback","requestFullscreen","webkitEnterFullscreen","toggleFallback","navigationUI","webkitExitFullscreen","action","cancelFullScreen","trapFocus","fullscreenElement","shadowRoot","getRootNode","fullscreenEnabled","webkitFullscreenEnabled","mozFullScreenEnabled","msFullscreenEnabled","pre","mathSign","loadImage","minWidth","image","Image","onload","onerror","naturalWidth","addStyleHook","build","checkPlaying","setTitle","setPoster","togglePoster","enable","backgroundImage","backgroundSize","toggleControls","checkLoading","clearTimeout","timers","controlsElement","recentTouchSeek","lastSeekTime","Date","migrateStyles","getPropertyValue","removeProperty","Listeners","focusTimer","lastKeyDown","timeStamp","wasKeyDown","handleKey","firstTouch","setTabFocus","setPlayerSize","measure","rect","resized","_player$fullscreen","usingNative","isEnter","_setPlayerSize","_getAspectRatio$call2","videoX","videoY","maxWidth","margin","setGutter","isAudio","ended","togglePlay","proxyEvents","_event$detail","defaultHandler","customHandlerKey","customHandler","returned","hasCustomHandler","inputEvent","forward","toggleCaptions","currentTarget","hasAttribute","seekTo","loaded","startMove","endMove","startScrubbing","endScrubbing","webkitDirectionInvertedFromDevice","_map2","deltaX","deltaY","direction","increaseVolume","lastKey","altKey","ctrlKey","metaKey","decreaseVolume","MAXIMUM_ALLOWED_LENGTH_EXCEEDED","deleteCount","insertCount","actualDeleteCount","to","actualStart","loadjs_umd","devnull","bundleIdCache","bundleResultCache","bundleCallbackQueue","subscribe","bundleIds","callbackFn","bundleId","depsNotFound","numWaiting","pathsNotFound","publish","executeCallbacks","success","loadFile","numTries","isLegacyIECss","async","maxTries","numRetries","beforeCallbackFn","before","pathStripped","relList","as","onbeforeload","ev","sheet","cssText","loadFiles","paths","loadjs","arg1","loadFn","returnPromise","deps","isDefined","factory","loadScript","parseId","$2","assurePlaybackState","hasPlayed","Vimeo","frameParams","sidedock","gesture","data-poster","thumbnail_url","Player","disableTextTrack","restorePause","setVolume","setCurrentTime","setPlaybackRate","currentSrc","setLoop","getVideoUrl","getVideoWidth","getVideoHeight","dimensions","_dimensions","setAutopause","getVideoTitle","getCurrentTime","getDuration","getTextTracks","_ref$cues","strippedCues","getPaused","seconds","YT","onYouTubeIframeAPIReady","getTitle","videoId","currentId","posterSrc","playerVars","hl","disablekb","cc_load_policy","cc_lang_pref","widget_referrer","onError","message","2","5","100","101","150","onPlaybackRateChange","getPlaybackRate","onReady","playVideo","pauseVideo","stopVideo","speeds","getAvailablePlaybackRates","clearInterval","buffering","getVideoLoadedFraction","lastBuffered","onStateChange","unMute","destroy","manager","displayContainer","remove","Ads","google","ima","startSafetyTimer","managerPromise","clearSafetyTimer","setupIMA","setVpaidMode","ImaSdkSettings","VpaidMode","ENABLED","setLocale","setDisableCustomPlaybackForIOS10Plus","AdDisplayContainer","loader","AdsLoader","AdsManagerLoadedEvent","Type","ADS_MANAGER_LOADED","onAdsManagerLoaded","AdErrorEvent","AD_ERROR","onAdError","requestAds","AdsRequest","adTagUrl","linearAdSlotWidth","linearAdSlotHeight","nonLinearAdSlotWidth","nonLinearAdSlotHeight","forceNonLinearFullSlot","setAdWillPlayMuted","countdownTimer","getRemainingTime","AdsRenderingSettings","restoreCustomPlaybackStateOnAdBreakComplete","enablePreloading","getAdsManager","cuePoints","getCuePoints","AdEvent","onAdEvent","cuePoint","seekElement","cuePercentage","ad","getAd","adData","getAdData","LOADED","pollCountdown","isLinear","STARTED","ALL_ADS_COMPLETED","loadAds","contentComplete","CONTENT_PAUSE_REQUESTED","pauseContent","CONTENT_RESUME_REQUESTED","resumeContent","LOG","adError","getMessage","cancel","addCuePoints","seekedTime","discardAdBreak","resize","ViewMode","NORMAL","initialize","initialized","zIndex","handlers","safetyTimer","AV_PUBLISHERID","AV_CHANNELID","AV_URL","cb","AV_WIDTH","AV_HEIGHT","AV_CDIM2","$findIndex","FIND_INDEX","nativeLastIndexOf","lastIndexOf","arrayLastIndexOf","parseVtt","vttDataString","processedList","frame","line","startTime","lineSplit","_lineSplit","_lineSplit$1$split2","matchTimes","endTime","fitRatio","outer","PreviewThumbnails","getThumbnails","render","determineContainerAutoSizing","sortAndResolve","thumbnails","promises","getThumbnail","thumbnail","frames","urlPrefix","substring","tempImage","naturalHeight","percentage","mousePosX","thumb","showImageAtCurrentTime","toggleThumbContainer","mouseDown","toggleScrubbingContainer","lastTime","scrubbing","setScrubbingContainerSize","setThumbContainerSizeAndPos","thumbNum","hasThumb","qualityIndex","loadedImages","showingThumb","thumbFilename","thumbUrl","currentImageElement","dataset","filename","showImage","removeOldImages","loadingImage","usingSprites","previewImage","showingThumbFilename","newImage","setImageSizeAndOffset","currentImageContainer","preloadNearby","getHigherQuality","currentImage","tagName","removeDelay","deleting","oldThumbFilename","thumbnailsClone","foundOne","newThumbFilename","thumbURL","currentQualityIndex","previewImageHeight","thumbContainerHeight","clearShowing","clientHeight","clientWidth","sizeSpecifiedInCSS","thumbAspectRatio","thumbHeight","setThumbContainerPos","seekbarRect","plyrRect","minVal","maxVal","previewPos","_fitRatio","multiplier","top","lastMouseMoveTime","currentScrubbingImageElement","currentThumbnailImageElement","insertElements","change","_sources$","_sources$$provider","crossorigin","clamp","Plyr","webkitShowPlaybackTargetPicker","isHidden","hiding","eventName","soft","original","unload","failed","jQuery","truthy","tabindex","inputIsValid","fauxDuration","realDuration","mozHasAudio","webkitAudioDecodedByteCount","audioTracks","updateStorage","requestPictureInPicture","exitPictureInPicture","webkitPresentationMode","pictureInPictureElement","inline"],"mappings":"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","file":"plyr.polyfilled.min.mjs","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 params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\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","// Polyfill for creating CustomEvents on IE9/10/11\n// code pulled from:\n// https://github.com/d4tocchini/customevent-polyfill\n// https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent#Polyfill\n(function () {\n if (typeof window === 'undefined') {\n return;\n }\n\n try {\n var ce = new window.CustomEvent('test', {\n cancelable: true\n });\n ce.preventDefault();\n\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 CustomEvent(event, params) {\n var evt, origPrevent;\n params = params || {};\n params.bubbles = !!params.bubbles;\n params.cancelable = !!params.cancelable;\n evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n origPrevent = evt.preventDefault;\n\n evt.preventDefault = function () {\n origPrevent.call(this);\n\n try {\n Object.defineProperty(this, 'defaultPrevented', {\n get: function get() {\n return true;\n }\n });\n } catch (e) {\n this.defaultPrevented = true;\n }\n };\n\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent; // expose definition to window\n }\n})();\n\nvar commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};\n\nfunction createCommonjsModule(fn, module) {\n\treturn module = { exports: {} }, fn(module, module.exports), module.exports;\n}\n\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global_1 =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof commonjsGlobal == 'object' && commonjsGlobal) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n\nvar fails = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n\n// Thank's IE8 for his funny defineProperty\nvar descriptors = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nvar f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n\nvar objectPropertyIsEnumerable = {\n\tf: f\n};\n\nvar createPropertyDescriptor = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n\nvar toString = {}.toString;\n\nvar classofRaw = function (it) {\n return toString.call(it).slice(8, -1);\n};\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar indexedObject = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classofRaw(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n\n// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nvar requireObjectCoercible = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n\n// toObject with fallback for non-array-like ES3 strings\n\n\n\nvar toIndexedObject = function (it) {\n return indexedObject(requireObjectCoercible(it));\n};\n\nvar isObject = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nvar toPrimitive = function (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n\nvar hasOwnProperty = {}.hasOwnProperty;\n\nvar has = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n\nvar document$1 = global_1.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document$1) && isObject(document$1.createElement);\n\nvar documentCreateElement = function (it) {\n return EXISTS ? document$1.createElement(it) : {};\n};\n\n// Thank's IE8 for his funny defineProperty\nvar ie8DomDefine = !descriptors && !fails(function () {\n return Object.defineProperty(documentCreateElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nvar f$1 = descriptors ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (ie8DomDefine) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!objectPropertyIsEnumerable.f.call(O, P), O[P]);\n};\n\nvar objectGetOwnPropertyDescriptor = {\n\tf: f$1\n};\n\nvar anObject = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nvar f$2 = descriptors ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (ie8DomDefine) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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\nvar objectDefineProperty = {\n\tf: f$2\n};\n\nvar createNonEnumerableProperty = descriptors ? function (object, key, value) {\n return objectDefineProperty.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n\nvar setGlobal = function (key, value) {\n try {\n createNonEnumerableProperty(global_1, key, value);\n } catch (error) {\n global_1[key] = value;\n } return value;\n};\n\nvar SHARED = '__core-js_shared__';\nvar store = global_1[SHARED] || setGlobal(SHARED, {});\n\nvar sharedStore = store;\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof sharedStore.inspectSource != 'function') {\n sharedStore.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nvar inspectSource = sharedStore.inspectSource;\n\nvar WeakMap$1 = global_1.WeakMap;\n\nvar nativeWeakMap = typeof WeakMap$1 === 'function' && /native code/.test(inspectSource(WeakMap$1));\n\nvar isPure = false;\n\nvar shared = createCommonjsModule(function (module) {\n(module.exports = function (key, value) {\n return sharedStore[key] || (sharedStore[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.7.0',\n mode: 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n});\n\nvar id = 0;\nvar postfix = Math.random();\n\nvar uid = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n\nvar keys = shared('keys');\n\nvar sharedKey = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n\nvar hiddenKeys = {};\n\nvar WeakMap$2 = global_1.WeakMap;\nvar set, get, has$1;\n\nvar enforce = function (it) {\n return has$1(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (nativeWeakMap) {\n var store$1 = sharedStore.state || (sharedStore.state = new WeakMap$2());\n var wmget = store$1.get;\n var wmhas = store$1.has;\n var wmset = store$1.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store$1, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store$1, it) || {};\n };\n has$1 = function (it) {\n return wmhas.call(store$1, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return has(it, STATE) ? it[STATE] : {};\n };\n has$1 = function (it) {\n return has(it, STATE);\n };\n}\n\nvar internalState = {\n set: set,\n get: get,\n has: has$1,\n enforce: enforce,\n getterFor: getterFor\n};\n\nvar redefine = createCommonjsModule(function (module) {\nvar getInternalState = internalState.get;\nvar enforceInternalState = internalState.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global_1) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n});\n\nvar path = global_1;\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nvar getBuiltIn = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global_1[namespace])\n : path[namespace] && path[namespace][method] || global_1[namespace] && global_1[namespace][method];\n};\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nvar toInteger = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nvar toLength = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n\nvar max = Math.max;\nvar min$1 = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nvar toAbsoluteIndex = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min$1(integer, length);\n};\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nvar arrayIncludes = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n\nvar indexOf = arrayIncludes.indexOf;\n\n\nvar objectKeysInternal = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n\n// IE8- don't enum bug keys\nvar enumBugKeys = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n\nvar hiddenKeys$1 = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nvar f$3 = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return objectKeysInternal(O, hiddenKeys$1);\n};\n\nvar objectGetOwnPropertyNames = {\n\tf: f$3\n};\n\nvar f$4 = Object.getOwnPropertySymbols;\n\nvar objectGetOwnPropertySymbols = {\n\tf: f$4\n};\n\n// all object keys, includes non-enumerable and symbols\nvar ownKeys = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = objectGetOwnPropertyNames.f(anObject(it));\n var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n\nvar copyConstructorProperties = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = objectDefineProperty.f;\n var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nvar isForced_1 = isForced;\n\nvar getOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nvar _export = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global_1;\n } else if (STATIC) {\n target = global_1[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global_1[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor$1(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced_1(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n\nvar nativeSymbol = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n\nvar useSymbolAsUid = nativeSymbol\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nvar isArray = Array.isArray || function isArray(arg) {\n return classofRaw(arg) == 'Array';\n};\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nvar toObject = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nvar objectKeys = Object.keys || function keys(O) {\n return objectKeysInternal(O, enumBugKeys);\n};\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nvar objectDefineProperties = descriptors ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) objectDefineProperty.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n\nvar html = getBuiltIn('document', 'documentElement');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nvar objectCreate = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : objectDefineProperties(result, Properties);\n};\n\nvar nativeGetOwnPropertyNames = objectGetOwnPropertyNames.f;\n\nvar toString$1 = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar f$5 = function getOwnPropertyNames(it) {\n return windowNames && toString$1.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n\nvar objectGetOwnPropertyNamesExternal = {\n\tf: f$5\n};\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol$1 = global_1.Symbol;\nvar createWellKnownSymbol = useSymbolAsUid ? Symbol$1 : Symbol$1 && Symbol$1.withoutSetter || uid;\n\nvar wellKnownSymbol = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (nativeSymbol && has(Symbol$1, name)) WellKnownSymbolsStore[name] = Symbol$1[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n\nvar f$6 = wellKnownSymbol;\n\nvar wellKnownSymbolWrapped = {\n\tf: f$6\n};\n\nvar defineProperty = objectDefineProperty.f;\n\nvar defineWellKnownSymbol = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wellKnownSymbolWrapped.f(NAME)\n });\n};\n\nvar defineProperty$1 = objectDefineProperty.f;\n\n\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nvar setToStringTag = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty$1(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n\nvar aFunction$1 = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n\n// optional / simple context binding\nvar functionBindContext = function (fn, that, length) {\n aFunction$1(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nvar arraySpeciesCreate = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod$1 = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = indexedObject(O);\n var boundFunction = functionBindContext(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nvar arrayIteration = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod$1(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod$1(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod$1(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod$1(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod$1(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod$1(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod$1(6)\n};\n\nvar $forEach = arrayIteration.forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE$1 = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = internalState.set;\nvar getInternalState = internalState.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE$1];\nvar $Symbol = global_1.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor$1 = objectGetOwnPropertyDescriptor.f;\nvar nativeDefineProperty$1 = objectDefineProperty.f;\nvar nativeGetOwnPropertyNames$1 = objectGetOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable$1 = objectPropertyIsEnumerable.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore$1 = shared('wks');\nvar QObject = global_1.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE$1] || !QObject[PROTOTYPE$1].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = descriptors && fails(function () {\n return objectCreate(nativeDefineProperty$1({}, 'a', {\n get: function () { return nativeDefineProperty$1(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor$1(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty$1(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty$1(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty$1;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = objectCreate($Symbol[PROTOTYPE$1]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!descriptors) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = useSymbolAsUid ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty$1(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = objectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty$1(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!descriptors || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? objectCreate(O) : $defineProperties(objectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable$1.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor$1(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames$1(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames$1(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!nativeSymbol) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (descriptors && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE$1], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n objectPropertyIsEnumerable.f = $propertyIsEnumerable;\n objectDefineProperty.f = $defineProperty;\n objectGetOwnPropertyDescriptor.f = $getOwnPropertyDescriptor;\n objectGetOwnPropertyNames.f = objectGetOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n objectGetOwnPropertySymbols.f = $getOwnPropertySymbols;\n\n wellKnownSymbolWrapped.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (descriptors) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty$1($Symbol[PROTOTYPE$1], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n_export({ global: true, wrap: true, forced: !nativeSymbol, sham: !nativeSymbol }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore$1), function (name) {\n defineWellKnownSymbol(name);\n});\n\n_export({ target: SYMBOL, stat: true, forced: !nativeSymbol }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n_export({ target: 'Object', stat: true, forced: !nativeSymbol, sham: !descriptors }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n_export({ target: 'Object', stat: true, forced: !nativeSymbol }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n_export({ target: 'Object', stat: true, forced: fails(function () { objectGetOwnPropertySymbols.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return objectGetOwnPropertySymbols.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !nativeSymbol || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n _export({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE$1][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE$1], TO_PRIMITIVE, $Symbol[PROTOTYPE$1].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n\nvar defineProperty$2 = objectDefineProperty.f;\n\n\nvar NativeSymbol = global_1.Symbol;\n\nif (descriptors && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty$2(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n _export({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n\nvar arrayMethodIsStrict = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n\nvar defineProperty$3 = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nvar arrayMethodUsesToLength = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !descriptors) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty$3(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n\nvar $forEach$1 = arrayIteration.forEach;\n\n\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nvar arrayForEach = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach$1(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n_export({ target: 'Array', proto: true, forced: [].forEach != arrayForEach }, {\n forEach: arrayForEach\n});\n\nvar $indexOf = arrayIncludes.indexOf;\n\n\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD$1 = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH$1 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n_export({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD$1 || !USES_TO_LENGTH$1 }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n objectDefineProperty.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: objectCreate(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nvar addToUnscopables = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n\nvar iterators = {};\n\nvar correctPrototypeGetter = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n\nvar IE_PROTO$1 = sharedKey('IE_PROTO');\nvar ObjectPrototype$1 = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nvar objectGetPrototypeOf = correctPrototypeGetter ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO$1)) return O[IE_PROTO$1];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype$1 : null;\n};\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = objectGetPrototypeOf(objectGetPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif ( !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nvar iteratorsCore = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n\nvar IteratorPrototype$1 = iteratorsCore.IteratorPrototype;\n\n\n\n\n\nvar returnThis$1 = function () { return this; };\n\nvar createIteratorConstructor = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = objectCreate(IteratorPrototype$1, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false);\n iterators[TO_STRING_TAG] = returnThis$1;\n return IteratorConstructor;\n};\n\nvar aPossiblePrototype = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar objectSetPrototypeOf = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n\nvar IteratorPrototype$2 = iteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS$1 = iteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR$1 = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis$2 = function () { return this; };\n\nvar defineIterator = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS$1 && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR$1]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS$1 && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = objectGetPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype$2 !== Object.prototype && CurrentIteratorPrototype.next) {\n if ( objectGetPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype$2) {\n if (objectSetPrototypeOf) {\n objectSetPrototypeOf(CurrentIteratorPrototype, IteratorPrototype$2);\n } else if (typeof CurrentIteratorPrototype[ITERATOR$1] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR$1, returnThis$2);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true);\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ( IterablePrototype[ITERATOR$1] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR$1, defaultIterator);\n }\n iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else _export({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS$1 || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState$1 = internalState.set;\nvar getInternalState$1 = internalState.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nvar es_array_iterator = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState$1(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState$1(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\niterators.Arguments = iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = indexedObject != Object;\nvar STRICT_METHOD$2 = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n_export({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD$2 }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n\nvar createProperty = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) objectDefineProperty.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n\nvar engineUserAgent = getBuiltIn('navigator', 'userAgent') || '';\n\nvar process = global_1.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (engineUserAgent) {\n match = engineUserAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = engineUserAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nvar engineV8Version = version && +version;\n\nvar SPECIES$1 = wellKnownSymbol('species');\n\nvar arrayMethodHasSpeciesSupport = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return engineV8Version >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES$1] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH$2 = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES$2 = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max$1 = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH$2 }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES$2];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max$1(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n\nvar TO_STRING_TAG$1 = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG$1] = 'z';\n\nvar toStringTagSupport = String(test) === '[object z]';\n\nvar TO_STRING_TAG$2 = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nvar classof = toStringTagSupport ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG$2)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nvar objectToString = toStringTagSupport ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!toStringTagSupport) {\n redefine(Object.prototype, 'toString', objectToString, { unsafe: true });\n}\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\nvar regexpFlags = 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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nvar UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nvar BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n\nvar regexpStickyHelpers = {\n\tUNSUPPORTED_Y: UNSUPPORTED_Y,\n\tBROKEN_CARET: BROKEN_CARET\n};\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y$1 = regexpStickyHelpers.UNSUPPORTED_Y || regexpStickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y$1;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y$1 && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nvar regexpExec = patchedExec;\n\n_export({ target: 'RegExp', proto: true, forced: /./.exec !== regexpExec }, {\n exec: regexpExec\n});\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? regexpFlags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod$2 = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nvar stringMultibyte = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod$2(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod$2(true)\n};\n\nvar charAt = stringMultibyte.charAt;\n\n\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState$2 = internalState.set;\nvar getInternalState$2 = internalState.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState$2(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState$2(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n\n// TODO: Remove from `core-js@4` since it's moved to entry points\n\n\n\n\n\n\n\nvar SPECIES$3 = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nvar fixRegexpWellKnownSymbolLogic = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES$3] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n\nvar charAt$1 = stringMultibyte.charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nvar advanceStringIndex = function (S, index, unicode) {\n return index + (unicode ? charAt$1(S, index).length : 1);\n};\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nvar regexpExecAbstract = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classofRaw(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\nvar max$2 = Math.max;\nvar min$2 = Math.min;\nvar floor$1 = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegexpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regexpExecAbstract(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max$2(min$2(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor$1(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n\n// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\nvar sameValue = 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\n// @@search logic\nfixRegexpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regexpExecAbstract(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nvar isRegexp = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classofRaw(it) == 'RegExp');\n};\n\nvar SPECIES$4 = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nvar speciesConstructor = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES$4]) == undefined ? defaultConstructor : aFunction$1(S);\n};\n\nvar arrayPush = [].push;\nvar min$3 = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegexpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegexp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return regexpExecAbstract(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = regexpExecAbstract(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min$3(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n\n// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nvar domIterables = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n\nfor (var COLLECTION_NAME in domIterables) {\n var Collection = global_1[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== arrayForEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', arrayForEach);\n } catch (error) {\n CollectionPrototype.forEach = arrayForEach;\n }\n}\n\nvar ITERATOR$2 = wellKnownSymbol('iterator');\nvar TO_STRING_TAG$3 = wellKnownSymbol('toStringTag');\nvar ArrayValues = es_array_iterator.values;\n\nfor (var COLLECTION_NAME$1 in domIterables) {\n var Collection$1 = global_1[COLLECTION_NAME$1];\n var CollectionPrototype$1 = Collection$1 && Collection$1.prototype;\n if (CollectionPrototype$1) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype$1[ITERATOR$2] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype$1, ITERATOR$2, ArrayValues);\n } catch (error) {\n CollectionPrototype$1[ITERATOR$2] = ArrayValues;\n }\n if (!CollectionPrototype$1[TO_STRING_TAG$3]) {\n createNonEnumerableProperty(CollectionPrototype$1, TO_STRING_TAG$3, COLLECTION_NAME$1);\n }\n if (domIterables[COLLECTION_NAME$1]) for (var METHOD_NAME in es_array_iterator) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype$1[METHOD_NAME] !== es_array_iterator[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype$1, METHOD_NAME, es_array_iterator[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype$1[METHOD_NAME] = es_array_iterator[METHOD_NAME];\n }\n }\n }\n}\n\nvar ITERATOR$3 = wellKnownSymbol('iterator');\n\nvar nativeUrl = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (isPure && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR$3]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n\nvar anInstance = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n\nvar nativeAssign = Object.assign;\nvar defineProperty$4 = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nvar objectAssign = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (descriptors && nativeAssign({ b: 1 }, nativeAssign(defineProperty$4({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty$4(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = objectGetOwnPropertySymbols.f;\n var propertyIsEnumerable = objectPropertyIsEnumerable.f;\n while (argumentsLength > index) {\n var S = indexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!descriptors || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n\nvar iteratorClose = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n\n// call something on iterator step with safe closing on error\nvar callWithSafeIterationClosing = 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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n\nvar ITERATOR$4 = wellKnownSymbol('iterator');\nvar ArrayPrototype$1 = Array.prototype;\n\n// check on default Array iterator\nvar isArrayIteratorMethod = function (it) {\n return it !== undefined && (iterators.Array === it || ArrayPrototype$1[ITERATOR$4] === it);\n};\n\nvar ITERATOR$5 = wellKnownSymbol('iterator');\n\nvar getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR$5]\n || it['@@iterator']\n || iterators[classof(it)];\n};\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nvar arrayFrom = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = functionBindContext(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor$2 = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor$2(delta / damp) : delta >> 1;\n delta += floor$2(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor$2(delta / baseMinusTMin);\n }\n return floor$2(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor$2((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor$2(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nvar stringPunycodeToAscii = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n\nvar redefineAll = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n\nvar getIterator = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR$6 = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState$3 = internalState.set;\nvar getInternalParamsState = internalState.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = internalState.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState$3(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState$3(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (has(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = functionBindContext(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR$6, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n_export({ global: true, forced: !nativeUrl }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!nativeUrl && typeof $fetch == 'function' && typeof Headers == 'function') {\n _export({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = objectCreate(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nvar web_urlSearchParams = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\n\n\n\n\n\n\n\n\n\n\n\nvar codeAt = stringMultibyte.codeAt;\n\n\n\n\n\nvar NativeURL = global_1.URL;\nvar URLSearchParams$1 = web_urlSearchParams.URLSearchParams;\nvar getInternalSearchParamsState = web_urlSearchParams.getState;\nvar setInternalState$4 = internalState.set;\nvar getInternalURLState = internalState.getterFor('URL');\nvar floor$3 = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = stringPunycodeToAscii(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor$3(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = objectAssign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = objectAssign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = objectAssign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState$4(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams$1();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!descriptors) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (descriptors) {\n objectDefineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n_export({ global: true, forced: !nativeUrl, sham: !descriptors }, {\n URL: URLConstructor\n});\n\nfunction _typeof(obj) {\n \"@babel/helpers - typeof\";\n\n if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n _typeof = function (obj) {\n return typeof obj;\n };\n } else {\n _typeof = function (obj) {\n return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n };\n }\n\n return _typeof(obj);\n}\n\nfunction _classCallCheck(instance, Constructor) {\n if (!(instance instanceof Constructor)) {\n throw new TypeError(\"Cannot call a class as a function\");\n }\n}\n\nfunction _defineProperties(target, props) {\n for (var i = 0; i < props.length; i++) {\n var descriptor = props[i];\n descriptor.enumerable = descriptor.enumerable || false;\n descriptor.configurable = true;\n if (\"value\" in descriptor) descriptor.writable = true;\n Object.defineProperty(target, descriptor.key, descriptor);\n }\n}\n\nfunction _createClass(Constructor, protoProps, staticProps) {\n if (protoProps) _defineProperties(Constructor.prototype, protoProps);\n if (staticProps) _defineProperties(Constructor, staticProps);\n return Constructor;\n}\n\nfunction _defineProperty(obj, key, value) {\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n\n return obj;\n}\n\nfunction ownKeys$1(object, enumerableOnly) {\n var keys = Object.keys(object);\n\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n if (enumerableOnly) symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n });\n keys.push.apply(keys, symbols);\n }\n\n return keys;\n}\n\nfunction _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = arguments[i] != null ? arguments[i] : {};\n\n if (i % 2) {\n ownKeys$1(Object(source), true).forEach(function (key) {\n _defineProperty(target, key, source[key]);\n });\n } else if (Object.getOwnPropertyDescriptors) {\n Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n } else {\n ownKeys$1(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n }\n\n return target;\n}\n\nfunction _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n\n return target;\n}\n\nfunction _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n\n var target = _objectWithoutPropertiesLoose(source, excluded);\n\n var key, i;\n\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n\n return target;\n}\n\nfunction _slicedToArray(arr, i) {\n return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest();\n}\n\nfunction _toConsumableArray(arr) {\n return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread();\n}\n\nfunction _arrayWithoutHoles(arr) {\n if (Array.isArray(arr)) return _arrayLikeToArray(arr);\n}\n\nfunction _arrayWithHoles(arr) {\n if (Array.isArray(arr)) return arr;\n}\n\nfunction _iterableToArray(iter) {\n if (typeof Symbol !== \"undefined\" && Symbol.iterator in Object(iter)) return Array.from(iter);\n}\n\nfunction _iterableToArrayLimit(arr, i) {\n if (typeof Symbol === \"undefined\" || !(Symbol.iterator in Object(arr))) return;\n var _arr = [];\n var _n = true;\n var _d = false;\n var _e = undefined;\n\n try {\n for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {\n _arr.push(_s.value);\n\n if (i && _arr.length === i) break;\n }\n } catch (err) {\n _d = true;\n _e = err;\n } finally {\n try {\n if (!_n && _i[\"return\"] != null) _i[\"return\"]();\n } finally {\n if (_d) throw _e;\n }\n }\n\n return _arr;\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n if (!o) return;\n if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n var n = Object.prototype.toString.call(o).slice(8, -1);\n if (n === \"Object\" && o.constructor) n = o.constructor.name;\n if (n === \"Map\" || n === \"Set\") return Array.from(o);\n if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n if (len == null || len > arr.length) len = arr.length;\n\n for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n return arr2;\n}\n\nfunction _nonIterableSpread() {\n throw new TypeError(\"Invalid attempt to spread non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\nfunction _nonIterableRest() {\n throw new TypeError(\"Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n}\n\n(function (global) {\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 */\n var checkIfIteratorIsSupported = function checkIfIteratorIsSupported() {\n try {\n return !!Symbol.iterator;\n } catch (error) {\n return false;\n }\n };\n\n var iteratorSupported = checkIfIteratorIsSupported();\n\n var createIterator = function createIterator(items) {\n var iterator = {\n next: function next() {\n var value = items.shift();\n return {\n done: value === void 0,\n value: value\n };\n }\n };\n\n if (iteratorSupported) {\n iterator[Symbol.iterator] = function () {\n return iterator;\n };\n }\n\n return iterator;\n };\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 */\n\n\n var serializeParam = function serializeParam(value) {\n return encodeURIComponent(value).replace(/%20/g, '+');\n };\n\n var deserializeParam = function deserializeParam(value) {\n return decodeURIComponent(String(value).replace(/\\+/g, ' '));\n };\n\n var polyfillURLSearchParams = function polyfillURLSearchParams() {\n var URLSearchParams = function URLSearchParams(searchString) {\n Object.defineProperty(this, '_entries', {\n writable: true,\n value: {}\n });\n\n var typeofSearchString = _typeof(searchString);\n\n if (typeofSearchString === 'undefined') ; else if (typeofSearchString === 'string') {\n if (searchString !== '') {\n this._fromString(searchString);\n }\n } else if (searchString instanceof URLSearchParams) {\n var _this = this;\n\n searchString.forEach(function (value, name) {\n _this.append(name, value);\n });\n } else if (searchString !== null && typeofSearchString === 'object') {\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\n for (var i = 0; i < searchString.length; i++) {\n var entry = searchString[i];\n\n if (Object.prototype.toString.call(entry) === '[object Array]' || entry.length !== 2) {\n this.append(entry[0], entry[1]);\n } else {\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\n }\n }\n } else {\n for (var key in searchString) {\n if (searchString.hasOwnProperty(key)) {\n this.append(key, searchString[key]);\n }\n }\n }\n } else {\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\n }\n };\n\n var proto = URLSearchParams.prototype;\n\n proto.append = function (name, value) {\n if (name in this._entries) {\n this._entries[name].push(String(value));\n } else {\n this._entries[name] = [String(value)];\n }\n };\n\n proto.delete = function (name) {\n delete this._entries[name];\n };\n\n proto.get = function (name) {\n return name in this._entries ? this._entries[name][0] : null;\n };\n\n proto.getAll = function (name) {\n return name in this._entries ? this._entries[name].slice(0) : [];\n };\n\n proto.has = function (name) {\n return name in this._entries;\n };\n\n proto.set = function (name, value) {\n this._entries[name] = [String(value)];\n };\n\n proto.forEach = function (callback, thisArg) {\n var entries;\n\n for (var name in this._entries) {\n if (this._entries.hasOwnProperty(name)) {\n entries = this._entries[name];\n\n for (var i = 0; i < entries.length; i++) {\n callback.call(thisArg, entries[i], name, this);\n }\n }\n }\n };\n\n proto.keys = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push(name);\n });\n return createIterator(items);\n };\n\n proto.values = function () {\n var items = [];\n this.forEach(function (value) {\n items.push(value);\n });\n return createIterator(items);\n };\n\n proto.entries = function () {\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n });\n return createIterator(items);\n };\n\n if (iteratorSupported) {\n proto[Symbol.iterator] = proto.entries;\n }\n\n proto.toString = function () {\n var searchArray = [];\n this.forEach(function (value, name) {\n searchArray.push(serializeParam(name) + '=' + serializeParam(value));\n });\n return searchArray.join('&');\n };\n\n global.URLSearchParams = URLSearchParams;\n };\n\n var checkIfURLSearchParamsSupported = function checkIfURLSearchParamsSupported() {\n try {\n var URLSearchParams = global.URLSearchParams;\n return new URLSearchParams('?a=1').toString() === 'a=1' && typeof URLSearchParams.prototype.set === 'function' && typeof URLSearchParams.prototype.entries === 'function';\n } catch (e) {\n return false;\n }\n };\n\n if (!checkIfURLSearchParamsSupported()) {\n polyfillURLSearchParams();\n }\n\n var proto = global.URLSearchParams.prototype;\n\n if (typeof proto.sort !== 'function') {\n proto.sort = function () {\n var _this = this;\n\n var items = [];\n this.forEach(function (value, name) {\n items.push([name, value]);\n\n if (!_this._entries) {\n _this.delete(name);\n }\n });\n items.sort(function (a, b) {\n if (a[0] < b[0]) {\n return -1;\n } else if (a[0] > b[0]) {\n return +1;\n } else {\n return 0;\n }\n });\n\n if (_this._entries) {\n // force reset because IE keeps keys index\n _this._entries = {};\n }\n\n for (var i = 0; i < items.length; i++) {\n this.append(items[i][0], items[i][1]);\n }\n };\n }\n\n if (typeof proto._fromString !== 'function') {\n Object.defineProperty(proto, '_fromString', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value(searchString) {\n if (this._entries) {\n this._entries = {};\n } else {\n var keys = [];\n this.forEach(function (value, name) {\n keys.push(name);\n });\n\n for (var i = 0; i < keys.length; i++) {\n this.delete(keys[i]);\n }\n }\n\n searchString = searchString.replace(/^\\?/, '');\n var attributes = searchString.split('&');\n var attribute;\n\n for (var i = 0; i < attributes.length; i++) {\n attribute = attributes[i].split('=');\n this.append(deserializeParam(attribute[0]), attribute.length > 1 ? deserializeParam(attribute[1]) : '');\n }\n }\n });\n } // HTMLAnchorElement\n\n})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\n(function (global) {\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 */\n var checkIfURLIsSupported = function checkIfURLIsSupported() {\n try {\n var u = new global.URL('b', 'http://a');\n u.pathname = 'c d';\n return u.href === 'http://a/c%20d' && u.searchParams;\n } catch (e) {\n return false;\n }\n };\n\n var polyfillURL = function polyfillURL() {\n var _URL = global.URL;\n\n var URL = function URL(url, base) {\n if (typeof url !== 'string') url = String(url);\n if (base && typeof base !== 'string') base = String(base); // Only create another document if the base is different from current location.\n\n var doc = document,\n baseElement;\n\n if (base && (global.location === void 0 || base !== global.location.href)) {\n base = base.toLowerCase();\n doc = document.implementation.createHTMLDocument('');\n baseElement = doc.createElement('base');\n baseElement.href = base;\n doc.head.appendChild(baseElement);\n\n try {\n if (baseElement.href.indexOf(base) !== 0) throw new Error(baseElement.href);\n } catch (err) {\n throw new Error('URL unable to set base ' + base + ' due to ' + err);\n }\n }\n\n var anchorElement = doc.createElement('a');\n anchorElement.href = url;\n\n if (baseElement) {\n doc.body.appendChild(anchorElement);\n anchorElement.href = anchorElement.href; // force href to refresh\n }\n\n var inputElement = doc.createElement('input');\n inputElement.type = 'url';\n inputElement.value = url;\n\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || !inputElement.checkValidity() && !base) {\n throw new TypeError('Invalid URL');\n }\n\n Object.defineProperty(this, '_anchorElement', {\n value: anchorElement\n }); // create a linked searchParams which reflect its changes on URL\n\n var searchParams = new global.URLSearchParams(this.search);\n var enableSearchUpdate = true;\n var enableSearchParamsUpdate = true;\n\n var _this = this;\n\n ['append', 'delete', 'set'].forEach(function (methodName) {\n var method = searchParams[methodName];\n\n searchParams[methodName] = function () {\n method.apply(searchParams, arguments);\n\n if (enableSearchUpdate) {\n enableSearchParamsUpdate = false;\n _this.search = searchParams.toString();\n enableSearchParamsUpdate = true;\n }\n };\n });\n Object.defineProperty(this, 'searchParams', {\n value: searchParams,\n enumerable: true\n });\n var search = void 0;\n Object.defineProperty(this, '_updateSearchParams', {\n enumerable: false,\n configurable: false,\n writable: false,\n value: function value() {\n if (this.search !== search) {\n search = this.search;\n\n if (enableSearchParamsUpdate) {\n enableSearchUpdate = false;\n\n this.searchParams._fromString(this.search);\n\n enableSearchUpdate = true;\n }\n }\n }\n });\n };\n\n var proto = URL.prototype;\n\n var linkURLWithAnchorAttribute = function linkURLWithAnchorAttribute(attributeName) {\n Object.defineProperty(proto, attributeName, {\n get: function get() {\n return this._anchorElement[attributeName];\n },\n set: function set(value) {\n this._anchorElement[attributeName] = value;\n },\n enumerable: true\n });\n };\n\n ['hash', 'host', 'hostname', 'port', 'protocol'].forEach(function (attributeName) {\n linkURLWithAnchorAttribute(attributeName);\n });\n Object.defineProperty(proto, 'search', {\n get: function get() {\n return this._anchorElement['search'];\n },\n set: function set(value) {\n this._anchorElement['search'] = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n });\n Object.defineProperties(proto, {\n 'toString': {\n get: function get() {\n var _this = this;\n\n return function () {\n return _this.href;\n };\n }\n },\n 'href': {\n get: function get() {\n return this._anchorElement.href.replace(/\\?$/, '');\n },\n set: function set(value) {\n this._anchorElement.href = value;\n\n this._updateSearchParams();\n },\n enumerable: true\n },\n 'pathname': {\n get: function get() {\n return this._anchorElement.pathname.replace(/(^\\/?)/, '/');\n },\n set: function set(value) {\n this._anchorElement.pathname = value;\n },\n enumerable: true\n },\n 'origin': {\n get: function get() {\n // get expected port from protocol\n var expectedPort = {\n 'http:': 80,\n 'https:': 443,\n 'ftp:': 21\n }[this._anchorElement.protocol]; // add port to origin if, expected port is different than actual port\n // and it is not empty f.e http://foo:8080\n // 8080 != 80 && 8080 != ''\n\n var addPortToOrigin = this._anchorElement.port != expectedPort && this._anchorElement.port !== '';\n return this._anchorElement.protocol + '//' + this._anchorElement.hostname + (addPortToOrigin ? ':' + this._anchorElement.port : '');\n },\n enumerable: true\n },\n 'password': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n },\n 'username': {\n // TODO\n get: function get() {\n return '';\n },\n set: function set(value) {},\n enumerable: true\n }\n });\n\n URL.createObjectURL = function (blob) {\n return _URL.createObjectURL.apply(_URL, arguments);\n };\n\n URL.revokeObjectURL = function (url) {\n return _URL.revokeObjectURL.apply(_URL, arguments);\n };\n\n global.URL = URL;\n };\n\n if (!checkIfURLIsSupported()) {\n polyfillURL();\n }\n\n if (global.location !== void 0 && !('origin' in global.location)) {\n var getOrigin = function getOrigin() {\n return global.location.protocol + '//' + global.location.hostname + (global.location.port ? ':' + global.location.port : '');\n };\n\n try {\n Object.defineProperty(global.location, 'origin', {\n get: getOrigin,\n enumerable: true\n });\n } catch (e) {\n setInterval(function () {\n global.location.origin = getOrigin();\n }, 100);\n }\n }\n})(typeof commonjsGlobal !== 'undefined' ? commonjsGlobal : typeof window !== 'undefined' ? window : typeof self !== 'undefined' ? self : commonjsGlobal);\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = engineV8Version >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n_export({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n\nvar $filter = arrayIteration.filter;\n\n\n\nvar HAS_SPECIES_SUPPORT$1 = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH$3 = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$1 || !USES_TO_LENGTH$3 }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nvar $find = arrayIteration.find;\n\n\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH$4 = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n_export({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH$4 }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n\nvar ITERATOR$7 = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR$7] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nvar checkCorrectnessOfIteration = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR$7] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n_export({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: arrayFrom\n});\n\nvar $includes = arrayIncludes.includes;\n\n\n\nvar USES_TO_LENGTH$5 = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n_export({ target: 'Array', proto: true, forced: !USES_TO_LENGTH$5 }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n\nvar $map = arrayIteration.map;\n\n\n\nvar HAS_SPECIES_SUPPORT$2 = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH$6 = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$2 || !USES_TO_LENGTH$6 }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// makes subclassing work correct for wrapped built-ins\nvar inheritIfRequired = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n objectSetPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) objectSetPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n\n// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nvar whitespaces = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod$3 = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nvar stringTrim = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod$3(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod$3(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod$3(3)\n};\n\nvar getOwnPropertyNames = objectGetOwnPropertyNames.f;\nvar getOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\nvar defineProperty$5 = objectDefineProperty.f;\nvar trim = stringTrim.trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global_1[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classofRaw(objectCreate(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced_1(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classofRaw(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys$1 = descriptors ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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$1.length > j; j++) {\n if (has(NativeNumber, key = keys$1[j]) && !has(NumberWrapper, key)) {\n defineProperty$5(NumberWrapper, key, getOwnPropertyDescriptor$2(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global_1, NUMBER, NumberWrapper);\n}\n\nvar FAILS_ON_PRIMITIVES = fails(function () { objectKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n_export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return objectKeys(toObject(it));\n }\n});\n\nvar propertyIsEnumerable = objectPropertyIsEnumerable.f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod$4 = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!descriptors || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nvar objectToArray = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod$4(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod$4(false)\n};\n\nvar $values = objectToArray.values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n_export({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n\nvar notARegexp = function (it) {\n if (isRegexp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n\nvar MATCH$1 = wellKnownSymbol('match');\n\nvar correctIsRegexpLogic = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH$1] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n_export({ target: 'String', proto: true, forced: !correctIsRegexpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegexp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nvar freezing = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n\nvar internalMetadata = createCommonjsModule(function (module) {\nvar defineProperty = objectDefineProperty.f;\n\n\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (freezing && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n});\nvar internalMetadata_1 = internalMetadata.REQUIRED;\nvar internalMetadata_2 = internalMetadata.fastKey;\nvar internalMetadata_3 = internalMetadata.getWeakData;\nvar internalMetadata_4 = internalMetadata.onFreeze;\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nvar iterate = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = functionBindContext(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n\nvar collection = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global_1[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced_1(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n internalMetadata.REQUIRED = true;\n } else if (isForced_1(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n _export({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n\nvar getWeakData = internalMetadata.getWeakData;\n\n\n\n\n\n\n\n\nvar setInternalState$5 = internalState.set;\nvar internalStateGetterFor = internalState.getterFor;\nvar find$1 = arrayIteration.find;\nvar findIndex = arrayIteration.findIndex;\nvar id$1 = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find$1(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nvar collectionWeak = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState$5(that, {\n type: CONSTRUCTOR_NAME,\n id: id$1++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && has(data, state.id) && delete data[state.id];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has$1(key) {\n var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n\nvar es_weakMap = createCommonjsModule(function (module) {\n\n\n\n\n\n\nvar enforceIternalState = internalState.enforce;\n\n\nvar IS_IE11 = !global_1.ActiveXObject && 'ActiveXObject' in global_1;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (nativeWeakMap && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n internalMetadata.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n});\n\nvar $every = arrayIteration.every;\n\n\n\nvar STRICT_METHOD$3 = arrayMethodIsStrict('every');\nvar USES_TO_LENGTH$7 = arrayMethodUsesToLength('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$3 || !USES_TO_LENGTH$7 }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n_export({ target: 'Object', stat: true, forced: Object.assign !== objectAssign }, {\n assign: objectAssign\n});\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nvar stringTrimForced = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n\nvar $trim = stringTrim.trim;\n\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n_export({ target: 'String', proto: true, forced: stringTrimForced('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n\nvar $some = arrayIteration.some;\n\n\n\nvar STRICT_METHOD$4 = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH$8 = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$4 || !USES_TO_LENGTH$8 }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nvar thisNumberValue = function (value) {\n if (typeof value != 'number' && classofRaw(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nvar stringRepeat = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor$4 = Math.floor;\n\nvar pow$1 = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow$1(x, n - 1, acc * x) : pow$1(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED$1 = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n_export({ target: 'Number', proto: true, forced: FORCED$1 }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor$4(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor$4(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + stringRepeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow$1(2, 69, 1)) - 69;\n z = e < 0 ? number * pow$1(2, -e, 1) : number / pow$1(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow$1(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + stringRepeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + stringRepeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n\nvar $entries = objectToArray.entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n_export({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n_export({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n\nvar nativeGetOwnPropertyDescriptor$2 = objectGetOwnPropertyDescriptor.f;\n\n\nvar FAILS_ON_PRIMITIVES$1 = fails(function () { nativeGetOwnPropertyDescriptor$2(1); });\nvar FORCED$2 = !descriptors || FAILS_ON_PRIMITIVES$1;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n_export({ target: 'Object', stat: true, forced: FORCED$2, sham: !descriptors }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor$2(toIndexedObject(it), key);\n }\n});\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n_export({ target: 'Object', stat: true, sham: !descriptors }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = objectGetOwnPropertyDescriptor.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n});\n\n// @@match logic\nfixRegexpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regexpExecAbstract(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regexpExecAbstract(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n\nfunction _classCallCheck$1(e, t) {\n if (!(e instanceof t)) throw new TypeError(\"Cannot call a class as a function\");\n}\n\nfunction _defineProperties$1(e, t) {\n for (var n = 0; n < t.length; n++) {\n var r = t[n];\n r.enumerable = r.enumerable || !1, r.configurable = !0, \"value\" in r && (r.writable = !0), Object.defineProperty(e, r.key, r);\n }\n}\n\nfunction _createClass$1(e, t, n) {\n return t && _defineProperties$1(e.prototype, t), n && _defineProperties$1(e, n), e;\n}\n\nfunction _defineProperty$1(e, t, n) {\n return t in e ? Object.defineProperty(e, t, {\n value: n,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }) : e[t] = n, e;\n}\n\nfunction ownKeys$2(e, t) {\n var n = Object.keys(e);\n\n if (Object.getOwnPropertySymbols) {\n var r = Object.getOwnPropertySymbols(e);\n t && (r = r.filter(function (t) {\n return Object.getOwnPropertyDescriptor(e, t).enumerable;\n })), n.push.apply(n, r);\n }\n\n return n;\n}\n\nfunction _objectSpread2$1(e) {\n for (var t = 1; t < arguments.length; t++) {\n var n = null != arguments[t] ? arguments[t] : {};\n t % 2 ? ownKeys$2(Object(n), !0).forEach(function (t) {\n _defineProperty$1(e, t, n[t]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(n)) : ownKeys$2(Object(n)).forEach(function (t) {\n Object.defineProperty(e, t, Object.getOwnPropertyDescriptor(n, t));\n });\n }\n\n return e;\n}\n\nvar defaults = {\n addCSS: !0,\n thumbWidth: 15,\n watch: !0\n};\n\nfunction matches(e, t) {\n return function () {\n return Array.from(document.querySelectorAll(t)).includes(this);\n }.call(e, t);\n}\n\nfunction trigger(e, t) {\n if (e && t) {\n var n = new Event(t, {\n bubbles: !0\n });\n e.dispatchEvent(n);\n }\n}\n\nvar getConstructor = function getConstructor(e) {\n return null != e ? e.constructor : null;\n},\n instanceOf = function instanceOf(e, t) {\n return !!(e && t && e instanceof t);\n},\n isNullOrUndefined = function isNullOrUndefined(e) {\n return null == e;\n},\n isObject$1 = function isObject(e) {\n return getConstructor(e) === Object;\n},\n isNumber = function isNumber(e) {\n return getConstructor(e) === Number && !Number.isNaN(e);\n},\n isString = function isString(e) {\n return getConstructor(e) === String;\n},\n isBoolean = function isBoolean(e) {\n return getConstructor(e) === Boolean;\n},\n isFunction = function isFunction(e) {\n return getConstructor(e) === Function;\n},\n isArray$1 = function isArray(e) {\n return Array.isArray(e);\n},\n isNodeList = function isNodeList(e) {\n return instanceOf(e, NodeList);\n},\n isElement = function isElement(e) {\n return instanceOf(e, Element);\n},\n isEvent = function isEvent(e) {\n return instanceOf(e, Event);\n},\n isEmpty = function isEmpty(e) {\n return isNullOrUndefined(e) || (isString(e) || isArray$1(e) || isNodeList(e)) && !e.length || isObject$1(e) && !Object.keys(e).length;\n},\n is = {\n nullOrUndefined: isNullOrUndefined,\n object: isObject$1,\n number: isNumber,\n string: isString,\n boolean: isBoolean,\n function: isFunction,\n array: isArray$1,\n nodeList: isNodeList,\n element: isElement,\n event: isEvent,\n empty: isEmpty\n};\n\nfunction getDecimalPlaces(e) {\n var t = \"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);\n return t ? Math.max(0, (t[1] ? t[1].length : 0) - (t[2] ? +t[2] : 0)) : 0;\n}\n\nfunction round(e, t) {\n if (1 > t) {\n var n = getDecimalPlaces(t);\n return parseFloat(e.toFixed(n));\n }\n\n return Math.round(e / t) * t;\n}\n\nvar RangeTouch = function () {\n function e(t, n) {\n _classCallCheck$1(this, e), is.element(t) ? this.element = t : is.string(t) && (this.element = document.querySelector(t)), is.element(this.element) && is.empty(this.element.rangeTouch) && (this.config = _objectSpread2$1({}, defaults, {}, n), this.init());\n }\n\n return _createClass$1(e, [{\n key: \"init\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"none\", this.element.style.webKitUserSelect = \"none\", this.element.style.touchAction = \"manipulation\"), this.listeners(!0), this.element.rangeTouch = this);\n }\n }, {\n key: \"destroy\",\n value: function value() {\n e.enabled && (this.config.addCSS && (this.element.style.userSelect = \"\", this.element.style.webKitUserSelect = \"\", this.element.style.touchAction = \"\"), this.listeners(!1), this.element.rangeTouch = null);\n }\n }, {\n key: \"listeners\",\n value: function value(e) {\n var t = this,\n n = e ? \"addEventListener\" : \"removeEventListener\";\n [\"touchstart\", \"touchmove\", \"touchend\"].forEach(function (e) {\n t.element[n](e, function (e) {\n return t.set(e);\n }, !1);\n });\n }\n }, {\n key: \"get\",\n value: function value(t) {\n if (!e.enabled || !is.event(t)) return null;\n var n,\n r = t.target,\n i = t.changedTouches[0],\n o = parseFloat(r.getAttribute(\"min\")) || 0,\n s = parseFloat(r.getAttribute(\"max\")) || 100,\n u = parseFloat(r.getAttribute(\"step\")) || 1,\n c = r.getBoundingClientRect(),\n a = 100 / c.width * (this.config.thumbWidth / 2) / 100;\n return 0 > (n = 100 / c.width * (i.clientX - c.left)) ? n = 0 : 100 < n && (n = 100), 50 > n ? n -= (100 - 2 * n) * a : 50 < n && (n += 2 * (n - 50) * a), o + round(n / 100 * (s - o), u);\n }\n }, {\n key: \"set\",\n value: function value(t) {\n e.enabled && is.event(t) && !t.target.disabled && (t.preventDefault(), t.target.value = this.get(t), trigger(t.target, \"touchend\" === t.type ? \"change\" : \"input\"));\n }\n }], [{\n key: \"setup\",\n value: function value(t) {\n var n = 1 < arguments.length && void 0 !== arguments[1] ? arguments[1] : {},\n r = null;\n if (is.empty(t) || is.string(t) ? r = Array.from(document.querySelectorAll(is.string(t) ? t : 'input[type=\"range\"]')) : is.element(t) ? r = [t] : is.nodeList(t) ? r = Array.from(t) : is.array(t) && (r = t.filter(is.element)), is.empty(r)) return null;\n\n var i = _objectSpread2$1({}, defaults, {}, n);\n\n if (is.string(t) && i.watch) {\n var o = new MutationObserver(function (n) {\n Array.from(n).forEach(function (n) {\n Array.from(n.addedNodes).forEach(function (n) {\n is.element(n) && matches(n, t) && new e(n, i);\n });\n });\n });\n o.observe(document.body, {\n childList: !0,\n subtree: !0\n });\n }\n\n return r.map(function (t) {\n return new e(t, n);\n });\n }\n }, {\n key: \"enabled\",\n get: function get() {\n return \"ontouchstart\" in document.documentElement;\n }\n }]), e;\n}();\n\nvar nativePromiseConstructor = global_1.Promise;\n\nvar SPECIES$5 = wellKnownSymbol('species');\n\nvar setSpecies = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = objectDefineProperty.f;\n\n if (descriptors && Constructor && !Constructor[SPECIES$5]) {\n defineProperty(Constructor, SPECIES$5, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n\nvar engineIsIos = /(iphone|ipod|ipad).*applewebkit/i.test(engineUserAgent);\n\nvar engineIsNode = classofRaw(global_1.process) == 'process';\n\nvar location = global_1.location;\nvar set$1 = global_1.setImmediate;\nvar clear = global_1.clearImmediate;\nvar process$1 = global_1.process;\nvar MessageChannel = global_1.MessageChannel;\nvar Dispatch = global_1.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global_1.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set$1 || !clear) {\n set$1 = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (engineIsNode) {\n defer = function (id) {\n process$1.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !engineIsIos) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = functionBindContext(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 (\n global_1.addEventListener &&\n typeof postMessage == 'function' &&\n !global_1.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global_1.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in documentCreateElement('script')) {\n defer = function (id) {\n html.appendChild(documentCreateElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nvar task = {\n set: set$1,\n clear: clear\n};\n\nvar getOwnPropertyDescriptor$3 = objectGetOwnPropertyDescriptor.f;\nvar macrotask = task.set;\n\n\n\nvar MutationObserver$1 = global_1.MutationObserver || global_1.WebKitMutationObserver;\nvar document$2 = global_1.document;\nvar process$2 = global_1.process;\nvar Promise$1 = global_1.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor$3(global_1, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (engineIsNode && (parent = process$2.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!engineIsIos && !engineIsNode && MutationObserver$1 && document$2) {\n toggle = true;\n node = document$2.createTextNode('');\n new MutationObserver$1(flush).observe(node, { characterData: true });\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise$1 && Promise$1.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise$1.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (engineIsNode) {\n notify = function () {\n process$2.nextTick(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_1, flush);\n };\n }\n}\n\nvar microtask = queueMicrotask || 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\nvar PromiseCapability = function (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$1(resolve);\n this.reject = aFunction$1(reject);\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\nvar f$7 = function (C) {\n return new PromiseCapability(C);\n};\n\nvar newPromiseCapability = {\n\tf: f$7\n};\n\nvar promiseResolve = 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\nvar hostReportErrors = function (a, b) {\n var console = global_1.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n\nvar perform = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n\nvar task$1 = task.set;\n\n\n\n\n\n\n\n\n\n\n\nvar SPECIES$6 = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState$3 = internalState.get;\nvar setInternalState$6 = internalState.set;\nvar getInternalPromiseState = internalState.getterFor(PROMISE);\nvar PromiseConstructor = nativePromiseConstructor;\nvar TypeError$1 = global_1.TypeError;\nvar document$3 = global_1.document;\nvar process$3 = global_1.process;\nvar $fetch$1 = getBuiltIn('fetch');\nvar newPromiseCapability$1 = newPromiseCapability.f;\nvar newGenericPromiseCapability = newPromiseCapability$1;\nvar DISPATCH_EVENT = !!(document$3 && document$3.createEvent && global_1.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED$3 = isForced_1(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (engineV8Version === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!engineIsNode && !NATIVE_REJECTION_EVENT) return true;\n }\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (engineV8Version >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES$6] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION$1 = FORCED$3 || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify$1 = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError$1('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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document$3.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global_1.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global_1['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n task$1.call(global_1, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (engineIsNode) {\n process$3.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = engineIsNode || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n task$1.call(global_1, function () {\n var promise = state.facade;\n if (engineIsNode) {\n process$3.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify$1(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError$1(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify$1(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED$3) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction$1(executor);\n Internal.call(this);\n var state = getInternalState$3(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState$6(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability$1(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = engineIsNode ? process$3.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify$1(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState$3(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapability.f = newPromiseCapability$1 = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if ( typeof nativePromiseConstructor == 'function') {\n nativeThen = nativePromiseConstructor.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(nativePromiseConstructor.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch$1 == 'function') _export({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch$1.apply(global_1, arguments));\n }\n });\n }\n}\n\n_export({ global: true, wrap: true, forced: FORCED$3 }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n_export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability$1(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n_export({ target: PROMISE, stat: true, forced: FORCED$3 }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve( this, x);\n }\n});\n\n_export({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION$1 }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability$1(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction$1(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability$1(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction$1(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n\nvar getOwnPropertyDescriptor$4 = objectGetOwnPropertyDescriptor.f;\n\n\n\n\n\n\nvar nativeStartsWith = ''.startsWith;\nvar min$4 = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegexpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor$4(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n_export({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegexp(searchString);\n var index = toLength(min$4(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n\n// ==========================================================================\n// Type checking utils\n// ==========================================================================\nvar getConstructor$1 = function getConstructor(input) {\n return input !== null && typeof input !== 'undefined' ? input.constructor : null;\n};\n\nvar instanceOf$1 = function instanceOf(input, constructor) {\n return Boolean(input && constructor && input instanceof constructor);\n};\n\nvar isNullOrUndefined$1 = function isNullOrUndefined(input) {\n return input === null || typeof input === 'undefined';\n};\n\nvar isObject$2 = function isObject(input) {\n return getConstructor$1(input) === Object;\n};\n\nvar isNumber$1 = function isNumber(input) {\n return getConstructor$1(input) === Number && !Number.isNaN(input);\n};\n\nvar isString$1 = function isString(input) {\n return getConstructor$1(input) === String;\n};\n\nvar isBoolean$1 = function isBoolean(input) {\n return getConstructor$1(input) === Boolean;\n};\n\nvar isFunction$1 = function isFunction(input) {\n return getConstructor$1(input) === Function;\n};\n\nvar isArray$2 = function isArray(input) {\n return Array.isArray(input);\n};\n\nvar isWeakMap = function isWeakMap(input) {\n return instanceOf$1(input, WeakMap);\n};\n\nvar isNodeList$1 = function isNodeList(input) {\n return instanceOf$1(input, NodeList);\n};\n\nvar isTextNode = function isTextNode(input) {\n return getConstructor$1(input) === Text;\n};\n\nvar isEvent$1 = function isEvent(input) {\n return instanceOf$1(input, Event);\n};\n\nvar isKeyboardEvent = function isKeyboardEvent(input) {\n return instanceOf$1(input, KeyboardEvent);\n};\n\nvar isCue = function isCue(input) {\n return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);\n};\n\nvar isTrack = function isTrack(input) {\n return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);\n};\n\nvar isPromise = function isPromise(input) {\n return instanceOf$1(input, Promise) && isFunction$1(input.then);\n};\n\nvar isElement$1 = function isElement(input) {\n return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';\n};\n\nvar isEmpty$1 = function isEmpty(input) {\n return isNullOrUndefined$1(input) || (isString$1(input) || isArray$2(input) || isNodeList$1(input)) && !input.length || isObject$2(input) && !Object.keys(input).length;\n};\n\nvar isUrl = function isUrl(input) {\n // Accept a URL object\n if (instanceOf$1(input, window.URL)) {\n return true;\n } // Must be string from here\n\n\n if (!isString$1(input)) {\n return false;\n } // Add the protocol if required\n\n\n var string = input;\n\n if (!input.startsWith('http://') || !input.startsWith('https://')) {\n string = \"http://\".concat(input);\n }\n\n try {\n return !isEmpty$1(new URL(string).hostname);\n } catch (e) {\n return false;\n }\n};\n\nvar is$1 = {\n nullOrUndefined: isNullOrUndefined$1,\n object: isObject$2,\n number: isNumber$1,\n string: isString$1,\n boolean: isBoolean$1,\n function: isFunction$1,\n array: isArray$2,\n weakMap: isWeakMap,\n nodeList: isNodeList$1,\n element: isElement$1,\n textNode: isTextNode,\n event: isEvent$1,\n keyboardEvent: isKeyboardEvent,\n cue: isCue,\n track: isTrack,\n promise: isPromise,\n url: isUrl,\n empty: isEmpty$1\n};\n\nvar transitionEndEvent = function () {\n var element = document.createElement('span');\n var events = {\n WebkitTransition: 'webkitTransitionEnd',\n MozTransition: 'transitionend',\n OTransition: 'oTransitionEnd otransitionend',\n transition: 'transitionend'\n };\n var type = Object.keys(events).find(function (event) {\n return element.style[event] !== undefined;\n });\n return is$1.string(type) ? events[type] : false;\n}(); // Force repaint of element\n\nfunction repaint(element, delay) {\n setTimeout(function () {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true; // eslint-disable-next-line no-unused-expressions\n\n element.offsetHeight; // eslint-disable-next-line no-param-reassign\n\n element.hidden = false;\n } catch (e) {// Do nothing\n }\n }, delay);\n}\n\n// ==========================================================================\n// Browser sniffing\n// Unfortunately, due to mixed support, UA sniffing is required\n// ==========================================================================\nvar browser = {\n isIE:\n /* @cc_on!@ */\n !!document.documentMode,\n isEdge: window.navigator.userAgent.includes('Edge'),\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\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod$5 = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction$1(callbackfn);\n var O = toObject(that);\n var self = indexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nvar arrayReduce = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod$5(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod$5(true)\n};\n\nvar $reduce = arrayReduce.left;\n\n\n\n\n\nvar STRICT_METHOD$5 = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH$9 = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !engineIsNode && engineV8Version > 79 && engineV8Version < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n_export({ target: 'Array', proto: true, forced: !STRICT_METHOD$5 || !USES_TO_LENGTH$9 || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nfunction cloneDeep(object) {\n return JSON.parse(JSON.stringify(object));\n} // Get a nested value in an object\n\nfunction getDeep(object, path) {\n return path.split('.').reduce(function (obj, key) {\n return obj && obj[key];\n }, object);\n} // Deep extend destination object with N more objects\n\nfunction extend() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n\n for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n sources[_key - 1] = arguments[_key];\n }\n\n if (!sources.length) {\n return target;\n }\n\n var source = sources.shift();\n\n if (!is$1.object(source)) {\n return target;\n }\n\n Object.keys(source).forEach(function (key) {\n if (is$1.object(source[key])) {\n if (!Object.keys(target).includes(key)) {\n Object.assign(target, _defineProperty({}, key, {}));\n }\n\n extend(target[key], source[key]);\n } else {\n Object.assign(target, _defineProperty({}, key, source[key]));\n }\n });\n return extend.apply(void 0, [target].concat(sources));\n}\n\nfunction wrap$1(elements, wrapper) {\n // Convert `elements` to an array, if necessary.\n var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the\n // first element (see `child` below).\n\n Array.from(targets).reverse().forEach(function (element, index) {\n var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.\n\n var parent = element.parentNode;\n var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current\n // parent).\n\n child.appendChild(element); // 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\n if (sibling) {\n parent.insertBefore(child, sibling);\n } else {\n parent.appendChild(child);\n }\n });\n} // Set attributes\n\nfunction setAttributes(element, attributes) {\n if (!is$1.element(element) || is$1.empty(attributes)) {\n return;\n } // Assume null and undefined attributes should be left out,\n // Setting them would otherwise convert them to \"null\" and \"undefined\"\n\n\n Object.entries(attributes).filter(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n value = _ref2[1];\n\n return !is$1.nullOrUndefined(value);\n }).forEach(function (_ref3) {\n var _ref4 = _slicedToArray(_ref3, 2),\n key = _ref4[0],\n value = _ref4[1];\n\n return element.setAttribute(key, value);\n });\n} // Create a DocumentFragment\n\nfunction createElement(type, attributes, text) {\n // Create a new <element>\n var element = document.createElement(type); // Set all passed attributes\n\n if (is$1.object(attributes)) {\n setAttributes(element, attributes);\n } // Add text node\n\n\n if (is$1.string(text)) {\n element.innerText = text;\n } // Return built element\n\n\n return element;\n} // Inaert an element after another\n\nfunction insertAfter(element, target) {\n if (!is$1.element(element) || !is$1.element(target)) {\n return;\n }\n\n target.parentNode.insertBefore(element, target.nextSibling);\n} // Insert a DocumentFragment\n\nfunction insertElement(type, parent, attributes, text) {\n if (!is$1.element(parent)) {\n return;\n }\n\n parent.appendChild(createElement(type, attributes, text));\n} // Remove element(s)\n\nfunction removeElement(element) {\n if (is$1.nodeList(element) || is$1.array(element)) {\n Array.from(element).forEach(removeElement);\n return;\n }\n\n if (!is$1.element(element) || !is$1.element(element.parentNode)) {\n return;\n }\n\n element.parentNode.removeChild(element);\n} // Remove all child elements\n\nfunction emptyElement(element) {\n if (!is$1.element(element)) {\n return;\n }\n\n var length = element.childNodes.length;\n\n while (length > 0) {\n element.removeChild(element.lastChild);\n length -= 1;\n }\n} // Replace element\n\nfunction replaceElement(newChild, oldChild) {\n if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {\n return null;\n }\n\n oldChild.parentNode.replaceChild(newChild, oldChild);\n return newChild;\n} // Get an attribute object from a string selector\n\nfunction 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 if (!is$1.string(sel) || is$1.empty(sel)) {\n return {};\n }\n\n var attributes = {};\n var existing = extend({}, existingAttributes);\n sel.split(',').forEach(function (s) {\n // Remove whitespace\n var selector = s.trim();\n var className = selector.replace('.', '');\n var stripped = selector.replace(/[[\\]]/g, ''); // Get the parts and value\n\n var parts = stripped.split('=');\n\n var _parts = _slicedToArray(parts, 1),\n key = _parts[0];\n\n var value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : ''; // Get the first character\n\n var start = selector.charAt(0);\n\n switch (start) {\n case '.':\n // Add to existing classname\n if (is$1.string(existing.class)) {\n attributes.class = \"\".concat(existing.class, \" \").concat(className);\n } else {\n attributes.class = className;\n }\n\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 break;\n }\n });\n return extend(existing, attributes);\n} // Toggle hidden\n\nfunction toggleHidden(element, hidden) {\n if (!is$1.element(element)) {\n return;\n }\n\n var hide = hidden;\n\n if (!is$1.boolean(hide)) {\n hide = !element.hidden;\n } // eslint-disable-next-line no-param-reassign\n\n\n element.hidden = hide;\n} // Mirror Element.classList.toggle, with IE compatibility for \"force\" argument\n\nfunction toggleClass(element, className, force) {\n if (is$1.nodeList(element)) {\n return Array.from(element).map(function (e) {\n return toggleClass(e, className, force);\n });\n }\n\n if (is$1.element(element)) {\n var method = 'toggle';\n\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} // Has class name\n\nfunction hasClass(element, className) {\n return is$1.element(element) && element.classList.contains(className);\n} // Element matches selector\n\nfunction matches$1(element, selector) {\n var _Element = Element,\n prototype = _Element.prototype;\n\n function match() {\n return Array.from(document.querySelectorAll(selector)).includes(this);\n }\n\n var method = prototype.matches || prototype.webkitMatchesSelector || prototype.mozMatchesSelector || prototype.msMatchesSelector || match;\n return method.call(element, selector);\n} // Closest ancestor element matching selector (also tests element itself)\n\nfunction closest(element, selector) {\n var _Element2 = Element,\n prototype = _Element2.prototype; // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n\n function closestElement() {\n var el = this;\n\n do {\n if (matches$1.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n\n return null;\n }\n\n var method = prototype.closest || closestElement;\n return method.call(element, selector);\n} // Find all elements\n\nfunction getElements(selector) {\n return this.elements.container.querySelectorAll(selector);\n} // Find a single element\n\nfunction getElement(selector) {\n return this.elements.container.querySelector(selector);\n} // Set focus and tab focus class\n\nfunction setFocus() {\n var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!is$1.element(element)) {\n return;\n } // Set regular focus\n\n\n element.focus({\n preventScroll: true\n }); // If we want to mimic keyboard focus via tab\n\n if (tabFocus) {\n toggleClass(element, this.config.classNames.tabFocus);\n }\n}\n\nvar 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}; // Check for feature support\n\nvar support = {\n // Basic support\n audio: 'canPlayType' in document.createElement('audio'),\n video: 'canPlayType' in document.createElement('video'),\n // Check for support\n // Basic functionality vs full UI\n check: function check(type, provider, playsinline) {\n var canPlayInline = browser.isIPhone && playsinline && support.playsinline;\n var api = support[type] || provider !== 'html5';\n var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);\n return {\n api: api,\n ui: ui\n };\n },\n // Picture-in-picture support\n // Safari & Chrome only currently\n pip: function () {\n if (browser.isIPhone) {\n return false;\n } // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n\n\n if (is$1.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n } // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n\n\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n }(),\n // Airplay support\n // Safari only currently\n airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),\n // Inline playback support\n // https://webkit.org/blog/6784/new-video-policies-for-ios/\n playsinline: 'playsInline' in document.createElement('video'),\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: function mime(input) {\n if (is$1.empty(input)) {\n return false;\n }\n\n var _input$split = input.split('/'),\n _input$split2 = _slicedToArray(_input$split, 1),\n mediaType = _input$split2[0];\n\n var type = input; // Verify we're using HTML5 and there's no media type mismatch\n\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n } // Add codec if required\n\n\n if (Object.keys(defaultCodecs).includes(type)) {\n type += \"; codecs=\\\"\".concat(defaultCodecs[input], \"\\\"\");\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\n return false;\n }\n },\n // Check for textTracks support\n textTracks: 'textTracks' in document.createElement('video'),\n // <input type=\"range\"> Sliders\n rangeInput: function () {\n var range = document.createElement('input');\n range.type = 'range';\n return range.type === 'range';\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 // Detect transitions support\n transitions: transitionEndEvent !== false,\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\n// https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md\n// https://www.youtube.com/watch?v=NPM6172J22g\n\nvar supportsPassiveListeners = function () {\n // Test via a getter in the options object to see if the passive property is accessed\n var supported = false;\n\n try {\n var options = Object.defineProperty({}, 'passive', {\n get: function get() {\n supported = true;\n return null;\n }\n });\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {// Do nothing\n }\n\n return supported;\n}(); // Toggle event listener\n\n\nfunction toggleListener(element, event, callback) {\n var _this = this;\n\n var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;\n\n // Bail if no element, event, or callback\n if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {\n return;\n } // Allow multiple events\n\n\n var events = event.split(' '); // Build options\n // Default to just the capture boolean for browsers with no passive listener support\n\n var options = capture; // If passive events listeners are supported\n\n if (supportsPassiveListeners) {\n options = {\n // Whether the listener can be passive (i.e. default never prevented)\n passive: passive,\n // Whether the listener is a capturing listener or not\n capture: capture\n };\n } // If a single node is passed, bind the event listener\n\n\n events.forEach(function (type) {\n if (_this && _this.eventListeners && toggle) {\n // Cache event listener\n _this.eventListeners.push({\n element: element,\n type: type,\n callback: callback,\n options: options\n });\n }\n\n element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);\n });\n} // Bind event handler\n\nfunction on(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, true, passive, capture);\n} // Unbind event handler\n\nfunction off(element) {\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n toggleListener.call(this, element, events, callback, false, passive, capture);\n} // Bind once-only event handler\n\nfunction once(element) {\n var _this2 = this;\n\n var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var callback = arguments.length > 2 ? arguments[2] : undefined;\n var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;\n var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;\n\n var onceCallback = function onceCallback() {\n off(element, events, onceCallback, passive, capture);\n\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n callback.apply(_this2, args);\n };\n\n toggleListener.call(this, element, events, onceCallback, true, passive, capture);\n} // Trigger event\n\nfunction triggerEvent(element) {\n var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};\n\n // Bail if no element\n if (!is$1.element(element) || is$1.empty(type)) {\n return;\n } // Create and dispatch the event\n\n\n var event = new CustomEvent(type, {\n bubbles: bubbles,\n detail: _objectSpread2(_objectSpread2({}, detail), {}, {\n plyr: this\n })\n }); // Dispatch the event\n\n element.dispatchEvent(event);\n} // Unbind all cached event listeners\n\nfunction unbindListeners() {\n if (this && this.eventListeners) {\n this.eventListeners.forEach(function (item) {\n var element = item.element,\n type = item.type,\n callback = item.callback,\n options = item.options;\n element.removeEventListener(type, callback, options);\n });\n this.eventListeners = [];\n }\n} // Run method when / if player is ready\n\nfunction ready() {\n var _this3 = this;\n\n return new Promise(function (resolve) {\n return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);\n }).then(function () {});\n}\n\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\n\nfunction silencePromise(value) {\n if (is$1.promise(value)) {\n value.then(null, function () {});\n }\n}\n\nfunction validateRatio(input) {\n if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {\n return false;\n }\n\n var ratio = is$1.array(input) ? input : input.split(':');\n return ratio.map(Number).every(is$1.number);\n}\nfunction reduceAspectRatio(ratio) {\n if (!is$1.array(ratio) || !ratio.every(is$1.number)) {\n return null;\n }\n\n var _ratio = _slicedToArray(ratio, 2),\n width = _ratio[0],\n height = _ratio[1];\n\n var getDivider = function getDivider(w, h) {\n return h === 0 ? w : getDivider(h, w % h);\n };\n\n var divider = getDivider(width, height);\n return [width / divider, height / divider];\n}\nfunction getAspectRatio(input) {\n var parse = function parse(ratio) {\n return validateRatio(ratio) ? ratio.split(':').map(Number) : null;\n }; // Try provided ratio\n\n\n var ratio = parse(input); // Get from config\n\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n } // Get from embed\n\n\n if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {\n ratio = this.embed.ratio;\n } // Get from HTML5 video\n\n\n if (ratio === null && this.isHTML5) {\n var _this$media = this.media,\n videoWidth = _this$media.videoWidth,\n videoHeight = _this$media.videoHeight;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n} // Set aspect ratio for responsive container\n\nfunction setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n var wrapper = this.elements.wrapper;\n var ratio = getAspectRatio.call(this, input);\n\n var _ref = is$1.array(ratio) ? ratio : [0, 0],\n _ref2 = _slicedToArray(_ref, 2),\n w = _ref2[0],\n h = _ref2[1];\n\n var padding = 100 / w * h;\n wrapper.style.paddingBottom = \"\".concat(padding, \"%\"); // For Vimeo we have an extra <div> to hide the standard controls and UI\n\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n var height = 100 / this.media.offsetWidth * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n var offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = \"translateY(-\".concat(offset, \"%)\");\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return {\n padding: padding,\n ratio: ratio\n };\n}\n\nvar html5 = {\n getSources: function getSources() {\n var _this = this;\n\n if (!this.isHTML5) {\n return [];\n }\n\n var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)\n\n return sources.filter(function (source) {\n var type = source.getAttribute('type');\n\n if (is$1.empty(type)) {\n return true;\n }\n\n return support.mime.call(_this, type);\n });\n },\n // Get quality levels\n getQualityOptions: function getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n } // Get sizes from <source> elements\n\n\n return html5.getSources.call(this).map(function (source) {\n return Number(source.getAttribute('size'));\n }).filter(Boolean);\n },\n setup: function setup() {\n if (!this.isHTML5) {\n return;\n }\n\n var player = this; // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set aspect ratio if fixed\n\n if (!is$1.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n } // Quality\n\n\n Object.defineProperty(player.media, 'quality', {\n get: function get() {\n // Get sources\n var sources = html5.getSources.call(player);\n var source = sources.find(function (s) {\n return s.getAttribute('src') === player.source;\n }); // Return size, if match is found\n\n return source && Number(source.getAttribute('size'));\n },\n set: function set(input) {\n if (player.quality === input) {\n return;\n } // If we're using an an external handler...\n\n\n if (player.config.quality.forced && is$1.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n var sources = html5.getSources.call(player); // Get first match for requested size\n\n var source = sources.find(function (s) {\n return Number(s.getAttribute('size')) === input;\n }); // No matching source found\n\n if (!source) {\n return;\n } // Get current state\n\n\n var _player$media = player.media,\n currentTime = _player$media.currentTime,\n paused = _player$media.paused,\n preload = _player$media.preload,\n readyState = _player$media.readyState,\n playbackRate = _player$media.playbackRate; // Set new source\n\n player.media.src = source.getAttribute('src'); // Prevent loading if preload=\"none\" and the current source isn't loaded (#1044)\n\n if (preload !== 'none' || readyState) {\n // Restore time\n player.once('loadedmetadata', function () {\n player.speed = playbackRate;\n player.currentTime = currentTime; // Resume playing\n\n if (!paused) {\n silencePromise(player.play());\n }\n }); // Load new source\n\n player.media.load();\n }\n } // Trigger change event\n\n\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input\n });\n }\n });\n },\n // Cancel current network requests\n // See https://github.com/sampotts/plyr/issues/174\n cancelRequests: function cancelRequests() {\n if (!this.isHTML5) {\n return;\n } // Remove child sources\n\n\n removeElement(html5.getSources.call(this)); // 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\n this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source\n // This will cancel existing requests\n // See https://github.com/sampotts/plyr/issues/174\n\n this.media.load(); // Debugging\n\n this.debug.log('Cancelled network requests');\n }\n};\n\nfunction dedupe(array) {\n if (!is$1.array(array)) {\n return array;\n }\n\n return array.filter(function (item, index) {\n return array.indexOf(item) === index;\n });\n} // Get the closest value in an array\n\nfunction closest$1(array, value) {\n if (!is$1.array(array) || !array.length) {\n return null;\n }\n\n return array.reduce(function (prev, curr) {\n return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;\n });\n}\n\nvar defineProperty$6 = objectDefineProperty.f;\nvar getOwnPropertyNames$1 = objectGetOwnPropertyNames.f;\n\n\n\n\n\nvar setInternalState$7 = internalState.set;\n\n\n\nvar MATCH$2 = wellKnownSymbol('match');\nvar NativeRegExp = global_1.RegExp;\nvar RegExpPrototype$1 = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y$2 = regexpStickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED$4 = descriptors && isForced_1('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y$2 || fails(function () {\n re2[MATCH$2] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED$4) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegexp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = regexpFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y$2) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype$1,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y$2 && sticky) setInternalState$7(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty$6(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys$2 = getOwnPropertyNames$1(NativeRegExp);\n var index = 0;\n while (keys$2.length > index) proxy(keys$2[index++]);\n RegExpPrototype$1.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype$1;\n redefine(global_1, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('RegExp');\n\nfunction generateId(prefix) {\n return \"\".concat(prefix, \"-\").concat(Math.floor(Math.random() * 10000));\n} // Format string\n\nfunction format(input) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n if (is$1.empty(input)) {\n return input;\n }\n\n return input.toString().replace(/{(\\d+)}/g, function (match, i) {\n return args[i].toString();\n });\n} // Get percentage\n\nfunction 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} // Replace all occurances of a string in a string\n\nvar replaceAll = function replaceAll() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';\n var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';\n return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n}; // Convert to title case\n\nvar toTitleCase = function toTitleCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n return input.toString().replace(/\\w\\S*/g, function (text) {\n return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();\n });\n}; // Convert string to pascalCase\n\nfunction toPascalCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert kebab case\n\n string = replaceAll(string, '-', ' '); // Convert snake case\n\n string = replaceAll(string, '_', ' '); // Convert to title case\n\n string = toTitleCase(string); // Convert to pascal case\n\n return replaceAll(string, ' ', '');\n} // Convert string to pascalCase\n\nfunction toCamelCase() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var string = input.toString(); // Convert to pascal case\n\n string = toPascalCase(string); // Convert first character to lowercase\n\n return string.charAt(0).toLowerCase() + string.slice(1);\n} // Remove HTML from a string\n\nfunction stripHTML(source) {\n var fragment = document.createDocumentFragment();\n var element = document.createElement('div');\n fragment.appendChild(element);\n element.innerHTML = source;\n return fragment.firstChild.innerText;\n} // Like outerHTML, but also works for DocumentFragment\n\nfunction getHTML(element) {\n var wrapper = document.createElement('div');\n wrapper.appendChild(element);\n return wrapper.innerHTML;\n}\n\nvar resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube'\n};\nvar i18n = {\n get: function get() {\n var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n if (is$1.empty(key) || is$1.empty(config)) {\n return '';\n }\n\n var string = getDeep(config.i18n, key);\n\n if (is$1.empty(string)) {\n if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n var replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title\n };\n Object.entries(replace).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n k = _ref2[0],\n v = _ref2[1];\n\n string = replaceAll(string, k, v);\n });\n return string;\n }\n};\n\nvar Storage = /*#__PURE__*/function () {\n function Storage(player) {\n var _this = this;\n\n _classCallCheck(this, Storage);\n\n _defineProperty(this, \"get\", function (key) {\n if (!Storage.supported || !_this.enabled) {\n return null;\n }\n\n var store = window.localStorage.getItem(_this.key);\n\n if (is$1.empty(store)) {\n return null;\n }\n\n var json = JSON.parse(store);\n return is$1.string(key) && key.length ? json[key] : json;\n });\n\n _defineProperty(this, \"set\", function (object) {\n // Bail if we don't have localStorage support or it's disabled\n if (!Storage.supported || !_this.enabled) {\n return;\n } // Can only store objectst\n\n\n if (!is$1.object(object)) {\n return;\n } // Get current storage\n\n\n var storage = _this.get(); // Default to empty object\n\n\n if (is$1.empty(storage)) {\n storage = {};\n } // Update the working copy of the values\n\n\n extend(storage, object); // Update storage\n\n window.localStorage.setItem(_this.key, JSON.stringify(storage));\n });\n\n this.enabled = player.config.storage.enabled;\n this.key = player.config.storage.key;\n } // Check for actual support (see if we can use it)\n\n\n _createClass(Storage, null, [{\n key: \"supported\",\n get: function get() {\n try {\n if (!('localStorage' in window)) {\n return false;\n }\n\n var test = '___test'; // 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\n window.localStorage.setItem(test, test);\n window.localStorage.removeItem(test);\n return true;\n } catch (e) {\n return false;\n }\n }\n }]);\n\n return Storage;\n}();\n\n// ==========================================================================\n// Fetch wrapper\n// Using XHR to avoid issues with older browsers\n// ==========================================================================\nfunction fetch(url) {\n var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';\n return new Promise(function (resolve, reject) {\n try {\n var request = new XMLHttpRequest(); // Check for CORS support\n\n if (!('withCredentials' in request)) {\n return;\n }\n\n request.addEventListener('load', function () {\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 request.addEventListener('error', function () {\n throw new Error(request.status);\n });\n request.open('GET', url, true); // Set the required response type\n\n request.responseType = responseType;\n request.send();\n } catch (e) {\n reject(e);\n }\n });\n}\n\n// ==========================================================================\n\nfunction loadSprite(url, id) {\n if (!is$1.string(url)) {\n return;\n }\n\n var prefix = 'cache';\n var hasId = is$1.string(id);\n var isCached = false;\n\n var exists = function exists() {\n return document.getElementById(id) !== null;\n };\n\n var update = function update(container, data) {\n // eslint-disable-next-line no-param-reassign\n container.innerHTML = data; // Check again incase of race condition\n\n if (hasId && exists()) {\n return;\n } // Inject the SVG to the body\n\n\n document.body.insertAdjacentElement('afterbegin', container);\n }; // Only load once if ID set\n\n\n if (!hasId || !exists()) {\n var useStorage = Storage.supported; // Create container\n\n var container = document.createElement('div');\n container.setAttribute('hidden', '');\n\n if (hasId) {\n container.setAttribute('id', id);\n } // Check in cache\n\n\n if (useStorage) {\n var cached = window.localStorage.getItem(\"\".concat(prefix, \"-\").concat(id));\n isCached = cached !== null;\n\n if (isCached) {\n var data = JSON.parse(cached);\n update(container, data.content);\n }\n } // Get the sprite\n\n\n fetch(url).then(function (result) {\n if (is$1.empty(result)) {\n return;\n }\n\n if (useStorage) {\n window.localStorage.setItem(\"\".concat(prefix, \"-\").concat(id), JSON.stringify({\n content: result\n }));\n }\n\n update(container, result);\n }).catch(function () {});\n }\n}\n\nvar ceil$1 = Math.ceil;\nvar floor$5 = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.github.io/ecma262/#sec-math.trunc\n_export({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor$5 : ceil$1)(it);\n }\n});\n\nvar getHours = function getHours(value) {\n return Math.trunc(value / 60 / 60 % 60, 10);\n};\nvar getMinutes = function getMinutes(value) {\n return Math.trunc(value / 60 % 60, 10);\n};\nvar getSeconds = function getSeconds(value) {\n return Math.trunc(value % 60, 10);\n}; // Format time to UI friendly string\n\nfunction formatTime() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return formatTime(undefined, displayHours, inverted);\n } // Format time component to add leading zero\n\n\n var format = function format(value) {\n return \"0\".concat(value).slice(-2);\n }; // Breakdown to hours, mins, secs\n\n\n var hours = getHours(time);\n var mins = getMinutes(time);\n var secs = getSeconds(time); // Do we need to display hours?\n\n if (displayHours || hours > 0) {\n hours = \"\".concat(hours, \":\");\n } else {\n hours = '';\n } // Render\n\n\n return \"\".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), \":\").concat(format(secs));\n}\n\nvar controls = {\n // Get icon URL\n getIconUrl: function getIconUrl() {\n var url = new URL(this.config.iconUrl, window.location);\n var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;\n return {\n url: this.config.iconUrl,\n cors: cors\n };\n },\n // Find the UI controls\n findElements: function findElements() {\n try {\n this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons\n\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 }; // Progress\n\n this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs\n\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 }; // Display\n\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 }; // Seek tooltip\n\n if (is$1.element(this.elements.progress)) {\n this.elements.display.seekTooltip = this.elements.progress.querySelector(\".\".concat(this.config.classNames.tooltip));\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); // Restore native video controls\n\n this.toggleNativeControls(true);\n return false;\n }\n },\n // Create <svg> icon\n createIcon: function createIcon(type, attributes) {\n var namespace = 'http://www.w3.org/2000/svg';\n var iconUrl = controls.getIconUrl.call(this);\n var iconPath = \"\".concat(!iconUrl.cors ? iconUrl.url : '', \"#\").concat(this.config.iconPrefix); // Create <svg>\n\n var icon = document.createElementNS(namespace, 'svg');\n setAttributes(icon, extend(attributes, {\n 'aria-hidden': 'true',\n focusable: 'false'\n })); // Create the <use> to reference sprite\n\n var use = document.createElementNS(namespace, 'use');\n var path = \"\".concat(iconPath, \"-\").concat(type); // 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\n if ('href' in use) {\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);\n } // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n\n\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>\n\n icon.appendChild(use);\n return icon;\n },\n // Create hidden text label\n createLabel: function createLabel(key) {\n var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var text = i18n.get(key, this.config);\n\n var attributes = _objectSpread2(_objectSpread2({}, attr), {}, {\n class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')\n });\n\n return createElement('span', attributes, text);\n },\n // Create a badge\n createBadge: function createBadge(text) {\n if (is$1.empty(text)) {\n return null;\n }\n\n var badge = createElement('span', {\n class: this.config.classNames.menu.value\n });\n badge.appendChild(createElement('span', {\n class: this.config.classNames.menu.badge\n }, text));\n return badge;\n },\n // Create a <button>\n createButton: function createButton(buttonType, attr) {\n var _this = this;\n\n var attributes = extend({}, attr);\n var type = toCamelCase(buttonType);\n var props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null\n };\n ['element', 'icon', 'label'].forEach(function (key) {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n }); // Default to 'button' type to prevent form submission\n\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n } // Set class name\n\n\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some(function (c) {\n return c === _this.config.classNames.control;\n })) {\n extend(attributes, {\n class: \"\".concat(attributes.class, \" \").concat(this.config.classNames.control)\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n } // Large play button\n\n\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += \" \".concat(this.config.classNames.control, \"--overlaid\");\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is$1.empty(props.label)) {\n props.label = type;\n }\n\n if (is$1.empty(props.icon)) {\n props.icon = buttonType;\n }\n\n }\n\n var button = createElement(props.element); // Setup toggle icon and labels\n\n if (props.toggle) {\n // Icon\n button.appendChild(controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed'\n }));\n button.appendChild(controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed'\n })); // Label/Tooltip\n\n button.appendChild(controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed'\n }));\n button.appendChild(controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed'\n }));\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n } // Merge and set attributes\n\n\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\n setAttributes(button, attributes); // We have multiple play buttons\n\n if (type === 'play') {\n if (!is$1.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 // Create an <input type='range'>\n createRange: function createRange(type, attributes) {\n // Seek input\n var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {\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 }, attributes));\n this.elements.inputs[type] = input; // Set the fill for webkit now\n\n controls.updateRangeFill.call(this, input); // Improve support on touch devices\n\n RangeTouch.setup(input);\n return input;\n },\n // Create a <progress>\n createProgress: function createProgress(type, attributes) {\n var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {\n min: 0,\n max: 100,\n value: 0,\n role: 'progressbar',\n 'aria-hidden': true\n }, attributes)); // Create the label inside\n\n if (type !== 'volume') {\n progress.appendChild(createElement('span', null, '0'));\n var suffixKey = {\n played: 'played',\n buffer: 'buffered'\n }[type];\n var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';\n progress.innerText = \"% \".concat(suffix.toLowerCase());\n }\n\n this.elements.display[type] = progress;\n return progress;\n },\n // Create time display\n createTime: function createTime(type, attrs) {\n var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n var container = createElement('div', extend(attributes, {\n class: \"\".concat(attributes.class ? attributes.class : '', \" \").concat(this.config.classNames.display.time, \" \").trim(),\n 'aria-label': i18n.get(type, this.config)\n }), '00:00'); // Reference for updates\n\n this.elements.display[type] = container;\n return container;\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: function bindMenuItemShortcuts(menuItem, type) {\n var _this2 = this;\n\n // Navigate through menus via arrow keys and space\n on.call(this, menuItem, 'keydown keyup', function (event) {\n // We only care about space and ⬆️ ⬇️️ ➡️\n if (![32, 38, 39, 40].includes(event.which)) {\n return;\n } // Prevent play / seek\n\n\n event.preventDefault();\n event.stopPropagation(); // We're just here to prevent the keydown bubbling\n\n if (event.type === 'keydown') {\n return;\n }\n\n var isRadioButton = matches$1(menuItem, '[role=\"menuitemradio\"]'); // Show the respective menu\n\n if (!isRadioButton && [32, 39].includes(event.which)) {\n controls.showMenuPanel.call(_this2, type, true);\n } else {\n var target;\n\n if (event.which !== 32) {\n if (event.which === 40 || isRadioButton && event.which === 39) {\n target = menuItem.nextElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.firstElementChild;\n }\n } else {\n target = menuItem.previousElementSibling;\n\n if (!is$1.element(target)) {\n target = menuItem.parentNode.lastElementChild;\n }\n }\n\n setFocus.call(_this2, target, true);\n }\n }\n }, false); // 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\n on.call(this, menuItem, 'keyup', function (event) {\n if (event.which !== 13) {\n return;\n }\n\n controls.focusFirstMenuItem.call(_this2, null, true);\n });\n },\n // Create a settings menu item\n createMenuItem: function createMenuItem(_ref) {\n var _this3 = this;\n\n var value = _ref.value,\n list = _ref.list,\n type = _ref.type,\n title = _ref.title,\n _ref$badge = _ref.badge,\n badge = _ref$badge === void 0 ? null : _ref$badge,\n _ref$checked = _ref.checked,\n checked = _ref$checked === void 0 ? false : _ref$checked;\n var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);\n var menuItem = createElement('button', extend(attributes, {\n type: 'button',\n role: 'menuitemradio',\n class: \"\".concat(this.config.classNames.control, \" \").concat(attributes.class ? attributes.class : '').trim(),\n 'aria-checked': checked,\n value: value\n }));\n var flex = createElement('span'); // We have to set as HTML incase of special characters\n\n flex.innerHTML = title;\n\n if (is$1.element(badge)) {\n flex.appendChild(badge);\n }\n\n menuItem.appendChild(flex); // Replicate radio button behaviour\n\n Object.defineProperty(menuItem, 'checked', {\n enumerable: true,\n get: function get() {\n return menuItem.getAttribute('aria-checked') === 'true';\n },\n set: function set(check) {\n // Ensure exclusivity\n if (check) {\n Array.from(menuItem.parentNode.children).filter(function (node) {\n return matches$1(node, '[role=\"menuitemradio\"]');\n }).forEach(function (node) {\n return node.setAttribute('aria-checked', 'false');\n });\n }\n\n menuItem.setAttribute('aria-checked', check ? 'true' : 'false');\n }\n });\n this.listeners.bind(menuItem, 'click keyup', function (event) {\n if (is$1.keyboardEvent(event) && event.which !== 32) {\n return;\n }\n\n event.preventDefault();\n event.stopPropagation();\n menuItem.checked = true;\n\n switch (type) {\n case 'language':\n _this3.currentTrack = Number(value);\n break;\n\n case 'quality':\n _this3.quality = value;\n break;\n\n case 'speed':\n _this3.speed = parseFloat(value);\n break;\n }\n\n controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));\n }, type, false);\n controls.bindMenuItemShortcuts.call(this, menuItem, type);\n list.appendChild(menuItem);\n },\n // Format a time for display\n formatTime: function formatTime$1() {\n var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n // Bail if the value isn't a number\n if (!is$1.number(time)) {\n return time;\n } // Always display hours if duration is over an hour\n\n\n var forceHours = getHours(this.duration) > 0;\n return formatTime(time, forceHours, inverted);\n },\n // Update the displayed time\n updateTimeDisplay: function updateTimeDisplay() {\n var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;\n var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;\n\n // Bail if there's no element to display or the value isn't a number\n if (!is$1.element(target) || !is$1.number(time)) {\n return;\n } // eslint-disable-next-line no-param-reassign\n\n\n target.innerText = controls.formatTime(time, inverted);\n },\n // Update volume UI and storage\n updateVolume: function updateVolume() {\n if (!this.supported.ui) {\n return;\n } // Update range\n\n\n if (is$1.element(this.elements.inputs.volume)) {\n controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);\n } // Update mute state\n\n\n if (is$1.element(this.elements.buttons.mute)) {\n this.elements.buttons.mute.pressed = this.muted || this.volume === 0;\n }\n },\n // Update seek value and lower fill\n setRange: function setRange(target) {\n var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n\n if (!is$1.element(target)) {\n return;\n } // eslint-disable-next-line\n\n\n target.value = value; // Webkit range fill\n\n controls.updateRangeFill.call(this, target);\n },\n // Update <progress> elements\n updateProgress: function updateProgress(event) {\n var _this4 = this;\n\n if (!this.supported.ui || !is$1.event(event)) {\n return;\n }\n\n var value = 0;\n\n var setProgress = function setProgress(target, input) {\n var val = is$1.number(input) ? input : 0;\n var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label\n\n if (is$1.element(progress)) {\n progress.value = val; // Update text label inside\n\n var label = progress.getElementsByTagName('span')[0];\n\n if (is$1.element(label)) {\n label.childNodes[0].nodeValue = val;\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); // Set seek range value only if it's a 'natural' time event\n\n if (event.type === 'timeupdate') {\n controls.setRange.call(this, this.elements.inputs.seek, value);\n }\n\n break;\n // Check buffer status\n\n case 'playing':\n case 'progress':\n setProgress(this.elements.display.buffer, this.buffered * 100);\n break;\n }\n }\n },\n // Webkit polyfill for lower fill range\n updateRangeFill: function updateRangeFill(target) {\n // Get range from event if event passed\n var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>\n\n if (!is$1.element(range) || range.getAttribute('type') !== 'range') {\n return;\n } // Set aria values for https://github.com/sampotts/plyr/issues/905\n\n\n if (matches$1(range, this.config.selectors.inputs.seek)) {\n range.setAttribute('aria-valuenow', this.currentTime);\n var currentTime = controls.formatTime(this.currentTime);\n var duration = controls.formatTime(this.duration);\n var format = i18n.get('seekLabel', this.config);\n range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));\n } else if (matches$1(range, this.config.selectors.inputs.volume)) {\n var percent = range.value * 100;\n range.setAttribute('aria-valuenow', percent);\n range.setAttribute('aria-valuetext', \"\".concat(percent.toFixed(1), \"%\"));\n } else {\n range.setAttribute('aria-valuenow', range.value);\n } // WebKit only\n\n\n if (!browser.isWebkit) {\n return;\n } // Set CSS custom property\n\n\n range.style.setProperty('--value', \"\".concat(range.value / range.max * 100, \"%\"));\n },\n // Update hover tooltip for seeking\n updateSeekTooltip: function updateSeekTooltip(event) {\n var _this5 = this;\n\n // Bail if setting not true\n if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {\n return;\n }\n\n var visible = \"\".concat(this.config.classNames.tooltip, \"--visible\");\n\n var toggle = function toggle(show) {\n return toggleClass(_this5.elements.display.seekTooltip, visible, show);\n }; // Hide on touch\n\n\n if (this.touch) {\n toggle(false);\n return;\n } // Determine percentage, if already visible\n\n\n var percent = 0;\n var clientRect = this.elements.progress.getBoundingClientRect();\n\n if (is$1.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 } // Set bounds\n\n\n if (percent < 0) {\n percent = 0;\n } else if (percent > 100) {\n percent = 100;\n } // Display the time a click would seek to\n\n\n controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position\n\n this.elements.display.seekTooltip.style.left = \"\".concat(percent, \"%\"); // Show/hide the tooltip\n // If the event is a moues in/out and percentage is inside bounds\n\n if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {\n toggle(event.type === 'mouseenter');\n }\n },\n // Handle time change event\n timeUpdate: function timeUpdate(event) {\n // Only invert if only one time element is displayed and used for both duration and currentTime\n var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration\n\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking\n\n if (event && event.type === 'timeupdate' && this.media.seeking) {\n return;\n } // Playing progress\n\n\n controls.updateProgress.call(this, event);\n },\n // Show the duration on metadataloaded or durationchange events\n durationUpdate: function 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 } // 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\n\n if (this.duration >= Math.pow(2, 32)) {\n toggleHidden(this.elements.display.currentTime, true);\n toggleHidden(this.elements.progress, true);\n return;\n } // Update ARIA values\n\n\n if (is$1.element(this.elements.inputs.seek)) {\n this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);\n } // If there's a spot to display duration\n\n\n var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there\n\n if (!hasDuration && this.config.displayDuration && this.paused) {\n controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);\n } // If there's a duration element, update content\n\n\n if (hasDuration) {\n controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);\n } // Update the tooltip (if visible)\n\n\n controls.updateSeekTooltip.call(this);\n },\n // Hide/show a tab\n toggleMenuButton: function toggleMenuButton(setting, toggle) {\n toggleHidden(this.elements.settings.buttons[setting], !toggle);\n },\n // Update the selected setting\n updateSetting: function updateSetting(setting, container, input) {\n var pane = this.elements.settings.panels[setting];\n var value = null;\n var list = container;\n\n if (setting === 'captions') {\n value = this.currentTrack;\n } else {\n value = !is$1.empty(input) ? input : this[setting]; // Get default\n\n if (is$1.empty(value)) {\n value = this.config[setting].default;\n } // Unsupported value\n\n\n if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {\n this.debug.warn(\"Unsupported value of '\".concat(value, \"' for \").concat(setting));\n return;\n } // Disabled value\n\n\n if (!this.config[setting].options.includes(value)) {\n this.debug.warn(\"Disabled value of '\".concat(value, \"' for \").concat(setting));\n return;\n }\n } // Get the list if we need to\n\n\n if (!is$1.element(list)) {\n list = pane && pane.querySelector('[role=\"menu\"]');\n } // If there's no list it means it's not been rendered...\n\n\n if (!is$1.element(list)) {\n return;\n } // Update the label\n\n\n var label = this.elements.settings.buttons[setting].querySelector(\".\".concat(this.config.classNames.menu.value));\n label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it\n\n var target = list && list.querySelector(\"[value=\\\"\".concat(value, \"\\\"]\"));\n\n if (is$1.element(target)) {\n target.checked = true;\n }\n },\n // Translate a value into a nice label\n getLabel: function getLabel(setting, value) {\n switch (setting) {\n case 'speed':\n return value === 1 ? i18n.get('normal', this.config) : \"\".concat(value, \"&times;\");\n\n case 'quality':\n if (is$1.number(value)) {\n var label = i18n.get(\"qualityLabel.\".concat(value), this.config);\n\n if (!label.length) {\n return \"\".concat(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 // Set the quality menu\n setQualityMenu: function setQualityMenu(options) {\n var _this6 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.quality)) {\n return;\n }\n\n var type = 'quality';\n var list = this.elements.settings.panels.quality.querySelector('[role=\"menu\"]'); // Set options if passed and filter based on uniqueness and config\n\n if (is$1.array(options)) {\n this.options.quality = dedupe(options).filter(function (quality) {\n return _this6.config.quality.options.includes(quality);\n });\n } // Toggle the pane and tab\n\n\n var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Get the badge HTML for HD, 4K etc\n\n\n var getBadge = function getBadge(quality) {\n var label = i18n.get(\"qualityBadge.\".concat(quality), _this6.config);\n\n if (!label.length) {\n return null;\n }\n\n return controls.createBadge.call(_this6, label);\n }; // Sort options by the config and then render options\n\n\n this.options.quality.sort(function (a, b) {\n var sorting = _this6.config.quality.options;\n return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;\n }).forEach(function (quality) {\n controls.createMenuItem.call(_this6, {\n value: quality,\n list: list,\n type: type,\n title: controls.getLabel.call(_this6, 'quality', quality),\n badge: getBadge(quality)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Set the looping options\n\n /* setLoopMenu() {\n // Menu required\n if (!is.element(this.elements.settings.panels.loop)) {\n return;\n }\n const options = ['start', 'end', 'all', 'reset'];\n const list = this.elements.settings.panels.loop.querySelector('[role=\"menu\"]');\n // Show the pane and tab\n toggleHidden(this.elements.settings.buttons.loop, false);\n toggleHidden(this.elements.settings.panels.loop, false);\n // Toggle the pane and tab\n const toggle = !is.empty(this.loop.options);\n controls.toggleMenuButton.call(this, 'loop', toggle);\n // Empty the menu\n emptyElement(list);\n options.forEach(option => {\n const item = createElement('li');\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 if (['start', 'end'].includes(option)) {\n const badge = controls.createBadge.call(this, '00:00');\n button.appendChild(badge);\n }\n item.appendChild(button);\n list.appendChild(item);\n });\n }, */\n // Get current selected caption language\n // TODO: rework this to user the getter in the API?\n // Set a list of available captions languages\n setCaptionsMenu: function setCaptionsMenu() {\n var _this7 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.captions)) {\n return;\n } // TODO: Captions or language? Currently it's mixed\n\n\n var type = 'captions';\n var list = this.elements.settings.panels.captions.querySelector('[role=\"menu\"]');\n var tracks = captions.getTracks.call(this);\n var toggle = Boolean(tracks.length); // Toggle the pane and tab\n\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If there's no captions, bail\n\n if (!toggle) {\n return;\n } // Generate options data\n\n\n var options = tracks.map(function (track, value) {\n return {\n value: value,\n checked: _this7.captions.toggled && _this7.currentTrack === value,\n title: captions.getLabel.call(_this7, track),\n badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),\n list: list,\n type: 'language'\n };\n }); // Add the \"Disabled\" option to turn off captions\n\n options.unshift({\n value: -1,\n checked: !this.captions.toggled,\n title: i18n.get('disabled', this.config),\n list: list,\n type: 'language'\n }); // Generate options\n\n options.forEach(controls.createMenuItem.bind(this));\n controls.updateSetting.call(this, type, list);\n },\n // Set a list of available captions languages\n setSpeedMenu: function setSpeedMenu() {\n var _this8 = this;\n\n // Menu required\n if (!is$1.element(this.elements.settings.panels.speed)) {\n return;\n }\n\n var type = 'speed';\n var list = this.elements.settings.panels.speed.querySelector('[role=\"menu\"]'); // Filter out invalid speeds\n\n this.options.speed = this.options.speed.filter(function (o) {\n return o >= _this8.minimumSpeed && o <= _this8.maximumSpeed;\n }); // Toggle the pane and tab\n\n var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;\n controls.toggleMenuButton.call(this, type, toggle); // Empty the menu\n\n emptyElement(list); // Check if we need to toggle the parent\n\n controls.checkMenu.call(this); // If we're hiding, nothing more to do\n\n if (!toggle) {\n return;\n } // Create items\n\n\n this.options.speed.forEach(function (speed) {\n controls.createMenuItem.call(_this8, {\n value: speed,\n list: list,\n type: type,\n title: controls.getLabel.call(_this8, 'speed', speed)\n });\n });\n controls.updateSetting.call(this, type, list);\n },\n // Check if we need to hide/show the settings menu\n checkMenu: function checkMenu() {\n var buttons = this.elements.settings.buttons;\n var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {\n return !button.hidden;\n });\n toggleHidden(this.elements.settings.menu, !visible);\n },\n // Focus the first menu item in a given (or visible) menu\n focusFirstMenuItem: function focusFirstMenuItem(pane) {\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (this.elements.settings.popup.hidden) {\n return;\n }\n\n var target = pane;\n\n if (!is$1.element(target)) {\n target = Object.values(this.elements.settings.panels).find(function (p) {\n return !p.hidden;\n });\n }\n\n var firstItem = target.querySelector('[role^=\"menuitem\"]');\n setFocus.call(this, firstItem, tabFocus);\n },\n // Show/hide menu\n toggleMenu: function toggleMenu(input) {\n var popup = this.elements.settings.popup;\n var button = this.elements.buttons.settings; // Menu and button are required\n\n if (!is$1.element(popup) || !is$1.element(button)) {\n return;\n } // True toggle by default\n\n\n var hidden = popup.hidden;\n var show = hidden;\n\n if (is$1.boolean(input)) {\n show = input;\n } else if (is$1.keyboardEvent(input) && input.which === 27) {\n show = false;\n } else if (is$1.event(input)) {\n // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;\n var isMenuItem = popup.contains(target); // 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\n if (isMenuItem || !isMenuItem && input.target !== button && show) {\n return;\n }\n } // Set button attributes\n\n\n button.setAttribute('aria-expanded', show); // Show the actual popup\n\n toggleHidden(popup, !show); // Add class hook\n\n toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction\n\n if (show && is$1.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$1.keyboardEvent(input));\n }\n },\n // Get the natural size of a menu panel\n getMenuSize: function getMenuSize(tab) {\n var clone = tab.cloneNode(true);\n clone.style.position = 'absolute';\n clone.style.opacity = 0;\n clone.removeAttribute('hidden'); // Append to parent so we get the \"real\" size\n\n tab.parentNode.appendChild(clone); // Get the sizes before we remove\n\n var width = clone.scrollWidth;\n var height = clone.scrollHeight; // Remove from the DOM\n\n removeElement(clone);\n return {\n width: width,\n height: height\n };\n },\n // Show a panel in the menu\n showMenuPanel: function showMenuPanel() {\n var _this9 = this;\n\n var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';\n var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var target = this.elements.container.querySelector(\"#plyr-settings-\".concat(this.id, \"-\").concat(type)); // Nothing to show, bail\n\n if (!is$1.element(target)) {\n return;\n } // Hide all other panels\n\n\n var container = target.parentNode;\n var current = Array.from(container.children).find(function (node) {\n return !node.hidden;\n }); // If we can do fancy animations, we'll animate the height/width\n\n if (support.transitions && !support.reducedMotion) {\n // Set the current width as a base\n container.style.width = \"\".concat(current.scrollWidth, \"px\");\n container.style.height = \"\".concat(current.scrollHeight, \"px\"); // Get potential sizes\n\n var size = controls.getMenuSize.call(this, target); // Restore auto height/width\n\n var restore = function 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 } // Revert back to auto\n\n\n container.style.width = '';\n container.style.height = ''; // Only listen once\n\n off.call(_this9, container, transitionEndEvent, restore);\n }; // Listen for the transition finishing and restore auto height/width\n\n\n on.call(this, container, transitionEndEvent, restore); // Set dimensions to target\n\n container.style.width = \"\".concat(size.width, \"px\");\n container.style.height = \"\".concat(size.height, \"px\");\n } // Set attributes on current tab\n\n\n toggleHidden(current, true); // Set attributes on target\n\n toggleHidden(target, false); // Focus the first item\n\n controls.focusFirstMenuItem.call(this, target, tabFocus);\n },\n // Set the download URL\n setDownloadUrl: function setDownloadUrl() {\n var button = this.elements.buttons.download; // Bail if no button\n\n if (!is$1.element(button)) {\n return;\n } // Set attribute\n\n\n button.setAttribute('href', this.download);\n },\n // Build the default HTML\n create: function create(data) {\n var _this10 = this;\n\n var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,\n createButton = controls.createButton,\n createProgress = controls.createProgress,\n createRange = controls.createRange,\n createTime = controls.createTime,\n setQualityMenu = controls.setQualityMenu,\n setSpeedMenu = controls.setSpeedMenu,\n showMenuPanel = controls.showMenuPanel;\n this.elements.controls = null; // Larger overlaid play button\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n } // Create the container\n\n\n var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container; // Default item attributes\n\n var defaultAttributes = {\n class: 'plyr__controls__item'\n }; // Loop through controls in order\n\n dedupe(is$1.array(this.config.controls) ? this.config.controls : []).forEach(function (control) {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));\n } // Rewind button\n\n\n if (control === 'rewind') {\n container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));\n } // Play/Pause button\n\n\n if (control === 'play') {\n container.appendChild(createButton.call(_this10, 'play', defaultAttributes));\n } // Fast forward button\n\n\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));\n } // Progress\n\n\n if (control === 'progress') {\n var progressContainer = createElement('div', {\n class: \"\".concat(defaultAttributes.class, \" plyr__progress__container\")\n });\n var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider\n\n progress.appendChild(createRange.call(_this10, 'seek', {\n id: \"plyr-seek-\".concat(data.id)\n })); // Buffer progress\n\n progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator\n // Seek tooltip\n\n if (_this10.config.tooltips.seek) {\n var tooltip = createElement('span', {\n class: _this10.config.classNames.tooltip\n }, '00:00');\n progress.appendChild(tooltip);\n _this10.elements.display.seekTooltip = tooltip;\n }\n\n _this10.elements.progress = progress;\n progressContainer.appendChild(_this10.elements.progress);\n container.appendChild(progressContainer);\n } // Media current time display\n\n\n if (control === 'current-time') {\n container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));\n } // Media duration display\n\n\n if (control === 'duration') {\n container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));\n } // Volume controls\n\n\n if (control === 'mute' || control === 'volume') {\n var volume = _this10.elements.volume; // Create the volume container if needed\n\n if (!is$1.element(volume) || !container.contains(volume)) {\n volume = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__volume\").trim()\n }));\n _this10.elements.volume = volume;\n container.appendChild(volume);\n } // Toggle mute button\n\n\n if (control === 'mute') {\n volume.appendChild(createButton.call(_this10, 'mute'));\n } // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n\n\n if (control === 'volume' && !browser.isIos) {\n // Set the attributes\n var attributes = {\n max: 1,\n step: 0.05,\n value: _this10.config.volume\n }; // Create the volume range slider\n\n volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {\n id: \"plyr-volume-\".concat(data.id)\n })));\n }\n } // Toggle captions button\n\n\n if (control === 'captions') {\n container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));\n } // Settings button / menu\n\n\n if (control === 'settings' && !is$1.empty(_this10.config.settings)) {\n var wrapper = createElement('div', extend({}, defaultAttributes, {\n class: \"\".concat(defaultAttributes.class, \" plyr__menu\").trim(),\n hidden: ''\n }));\n wrapper.appendChild(createButton.call(_this10, 'settings', {\n 'aria-haspopup': true,\n 'aria-controls': \"plyr-settings-\".concat(data.id),\n 'aria-expanded': false\n }));\n var popup = createElement('div', {\n class: 'plyr__menu__container',\n id: \"plyr-settings-\".concat(data.id),\n hidden: ''\n });\n var inner = createElement('div');\n var home = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-home\")\n }); // Create the menu\n\n var menu = createElement('div', {\n role: 'menu'\n });\n home.appendChild(menu);\n inner.appendChild(home);\n _this10.elements.settings.panels.home = home; // Build the menu items\n\n _this10.config.settings.forEach(function (type) {\n // TODO: bundle this with the createMenuItem helper and bindings\n var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--forward\"),\n role: 'menuitem',\n 'aria-haspopup': true,\n hidden: ''\n })); // Bind menu shortcuts for keyboard users\n\n bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click\n\n on.call(_this10, menuItem, 'click', function () {\n showMenuPanel.call(_this10, type, false);\n });\n var flex = createElement('span', null, i18n.get(type, _this10.config));\n var value = createElement('span', {\n class: _this10.config.classNames.menu.value\n }); // Speed contains HTML entities\n\n value.innerHTML = data[type];\n flex.appendChild(value);\n menuItem.appendChild(flex);\n menu.appendChild(menuItem); // Build the panes\n\n var pane = createElement('div', {\n id: \"plyr-settings-\".concat(data.id, \"-\").concat(type),\n hidden: ''\n }); // Back button\n\n var backButton = createElement('button', {\n type: 'button',\n class: \"\".concat(_this10.config.classNames.control, \" \").concat(_this10.config.classNames.control, \"--back\")\n }); // Visible label\n\n backButton.appendChild(createElement('span', {\n 'aria-hidden': true\n }, i18n.get(type, _this10.config))); // Screen reader label\n\n backButton.appendChild(createElement('span', {\n class: _this10.config.classNames.hidden\n }, i18n.get('menuBack', _this10.config))); // Go back via keyboard\n\n on.call(_this10, pane, 'keydown', function (event) {\n // We only care about <-\n if (event.which !== 37) {\n return;\n } // Prevent seek\n\n\n event.preventDefault();\n event.stopPropagation(); // Show the respective menu\n\n showMenuPanel.call(_this10, 'home', true);\n }, false); // Go back via button click\n\n on.call(_this10, backButton, 'click', function () {\n showMenuPanel.call(_this10, 'home', false);\n }); // Add to pane\n\n pane.appendChild(backButton); // Menu\n\n pane.appendChild(createElement('div', {\n role: 'menu'\n }));\n inner.appendChild(pane);\n _this10.elements.settings.buttons[type] = menuItem;\n _this10.elements.settings.panels[type] = pane;\n });\n\n popup.appendChild(inner);\n wrapper.appendChild(popup);\n container.appendChild(wrapper);\n _this10.elements.settings.popup = popup;\n _this10.elements.settings.menu = wrapper;\n } // Picture in picture button\n\n\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));\n } // Airplay button\n\n\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));\n } // Download button\n\n\n if (control === 'download') {\n var _attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: _this10.download,\n target: '_blank'\n }); // Set download attribute for HTML5 only\n\n\n if (_this10.isHTML5) {\n _attributes.download = '';\n }\n\n var download = _this10.config.urls.download;\n\n if (!is$1.url(download) && _this10.isEmbed) {\n extend(_attributes, {\n icon: \"logo-\".concat(_this10.provider),\n label: _this10.provider\n });\n }\n\n container.appendChild(createButton.call(_this10, 'download', _attributes));\n } // Toggle fullscreen button\n\n\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));\n }\n }); // Set available quality levels\n\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n setSpeedMenu.call(this);\n return container;\n },\n // Insert controls\n inject: function inject() {\n var _this11 = this;\n\n // Sprite\n if (this.config.loadSprite) {\n var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX\n\n if (icon.cors) {\n loadSprite(icon.url, 'sprite-plyr');\n }\n } // Create a unique ID\n\n\n this.id = Math.floor(Math.random() * 10000); // Null by default\n\n var container = null;\n this.elements.controls = null; // Set template properties\n\n var props = {\n id: this.id,\n seektime: this.config.seekTime,\n title: this.config.title\n };\n var update = true; // If function, run it and use output\n\n if (is$1.function(this.config.controls)) {\n this.config.controls = this.config.controls.call(this, props);\n } // Convert falsy controls to empty array (primarily for empty strings)\n\n\n if (!this.config.controls) {\n this.config.controls = [];\n }\n\n if (is$1.element(this.config.controls) || is$1.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) // TODO: Looping\n // loop: 'None',\n\n });\n update = false;\n } // Replace props with their value\n\n\n var replace = function replace(input) {\n var result = input;\n Object.entries(props).forEach(function (_ref2) {\n var _ref3 = _slicedToArray(_ref2, 2),\n key = _ref3[0],\n value = _ref3[1];\n\n result = replaceAll(result, \"{\".concat(key, \"}\"), value);\n });\n return result;\n }; // Update markup\n\n\n if (update) {\n if (is$1.string(this.config.controls)) {\n container = replace(container);\n }\n } // Controls container\n\n\n var target; // Inject to custom location\n\n if (is$1.string(this.config.selectors.controls.container)) {\n target = document.querySelector(this.config.selectors.controls.container);\n } // Inject into the container by default\n\n\n if (!is$1.element(target)) {\n target = this.elements.container;\n } // Inject controls HTML (needs to be before captions, hence \"afterbegin\")\n\n\n var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';\n target[insertMethod]('afterbegin', container); // Find the elements if need be\n\n if (!is$1.element(this.elements.controls)) {\n controls.findElements.call(this);\n } // Add pressed property to buttons\n\n\n if (!is$1.empty(this.elements.buttons)) {\n var addProperty = function addProperty(button) {\n var className = _this11.config.classNames.controlPressed;\n Object.defineProperty(button, 'pressed', {\n enumerable: true,\n get: function get() {\n return hasClass(button, className);\n },\n set: function set() {\n var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n toggleClass(button, className, pressed);\n }\n });\n }; // Toggle classname when pressed property is set\n\n\n Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {\n if (is$1.array(button) || is$1.nodeList(button)) {\n Array.from(button).filter(Boolean).forEach(addProperty);\n } else {\n addProperty(button);\n }\n });\n } // Edge sometimes doesn't finish the paint so force a repaint\n\n\n if (browser.isEdge) {\n repaint(target);\n } // Setup tooltips\n\n\n if (this.config.tooltips.controls) {\n var _this$config = this.config,\n classNames = _this$config.classNames,\n selectors = _this$config.selectors;\n var selector = \"\".concat(selectors.controls.wrapper, \" \").concat(selectors.labels, \" .\").concat(classNames.hidden);\n var labels = getElements.call(this, selector);\n Array.from(labels).forEach(function (label) {\n toggleClass(label, _this11.config.classNames.hidden, false);\n toggleClass(label, _this11.config.classNames.tooltip, true);\n });\n }\n }\n};\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 */\n\nfunction parseUrl(input) {\n var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var url = input;\n\n if (safe) {\n var 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} // Convert object to URLSearchParams\n\nfunction buildUrlParams(input) {\n var params = new URLSearchParams();\n\n if (is$1.object(input)) {\n Object.entries(input).forEach(function (_ref) {\n var _ref2 = _slicedToArray(_ref, 2),\n key = _ref2[0],\n value = _ref2[1];\n\n params.set(key, value);\n });\n }\n\n return params;\n}\n\nvar captions = {\n // Setup captions\n setup: function setup() {\n // Requires UI support\n if (!this.supported.ui) {\n return;\n } // Only Vimeo and HTML5 video supported at this point\n\n\n if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {\n // Clear menu and hide\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n\n return;\n } // Inject the container\n\n\n if (!is$1.element(this.elements.captions)) {\n this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));\n insertAfter(this.elements.captions, this.elements.wrapper);\n } // Fix IE captions if CORS is used\n // Fetch captions and inject as blobs instead (data URIs not supported!)\n\n\n if (browser.isIE && window.URL) {\n var elements = this.media.querySelectorAll('track');\n Array.from(elements).forEach(function (track) {\n var src = track.getAttribute('src');\n var url = parseUrl(src);\n\n if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {\n fetch(src, 'blob').then(function (blob) {\n track.setAttribute('src', window.URL.createObjectURL(blob));\n }).catch(function () {\n removeElement(track);\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\n var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];\n var languages = dedupe(browserLanguages.map(function (language) {\n return language.split('-')[0];\n }));\n var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'\n\n if (language === 'auto') {\n var _languages = _slicedToArray(languages, 1);\n\n language = _languages[0];\n }\n\n var active = this.storage.get('captions');\n\n if (!is$1.boolean(active)) {\n active = this.config.captions.active;\n }\n\n Object.assign(this.captions, {\n toggled: false,\n active: active,\n language: language,\n languages: languages\n }); // Watch changes to textTracks and update captions menu\n\n if (this.isHTML5) {\n var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';\n on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));\n } // Update available languages in list next tick (the event must not be triggered before the listeners)\n\n\n setTimeout(captions.update.bind(this), 0);\n },\n // Update available language options in settings based on tracks\n update: function update() {\n var _this = this;\n\n var tracks = captions.getTracks.call(this, true); // Get the wanted language\n\n var _this$captions = this.captions,\n active = _this$captions.active,\n language = _this$captions.language,\n meta = _this$captions.meta,\n currentTrackNode = _this$captions.currentTrackNode;\n var languageExists = Boolean(tracks.find(function (track) {\n return track.language === language;\n })); // Handle tracks (add event listener and \"pseudo\"-default)\n\n if (this.isHTML5 && this.isVideo) {\n tracks.filter(function (track) {\n return !meta.get(track);\n }).forEach(function (track) {\n _this.debug.log('Track added', track); // Attempt to store if the original dom element was \"default\"\n\n\n meta.set(track, {\n default: track.mode === 'showing'\n }); // Turn off native caption rendering to avoid double captions\n // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n } // Add event listener for cue changes\n\n\n on.call(_this, track, 'cuechange', function () {\n return captions.updateCues.call(_this);\n });\n });\n } // Update language first time it matches, or if the previous matching track was removed\n\n\n if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {\n captions.setLanguage.call(this, language);\n captions.toggle.call(this, active && languageExists);\n } // Enable or disable captions based on track length\n\n\n toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list\n\n if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {\n controls.setCaptionsMenu.call(this);\n }\n },\n // Toggle captions display\n // Used internally for the toggleCaptions method, with the passive option forced to false\n toggle: function toggle(input) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // If there's no full support\n if (!this.supported.ui) {\n return;\n }\n\n var toggled = this.captions.toggled; // Current state\n\n var activeClass = this.config.classNames.captions.active; // Get the next state\n // If the method is called without parameter, toggle based on current value\n\n var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event\n\n if (active !== toggled) {\n // When passive, don't override user preferences\n if (!passive) {\n this.captions.active = active;\n this.storage.set({\n captions: active\n });\n } // Force language if the call isn't passive and there is no matching language to toggle to\n\n\n if (!this.language && active && !passive) {\n var tracks = captions.getTracks.call(this);\n 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\n\n this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference\n\n captions.set.call(this, tracks.indexOf(track));\n return;\n } // Toggle button if it's enabled\n\n\n if (this.elements.buttons.captions) {\n this.elements.buttons.captions.pressed = active;\n } // Add class hook\n\n\n toggleClass(this.elements.container, activeClass, active);\n this.captions.toggled = active; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)\n\n triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');\n } // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n\n\n setTimeout(function () {\n if (active && _this2.captions.toggled) {\n _this2.captions.currentTrackNode.mode = 'hidden';\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: function set(index) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n var tracks = captions.getTracks.call(this); // Disable captions if setting to -1\n\n if (index === -1) {\n captions.toggle.call(this, false, passive);\n return;\n }\n\n if (!is$1.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 var track = tracks[index];\n\n var _ref = track || {},\n language = _ref.language; // Store reference to node for invalidation on remove\n\n\n this.captions.currentTrackNode = track; // Update settings menu\n\n controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences\n\n if (!passive) {\n this.captions.language = language;\n this.storage.set({\n language: language\n });\n } // Handle Vimeo captions\n\n\n if (this.isVimeo) {\n this.embed.enableTextTrack(language);\n } // Trigger event\n\n\n triggerEvent.call(this, this.media, 'languagechange');\n } // Show captions\n\n\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 // Set captions by language\n // Used internally for the language setter with the passive option forced to false\n setLanguage: function setLanguage(input) {\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n if (!is$1.string(input)) {\n this.debug.warn('Invalid language argument', input);\n return;\n } // Normalize\n\n\n var language = input.toLowerCase();\n this.captions.language = language; // Set currentTrack\n\n var tracks = captions.getTracks.call(this);\n var track = captions.findTrack.call(this, [language]);\n captions.set.call(this, tracks.indexOf(track), passive);\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: function getTracks() {\n var _this3 = this;\n\n var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n // Handle media or textTracks missing or null\n var tracks = Array.from((this.media || {}).textTracks || []); // 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\n return tracks.filter(function (track) {\n return !_this3.isHTML5 || update || _this3.captions.meta.has(track);\n }).filter(function (track) {\n return ['captions', 'subtitles'].includes(track.kind);\n });\n },\n // Match tracks based on languages and get the first\n findTrack: function findTrack(languages) {\n var _this4 = this;\n\n var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var tracks = captions.getTracks.call(this);\n\n var sortIsDefault = function sortIsDefault(track) {\n return Number((_this4.captions.meta.get(track) || {}).default);\n };\n\n var sorted = Array.from(tracks).sort(function (a, b) {\n return sortIsDefault(b) - sortIsDefault(a);\n });\n var track;\n languages.every(function (language) {\n track = sorted.find(function (t) {\n return t.language === language;\n });\n return !track; // Break iteration if there is a match\n }); // If no match is found but is required, get first\n\n return track || (force ? sorted[0] : undefined);\n },\n // Get the current track\n getCurrentTrack: function getCurrentTrack() {\n return captions.getTracks.call(this)[this.currentTrack];\n },\n // Get UI label for track\n getLabel: function getLabel(track) {\n var currentTrack = track;\n\n if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {\n currentTrack = captions.getCurrentTrack.call(this);\n }\n\n if (is$1.track(currentTrack)) {\n if (!is$1.empty(currentTrack.label)) {\n return currentTrack.label;\n }\n\n if (!is$1.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 // Update captions using current track's active cues\n // Also optional array argument in case there isn't any track (ex: vimeo)\n updateCues: function updateCues(input) {\n // Requires UI\n if (!this.supported.ui) {\n return;\n }\n\n if (!is$1.element(this.elements.captions)) {\n this.debug.warn('No captions element to render to');\n return;\n } // Only accept array or empty input\n\n\n if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {\n this.debug.warn('updateCues: Invalid input', input);\n return;\n }\n\n var cues = input; // Get cues from track\n\n if (!cues) {\n var track = captions.getCurrentTrack.call(this);\n cues = Array.from((track || {}).activeCues || []).map(function (cue) {\n return cue.getCueAsHTML();\n }).map(getHTML);\n } // Set new caption text\n\n\n var content = cues.map(function (cueText) {\n return cueText.trim();\n }).join('\\n');\n var 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 var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));\n caption.innerHTML = content;\n this.elements.captions.appendChild(caption); // Trigger event\n\n triggerEvent.call(this, this.media, 'cuechange');\n }\n }\n};\n\n// ==========================================================================\n// Plyr default config\n// ==========================================================================\nvar defaults$1 = {\n // Disable\n enabled: true,\n // Custom media title\n title: '',\n // Logging to console\n debug: false,\n // Auto play (if supported)\n autoplay: false,\n // Only allow one media playing at once (vimeo only)\n autopause: true,\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 // Default time to skip when rewind/fast forward\n seekTime: 10,\n // Default volume\n volume: 1,\n muted: false,\n // Pass a custom duration\n duration: null,\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 // Invert the current time to be a countdown\n invertTime: true,\n // Clicking the currentTime inverts it's value to show time left rather than elapsed\n toggleInvert: true,\n // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\n // Click video container to play/pause\n clickToPlay: true,\n // Auto hide the controls\n hideControls: true,\n // Reset to start when playback ended\n resetOnEnd: false,\n // Disable the standard context menu\n disableContextMenu: true,\n // Sprite (for icons)\n loadSprite: true,\n iconPrefix: 'plyr',\n iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',\n // Blank video (used to prevent errors on source change)\n blankVideo: 'https://cdn.plyr.io/static/blank.mp4',\n // Quality default\n quality: {\n default: 576,\n // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null\n },\n // Set loops\n loop: {\n active: false // start: null,\n // end: null,\n\n },\n // Speed default and options to display\n speed: {\n selected: 1,\n // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4]\n },\n // Keyboard shortcut settings\n keyboard: {\n focused: true,\n global: false\n },\n // Display tooltips\n tooltips: {\n controls: false,\n seek: true\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 // Fullscreen settings\n fullscreen: {\n enabled: true,\n // Allow fullscreen?\n fallback: true,\n // Fallback using full viewport/window\n iosNative: false // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\n\n },\n // Local storage\n storage: {\n enabled: true,\n key: 'plyr'\n },\n // Default controls\n controls: ['play-large', // 'restart',\n // 'rewind',\n 'play', // 'fast-forward',\n 'progress', 'current-time', // 'duration',\n 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',\n 'fullscreen'],\n settings: ['captions', 'quality', 'speed'],\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 // URLs\n urls: {\n download: null,\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/oembed.json?url={0}'\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'\n },\n googleIMA: {\n sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'\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 download: null,\n fullscreen: null,\n pip: null,\n airplay: null,\n speed: null,\n quality: null,\n loop: null,\n language: null\n },\n // Events to watch and bubble\n events: [// Events to watch on HTML5 media elements and bubble\n // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events\n 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events\n 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube\n 'statechange', // Quality\n 'qualitychange', // Ads\n 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],\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 download: '[data-plyr=\"download\"]',\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',\n // Used later\n volume: '.plyr__volume--display'\n },\n progress: '.plyr__progress',\n captions: '.plyr__captions',\n caption: '.plyr__caption'\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'\n }\n },\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id'\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 tagUrl: ''\n },\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: ''\n },\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null,\n // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false\n },\n // YouTube plugin\n youtube: {\n rel: 0,\n // No related vids\n showinfo: 0,\n // Hide info\n iv_load_policy: 3,\n // Hide annotations\n modestbranding: 1,\n // Hide logos as much as possible (they still show one in the corner when paused)\n // Custom settings from Plyr\n customControls: true,\n noCookie: false // Whether to use an alternative version of YouTube without cookies\n\n }\n};\n\n// ==========================================================================\n// Plyr states\n// ==========================================================================\nvar pip = {\n active: 'picture-in-picture',\n inactive: 'inline'\n};\n\n// ==========================================================================\n// Plyr supported types and providers\n// ==========================================================================\nvar providers = {\n html5: 'html5',\n youtube: 'youtube',\n vimeo: 'vimeo'\n};\nvar types = {\n audio: 'audio',\n video: 'video'\n};\n/**\n * Get provider by URL\n * @param {String} url\n */\n\nfunction getProviderByUrl(url) {\n // YouTube\n if (/^(https?:\\/\\/)?(www\\.)?(youtube\\.com|youtube-nocookie\\.com|youtu\\.?be)\\/.+$/.test(url)) {\n return providers.youtube;\n } // Vimeo\n\n\n if (/^https?:\\/\\/player.vimeo.com\\/video\\/\\d{0,9}(?=\\b|\\/)/.test(url)) {\n return providers.vimeo;\n }\n\n return null;\n}\n\n// ==========================================================================\n// Console wrapper\n// ==========================================================================\nvar noop = function noop() {};\n\nvar Console = /*#__PURE__*/function () {\n function Console() {\n var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n _classCallCheck(this, Console);\n\n this.enabled = window.console && enabled;\n\n if (this.enabled) {\n this.log('Debugging enabled');\n }\n }\n\n _createClass(Console, [{\n key: \"log\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;\n }\n }, {\n key: \"warn\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;\n }\n }, {\n key: \"error\",\n get: function get() {\n // eslint-disable-next-line no-console\n return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;\n }\n }]);\n\n return Console;\n}();\n\nvar Fullscreen = /*#__PURE__*/function () {\n function Fullscreen(player) {\n var _this = this;\n\n _classCallCheck(this, Fullscreen);\n\n _defineProperty(this, \"onChange\", function () {\n if (!_this.enabled) {\n return;\n } // Update toggle button\n\n\n var button = _this.player.elements.buttons.fullscreen;\n\n if (is$1.element(button)) {\n button.pressed = _this.active;\n } // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n\n\n var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event\n\n triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n });\n\n _defineProperty(this, \"toggleFallback\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\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 } // Toggle scroll\n\n\n document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook\n\n toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+\n\n if (browser.isIos) {\n var viewport = document.head.querySelector('meta[name=\"viewport\"]');\n var property = 'viewport-fit=cover'; // Inject the viewport meta if required\n\n if (!viewport) {\n viewport = document.createElement('meta');\n viewport.setAttribute('name', 'viewport');\n } // Check if the property already exists\n\n\n var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);\n\n if (toggle) {\n _this.cleanupViewport = !hasProperty;\n\n if (!hasProperty) {\n viewport.content += \",\".concat(property);\n }\n } else if (_this.cleanupViewport) {\n viewport.content = viewport.content.split(',').filter(function (part) {\n return part.trim() !== property;\n }).join(',');\n }\n } // Toggle button and fire events\n\n\n _this.onChange();\n });\n\n _defineProperty(this, \"trapFocus\", function (event) {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n } // Get the current focused element\n\n\n var focused = document.activeElement;\n var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n\n var _focusable = _slicedToArray(focusable, 1),\n first = _focusable[0];\n\n var last = focusable[focusable.length - 1];\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 _defineProperty(this, \"update\", function () {\n if (_this.enabled) {\n var mode;\n\n if (_this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n _this.player.debug.log(\"\".concat(mode, \" fullscreen enabled\"));\n } else {\n _this.player.debug.log('Fullscreen not supported and fallback disabled');\n } // Add styling hook to show button\n\n\n toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);\n });\n\n _defineProperty(this, \"enter\", function () {\n if (!_this.enabled) {\n return;\n } // iOS native fullscreen doesn't need the request step\n\n\n if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n if (_this.player.isVimeo) {\n _this.player.embed.requestFullscreen();\n } else {\n _this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || _this.forceFallback) {\n _this.toggleFallback(true);\n } else if (!_this.prefix) {\n _this.target.requestFullscreen({\n navigationUI: 'hide'\n });\n } else if (!is$1.empty(_this.prefix)) {\n _this.target[\"\".concat(_this.prefix, \"Request\").concat(_this.property)]();\n }\n });\n\n _defineProperty(this, \"exit\", function () {\n if (!_this.enabled) {\n return;\n } // iOS native fullscreen\n\n\n if (browser.isIos && _this.player.config.fullscreen.iosNative) {\n _this.target.webkitExitFullscreen();\n\n silencePromise(_this.player.play());\n } else if (!Fullscreen.native || _this.forceFallback) {\n _this.toggleFallback(false);\n } else if (!_this.prefix) {\n (document.cancelFullScreen || document.exitFullscreen).call(document);\n } else if (!is$1.empty(_this.prefix)) {\n var action = _this.prefix === 'moz' ? 'Cancel' : 'Exit';\n document[\"\".concat(_this.prefix).concat(action).concat(_this.property)]();\n }\n });\n\n _defineProperty(this, \"toggle\", function () {\n if (!_this.active) {\n _this.enter();\n } else {\n _this.exit();\n }\n });\n\n // Keep reference to parent\n this.player = player; // Get prefix\n\n this.prefix = Fullscreen.prefix;\n this.property = Fullscreen.property; // Scroll position\n\n this.scrollPosition = {\n x: 0,\n y: 0\n }; // Force the use of 'full window/browser' rather than fullscreen\n\n this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n\n this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // Register event listeners\n // Handle event (incase user presses escape etc)\n\n on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : \"\".concat(this.prefix, \"fullscreenchange\"), function () {\n // TODO: Filter for target??\n _this.onChange();\n }); // Fullscreen toggle on double click\n\n on.call(this.player, this.player.elements.container, 'dblclick', function (event) {\n // Ignore double click in controls\n if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {\n return;\n }\n\n _this.player.listeners.proxy(event, _this.toggle, 'fullscreen');\n }); // Tap focus when in fullscreen\n\n on.call(this, this.player.elements.container, 'keydown', function (event) {\n return _this.trapFocus(event);\n }); // Update the UI\n\n this.update(); // this.toggle = this.toggle.bind(this);\n } // Determine if native supported\n\n\n _createClass(Fullscreen, [{\n key: \"usingNative\",\n // If we're actually using native\n get: function get() {\n return Fullscreen.native && !this.forceFallback;\n } // Get the prefix for handlers\n\n }, {\n key: \"enabled\",\n // Determine if fullscreen is enabled\n get: function get() {\n return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;\n } // Get active state\n\n }, {\n key: \"active\",\n get: function get() {\n if (!this.enabled) {\n return false;\n } // Fallback using classname\n\n\n if (!Fullscreen.native || this.forceFallback) {\n return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);\n }\n\n var element = !this.prefix ? document.fullscreenElement : document[\"\".concat(this.prefix).concat(this.property, \"Element\")];\n return element && element.shadowRoot ? element === this.target.getRootNode().host : element === this.target;\n } // Get target element\n\n }, {\n key: \"target\",\n get: function get() {\n return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.fullscreen || this.player.elements.container;\n }\n }], [{\n key: \"native\",\n get: function get() {\n return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);\n }\n }, {\n key: \"prefix\",\n get: function get() {\n // No prefix\n if (is$1.function(document.exitFullscreen)) {\n return '';\n } // Check for fullscreen support by vendor prefix\n\n\n var value = '';\n var prefixes = ['webkit', 'moz', 'ms'];\n prefixes.some(function (pre) {\n if (is$1.function(document[\"\".concat(pre, \"ExitFullscreen\")]) || is$1.function(document[\"\".concat(pre, \"CancelFullScreen\")])) {\n value = pre;\n return true;\n }\n\n return false;\n });\n return value;\n }\n }, {\n key: \"property\",\n get: function get() {\n return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';\n }\n }]);\n\n return Fullscreen;\n}();\n\n// `Math.sign` method implementation\n// https://tc39.github.io/ecma262/#sec-math.sign\nvar mathSign = 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// `Math.sign` method\n// https://tc39.github.io/ecma262/#sec-math.sign\n_export({ target: 'Math', stat: true }, {\n sign: mathSign\n});\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// ==========================================================================\nfunction loadImage(src) {\n var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;\n return new Promise(function (resolve, reject) {\n var image = new Image();\n\n var handler = function handler() {\n delete image.onload;\n delete image.onerror;\n (image.naturalWidth >= minWidth ? resolve : reject)(image);\n };\n\n Object.assign(image, {\n onload: handler,\n onerror: handler,\n src: src\n });\n });\n}\n\nvar ui = {\n addStyleHook: function 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 // Toggle native HTML5 media controls\n toggleNativeControls: function toggleNativeControls() {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (toggle && this.isHTML5) {\n this.media.setAttribute('controls', '');\n } else {\n this.media.removeAttribute('controls');\n }\n },\n // Setup the UI\n build: function build() {\n var _this = this;\n\n // Re-attach media element listeners\n // TODO: Use event bubbling?\n this.listeners.media(); // Don't setup interface if no support\n\n if (!this.supported.ui) {\n this.debug.warn(\"Basic support only for \".concat(this.provider, \" \").concat(this.type)); // Restore native controls\n\n ui.toggleNativeControls.call(this, true); // Bail\n\n return;\n } // Inject custom controls if not present\n\n\n if (!is$1.element(this.elements.controls)) {\n // Inject custom controls\n controls.inject.call(this); // Re-attach control listeners\n\n this.listeners.controls();\n } // Remove native controls\n\n\n ui.toggleNativeControls.call(this); // Setup captions for HTML5\n\n if (this.isHTML5) {\n captions.setup.call(this);\n } // Reset volume\n\n\n this.volume = null; // Reset mute state\n\n this.muted = null; // Reset loop state\n\n this.loop = null; // Reset quality setting\n\n this.quality = null; // Reset speed\n\n this.speed = null; // Reset volume display\n\n controls.updateVolume.call(this); // Reset time display\n\n controls.timeUpdate.call(this); // Update the UI\n\n ui.checkPlaying.call(this); // Check for picture-in-picture support\n\n toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support\n\n toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class\n\n toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class\n\n toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls\n\n this.ready = true; // Ready event at end of execution stack\n\n setTimeout(function () {\n triggerEvent.call(_this, _this.media, 'ready');\n }, 0); // Set the title\n\n ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created\n\n if (this.poster) {\n ui.setPoster.call(this, this.poster, false).catch(function () {});\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\n\n if (this.config.duration) {\n controls.durationUpdate.call(this);\n }\n },\n // Setup aria attribute for play and iframe title\n setTitle: function setTitle() {\n // Find the current text\n var label = i18n.get('play', this.config); // If there's a media title set, use that for the label\n\n if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {\n label += \", \".concat(this.config.title);\n } // If there's a play button, set label\n\n\n Array.from(this.elements.buttons.play || []).forEach(function (button) {\n button.setAttribute('aria-label', label);\n }); // Set iframe title\n // https://github.com/sampotts/plyr/issues/124\n\n if (this.isEmbed) {\n var iframe = getElement.call(this, 'iframe');\n\n if (!is$1.element(iframe)) {\n return;\n } // Default to media type\n\n\n var title = !is$1.empty(this.config.title) ? this.config.title : 'video';\n var format = i18n.get('frameTitle', this.config);\n iframe.setAttribute('title', format.replace('{title}', title));\n }\n },\n // Toggle poster\n togglePoster: function togglePoster(enable) {\n toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);\n },\n // Set the poster image (async)\n // Used internally for the poster setter, with the passive option forced to false\n setPoster: function setPoster(poster) {\n var _this2 = this;\n\n var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n\n // Don't override if call is passive\n if (passive && this.poster) {\n return Promise.reject(new Error('Poster already set'));\n } // Set property synchronously to respect the call order\n\n\n this.media.setAttribute('data-poster', poster); // Show the poster\n\n this.elements.poster.removeAttribute('hidden'); // Wait until ui is ready\n\n return ready.call(this) // Load image\n .then(function () {\n return loadImage(poster);\n }).catch(function (err) {\n // Hide poster on error unless it's been set by another call\n if (poster === _this2.poster) {\n ui.togglePoster.call(_this2, false);\n } // Rethrow\n\n\n throw err;\n }).then(function () {\n // Prevent race conditions\n if (poster !== _this2.poster) {\n throw new Error('setPoster cancelled by later call to setPoster');\n }\n }).then(function () {\n Object.assign(_this2.elements.poster.style, {\n backgroundImage: \"url('\".concat(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(_this2, true);\n return poster;\n });\n },\n // Check playing state\n checkPlaying: function checkPlaying(event) {\n var _this3 = this;\n\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); // Set state\n\n Array.from(this.elements.buttons.play || []).forEach(function (target) {\n Object.assign(target, {\n pressed: _this3.playing\n });\n target.setAttribute('aria-label', i18n.get(_this3.playing ? 'pause' : 'play', _this3.config));\n }); // Only update controls on non timeupdate events\n\n if (is$1.event(event) && event.type === 'timeupdate') {\n return;\n } // Toggle controls\n\n\n ui.toggleControls.call(this);\n },\n // Check if media is loading\n checkLoading: function checkLoading(event) {\n var _this4 = this;\n\n this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer\n\n clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking\n\n this.timers.loading = setTimeout(function () {\n // Update progress bar loading class state\n toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility\n\n ui.toggleControls.call(_this4);\n }, this.loading ? 250 : 0);\n },\n // Toggle controls based on state and `force` argument\n toggleControls: function toggleControls(force) {\n var controlsElement = this.elements.controls;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n\n this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));\n }\n },\n // Migrate any custom properties from the media to the parent\n migrateStyles: function migrateStyles() {\n var _this5 = this;\n\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values(_objectSpread2({}, this.media.style)) // We're only fussed about Plyr specific properties\n .filter(function (key) {\n return !is$1.empty(key) && is$1.string(key) && key.startsWith('--plyr');\n }).forEach(function (key) {\n // Set on the container\n _this5.elements.container.style.setProperty(key, _this5.media.style.getPropertyValue(key)); // Clean up from media element\n\n\n _this5.media.style.removeProperty(key);\n }); // Remove attribute if empty\n\n if (is$1.empty(this.media.style)) {\n this.media.removeAttribute('style');\n }\n }\n};\n\nvar Listeners = /*#__PURE__*/function () {\n function Listeners(_player) {\n var _this = this;\n\n _classCallCheck(this, Listeners);\n\n _defineProperty(this, \"firstTouch\", function () {\n var player = _this.player;\n var elements = player.elements;\n player.touch = true; // Add touch class\n\n toggleClass(elements.container, player.config.classNames.isTouch, true);\n });\n\n _defineProperty(this, \"setTabFocus\", function (event) {\n var player = _this.player;\n var elements = player.elements;\n clearTimeout(_this.focusTimer); // Ignore any key other than tab\n\n if (event.type === 'keydown' && event.which !== 9) {\n return;\n } // Store reference to event timeStamp\n\n\n if (event.type === 'keydown') {\n _this.lastKeyDown = event.timeStamp;\n } // Remove current classes\n\n\n var removeCurrent = function removeCurrent() {\n var className = player.config.classNames.tabFocus;\n var current = getElements.call(player, \".\".concat(className));\n toggleClass(current, className, false);\n }; // Determine if a key was pressed to trigger this event\n\n\n var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior\n\n if (event.type === 'focus' && !wasKeyDown) {\n return;\n } // Remove all current\n\n\n removeCurrent(); // Delay the adding of classname until the focus has changed\n // This event fires before the focusin event\n\n if (event.type !== 'focusout') {\n _this.focusTimer = setTimeout(function () {\n var focused = document.activeElement; // Ignore if current focus element isn't inside the player\n\n if (!elements.container.contains(focused)) {\n return;\n }\n\n toggleClass(document.activeElement, player.config.classNames.tabFocus, true);\n }, 10);\n }\n });\n\n _defineProperty(this, \"global\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n var player = _this.player; // Keyboard shortcuts\n\n if (player.config.keyboard.global) {\n toggleListener.call(player, window, 'keydown keyup', _this.handleKey, toggle, false);\n } // Click anywhere closes menu\n\n\n toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events\n\n once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection\n\n toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);\n });\n\n _defineProperty(this, \"container\", function () {\n var player = _this.player;\n var config = player.config,\n elements = player.elements,\n timers = player.timers; // Keyboard shortcuts\n\n if (!config.keyboard.global && config.keyboard.focused) {\n on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);\n } // Toggle controls on mouse events and entering fullscreen\n\n\n on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {\n var controlsElement = elements.controls; // Remove button states for fullscreen\n\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.hover = false;\n } // Show, then hide after a timeout unless another control event occurs\n\n\n var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);\n var delay = 0;\n\n if (show) {\n ui.toggleControls.call(player, true); // Use longer timeout for touch devices\n\n delay = player.touch ? 3000 : 2000;\n } // Clear timer\n\n\n clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Set a gutter for Vimeo\n\n var setGutter = function setGutter(ratio, padding, toggle) {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n var target = player.elements.wrapper.firstChild;\n\n var _ratio = _slicedToArray(ratio, 2),\n y = _ratio[1];\n\n var _getAspectRatio$call = getAspectRatio.call(player),\n _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),\n videoX = _getAspectRatio$call2[0],\n videoY = _getAspectRatio$call2[1];\n\n target.style.maxWidth = toggle ? \"\".concat(y / videoY * videoX, \"px\") : null;\n target.style.margin = toggle ? '0 auto' : null;\n }; // Resize on fullscreen change\n\n\n var setPlayerSize = function setPlayerSize(measure) {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n var rect = elements.container.getBoundingClientRect();\n var width = rect.width,\n height = rect.height;\n return setAspectRatio.call(player, \"\".concat(width, \":\").concat(height));\n };\n\n var resized = function resized() {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {\n var _player$fullscreen = player.fullscreen,\n target = _player$fullscreen.target,\n usingNative = _player$fullscreen.usingNative; // Ignore events not from target\n\n if (target !== elements.container) {\n return;\n } // If it's not an embed and no ratio specified\n\n\n if (!player.isEmbed && is$1.empty(player.config.ratio)) {\n return;\n }\n\n var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size\n\n var _setPlayerSize = setPlayerSize(isEnter),\n padding = _setPlayerSize.padding,\n ratio = _setPlayerSize.ratio; // Set Vimeo gutter\n\n\n setGutter(ratio, padding, isEnter); // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n\n if (isEnter) {\n setTimeout(function () {\n return repaint(elements.container);\n }, 100);\n } // If not using native browser fullscreen API, we need to check for resizes of viewport\n\n\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\n }\n });\n });\n\n _defineProperty(this, \"media\", function () {\n var player = _this.player;\n var elements = player.elements; // Time change on media\n\n on.call(player, player.media, 'timeupdate seeking seeked', function (event) {\n return controls.timeUpdate.call(player, event);\n }); // Display duration\n\n on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {\n return controls.durationUpdate.call(player, event);\n }); // Handle the media finishing\n\n on.call(player, player.media, 'ended', function () {\n // Show poster on end\n if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {\n // Restart\n player.restart(); // Call pause otherwise IE11 will start playing the video again\n\n player.pause();\n }\n }); // Check for buffer progress\n\n on.call(player, player.media, 'progress playing seeking seeked', function (event) {\n return controls.updateProgress.call(player, event);\n }); // Handle volume changes\n\n on.call(player, player.media, 'volumechange', function (event) {\n return controls.updateVolume.call(player, event);\n }); // Handle play/pause\n\n on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {\n return ui.checkPlaying.call(player, event);\n }); // Loading state\n\n on.call(player, player.media, 'waiting canplay seeked playing', function (event) {\n return ui.checkLoading.call(player, event);\n }); // Click video\n\n if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {\n // Re-fetch the wrapper\n var wrapper = getElement.call(player, \".\".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)\n\n if (!is$1.element(wrapper)) {\n return;\n } // On click play, pause or restart\n\n\n on.call(player, elements.container, 'click', function (event) {\n var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper\n\n if (!targets.includes(event.target) && !wrapper.contains(event.target)) {\n return;\n } // Touch devices will just show controls (if hidden)\n\n\n if (player.touch && player.config.hideControls) {\n return;\n }\n\n if (player.ended) {\n _this.proxy(event, player.restart, 'restart');\n\n _this.proxy(event, function () {\n silencePromise(player.play());\n }, 'play');\n } else {\n _this.proxy(event, function () {\n silencePromise(player.togglePlay());\n }, 'play');\n }\n });\n } // Disable right click\n\n\n if (player.supported.ui && player.config.disableContextMenu) {\n on.call(player, elements.wrapper, 'contextmenu', function (event) {\n event.preventDefault();\n }, false);\n } // Volume change\n\n\n on.call(player, player.media, 'volumechange', function () {\n // Save to storage\n player.storage.set({\n volume: player.volume,\n muted: player.muted\n });\n }); // Speed change\n\n on.call(player, player.media, 'ratechange', function () {\n // Update UI\n controls.updateSetting.call(player, 'speed'); // Save to storage\n\n player.storage.set({\n speed: player.speed\n });\n }); // Quality change\n\n on.call(player, player.media, 'qualitychange', function (event) {\n // Update UI\n controls.updateSetting.call(player, 'quality', null, event.detail.quality);\n }); // Update download link when ready and if quality changes\n\n on.call(player, player.media, 'ready qualitychange', function () {\n controls.setDownloadUrl.call(player);\n }); // Proxy events to container\n // Bubble up key events for Edge\n\n var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');\n on.call(player, player.media, proxyEvents, function (event) {\n var _event$detail = event.detail,\n detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media\n\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 _defineProperty(this, \"proxy\", function (event, defaultHandler, customHandlerKey) {\n var player = _this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n var returned = true; // Execute custom handler\n\n if (hasCustomHandler) {\n returned = customHandler.call(player, event);\n } // Only call default handler if not prevented in custom handler\n\n\n if (returned !== false && is$1.function(defaultHandler)) {\n defaultHandler.call(player, event);\n }\n });\n\n _defineProperty(this, \"bind\", function (element, type, defaultHandler, customHandlerKey) {\n var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;\n var player = _this.player;\n var customHandler = player.config.listeners[customHandlerKey];\n var hasCustomHandler = is$1.function(customHandler);\n on.call(player, element, type, function (event) {\n return _this.proxy(event, defaultHandler, customHandlerKey);\n }, passive && !hasCustomHandler);\n });\n\n _defineProperty(this, \"controls\", function () {\n var player = _this.player;\n var elements = player.elements; // IE doesn't support input event, so we fallback to change\n\n var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle\n\n if (elements.buttons.play) {\n Array.from(elements.buttons.play).forEach(function (button) {\n _this.bind(button, 'click', function () {\n silencePromise(player.togglePlay());\n }, 'play');\n });\n } // Pause\n\n\n _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind\n\n\n _this.bind(elements.buttons.rewind, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n }, 'rewind'); // Rewind\n\n\n _this.bind(elements.buttons.fastForward, 'click', function () {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n }, 'fastForward'); // Mute toggle\n\n\n _this.bind(elements.buttons.mute, 'click', function () {\n player.muted = !player.muted;\n }, 'mute'); // Captions toggle\n\n\n _this.bind(elements.buttons.captions, 'click', function () {\n return player.toggleCaptions();\n }); // Download\n\n\n _this.bind(elements.buttons.download, 'click', function () {\n triggerEvent.call(player, player.media, 'download');\n }, 'download'); // Fullscreen toggle\n\n\n _this.bind(elements.buttons.fullscreen, 'click', function () {\n player.fullscreen.toggle();\n }, 'fullscreen'); // Picture-in-Picture\n\n\n _this.bind(elements.buttons.pip, 'click', function () {\n player.pip = 'toggle';\n }, 'pip'); // Airplay\n\n\n _this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle\n\n\n _this.bind(elements.buttons.settings, 'click', function (event) {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n controls.toggleMenu.call(player, event);\n }, null, false); // Can't be passive as we're preventing default\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\n\n _this.bind(elements.buttons.settings, 'keyup', function (event) {\n var code = event.which; // We only care about space and return\n\n if (![13, 32].includes(code)) {\n return;\n } // Because return triggers a click anyway, all we need to do is set focus\n\n\n if (code === 13) {\n controls.focusFirstMenuItem.call(player, null, true);\n return;\n } // Prevent scroll\n\n\n event.preventDefault(); // Prevent playing video (Firefox)\n\n event.stopPropagation(); // Toggle menu\n\n controls.toggleMenu.call(player, event);\n }, null, false // Can't be passive as we're preventing default\n ); // Escape closes menu\n\n\n _this.bind(elements.settings.menu, 'keydown', function (event) {\n if (event.which === 27) {\n controls.toggleMenu.call(player, event);\n }\n }); // Set range input alternative \"value\", which matches the tooltip time (#954)\n\n\n _this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {\n var rect = elements.progress.getBoundingClientRect();\n var percent = 100 / rect.width * (event.pageX - rect.left);\n event.currentTarget.setAttribute('seek-value', percent);\n }); // Pause while seeking\n\n\n _this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {\n var seek = event.currentTarget;\n var code = event.keyCode ? event.keyCode : event.which;\n var attribute = 'play-on-seeked';\n\n if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {\n return;\n } // Record seek time so we can prevent hiding controls for a few seconds after seek\n\n\n player.lastSeekTime = Date.now(); // Was playing before?\n\n var play = seek.hasAttribute(attribute); // Done seeking\n\n var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback\n\n if (play && done) {\n seek.removeAttribute(attribute);\n silencePromise(player.play());\n } else if (!done && player.playing) {\n seek.setAttribute(attribute, '');\n player.pause();\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\n\n if (browser.isIos) {\n var inputs = getElements.call(player, 'input[type=\"range\"]');\n Array.from(inputs).forEach(function (input) {\n return _this.bind(input, inputEvent, function (event) {\n return repaint(event.target);\n });\n });\n } // Seek\n\n\n _this.bind(elements.inputs.seek, inputEvent, function (event) {\n var seek = event.currentTarget; // If it exists, use seek-value instead of \"value\" for consistency with tooltip time (#954)\n\n var seekTo = seek.getAttribute('seek-value');\n\n if (is$1.empty(seekTo)) {\n seekTo = seek.value;\n }\n\n seek.removeAttribute('seek-value');\n player.currentTime = seekTo / seek.max * player.duration;\n }, 'seek'); // Seek tooltip\n\n\n _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {\n return controls.updateSeekTooltip.call(player, event);\n }); // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n\n\n _this.bind(elements.progress, 'mousemove touchmove', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n\n\n _this.bind(elements.progress, 'mouseleave touchend click', function () {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n }); // Show scrubbing preview\n\n\n _this.bind(elements.progress, 'mousedown touchstart', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n _this.bind(elements.progress, 'mouseup touchend', function (event) {\n var previewThumbnails = player.previewThumbnails;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\n }); // Polyfill for lower fill in <input type=\"range\"> for webkit\n\n\n if (browser.isWebkit) {\n Array.from(getElements.call(player, 'input[type=\"range\"]')).forEach(function (element) {\n _this.bind(element, 'input', function (event) {\n return controls.updateRangeFill.call(player, event.target);\n });\n });\n } // Current time invert\n // Only if one time element is used for both currentTime and duration\n\n\n if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {\n _this.bind(elements.display.currentTime, 'click', function () {\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 controls.timeUpdate.call(player);\n });\n } // Volume\n\n\n _this.bind(elements.inputs.volume, inputEvent, function (event) {\n player.volume = event.target.value;\n }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)\n\n\n _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n }); // Also update controls.hover state for any non-player children of fullscreen element (as above)\n\n\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children).filter(function (c) {\n return !c.contains(elements.container);\n }).forEach(function (child) {\n _this.bind(child, 'mouseenter mouseleave', function (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\n\n _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {\n elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);\n }); // Show controls when they receive focus (e.g., when using keyboard tab key)\n\n\n _this.bind(elements.controls, 'focusin', function () {\n var config = player.config,\n timers = player.timers; // Skip transition to prevent focus from scrolling the parent element\n\n toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle\n\n ui.toggleControls.call(player, true); // Restore transition\n\n setTimeout(function () {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0); // Delay a little more for mouse users\n\n var delay = _this.touch ? 3000 : 4000; // Clear timer\n\n clearTimeout(timers.controls); // Hide again after delay\n\n timers.controls = setTimeout(function () {\n return ui.toggleControls.call(player, false);\n }, delay);\n }); // Mouse wheel for volume\n\n\n _this.bind(elements.inputs.volume, 'wheel', function (event) {\n // Detect \"natural\" scroll - suppored on OS X Safari only\n // Other browsers on OS X will be inverted until support improves\n var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true\n\n var _map = [event.deltaX, -event.deltaY].map(function (value) {\n return inverted ? -value : value;\n }),\n _map2 = _slicedToArray(_map, 2),\n x = _map2[0],\n y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)\n\n\n var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%\n\n player.increaseVolume(direction / 50); // Don't break page scrolling at max and min\n\n var volume = player.media.volume;\n\n if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {\n event.preventDefault();\n }\n }, 'volume', false);\n });\n\n this.player = _player;\n this.lastKey = null;\n this.focusTimer = null;\n this.lastKeyDown = null;\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 } // Handle key presses\n\n\n _createClass(Listeners, [{\n key: \"handleKey\",\n value: function handleKey(event) {\n var player = this.player;\n var elements = player.elements;\n var code = event.keyCode ? event.keyCode : event.which;\n var pressed = event.type === 'keydown';\n var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set\n\n if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {\n return;\n } // If the event is bubbled from the media element\n // Firefox doesn't get the keycode for whatever reason\n\n\n if (!is$1.number(code)) {\n return;\n } // Seek by the number keys\n\n\n var seekByKey = function seekByKey() {\n // Divide the max duration into 10th's and times by the number value\n player.currentTime = player.duration / 10 * (code - 48);\n }; // Handle the key on keydown\n // Reset on keyup\n\n\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 var focused = document.activeElement;\n\n if (is$1.element(focused)) {\n var editable = player.config.selectors.editable;\n var seek = elements.inputs.seek;\n\n if (focused !== seek && matches$1(focused, editable)) {\n return;\n }\n\n if (event.which === 32 && matches$1(focused, 'button, [role^=\"menuitem\"]')) {\n return;\n }\n } // Which keycodes should we prevent default\n\n\n 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)\n\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\n break;\n\n case 32:\n case 75:\n // Space and K key\n if (!repeat) {\n silencePromise(player.togglePlay());\n }\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\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\n break;\n\n case 76:\n // L key\n player.loop = !player.loop;\n break;\n } // Escape is handle natively when in full screen\n // So we only need to worry about non native\n\n\n if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\n player.fullscreen.toggle();\n } // Store last code for next cycle\n\n\n this.lastKey = code;\n } else {\n this.lastKey = null;\n }\n } // Toggle menu\n\n }, {\n key: \"toggleMenu\",\n value: function toggleMenu(event) {\n controls.toggleMenu.call(this.player, event);\n } // Device is touch enabled\n\n }]);\n\n return Listeners;\n}();\n\nvar HAS_SPECIES_SUPPORT$3 = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH$a = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max$3 = Math.max;\nvar min$5 = Math.min;\nvar MAX_SAFE_INTEGER$1 = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n_export({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT$3 || !USES_TO_LENGTH$a }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min$5(max$3(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER$1) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\n});\n\nvar loadjs_umd = createCommonjsModule(function (module, exports) {\n (function (root, factory) {\n {\n module.exports = factory();\n }\n })(commonjsGlobal, function () {\n /**\n * Global dependencies.\n * @global {Object} document - DOM\n */\n var devnull = function devnull() {},\n bundleIdCache = {},\n bundleResultCache = {},\n bundleCallbackQueue = {};\n /**\n * Subscribe to bundle load event.\n * @param {string[]} bundleIds - Bundle ids\n * @param {Function} callbackFn - The callback function\n */\n\n\n function subscribe(bundleIds, callbackFn) {\n // listify\n bundleIds = bundleIds.push ? bundleIds : [bundleIds];\n var depsNotFound = [],\n i = bundleIds.length,\n numWaiting = i,\n fn,\n bundleId,\n r,\n q; // define callback function\n\n fn = function fn(bundleId, pathsNotFound) {\n if (pathsNotFound.length) depsNotFound.push(bundleId);\n numWaiting--;\n if (!numWaiting) callbackFn(depsNotFound);\n }; // register callback\n\n\n while (i--) {\n bundleId = bundleIds[i]; // execute callback if in result cache\n\n r = bundleResultCache[bundleId];\n\n if (r) {\n fn(bundleId, r);\n continue;\n } // add to callback queue\n\n\n q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];\n q.push(fn);\n }\n }\n /**\n * Publish bundle load event.\n * @param {string} bundleId - Bundle id\n * @param {string[]} pathsNotFound - List of files not found\n */\n\n\n function publish(bundleId, pathsNotFound) {\n // exit if id isn't defined\n if (!bundleId) return;\n var q = bundleCallbackQueue[bundleId]; // cache result\n\n bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty\n\n if (!q) return; // empty callback queue\n\n while (q.length) {\n q[0](bundleId, pathsNotFound);\n q.splice(0, 1);\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 */\n\n\n function executeCallbacks(args, depsNotFound) {\n // accept function as argument\n if (args.call) args = {\n success: args\n }; // success and error callbacks\n\n if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);\n }\n /**\n * Load individual file.\n * @param {string} path - The file path\n * @param {Function} callbackFn - The callback function\n */\n\n\n function 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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped; // tag IE9+\n\n isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)\n\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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]; // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) result = 'e';\n }\n } // handle retries in case of load failure\n\n\n if (result == 'e') {\n // increment counter\n numTries += 1; // exit function and try again\n\n if (numTries < maxTries) {\n return loadFile(path, callbackFn, args, numTries);\n }\n } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\n } // execute callback\n\n\n callbackFn(path, result, ev.defaultPrevented);\n }; // add to document (unless callback returns `false`)\n\n\n if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);\n }\n /**\n * Load multiple files.\n * @param {string[]} paths - The file paths\n * @param {Function} callbackFn - The callback function\n */\n\n\n function loadFiles(paths, callbackFn, args) {\n // listify paths\n paths = paths.push ? paths : [paths];\n var numWaiting = paths.length,\n x = numWaiting,\n pathsNotFound = [],\n fn,\n i; // define callback function\n\n fn = function fn(path, result, defaultPrevented) {\n // handle error\n if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load\n // will be blocked (ex. Ghostery/ABP on Safari)\n\n if (result == 'b') {\n if (defaultPrevented) pathsNotFound.push(path);else return;\n }\n\n numWaiting--;\n if (!numWaiting) callbackFn(pathsNotFound);\n }; // load scripts\n\n\n for (i = 0; i < x; i++) {\n loadFile(paths[i], fn, args);\n }\n }\n /**\n * Initiate script load and register bundle.\n * @param {(string|string[])} paths - The file paths\n * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\n */\n\n\n function loadjs(paths, arg1, arg2) {\n var bundleId, args; // bundleId (if string)\n\n if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})\n\n args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined\n\n if (bundleId) {\n if (bundleId in bundleIdCache) {\n throw \"LoadJS\";\n } else {\n bundleIdCache[bundleId] = true;\n }\n }\n\n function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound); // resolve Promise\n\n if (resolve) {\n executeCallbacks({\n success: resolve,\n error: reject\n }, pathsNotFound);\n } // publish bundle load event\n\n\n publish(bundleId, pathsNotFound);\n }, args);\n }\n\n if (args.returnPromise) return new Promise(loadFn);else loadFn();\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 */\n\n\n loadjs.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 return loadjs;\n };\n /**\n * Manually satisfy bundle dependencies.\n * @param {string} bundleId - The bundle id\n */\n\n\n loadjs.done = function done(bundleId) {\n publish(bundleId, []);\n };\n /**\n * Reset loadjs dependencies statuses\n */\n\n\n loadjs.reset = function reset() {\n bundleIdCache = {};\n bundleResultCache = {};\n bundleCallbackQueue = {};\n };\n /**\n * Determine if bundle has already been defined\n * @param String} bundleId - The bundle id\n */\n\n\n loadjs.isDefined = function isDefined(bundleId) {\n return bundleId in bundleIdCache;\n }; // export\n\n\n return loadjs;\n });\n});\n\nfunction loadScript(url) {\n return new Promise(function (resolve, reject) {\n loadjs_umd(url, {\n success: resolve,\n error: reject\n });\n });\n}\n\nfunction parseId(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n if (is$1.number(Number(url))) {\n return url;\n }\n\n var regex = /^.*(vimeo.com\\/|video\\/)(\\d+).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nvar vimeo = {\n setup: function setup() {\n var player = this; // Add embed class for responsive\n\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true); // Set speed options from config\n\n player.options.speed = player.config.speed.options; // Set intial ratio\n\n setAspectRatio.call(player); // Load the SDK if not already\n\n if (!is$1.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk).then(function () {\n vimeo.ready.call(player);\n }).catch(function (error) {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n // API Ready\n ready: function ready() {\n var _this = this;\n\n var player = this;\n var config = player.config.vimeo;\n\n var premium = config.premium,\n referrerPolicy = config.referrerPolicy,\n frameParams = _objectWithoutProperties(config, [\"premium\", \"referrerPolicy\"]); // If the owner has a pro or premium account then we can hide controls etc\n\n\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false\n });\n } // Get Vimeo params for the iframe\n\n\n var params = buildUrlParams(_objectSpread2({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative\n }, frameParams)); // Get the source URL or ID\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(player.config.attributes.embed.id);\n }\n\n var id = parseId(source); // Build an iframe\n\n var iframe = createElement('iframe');\n var src = format(player.config.urls.vimeo.iframe, id, params);\n iframe.setAttribute('src', src);\n iframe.setAttribute('allowfullscreen', '');\n iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required\n\n if (!is$1.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n } // Inject the package\n\n\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n var wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n } // Get poster image\n\n\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then(function (response) {\n if (is$1.empty(response) || !response.thumbnail_url) {\n return;\n } // Set and show poster\n\n\n ui.setPoster.call(player, response.thumbnail_url).catch(function () {});\n });\n } // Setup instance\n // https://github.com/vimeo/player.js\n\n\n player.embed = new window.Vimeo.Player(iframe, {\n autopause: player.config.autopause,\n muted: player.muted\n });\n player.media.paused = true;\n player.media.currentTime = 0; // Disable native text track rendering\n\n if (player.supported.ui) {\n player.embed.disableTextTrack();\n } // Create a faux HTML5 API using the Vimeo API\n\n\n player.media.play = function () {\n assurePlaybackState.call(player, true);\n return player.embed.play();\n };\n\n player.media.pause = function () {\n assurePlaybackState.call(player, false);\n return player.embed.pause();\n };\n\n player.media.stop = function () {\n player.pause();\n player.currentTime = 0;\n }; // Seeking\n\n\n var currentTime = player.media.currentTime;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return currentTime;\n },\n set: function set(time) {\n // Vimeo will automatically play on seek if the video hasn't been played before\n // Get current paused state and volume etc\n var embed = player.embed,\n media = player.media,\n paused = player.paused,\n volume = player.volume;\n var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event\n\n media.seeking = true;\n triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete\n\n Promise.resolve(restorePause && embed.setVolume(0)) // Seek\n .then(function () {\n return embed.setCurrentTime(time);\n }) // Restore paused\n .then(function () {\n return restorePause && embed.pause();\n }) // Restore volume\n .then(function () {\n return restorePause && embed.setVolume(volume);\n }).catch(function () {// Do nothing\n });\n }\n }); // Playback speed\n\n var speed = player.config.speed.selected;\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return speed;\n },\n set: function set(input) {\n player.embed.setPlaybackRate(input).then(function () {\n speed = input;\n triggerEvent.call(player, player.media, 'ratechange');\n }).catch(function () {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\n });\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n player.embed.setVolume(input).then(function () {\n volume = input;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : false;\n player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {\n muted = toggle;\n triggerEvent.call(player, player.media, 'volumechange');\n });\n }\n }); // Loop\n\n var loop = player.config.loop;\n Object.defineProperty(player.media, 'loop', {\n get: function get() {\n return loop;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : player.config.loop.active;\n player.embed.setLoop(toggle).then(function () {\n loop = toggle;\n });\n }\n }); // Source\n\n var currentSrc;\n player.embed.getVideoUrl().then(function (value) {\n currentSrc = value;\n controls.setDownloadUrl.call(player);\n }).catch(function (error) {\n _this.debug.warn(error);\n });\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return currentSrc;\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Set aspect ratio based on video size\n\n Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {\n var _dimensions = _slicedToArray(dimensions, 2),\n width = _dimensions[0],\n height = _dimensions[1];\n\n player.embed.ratio = [width, height];\n setAspectRatio.call(_this);\n }); // Set autopause\n\n player.embed.setAutopause(player.config.autopause).then(function (state) {\n player.config.autopause = state;\n }); // Get title\n\n player.embed.getVideoTitle().then(function (title) {\n player.config.title = title;\n ui.setTitle.call(_this);\n }); // Get current time\n\n player.embed.getCurrentTime().then(function (value) {\n currentTime = value;\n triggerEvent.call(player, player.media, 'timeupdate');\n }); // Get duration\n\n player.embed.getDuration().then(function (value) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }); // Get captions\n\n player.embed.getTextTracks().then(function (tracks) {\n player.media.textTracks = tracks;\n captions.setup.call(player);\n });\n player.embed.on('cuechange', function (_ref) {\n var _ref$cues = _ref.cues,\n cues = _ref$cues === void 0 ? [] : _ref$cues;\n var strippedCues = cues.map(function (cue) {\n return stripHTML(cue.text);\n });\n captions.updateCues.call(player, strippedCues);\n });\n player.embed.on('loaded', function () {\n // Assure state and events are updated on autoplay\n player.embed.getPaused().then(function (paused) {\n assurePlaybackState.call(player, !paused);\n\n if (!paused) {\n triggerEvent.call(player, player.media, 'playing');\n }\n });\n\n if (is$1.element(player.embed.element) && player.supported.ui) {\n var frame = player.embed.element; // Fix keyboard focus issues\n // https://github.com/sampotts/plyr/issues/317\n\n frame.setAttribute('tabindex', -1);\n }\n });\n player.embed.on('bufferstart', function () {\n triggerEvent.call(player, player.media, 'waiting');\n });\n player.embed.on('bufferend', function () {\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('play', function () {\n assurePlaybackState.call(player, true);\n triggerEvent.call(player, player.media, 'playing');\n });\n player.embed.on('pause', function () {\n assurePlaybackState.call(player, false);\n });\n player.embed.on('timeupdate', function (data) {\n player.media.seeking = false;\n currentTime = data.seconds;\n triggerEvent.call(player, player.media, 'timeupdate');\n });\n player.embed.on('progress', function (data) {\n player.media.buffered = data.percent;\n triggerEvent.call(player, player.media, 'progress'); // Check all loaded\n\n if (parseInt(data.percent, 10) === 1) {\n triggerEvent.call(player, player.media, 'canplaythrough');\n } // Get duration as if we do it before load, it gives an incorrect value\n // https://github.com/sampotts/plyr/issues/891\n\n\n player.embed.getDuration().then(function (value) {\n if (value !== player.media.duration) {\n player.media.duration = value;\n triggerEvent.call(player, player.media, 'durationchange');\n }\n });\n });\n player.embed.on('seeked', function () {\n player.media.seeking = false;\n triggerEvent.call(player, player.media, 'seeked');\n });\n player.embed.on('ended', function () {\n player.media.paused = true;\n triggerEvent.call(player, player.media, 'ended');\n });\n player.embed.on('error', function (detail) {\n player.media.error = detail;\n triggerEvent.call(player, player.media, 'error');\n }); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 0);\n }\n }\n};\n\nfunction parseId$1(url) {\n if (is$1.empty(url)) {\n return null;\n }\n\n var regex = /^.*(youtu.be\\/|v\\/|u\\/\\w\\/|embed\\/|watch\\?v=|&v=)([^#&?]*).*/;\n return url.match(regex) ? RegExp.$2 : url;\n} // Set playback state and trigger change (only on actual change)\n\n\nfunction assurePlaybackState$1(play) {\n if (play && !this.embed.hasPlayed) {\n this.embed.hasPlayed = true;\n }\n\n if (this.media.paused === play) {\n this.media.paused = !play;\n triggerEvent.call(this, this.media, play ? 'play' : 'pause');\n }\n}\n\nfunction getHost$1(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n } // Use YouTube's default\n\n\n return undefined;\n}\n\nvar youtube = {\n setup: function setup() {\n var _this = this;\n\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API\n\n if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue\n\n window.onYouTubeIframeAPIReady = function () {\n // Call global callback if set\n if (is$1.function(callback)) {\n callback();\n }\n\n youtube.ready.call(_this);\n }; // Load the SDK\n\n\n loadScript(this.config.urls.youtube.sdk).catch(function (error) {\n _this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n // Get the media title\n getTitle: function getTitle(videoId) {\n var _this2 = this;\n\n var url = format(this.config.urls.youtube.api, videoId);\n fetch(url).then(function (data) {\n if (is$1.object(data)) {\n var title = data.title,\n height = data.height,\n width = data.width; // Set title\n\n _this2.config.title = title;\n ui.setTitle.call(_this2); // Set aspect ratio\n\n _this2.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(_this2);\n }).catch(function () {\n // Set aspect ratio\n setAspectRatio.call(_this2);\n });\n },\n // API ready\n ready: function ready() {\n var player = this;\n var config = player.config.youtube; // Ignore already setup (race condition)\n\n var currentId = player.media && player.media.getAttribute('id');\n\n if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {\n return;\n } // Get the source URL or ID\n\n\n var source = player.media.getAttribute('src'); // Get from <div> if needed\n\n if (is$1.empty(source)) {\n source = player.media.getAttribute(this.config.attributes.embed.id);\n } // Replace the <iframe> with a <div> due to YouTube API issues\n\n\n var videoId = parseId$1(source);\n var id = generateId(player.provider); // Replace media element\n\n var container = createElement('div', {\n id: id,\n 'data-poster': config.customControls ? player.poster : undefined\n });\n player.media = replaceElement(container, player.media); // Only load the poster when using custom controls\n\n if (config.customControls) {\n var posterSrc = function posterSrc(s) {\n return \"https://i.ytimg.com/vi/\".concat(videoId, \"/\").concat(s, \"default.jpg\");\n }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)\n\n\n loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded\n .catch(function () {\n return loadImage(posterSrc('sd'), 121);\n }) // 480p padded 4:3\n .catch(function () {\n return loadImage(posterSrc('hq'));\n }) // 360p padded 4:3. Always exists\n .then(function (image) {\n return ui.setPoster.call(player, image.src);\n }).then(function (src) {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n }).catch(function () {});\n } // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n\n\n player.embed = new window.YT.Player(player.media, {\n videoId: videoId,\n host: getHost$1(config),\n playerVars: extend({}, {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null\n }, config),\n events: {\n onError: function onError(event) {\n // YouTube may fire onError twice, so only handle it once\n if (!player.media.error) {\n var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError\n\n var message = {\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 player.media.error = {\n code: code,\n message: message\n };\n triggerEvent.call(player, player.media, 'error');\n }\n },\n onPlaybackRateChange: function onPlaybackRateChange(event) {\n // Get the instance\n var instance = event.target; // Get current speed\n\n player.media.playbackRate = instance.getPlaybackRate();\n triggerEvent.call(player, player.media, 'ratechange');\n },\n onReady: function onReady(event) {\n // Bail if onReady has already been called. See issue #1108\n if (is$1.function(player.media.play)) {\n return;\n } // Get the instance\n\n\n var instance = event.target; // Get the title\n\n youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API\n\n player.media.play = function () {\n assurePlaybackState$1.call(player, true);\n instance.playVideo();\n };\n\n player.media.pause = function () {\n assurePlaybackState$1.call(player, false);\n instance.pauseVideo();\n };\n\n player.media.stop = function () {\n instance.stopVideo();\n };\n\n player.media.duration = instance.getDuration();\n player.media.paused = true; // Seeking\n\n player.media.currentTime = 0;\n Object.defineProperty(player.media, 'currentTime', {\n get: function get() {\n return Number(instance.getCurrentTime());\n },\n set: function 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 } // Set seeking state and trigger event\n\n\n player.media.seeking = true;\n triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent\n\n instance.seekTo(time);\n }\n }); // Playback speed\n\n Object.defineProperty(player.media, 'playbackRate', {\n get: function get() {\n return instance.getPlaybackRate();\n },\n set: function set(input) {\n instance.setPlaybackRate(input);\n }\n }); // Volume\n\n var volume = player.config.volume;\n Object.defineProperty(player.media, 'volume', {\n get: function get() {\n return volume;\n },\n set: function set(input) {\n volume = input;\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Muted\n\n var muted = player.config.muted;\n Object.defineProperty(player.media, 'muted', {\n get: function get() {\n return muted;\n },\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : muted;\n muted = toggle;\n instance[toggle ? 'mute' : 'unMute']();\n instance.setVolume(volume * 100);\n triggerEvent.call(player, player.media, 'volumechange');\n }\n }); // Source\n\n Object.defineProperty(player.media, 'currentSrc', {\n get: function get() {\n return instance.getVideoUrl();\n }\n }); // Ended\n\n Object.defineProperty(player.media, 'ended', {\n get: function get() {\n return player.currentTime === player.duration;\n }\n }); // Get available speeds\n\n var speeds = instance.getAvailablePlaybackRates(); // Filter based on config\n\n player.options.speed = speeds.filter(function (s) {\n return player.config.speed.options.includes(s);\n }); // Set the tabindex to avoid focus entering iframe\n\n if (player.supported.ui && config.customControls) {\n player.media.setAttribute('tabindex', -1);\n }\n\n triggerEvent.call(player, player.media, 'timeupdate');\n triggerEvent.call(player, player.media, 'durationchange'); // Reset timer\n\n clearInterval(player.timers.buffering); // Setup buffering\n\n player.timers.buffering = setInterval(function () {\n // Get loaded % from YouTube\n player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something\n\n if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {\n triggerEvent.call(player, player.media, 'progress');\n } // Set last buffer point\n\n\n player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%\n\n if (player.media.buffered === 1) {\n clearInterval(player.timers.buffering); // Trigger event\n\n triggerEvent.call(player, player.media, 'canplaythrough');\n }\n }, 200); // Rebuild UI\n\n if (config.customControls) {\n setTimeout(function () {\n return ui.build.call(player);\n }, 50);\n }\n },\n onStateChange: function onStateChange(event) {\n // Get the instance\n var instance = event.target; // Reset timer\n\n clearInterval(player.timers.playing);\n var 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 } // Handle events\n // -1 Unstarted\n // 0 Ended\n // 1 Playing\n // 2 Paused\n // 3 Buffering\n // 5 Video cued\n\n\n switch (event.data) {\n case -1:\n // Update scrubber\n triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube\n\n player.media.buffered = instance.getVideoLoadedFraction();\n triggerEvent.call(player, player.media, 'progress');\n break;\n\n case 0:\n assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.\n\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 (config.customControls && !player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {\n player.media.pause();\n } else {\n assurePlaybackState$1.call(player, true);\n triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress\n\n player.timers.playing = setInterval(function () {\n triggerEvent.call(player, player.media, 'timeupdate');\n }, 50); // 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\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\n assurePlaybackState$1.call(player, false);\n break;\n\n case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\n break;\n }\n\n triggerEvent.call(player, player.elements.container, 'statechange', false, {\n code: event.data\n });\n }\n }\n });\n }\n};\n\nvar media = {\n // Setup media\n setup: function setup() {\n // If there's no media, bail\n if (!this.media) {\n this.debug.warn('No media element found!');\n return;\n } // Add type class\n\n\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class\n\n toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds\n // This will require changes if audio embeds are added\n\n if (this.isEmbed) {\n toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);\n } // Inject the player wrapper\n\n\n if (this.isVideo) {\n // Create the wrapper div\n this.elements.wrapper = createElement('div', {\n class: this.config.classNames.video\n }); // Wrap the video in a container\n\n wrap$1(this.media, this.elements.wrapper); // Poster image container\n\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: ''\n });\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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\nvar destroy = function destroy(instance) {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n } // Destroy our adsManager\n\n\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nvar Ads = /*#__PURE__*/function () {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n function Ads(player) {\n var _this = this;\n\n _classCallCheck(this, Ads);\n\n _defineProperty(this, \"load\", function () {\n if (!_this.enabled) {\n return;\n } // Check if the Google IMA3 SDK is loaded or load it ourselves\n\n\n if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {\n loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {\n _this.ready();\n }).catch(function () {\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 _defineProperty(this, \"ready\", function () {\n // Double check we're enabled\n if (!_this.enabled) {\n destroy(_this);\n } // Start ticking our safety timer. If the whole advertisement\n // thing doesn't resolve within our set time; we bail\n\n\n _this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer\n\n\n _this.managerPromise.then(function () {\n _this.clearSafetyTimer('onAdsManagerLoaded()');\n }); // Set listeners on the Plyr instance\n\n\n _this.listeners(); // Setup the IMA SDK\n\n\n _this.setupIMA();\n });\n\n _defineProperty(this, \"setupIMA\", function () {\n // Create the container for our advertisements\n _this.elements.container = createElement('div', {\n class: _this.player.config.classNames.ads\n });\n\n _this.player.elements.container.appendChild(_this.elements.container); // So we can run VPAID2\n\n\n google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language\n\n google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+\n\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads\n\n _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader\n\n _this.loader = new google.ima.AdsLoader(_this.elements.displayContainer); // Listen and respond to ads loaded and error events\n\n _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {\n return _this.onAdsManagerLoaded(event);\n }, false);\n\n _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this.onAdError(error);\n }, false); // Request video ads to be pre-loaded\n\n\n _this.requestAds();\n });\n\n _defineProperty(this, \"requestAds\", function () {\n var container = _this.player.elements.container;\n\n try {\n // Request video ads\n var request = new google.ima.AdsRequest();\n request.adTagUrl = _this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK\n // to select the correct creative if multiple are returned\n\n request.linearAdSlotWidth = container.offsetWidth;\n request.linearAdSlotHeight = container.offsetHeight;\n request.nonLinearAdSlotWidth = container.offsetWidth;\n request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.\n\n request.forceNonLinearFullSlot = false; // Mute based on current state\n\n request.setAdWillPlayMuted(!_this.player.muted);\n\n _this.loader.requestAds(request);\n } catch (e) {\n _this.onAdError(e);\n }\n });\n\n _defineProperty(this, \"pollCountdown\", function () {\n var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n\n if (!start) {\n clearInterval(_this.countdownTimer);\n\n _this.elements.container.removeAttribute('data-badge-text');\n\n return;\n }\n\n var update = function update() {\n var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));\n var label = \"\".concat(i18n.get('advertisement', _this.player.config), \" - \").concat(time);\n\n _this.elements.container.setAttribute('data-badge-text', label);\n };\n\n _this.countdownTimer = setInterval(update, 100);\n });\n\n _defineProperty(this, \"onAdsManagerLoaded\", function (event) {\n // Load could occur after a source change (race condition)\n if (!_this.enabled) {\n return;\n } // Get the ads manager\n\n\n var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf\n\n settings.restoreCustomPlaybackStateOnAdBreakComplete = true;\n settings.enablePreloading = true; // 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\n _this.manager = event.getAdsManager(_this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll\n\n _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events\n // Advertisement error events\n\n _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {\n return _this.onAdError(error);\n }); // Advertisement regular events\n\n\n Object.keys(google.ima.AdEvent.Type).forEach(function (type) {\n _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {\n return _this.onAdEvent(e);\n });\n }); // Resolve our adsManager\n\n _this.trigger('loaded');\n });\n\n _defineProperty(this, \"addCuePoints\", function () {\n // Add advertisement cue's within the time line if available\n if (!is$1.empty(_this.cuePoints)) {\n _this.cuePoints.forEach(function (cuePoint) {\n if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {\n var seekElement = _this.player.elements.progress;\n\n if (is$1.element(seekElement)) {\n var cuePercentage = 100 / _this.player.duration * cuePoint;\n var cue = createElement('span', {\n class: _this.player.config.classNames.cues\n });\n cue.style.left = \"\".concat(cuePercentage.toString(), \"%\");\n seekElement.appendChild(cue);\n }\n }\n });\n }\n });\n\n _defineProperty(this, \"onAdEvent\", function (event) {\n var container = _this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)\n // don't have ad object associated\n\n var ad = event.getAd();\n var adData = event.getAdData(); // Proxy event\n\n var dispatchEvent = function dispatchEvent(type) {\n triggerEvent.call(_this.player, _this.player.media, \"ads\".concat(type.replace(/_/g, '').toLowerCase()));\n }; // Bubble the event\n\n\n dispatchEvent(event.type);\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'); // Start countdown\n\n\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 } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());\n // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());\n\n\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n _this.manager.setVolume(_this.player.volume);\n\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 // 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 // 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 if (_this.player.ended) {\n _this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n _this.loader.contentComplete();\n }\n\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 _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 _this.pollCountdown();\n\n _this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n _this.player.debug.warn(\"Non-fatal ad error: \".concat(adData.adError.getMessage()));\n }\n\n break;\n }\n });\n\n _defineProperty(this, \"onAdError\", function (event) {\n _this.cancel();\n\n _this.player.debug.warn('Ads error', event);\n });\n\n _defineProperty(this, \"listeners\", function () {\n var container = _this.player.elements.container;\n var time;\n\n _this.player.on('canplay', function () {\n _this.addCuePoints();\n });\n\n _this.player.on('ended', function () {\n _this.loader.contentComplete();\n });\n\n _this.player.on('timeupdate', function () {\n time = _this.player.currentTime;\n });\n\n _this.player.on('seeked', function () {\n var seekedTime = _this.player.currentTime;\n\n if (is$1.empty(_this.cuePoints)) {\n return;\n }\n\n _this.cuePoints.forEach(function (cuePoint, index) {\n if (time < cuePoint && cuePoint < seekedTime) {\n _this.manager.discardAdBreak();\n\n _this.cuePoints.splice(index, 1);\n }\n });\n }); // Listen to the resizing of the window. And resize ad accordingly\n // TODO: eventually implement ResizeObserver\n\n\n window.addEventListener('resize', function () {\n if (_this.manager) {\n _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);\n }\n });\n });\n\n _defineProperty(this, \"play\", function () {\n var container = _this.player.elements.container;\n\n if (!_this.managerPromise) {\n _this.resumeContent();\n } // Play the requested advertisement whenever the adsManager is ready\n\n\n _this.managerPromise.then(function () {\n // Set volume to match player\n _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices\n\n\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); // 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\n\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 }).catch(function () {});\n });\n\n _defineProperty(this, \"resumeContent\", function () {\n // Hide the advertisement container\n _this.elements.container.style.zIndex = ''; // Ad is stopped\n\n _this.playing = false; // Play video\n\n silencePromise(_this.player.media.play());\n });\n\n _defineProperty(this, \"pauseContent\", function () {\n // Show the advertisement container\n _this.elements.container.style.zIndex = 3; // Ad is playing\n\n _this.playing = true; // Pause our video.\n\n _this.player.media.pause();\n });\n\n _defineProperty(this, \"cancel\", function () {\n // Pause our video\n if (_this.initialized) {\n _this.resumeContent();\n } // Tell our instance that we're done for now\n\n\n _this.trigger('error'); // Re-create our adsManager\n\n\n _this.loadAds();\n });\n\n _defineProperty(this, \"loadAds\", function () {\n // Tell our adsManager to go bye bye\n _this.managerPromise.then(function () {\n // Destroy our adsManager\n if (_this.manager) {\n _this.manager.destroy();\n } // Re-set our adsManager promises\n\n\n _this.managerPromise = new Promise(function (resolve) {\n _this.on('loaded', resolve);\n\n _this.player.debug.log(_this.manager);\n }); // Now that the manager has been destroyed set it to also be un-initialized\n\n _this.initialized = false; // Now request some new advertisements\n\n _this.requestAds();\n }).catch(function () {});\n });\n\n _defineProperty(this, \"trigger\", function (event) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n var handlers = _this.events[event];\n\n if (is$1.array(handlers)) {\n handlers.forEach(function (handler) {\n if (is$1.function(handler)) {\n handler.apply(_this, args);\n }\n });\n }\n });\n\n _defineProperty(this, \"on\", function (event, callback) {\n if (!is$1.array(_this.events[event])) {\n _this.events[event] = [];\n }\n\n _this.events[event].push(callback);\n\n return _this;\n });\n\n _defineProperty(this, \"startSafetyTimer\", function (time, from) {\n _this.player.debug.log(\"Safety timer invoked from: \".concat(from));\n\n _this.safetyTimer = setTimeout(function () {\n _this.cancel();\n\n _this.clearSafetyTimer('startSafetyTimer()');\n }, time);\n });\n\n _defineProperty(this, \"clearSafetyTimer\", function (from) {\n if (!is$1.nullOrUndefined(_this.safetyTimer)) {\n _this.player.debug.log(\"Safety timer cleared from: \".concat(from));\n\n clearTimeout(_this.safetyTimer);\n _this.safetyTimer = null;\n }\n });\n\n this.player = player;\n this.config = player.config.ads;\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; // Setup a promise to resolve when the IMA manager is ready\n\n this.managerPromise = new Promise(function (resolve, reject) {\n // The ad is loaded and ready\n _this.on('loaded', resolve); // Ads failed\n\n\n _this.on('error', reject);\n });\n this.load();\n }\n\n _createClass(Ads, [{\n key: \"enabled\",\n get: function get() {\n var config = this.config;\n return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));\n }\n /**\n * Load the IMA SDK\n */\n\n }, {\n key: \"tagUrl\",\n // Build the tag URL\n get: function get() {\n var config = this.config;\n\n if (is$1.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\n var 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: config.publisherId\n };\n var base = 'https://go.aniview.com/api/adserver6/vast/';\n return \"\".concat(base, \"?\").concat(buildUrlParams(params));\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\n }]);\n\n return Ads;\n}();\n\nvar $findIndex = arrayIteration.findIndex;\n\n\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES$1 = true;\n\nvar USES_TO_LENGTH$b = arrayMethodUsesToLength(FIND_INDEX);\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES$1 = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n_export({ target: 'Array', proto: true, forced: SKIPS_HOLES$1 || !USES_TO_LENGTH$b }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n\nvar min$6 = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO$1 = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD$6 = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH$c = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED$5 = NEGATIVE_ZERO$1 || !STRICT_METHOD$6 || !USES_TO_LENGTH$c;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nvar arrayLastIndexOf = FORCED$5 ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO$1) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min$6(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n_export({ target: 'Array', proto: true, forced: arrayLastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: arrayLastIndexOf\n});\n\nvar parseVtt = function parseVtt(vttDataString) {\n var processedList = [];\n var frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n frames.forEach(function (frame) {\n var result = {};\n var lines = frame.split(/\\r\\n|\\n|\\r/);\n lines.forEach(function (line) {\n if (!is$1.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number(\"0.\".concat(matchTimes[4]));\n result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number(\"0.\".concat(matchTimes[9]));\n }\n } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n var lineSplit = line.trim().split('#xywh=');\n\n var _lineSplit = _slicedToArray(lineSplit, 1);\n\n result.text = _lineSplit[0];\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n var _lineSplit$1$split = lineSplit[1].split(',');\n\n var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);\n\n result.x = _lineSplit$1$split2[0];\n result.y = _lineSplit$1$split2[1];\n result.w = _lineSplit$1$split2[2];\n result.h = _lineSplit$1$split2[3];\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n return processedList;\n};\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\n\nvar fitRatio = function fitRatio(ratio, outer) {\n var targetRatio = outer.width / outer.height;\n var result = {};\n\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = 1 / ratio * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nvar PreviewThumbnails = /*#__PURE__*/function () {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n function PreviewThumbnails(player) {\n var _this = this;\n\n _classCallCheck(this, PreviewThumbnails);\n\n _defineProperty(this, \"load\", function () {\n // Toggle the regular seek tooltip\n if (_this.player.elements.display.seekTooltip) {\n _this.player.elements.display.seekTooltip.hidden = _this.enabled;\n }\n\n if (!_this.enabled) {\n return;\n }\n\n _this.getThumbnails().then(function () {\n if (!_this.enabled) {\n return;\n } // Render DOM elements\n\n\n _this.render(); // Check to see if thumb container size was specified manually in CSS\n\n\n _this.determineContainerAutoSizing();\n\n _this.loaded = true;\n });\n });\n\n _defineProperty(this, \"getThumbnails\", function () {\n return new Promise(function (resolve) {\n var src = _this.player.config.previewThumbnails.src;\n\n if (is$1.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n } // Resolve promise\n\n\n var sortAndResolve = function sortAndResolve() {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n _this.thumbnails.sort(function (x, y) {\n return x.height - y.height;\n });\n\n _this.player.debug.log('Preview thumbnails', _this.thumbnails);\n\n resolve();\n }; // Via callback()\n\n\n if (is$1.function(src)) {\n src(function (thumbnails) {\n _this.thumbnails = thumbnails;\n sortAndResolve();\n });\n } // VTT urls\n else {\n // If string, convert into single-element list\n var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n\n var promises = urls.map(function (u) {\n return _this.getThumbnail(u);\n }); // Resolve\n\n Promise.all(promises).then(sortAndResolve);\n }\n });\n });\n\n _defineProperty(this, \"getThumbnail\", function (url) {\n return new Promise(function (resolve) {\n fetch(url).then(function (response) {\n var thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: ''\n }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n\n if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n } // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n\n\n var tempImage = new Image();\n\n tempImage.onload = function () {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n _this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n });\n\n _defineProperty(this, \"startMove\", function (event) {\n if (!_this.loaded) {\n return;\n }\n\n if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n } // Wait until media has a duration\n\n\n if (!_this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n var clientRect = _this.player.elements.progress.getBoundingClientRect();\n\n var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);\n _this.seekTime = _this.player.media.duration * (percentage / 100);\n\n if (_this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n _this.seekTime = 0;\n }\n\n if (_this.seekTime > _this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n _this.seekTime = _this.player.media.duration - 1;\n }\n\n _this.mousePosX = event.pageX; // Set time text inside image container\n\n _this.elements.thumb.time.innerText = formatTime(_this.seekTime);\n } // Download and show image\n\n\n _this.showImageAtCurrentTime();\n });\n\n _defineProperty(this, \"endMove\", function () {\n _this.toggleThumbContainer(false, true);\n });\n\n _defineProperty(this, \"startScrubbing\", function (event) {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n _this.mouseDown = true; // Wait until media has a duration\n\n if (_this.player.media.duration) {\n _this.toggleScrubbingContainer(true);\n\n _this.toggleThumbContainer(false, true); // Download and show image\n\n\n _this.showImageAtCurrentTime();\n }\n }\n });\n\n _defineProperty(this, \"endScrubbing\", function () {\n _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n\n if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n _this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(_this.player, _this.player.media, 'timeupdate', function () {\n // Re-check mousedown - we might have already started scrubbing again\n if (!_this.mouseDown) {\n _this.toggleScrubbingContainer(false);\n }\n });\n }\n });\n\n _defineProperty(this, \"listeners\", function () {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n _this.player.on('play', function () {\n _this.toggleThumbContainer(false, true);\n });\n\n _this.player.on('seeked', function () {\n _this.toggleThumbContainer(false);\n });\n\n _this.player.on('timeupdate', function () {\n _this.lastTime = _this.player.media.currentTime;\n });\n });\n\n _defineProperty(this, \"render\", function () {\n // Create HTML element: plyr__preview-thumbnail-container\n _this.elements.thumb.container = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.thumbContainer\n }); // Wrapper for the image for styling\n\n _this.elements.thumb.imageContainer = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.imageContainer\n });\n\n _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)\n\n\n var timeContainer = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.timeContainer\n });\n _this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(_this.elements.thumb.time);\n\n _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb\n\n\n if (is$1.element(_this.player.elements.progress)) {\n _this.player.elements.progress.appendChild(_this.elements.thumb.container);\n } // Create HTML element: plyr__preview-scrubbing-container\n\n\n _this.elements.scrubbing.container = createElement('div', {\n class: _this.player.config.classNames.previewThumbnails.scrubbingContainer\n });\n\n _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);\n });\n\n _defineProperty(this, \"destroy\", function () {\n if (_this.elements.thumb.container) {\n _this.elements.thumb.container.remove();\n }\n\n if (_this.elements.scrubbing.container) {\n _this.elements.scrubbing.container.remove();\n }\n });\n\n _defineProperty(this, \"showImageAtCurrentTime\", function () {\n if (_this.mouseDown) {\n _this.setScrubbingContainerSize();\n } else {\n _this.setThumbContainerSizeAndPos();\n } // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n\n\n var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {\n return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;\n });\n\n var hasThumb = thumbNum >= 0;\n var qualityIndex = 0; // Show the thumb container if we're not scrubbing\n\n if (!_this.mouseDown) {\n _this.toggleThumbContainer(hasThumb);\n } // No matching thumb found\n\n\n if (!hasThumb) {\n return;\n } // Check to see if we've already downloaded higher quality versions of this image\n\n\n _this.thumbnails.forEach(function (thumbnail, index) {\n if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n }); // Only proceed if either thumbnum or thumbfilename has changed\n\n\n if (thumbNum !== _this.showingThumb) {\n _this.showingThumb = thumbNum;\n\n _this.loadImage(qualityIndex);\n }\n });\n\n _defineProperty(this, \"loadImage\", function () {\n var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var thumbNum = _this.showingThumb;\n var thumbnail = _this.thumbnails[qualityIndex];\n var urlPrefix = thumbnail.urlPrefix;\n var frame = thumbnail.frames[thumbNum];\n var thumbFilename = thumbnail.frames[thumbNum].text;\n var thumbUrl = urlPrefix + thumbFilename;\n\n if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (_this.loadingImage && _this.usingSprites) {\n _this.loadingImage.onload = null;\n } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n\n\n var previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n _this.showingThumbFilename = thumbFilename;\n\n _this.player.debug.log(\"Loading image: \".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n\n\n previewImage.onload = function () {\n return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n };\n\n _this.loadingImage = previewImage;\n\n _this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n\n _this.currentImageElement.dataset.index = thumbNum;\n\n _this.removeOldImages(_this.currentImageElement);\n }\n });\n\n _defineProperty(this, \"showImage\", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {\n var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;\n\n _this.player.debug.log(\"Showing thumb: \".concat(thumbFilename, \". num: \").concat(thumbNum, \". qual: \").concat(qualityIndex, \". newimg: \").concat(newImage));\n\n _this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n _this.currentImageContainer.appendChild(previewImage);\n\n _this.currentImageElement = previewImage;\n\n if (!_this.loadedImages.includes(thumbFilename)) {\n _this.loadedImages.push(thumbFilename);\n }\n } // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n\n\n _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n });\n\n _defineProperty(this, \"removeOldImages\", function (currentImage) {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(_this.currentImageContainer.children).forEach(function (image) {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n var removeDelay = _this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub\n\n var currentImageContainer = _this.currentImageContainer;\n setTimeout(function () {\n currentImageContainer.removeChild(image);\n\n _this.player.debug.log(\"Removing thumb: \".concat(image.dataset.filename));\n }, removeDelay);\n }\n });\n });\n\n _defineProperty(this, \"preloadNearby\", function (thumbNum) {\n var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;\n return new Promise(function (resolve) {\n setTimeout(function () {\n var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;\n\n if (_this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n var thumbnailsClone;\n\n if (forward) {\n thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n var foundOne = false;\n thumbnailsClone.forEach(function (frame) {\n var newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!_this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n\n _this.player.debug.log(\"Preloading thumb filename: \".concat(newThumbFilename));\n\n var urlPrefix = _this.thumbnails[0].urlPrefix;\n var thumbURL = urlPrefix + newThumbFilename;\n var previewImage = new Image();\n previewImage.src = thumbURL;\n\n previewImage.onload = function () {\n _this.player.debug.log(\"Preloaded thumb filename: \".concat(newThumbFilename));\n\n if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded\n\n resolve();\n };\n }\n }\n }); // If there are none to preload then we want to resolve immediately\n\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n });\n\n _defineProperty(this, \"getHigherQuality\", function (currentQualityIndex, previewImage, frame, thumbFilename) {\n if (currentQualityIndex < _this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n var previewImageHeight = previewImage.naturalHeight;\n\n if (_this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < _this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(function () {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (_this.showingThumbFilename === thumbFilename) {\n _this.player.debug.log(\"Showing higher quality thumb for: \".concat(thumbFilename));\n\n _this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n });\n\n _defineProperty(this, \"toggleThumbContainer\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;\n\n _this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n _this.showingThumb = null;\n _this.showingThumbFilename = null;\n }\n });\n\n _defineProperty(this, \"toggleScrubbingContainer\", function () {\n var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;\n var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n\n _this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n _this.showingThumb = null;\n _this.showingThumbFilename = null;\n }\n });\n\n _defineProperty(this, \"determineContainerAutoSizing\", function () {\n if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n _this.sizeSpecifiedInCSS = true;\n }\n });\n\n _defineProperty(this, \"setThumbContainerSizeAndPos\", function () {\n if (!_this.sizeSpecifiedInCSS) {\n var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);\n _this.elements.thumb.imageContainer.style.height = \"\".concat(_this.thumbContainerHeight, \"px\");\n _this.elements.thumb.imageContainer.style.width = \"\".concat(thumbWidth, \"px\");\n } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {\n var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);\n\n _this.elements.thumb.imageContainer.style.width = \"\".concat(_thumbWidth, \"px\");\n } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {\n var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);\n _this.elements.thumb.imageContainer.style.height = \"\".concat(thumbHeight, \"px\");\n }\n\n _this.setThumbContainerPos();\n });\n\n _defineProperty(this, \"setThumbContainerPos\", function () {\n var seekbarRect = _this.player.elements.progress.getBoundingClientRect();\n\n var plyrRect = _this.player.elements.container.getBoundingClientRect();\n\n var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n\n var minVal = plyrRect.left - seekbarRect.left + 10;\n var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n\n var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = \"\".concat(previewPos, \"px\");\n });\n\n _defineProperty(this, \"setScrubbingContainerSize\", function () {\n var _fitRatio = fitRatio(_this.thumbAspectRatio, {\n width: _this.player.media.clientWidth,\n height: _this.player.media.clientHeight\n }),\n width = _fitRatio.width,\n height = _fitRatio.height;\n\n _this.elements.scrubbing.container.style.width = \"\".concat(width, \"px\");\n _this.elements.scrubbing.container.style.height = \"\".concat(height, \"px\");\n });\n\n _defineProperty(this, \"setImageSizeAndOffset\", function (previewImage, frame) {\n if (!_this.usingSprites) {\n return;\n } // Find difference between height and preview container height\n\n\n var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign\n\n previewImage.style.height = \"\".concat(previewImage.naturalHeight * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.width = \"\".concat(previewImage.naturalWidth * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.left = \"-\".concat(frame.x * multiplier, \"px\"); // eslint-disable-next-line no-param-reassign\n\n previewImage.style.top = \"-\".concat(frame.y * multiplier, \"px\");\n });\n\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n this.elements = {\n thumb: {},\n scrubbing: {}\n };\n this.load();\n }\n\n _createClass(PreviewThumbnails, [{\n key: \"enabled\",\n get: function get() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n }, {\n key: \"currentImageContainer\",\n get: function get() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n }, {\n key: \"usingSprites\",\n get: function get() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n }, {\n key: \"thumbAspectRatio\",\n get: function get() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n }, {\n key: \"thumbContainerHeight\",\n get: function get() {\n if (this.mouseDown) {\n var _fitRatio2 = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight\n }),\n height = _fitRatio2.height;\n\n return height;\n } // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n\n\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n }, {\n key: \"currentImageElement\",\n get: function get() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n },\n set: function set(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n }]);\n\n return PreviewThumbnails;\n}();\n\nvar source = {\n // Add elements to HTML5 media (source, tracks, etc)\n insertElements: function insertElements(type, attributes) {\n var _this = this;\n\n if (is$1.string(attributes)) {\n insertElement(type, this.media, {\n src: attributes\n });\n } else if (is$1.array(attributes)) {\n attributes.forEach(function (attribute) {\n insertElement(type, _this.media, attribute);\n });\n }\n },\n // Update source\n // Sources are not checked for support so be careful\n change: function change(input) {\n var _this2 = this;\n\n if (!getDeep(input, 'sources.length')) {\n this.debug.warn('Invalid source format');\n return;\n } // Cancel current network requests\n\n\n html5.cancelRequests.call(this); // Destroy instance and re-setup\n\n this.destroy.call(this, function () {\n // Reset quality options\n _this2.options.quality = []; // Remove elements\n\n removeElement(_this2.media);\n _this2.media = null; // Reset class name\n\n if (is$1.element(_this2.elements.container)) {\n _this2.elements.container.removeAttribute('class');\n } // Set the type and provider\n\n\n var sources = input.sources,\n type = input.type;\n\n var _sources = _slicedToArray(sources, 1),\n _sources$ = _sources[0],\n _sources$$provider = _sources$.provider,\n provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,\n src = _sources$.src;\n\n var tagName = provider === 'html5' ? type : 'div';\n var attributes = provider === 'html5' ? {} : {\n src: src\n };\n Object.assign(_this2, {\n provider: provider,\n type: type,\n // Check for support\n supported: support.check(type, provider, _this2.config.playsinline),\n // Create new element\n media: createElement(tagName, attributes)\n }); // Inject the new element\n\n _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?\n\n\n if (is$1.boolean(input.autoplay)) {\n _this2.config.autoplay = input.autoplay;\n } // Set attributes for audio and video\n\n\n if (_this2.isHTML5) {\n if (_this2.config.crossorigin) {\n _this2.media.setAttribute('crossorigin', '');\n }\n\n if (_this2.config.autoplay) {\n _this2.media.setAttribute('autoplay', '');\n }\n\n if (!is$1.empty(input.poster)) {\n _this2.poster = input.poster;\n }\n\n if (_this2.config.loop.active) {\n _this2.media.setAttribute('loop', '');\n }\n\n if (_this2.config.muted) {\n _this2.media.setAttribute('muted', '');\n }\n\n if (_this2.config.playsinline) {\n _this2.media.setAttribute('playsinline', '');\n }\n } // Restore class hook\n\n\n ui.addStyleHook.call(_this2); // Set new sources for html5\n\n if (_this2.isHTML5) {\n source.insertElements.call(_this2, 'source', sources);\n } // Set video title\n\n\n _this2.config.title = input.title; // Set up from scratch\n\n media.setup.call(_this2); // HTML5 stuff\n\n if (_this2.isHTML5) {\n // Setup captions\n if (Object.keys(input).includes('tracks')) {\n source.insertElements.call(_this2, 'track', input.tracks);\n }\n } // If HTML5 or embed but not fully supported, setupInterface and call ready now\n\n\n if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {\n // Setup interface\n ui.build.call(_this2);\n } // Load HTML5 sources\n\n\n if (_this2.isHTML5) {\n _this2.media.load();\n } // Update previewThumbnails config & reload plugin\n\n\n if (!is$1.empty(input.previewThumbnails)) {\n Object.assign(_this2.config.previewThumbnails, input.previewThumbnails); // Cleanup previewThumbnails plugin if it was loaded\n\n if (_this2.previewThumbnails && _this2.previewThumbnails.loaded) {\n _this2.previewThumbnails.destroy();\n\n _this2.previewThumbnails = null;\n } // Create new instance if it is still enabled\n\n\n if (_this2.config.previewThumbnails.enabled) {\n _this2.previewThumbnails = new PreviewThumbnails(_this2);\n }\n } // Update the fullscreen support\n\n\n _this2.fullscreen.update();\n }, true);\n }\n};\n\n/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nfunction clamp() {\n var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;\n var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;\n return Math.min(Math.max(input, min), max);\n}\n\n// TODO: Use a WeakMap for private globals\n// const globals = new WeakMap();\n// Plyr instance\n\nvar Plyr = /*#__PURE__*/function () {\n function Plyr(target, options) {\n var _this = this;\n\n _classCallCheck(this, Plyr);\n\n _defineProperty(this, \"play\", function () {\n if (!is$1.function(_this.media.play)) {\n return null;\n } // Intecept play with ads\n\n\n if (_this.ads && _this.ads.enabled) {\n _this.ads.managerPromise.then(function () {\n return _this.ads.play();\n }).catch(function () {\n return silencePromise(_this.media.play());\n });\n } // Return the promise (for HTML5)\n\n\n return _this.media.play();\n });\n\n _defineProperty(this, \"pause\", function () {\n if (!_this.playing || !is$1.function(_this.media.pause)) {\n return null;\n }\n\n return _this.media.pause();\n });\n\n _defineProperty(this, \"togglePlay\", function (input) {\n // Toggle based on current state if nothing passed\n var toggle = is$1.boolean(input) ? input : !_this.playing;\n\n if (toggle) {\n return _this.play();\n }\n\n return _this.pause();\n });\n\n _defineProperty(this, \"stop\", function () {\n if (_this.isHTML5) {\n _this.pause();\n\n _this.restart();\n } else if (is$1.function(_this.media.stop)) {\n _this.media.stop();\n }\n });\n\n _defineProperty(this, \"restart\", function () {\n _this.currentTime = 0;\n });\n\n _defineProperty(this, \"rewind\", function (seekTime) {\n _this.currentTime -= is$1.number(seekTime) ? seekTime : _this.config.seekTime;\n });\n\n _defineProperty(this, \"forward\", function (seekTime) {\n _this.currentTime += is$1.number(seekTime) ? seekTime : _this.config.seekTime;\n });\n\n _defineProperty(this, \"increaseVolume\", function (step) {\n var volume = _this.media.muted ? 0 : _this.volume;\n _this.volume = volume + (is$1.number(step) ? step : 0);\n });\n\n _defineProperty(this, \"decreaseVolume\", function (step) {\n _this.increaseVolume(-step);\n });\n\n _defineProperty(this, \"airplay\", function () {\n // Show dialog if supported\n if (support.airplay) {\n _this.media.webkitShowPlaybackTargetPicker();\n }\n });\n\n _defineProperty(this, \"toggleControls\", function (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 var isHidden = hasClass(_this.elements.container, _this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls\n\n var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state\n\n var hiding = toggleClass(_this.elements.container, _this.config.classNames.hideControls, force); // Close menu\n\n if (hiding && is$1.array(_this.config.controls) && _this.config.controls.includes('settings') && !is$1.empty(_this.config.settings)) {\n controls.toggleMenu.call(_this, false);\n } // Trigger event on change\n\n\n if (hiding !== isHidden) {\n var eventName = hiding ? 'controlshidden' : 'controlsshown';\n triggerEvent.call(_this, _this.media, eventName);\n }\n\n return !hiding;\n }\n\n return false;\n });\n\n _defineProperty(this, \"on\", function (event, callback) {\n on.call(_this, _this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"once\", function (event, callback) {\n once.call(_this, _this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"off\", function (event, callback) {\n off(_this.elements.container, event, callback);\n });\n\n _defineProperty(this, \"destroy\", function (callback) {\n var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;\n\n if (!_this.ready) {\n return;\n }\n\n var done = function done() {\n // Reset overflow (incase destroyed while in fullscreen)\n document.body.style.overflow = ''; // GC for embed\n\n _this.embed = null; // If it's a soft destroy, make minimal changes\n\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); // Clear for GC\n\n _this.elements.buttons.play = null;\n _this.elements.captions = null;\n _this.elements.controls = null;\n _this.elements.wrapper = null;\n } // Callback\n\n\n if (is$1.function(callback)) {\n callback();\n }\n } else {\n // Unbind listeners\n unbindListeners.call(_this); // Cancel current network requests\n\n html5.cancelRequests.call(_this); // Replace the container with the original element provided\n\n replaceElement(_this.elements.original, _this.elements.container); // Event\n\n triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback\n\n if (is$1.function(callback)) {\n callback.call(_this.elements.original);\n } // Reset state\n\n\n _this.ready = false; // Clear for garbage collection\n\n setTimeout(function () {\n _this.elements = null;\n _this.media = null;\n }, 200);\n }\n }; // Stop playback\n\n\n _this.stop(); // Clear timeouts\n\n\n clearTimeout(_this.timers.loading);\n clearTimeout(_this.timers.controls);\n clearTimeout(_this.timers.resized); // Provider specific stuff\n\n if (_this.isHTML5) {\n // Restore native video controls\n ui.toggleNativeControls.call(_this, true); // Clean up\n\n done();\n } else if (_this.isYouTube) {\n // Clear timers\n clearInterval(_this.timers.buffering);\n clearInterval(_this.timers.playing); // Destroy YouTube API\n\n if (_this.embed !== null && is$1.function(_this.embed.destroy)) {\n _this.embed.destroy();\n } // Clean up\n\n\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 } // Vimeo does not always return\n\n\n setTimeout(done, 200);\n }\n });\n\n _defineProperty(this, \"supports\", function (type) {\n return support.mime.call(_this, type);\n });\n\n this.timers = {}; // State\n\n this.ready = false;\n this.loading = false;\n this.failed = false; // Touch device\n\n this.touch = support.touch; // Set the media element\n\n this.media = target; // String selector passed\n\n if (is$1.string(this.media)) {\n this.media = document.querySelectorAll(this.media);\n } // jQuery, NodeList or Array passed, use first element\n\n\n if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {\n // eslint-disable-next-line\n this.media = this.media[0];\n } // Set config\n\n\n this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {\n try {\n return JSON.parse(_this.media.getAttribute('data-plyr-config'));\n } catch (e) {\n return {};\n }\n }()); // Elements cache\n\n this.elements = {\n container: null,\n fullscreen: 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 }; // Captions\n\n this.captions = {\n active: null,\n currentTrack: -1,\n meta: new WeakMap()\n }; // Fullscreen\n\n this.fullscreen = {\n active: false\n }; // Options\n\n this.options = {\n speed: [],\n quality: []\n }; // Debugging\n // TODO: move to globals\n\n this.debug = new Console(this.config.debug); // Log config options and support\n\n this.debug.log('Config', this.config);\n this.debug.log('Support', support); // We need an element to setup\n\n if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {\n this.debug.error('Setup failed: no suitable element passed');\n return;\n } // Bail if the element is initialized\n\n\n if (this.media.plyr) {\n this.debug.warn('Target already setup');\n return;\n } // Bail if not enabled\n\n\n if (!this.config.enabled) {\n this.debug.error('Setup failed: disabled by config');\n return;\n } // Bail if disabled or no basic support\n // You may want to disable certain UAs etc\n\n\n if (!support.check().api) {\n this.debug.error('Setup failed: no support');\n return;\n } // Cache original element state for .destroy()\n\n\n var clone = this.media.cloneNode(true);\n clone.autoplay = false;\n this.elements.original = clone; // Set media type based on tag or data attribute\n // Supported: video, audio, vimeo, youtube\n\n var _type = this.media.tagName.toLowerCase(); // Embed properties\n\n\n var iframe = null;\n var url = null; // Different setup based on type\n\n switch (_type) {\n case 'div':\n // Find the frame\n iframe = this.media.querySelector('iframe'); // <iframe> type\n\n if (is$1.element(iframe)) {\n // Detect provider\n url = parseUrl(iframe.getAttribute('src'));\n this.provider = getProviderByUrl(url.toString()); // Rework elements\n\n this.elements.container = this.media;\n this.media = iframe; // Reset classname\n\n this.elements.container.className = ''; // Get attributes from URL and set config\n\n if (url.search.length) {\n var truthy = ['1', 'true'];\n\n if (truthy.includes(url.searchParams.get('autoplay'))) {\n this.config.autoplay = true;\n }\n\n if (truthy.includes(url.searchParams.get('loop'))) {\n this.config.loop.active = true;\n } // TODO: replace fullscreen.iosNative with this playsinline config option\n // YouTube requires the playsinline in the URL\n\n\n if (this.isYouTube) {\n this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));\n this.config.youtube.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); // Remove attribute\n\n this.media.removeAttribute(this.config.attributes.embed.provider);\n } // Unsupported or missing provider\n\n\n if (is$1.empty(this.provider) || !Object.values(providers).includes(this.provider)) {\n this.debug.error('Setup failed: Invalid provider');\n return;\n } // Audio will come later for external providers\n\n\n this.type = types.video;\n break;\n\n case 'video':\n case 'audio':\n this.type = _type;\n this.provider = providers.html5; // Get config from attributes\n\n if (this.media.hasAttribute('crossorigin')) {\n this.config.crossorigin = true;\n }\n\n if (this.media.hasAttribute('autoplay')) {\n this.config.autoplay = true;\n }\n\n if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {\n this.config.playsinline = true;\n }\n\n if (this.media.hasAttribute('muted')) {\n this.config.muted = true;\n }\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 } // Check for support again but with type\n\n\n this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail\n\n if (!this.supported.api) {\n this.debug.error('Setup failed: no support');\n return;\n }\n\n this.eventListeners = []; // Create listeners\n\n this.listeners = new Listeners(this); // Setup local storage for user settings\n\n this.storage = new Storage(this); // Store reference\n\n this.media.plyr = this; // Wrap media\n\n if (!is$1.element(this.elements.container)) {\n this.elements.container = createElement('div', {\n tabindex: 0\n });\n wrap$1(this.media, this.elements.container);\n } // Migrate custom properties from media to container (so they work 😉)\n\n\n ui.migrateStyles.call(this); // Add style hook\n\n ui.addStyleHook.call(this); // Setup media\n\n media.setup.call(this); // Listen for events if debugging\n\n if (this.config.debug) {\n on.call(this, this.elements.container, this.config.events.join(' '), function (event) {\n _this.debug.log(\"event: \".concat(event.type));\n });\n } // Setup fullscreen\n\n\n this.fullscreen = new Fullscreen(this); // Setup interface\n // If embed but not fully supported, build interface now to avoid flash of controls\n\n if (this.isHTML5 || this.isEmbed && !this.supported.ui) {\n ui.build.call(this);\n } // Container listeners\n\n\n this.listeners.container(); // Global listeners\n\n this.listeners.global(); // Setup ads if provided\n\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n } // Autoplay if required\n\n\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', function () {\n return silencePromise(_this.play());\n });\n } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n\n\n this.lastSeekTime = 0; // Setup preview thumbnails if enabled\n\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n } // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n\n\n _createClass(Plyr, [{\n key: \"toggleCaptions\",\n\n /**\n * Toggle captions\n * @param {Boolean} input - Whether to enable captions\n */\n value: function toggleCaptions(input) {\n captions.toggle.call(this, input, false);\n }\n /**\n * Set the caption track by index\n * @param {Number} - Caption index\n */\n\n }, {\n key: \"isHTML5\",\n get: function get() {\n return this.provider === providers.html5;\n }\n }, {\n key: \"isEmbed\",\n get: function get() {\n return this.isYouTube || this.isVimeo;\n }\n }, {\n key: \"isYouTube\",\n get: function get() {\n return this.provider === providers.youtube;\n }\n }, {\n key: \"isVimeo\",\n get: function get() {\n return this.provider === providers.vimeo;\n }\n }, {\n key: \"isVideo\",\n get: function get() {\n return this.type === types.video;\n }\n }, {\n key: \"isAudio\",\n get: function get() {\n return this.type === types.audio;\n }\n /**\n * Play the media, or play the advertisement (if they are not blocked)\n */\n\n }, {\n key: \"playing\",\n\n /**\n * Get playing state\n */\n get: function get() {\n return Boolean(this.ready && !this.paused && !this.ended);\n }\n /**\n * Get paused state\n */\n\n }, {\n key: \"paused\",\n get: function get() {\n return Boolean(this.media.paused);\n }\n /**\n * Get stopped state\n */\n\n }, {\n key: \"stopped\",\n get: function get() {\n return Boolean(this.paused && this.currentTime === 0);\n }\n /**\n * Get ended state\n */\n\n }, {\n key: \"ended\",\n get: function get() {\n return Boolean(this.media.ended);\n }\n /**\n * Toggle playback based on current status\n * @param {Boolean} input\n */\n\n }, {\n key: \"currentTime\",\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: function set(input) {\n // Bail if media duration isn't available yet\n if (!this.duration) {\n return;\n } // Validate input\n\n\n var inputIsValid = is$1.number(input) && input > 0; // Set\n\n this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging\n\n this.debug.log(\"Seeking to \".concat(this.currentTime, \" seconds\"));\n }\n /**\n * Get current time\n */\n ,\n get: function get() {\n return Number(this.media.currentTime);\n }\n /**\n * Get buffered\n */\n\n }, {\n key: \"buffered\",\n get: function get() {\n var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1\n\n if (is$1.number(buffered)) {\n return buffered;\n } // HTML5\n // TODO: Handle buffered chunks of the media\n // (i.e. seek to another section buffers only that section)\n\n\n if (buffered && buffered.length && this.duration > 0) {\n return buffered.end(0) / this.duration;\n }\n\n return 0;\n }\n /**\n * Get seeking status\n */\n\n }, {\n key: \"seeking\",\n get: function get() {\n return Boolean(this.media.seeking);\n }\n /**\n * Get the duration of the current media\n */\n\n }, {\n key: \"duration\",\n get: function get() {\n // Faux duration set via config\n var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded\n\n var realDuration = (this.media || {}).duration;\n var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration\n\n return fauxDuration || duration;\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\n }, {\n key: \"volume\",\n set: function set(value) {\n var volume = value;\n var max = 1;\n var min = 0;\n\n if (is$1.string(volume)) {\n volume = Number(volume);\n } // Load volume from storage if no value specified\n\n\n if (!is$1.number(volume)) {\n volume = this.storage.get('volume');\n } // Use config if all else fails\n\n\n if (!is$1.number(volume)) {\n volume = this.config.volume;\n } // Maximum is volumeMax\n\n\n if (volume > max) {\n volume = max;\n } // Minimum is volumeMin\n\n\n if (volume < min) {\n volume = min;\n } // Update config\n\n\n this.config.volume = volume; // Set the player volume\n\n this.media.volume = volume; // If muted, and we're increasing volume manually, reset muted state\n\n if (!is$1.empty(value) && this.muted && volume > 0) {\n this.muted = false;\n }\n }\n /**\n * Get the current player volume\n */\n ,\n get: function get() {\n return Number(this.media.volume);\n }\n /**\n * Increase volume\n * @param {Boolean} step - How much to decrease by (between 0 and 1)\n */\n\n }, {\n key: \"muted\",\n\n /**\n * Set muted state\n * @param {Boolean} mute\n */\n set: function set(mute) {\n var toggle = mute; // Load muted state from storage\n\n if (!is$1.boolean(toggle)) {\n toggle = this.storage.get('muted');\n } // Use config if all else fails\n\n\n if (!is$1.boolean(toggle)) {\n toggle = this.config.muted;\n } // Update config\n\n\n this.config.muted = toggle; // Set mute on the player\n\n this.media.muted = toggle;\n }\n /**\n * Get current muted state\n */\n ,\n get: function get() {\n return Boolean(this.media.muted);\n }\n /**\n * Check if the media has audio\n */\n\n }, {\n key: \"hasAudio\",\n get: function get() {\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 } // Get audio tracks\n\n\n return Boolean(this.media.mozHasAudio) || Boolean(this.media.webkitAudioDecodedByteCount) || Boolean(this.media.audioTracks && this.media.audioTracks.length);\n }\n /**\n * Set playback speed\n * @param {Number} speed - the speed of playback (0.5-2.0)\n */\n\n }, {\n key: \"speed\",\n set: function set(input) {\n var _this2 = this;\n\n var speed = null;\n\n if (is$1.number(input)) {\n speed = input;\n }\n\n if (!is$1.number(speed)) {\n speed = this.storage.get('speed');\n }\n\n if (!is$1.number(speed)) {\n speed = this.config.speed.selected;\n } // Clamp to min/max\n\n\n var min = this.minimumSpeed,\n max = this.maximumSpeed;\n speed = clamp(speed, min, max); // Update config\n\n this.config.speed.selected = speed; // Set media speed\n\n setTimeout(function () {\n _this2.media.playbackRate = speed;\n }, 0);\n }\n /**\n * Get current playback speed\n */\n ,\n get: function get() {\n return Number(this.media.playbackRate);\n }\n /**\n * Get the minimum allowed speed\n */\n\n }, {\n key: \"minimumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 0.0625;\n }\n /**\n * Get the maximum allowed speed\n */\n\n }, {\n key: \"maximumSpeed\",\n get: function get() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max.apply(Math, _toConsumableArray(this.options.speed));\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n } // https://stackoverflow.com/a/32320020/1191319\n\n\n return 16;\n }\n /**\n * Set playback quality\n * Currently HTML5 & YouTube only\n * @param {Number} input - Quality level\n */\n\n }, {\n key: \"quality\",\n set: function set(input) {\n var config = this.config.quality;\n var options = this.options.quality;\n\n if (!options.length) {\n return;\n }\n\n var quality = [!is$1.empty(input) && Number(input), this.storage.get('quality'), config.selected, config.default].find(is$1.number);\n var updateStorage = true;\n\n if (!options.includes(quality)) {\n var value = closest$1(options, quality);\n this.debug.warn(\"Unsupported quality option: \".concat(quality, \", using \").concat(value, \" instead\"));\n quality = value; // Don't update storage if quality is not supported\n\n updateStorage = false;\n } // Update config\n\n\n config.selected = quality; // Set quality\n\n this.media.quality = quality; // Save to storage\n\n if (updateStorage) {\n this.storage.set({\n quality: quality\n });\n }\n }\n /**\n * Get current quality level\n */\n ,\n get: function get() {\n return this.media.quality;\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\n }, {\n key: \"loop\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.loop.active;\n this.config.loop.active = toggle;\n this.media.loop = toggle; // Set default to be a true toggle\n\n /* const type = ['start', 'end', 'all', 'none', 'toggle'].includes(input) ? input : 'toggle';\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 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 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 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 default:\n this.config.loop.start = 0;\n this.config.loop.end = null;\n break;\n } */\n }\n /**\n * Get current loop state\n */\n ,\n get: function get() {\n return Boolean(this.media.loop);\n }\n /**\n * Set new media source\n * @param {Object} input - The new source object (see docs)\n */\n\n }, {\n key: \"source\",\n set: function set(input) {\n source.change.call(this, input);\n }\n /**\n * Get current source\n */\n ,\n get: function get() {\n return this.media.currentSrc;\n }\n /**\n * Get a download URL (either source or custom)\n */\n\n }, {\n key: \"download\",\n get: function get() {\n var download = this.config.urls.download;\n return is$1.url(download) ? download : this.source;\n }\n /**\n * Set the download URL\n */\n ,\n set: function set(input) {\n if (!is$1.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n controls.setDownloadUrl.call(this);\n }\n /**\n * Set the poster image for a video\n * @param {String} input - the URL for the new poster image\n */\n\n }, {\n key: \"poster\",\n set: function set(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(function () {});\n }\n /**\n * Get the current poster image\n */\n ,\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n return this.media.getAttribute('poster') || this.media.getAttribute('data-poster');\n }\n /**\n * Get the current aspect ratio in use\n */\n\n }, {\n key: \"ratio\",\n get: function get() {\n if (!this.isVideo) {\n return null;\n }\n\n var ratio = reduceAspectRatio(getAspectRatio.call(this));\n return is$1.array(ratio) ? ratio.join(':') : ratio;\n }\n /**\n * Set video aspect ratio\n */\n ,\n set: function set(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is$1.string(input) || !validateRatio(input)) {\n this.debug.error(\"Invalid aspect ratio specified (\".concat(input, \")\"));\n return;\n }\n\n this.config.ratio = input;\n setAspectRatio.call(this);\n }\n /**\n * Set the autoplay state\n * @param {Boolean} input - Whether to autoplay or not\n */\n\n }, {\n key: \"autoplay\",\n set: function set(input) {\n var toggle = is$1.boolean(input) ? input : this.config.autoplay;\n this.config.autoplay = toggle;\n }\n /**\n * Get the current autoplay state\n */\n ,\n get: function get() {\n return Boolean(this.config.autoplay);\n }\n }, {\n key: \"currentTrack\",\n set: function set(input) {\n captions.set.call(this, input, false);\n }\n /**\n * Get the current caption track index (-1 if disabled)\n */\n ,\n get: function get() {\n var _this$captions = this.captions,\n toggled = _this$captions.toggled,\n currentTrack = _this$captions.currentTrack;\n return toggled ? currentTrack : -1;\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\n }, {\n key: \"language\",\n set: function set(input) {\n captions.setLanguage.call(this, input, false);\n }\n /**\n * Get the current track's language\n */\n ,\n get: function get() {\n return (captions.getCurrentTrack.call(this) || {}).language;\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\n }, {\n key: \"pip\",\n set: function set(input) {\n // Bail if no support\n if (!support.pip) {\n return;\n } // Toggle based on current state if not passed\n\n\n var toggle = is$1.boolean(input) ? input : !this.pip; // Toggle based on current state\n // Safari\n\n if (is$1.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n } // Chrome\n\n\n if (is$1.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\n }\n /**\n * Get the current picture-in-picture state\n */\n ,\n get: function get() {\n if (!support.pip) {\n return null;\n } // Safari\n\n\n if (!is$1.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n } // Chrome\n\n\n return this.media === document.pictureInPictureElement;\n }\n /**\n * Trigger the airplay dialog\n * TODO: update player with state, support, enabled\n */\n\n }], [{\n key: \"supported\",\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} inline - Where player has `playsinline` sttribute\n */\n value: function supported(type, provider, inline) {\n return support.check(type, provider, inline);\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\n }, {\n key: \"loadSprite\",\n value: function loadSprite$1(url, id) {\n return loadSprite(url, id);\n }\n /**\n * Setup multiple instances\n * @param {*} selector\n * @param {Object} options\n */\n\n }, {\n key: \"setup\",\n value: function setup(selector) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n var targets = null;\n\n if (is$1.string(selector)) {\n targets = Array.from(document.querySelectorAll(selector));\n } else if (is$1.nodeList(selector)) {\n targets = Array.from(selector);\n } else if (is$1.array(selector)) {\n targets = selector.filter(is$1.element);\n }\n\n if (is$1.empty(targets)) {\n return null;\n }\n\n return targets.map(function (t) {\n return new Plyr(t, options);\n });\n }\n }]);\n\n return Plyr;\n}();\n\nPlyr.defaults = cloneDeep(defaults$1);\n\n// ==========================================================================\n\nexport default Plyr;\n","var check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == 'object' && globalThis) ||\n check(typeof window == 'object' && window) ||\n check(typeof self == 'object' && self) ||\n check(typeof global == 'object' && global) ||\n // eslint-disable-next-line no-new-func\n (function () { return this; })() || Function('return this')();\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 1, { get: function () { return 7; } })[1] != 7;\n});\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\n// `Object.prototype.propertyIsEnumerable` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.propertyisenumerable\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\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 toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\n// fallback for non-array-like ES3 and non-enumerable old V8 strings\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","var isObject = require('../internals/is-object');\n\n// `ToPrimitive` abstract operation\n// https://tc39.github.io/ecma262/#sec-toprimitive\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 (input, PREFERRED_STRING) {\n if (!isObject(input)) return input;\n var fn, val;\n if (PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n if (typeof (fn = input.valueOf) == 'function' && !isObject(val = fn.call(input))) return val;\n if (!PREFERRED_STRING && typeof (fn = input.toString) == 'function' && !isObject(val = fn.call(input))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar EXISTS = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return EXISTS ? document.createElement(it) : {};\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\n// `Object.defineProperty` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperty\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* 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","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nmodule.exports = function (key, value) {\n try {\n createNonEnumerableProperty(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\nmodule.exports = store;\n","var store = require('../internals/shared-store');\n\nvar functionToString = Function.toString;\n\n// this helper broken in `3.4.1-3.4.4`, so we can't use `shared` helper\nif (typeof store.inspectSource != 'function') {\n store.inspectSource = function (it) {\n return functionToString.call(it);\n };\n}\n\nmodule.exports = store.inspectSource;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar objectHas = require('../internals/has');\nvar shared = require('../internals/shared-store');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = shared.state || (shared.state = new WeakMap());\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n metadata.facade = it;\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n metadata.facade = it;\n createNonEnumerableProperty(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var global = require('../internals/global');\nvar inspectSource = require('../internals/inspect-source');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(inspectSource(WeakMap));\n","module.exports = false;\n","var IS_PURE = require('../internals/is-pure');\nvar store = require('../internals/shared-store');\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.7.0',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol(' + String(key === undefined ? '' : key) + ')_' + (++id + postfix).toString(36);\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","module.exports = {};\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\n\nvar GT = '>';\nvar LT = '<';\nvar PROTOTYPE = 'prototype';\nvar SCRIPT = 'script';\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar EmptyConstructor = function () { /* empty */ };\n\nvar scriptTag = function (content) {\n return LT + SCRIPT + GT + content + LT + '/' + SCRIPT + GT;\n};\n\n// Create object with fake `null` prototype: use ActiveX Object with cleared prototype\nvar NullProtoObjectViaActiveX = function (activeXDocument) {\n activeXDocument.write(scriptTag(''));\n activeXDocument.close();\n var temp = activeXDocument.parentWindow.Object;\n activeXDocument = null; // avoid memory leak\n return temp;\n};\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar NullProtoObjectViaIFrame = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var JS = 'java' + SCRIPT + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n // https://github.com/zloirock/core-js/issues/475\n iframe.src = String(JS);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(scriptTag('document.F=Object'));\n iframeDocument.close();\n return iframeDocument.F;\n};\n\n// Check for document.domain and active x support\n// No need to use active x approach when document.domain is not set\n// see https://github.com/es-shims/es5-shim/issues/150\n// variation of https://github.com/kitcambridge/es5-shim/commit/4f738ac066346\n// avoid IE GC bug\nvar activeXDocument;\nvar NullProtoObject = function () {\n try {\n /* global ActiveXObject */\n activeXDocument = document.domain && new ActiveXObject('htmlfile');\n } catch (error) { /* ignore */ }\n NullProtoObject = activeXDocument ? NullProtoObjectViaActiveX(activeXDocument) : NullProtoObjectViaIFrame();\n var length = enumBugKeys.length;\n while (length--) delete NullProtoObject[PROTOTYPE][enumBugKeys[length]];\n return NullProtoObject();\n};\n\nhiddenKeys[IE_PROTO] = true;\n\n// `Object.create` method\n// https://tc39.github.io/ecma262/#sec-object.create\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n EmptyConstructor[PROTOTYPE] = anObject(O);\n result = new EmptyConstructor();\n EmptyConstructor[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = NullProtoObject();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n","var global = require('../internals/global');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar inspectSource = require('../internals/inspect-source');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(String).split('String');\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n var state;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) {\n createNonEnumerableProperty(value, 'name', key);\n }\n state = enforceInternalState(value);\n if (!state.source) {\n state.source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else createNonEnumerableProperty(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || inspectSource(this);\n});\n","var global = require('../internals/global');\n\nmodule.exports = global;\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(integer, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\nvar createMethod = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($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++) {\n if ((IS_INCLUDES || index in O) && O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.includes` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.includes\n includes: createMethod(true),\n // `Array.prototype.indexOf` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n indexOf: createMethod(false)\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar indexOf = require('../internals/array-includes').indexOf;\nvar hiddenKeys = require('../internals/hidden-keys');\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && 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 ~indexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\n// `Object.getOwnPropertyNames` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertynames\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var getBuiltIn = require('../internals/get-built-in');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = getBuiltIn('Reflect', 'ownKeys') || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n createNonEnumerableProperty(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var NATIVE_SYMBOL = require('../internals/native-symbol');\n\nmodule.exports = NATIVE_SYMBOL\n // eslint-disable-next-line no-undef\n && !Symbol.sham\n // eslint-disable-next-line no-undef\n && typeof Symbol.iterator == 'symbol';\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\n// `Object.defineProperties` method\n// https://tc39.github.io/ecma262/#sec-object.defineproperties\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var index = 0;\n var key;\n while (length > index) definePropertyModule.f(O, key = keys[index++], Properties[key]);\n return O;\n};\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('document', 'documentElement');\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyNames = require('../internals/object-get-own-property-names').f;\n\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 nativeGetOwnPropertyNames(it);\n } catch (error) {\n return windowNames.slice();\n }\n};\n\n// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]'\n ? getWindowNames(it)\n : nativeGetOwnPropertyNames(toIndexedObject(it));\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar has = require('../internals/has');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\n\nvar WellKnownSymbolsStore = shared('wks');\nvar Symbol = global.Symbol;\nvar createWellKnownSymbol = USE_SYMBOL_AS_UID ? Symbol : Symbol && Symbol.withoutSetter || uid;\n\nmodule.exports = function (name) {\n if (!has(WellKnownSymbolsStore, name)) {\n if (NATIVE_SYMBOL && has(Symbol, name)) WellKnownSymbolsStore[name] = Symbol[name];\n else WellKnownSymbolsStore[name] = createWellKnownSymbol('Symbol.' + name);\n } return WellKnownSymbolsStore[name];\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nexports.f = wellKnownSymbol;\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\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 isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var bind = require('../internals/function-bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\nvar push = [].push;\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\nvar createMethod = function (TYPE) {\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 return function ($this, callbackfn, that, specificCreate) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var create = specificCreate || arraySpeciesCreate;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: push.call(target, value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.forEach` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n forEach: createMethod(0),\n // `Array.prototype.map` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.map\n map: createMethod(1),\n // `Array.prototype.filter` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.filter\n filter: createMethod(2),\n // `Array.prototype.some` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.some\n some: createMethod(3),\n // `Array.prototype.every` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.every\n every: createMethod(4),\n // `Array.prototype.find` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.find\n find: createMethod(5),\n // `Array.prototype.findIndex` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\n findIndex: createMethod(6)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar IS_PURE = require('../internals/is-pure');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\nvar USE_SYMBOL_AS_UID = require('../internals/use-symbol-as-uid');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar nativeObjectCreate = require('../internals/object-create');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertyNamesExternal = require('../internals/object-get-own-property-names-external');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar shared = require('../internals/shared');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar uid = require('../internals/uid');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar wrappedWellKnownSymbolModule = require('../internals/well-known-symbol-wrapped');\nvar defineWellKnownSymbol = require('../internals/define-well-known-symbol');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar InternalStateModule = require('../internals/internal-state');\nvar $forEach = require('../internals/array-iteration').forEach;\n\nvar HIDDEN = sharedKey('hidden');\nvar SYMBOL = 'Symbol';\nvar PROTOTYPE = 'prototype';\nvar TO_PRIMITIVE = wellKnownSymbol('toPrimitive');\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(SYMBOL);\nvar ObjectPrototype = Object[PROTOTYPE];\nvar $Symbol = global.Symbol;\nvar $stringify = getBuiltIn('JSON', 'stringify');\nvar nativeGetOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\nvar nativeDefineProperty = definePropertyModule.f;\nvar nativeGetOwnPropertyNames = getOwnPropertyNamesExternal.f;\nvar nativePropertyIsEnumerable = propertyIsEnumerableModule.f;\nvar AllSymbols = shared('symbols');\nvar ObjectPrototypeSymbols = shared('op-symbols');\nvar StringToSymbolRegistry = shared('string-to-symbol-registry');\nvar SymbolToStringRegistry = shared('symbol-to-string-registry');\nvar WellKnownSymbolsStore = shared('wks');\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar USE_SETTER = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDescriptor = DESCRIPTORS && fails(function () {\n return nativeObjectCreate(nativeDefineProperty({}, 'a', {\n get: function () { return nativeDefineProperty(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (O, P, Attributes) {\n var ObjectPrototypeDescriptor = nativeGetOwnPropertyDescriptor(ObjectPrototype, P);\n if (ObjectPrototypeDescriptor) delete ObjectPrototype[P];\n nativeDefineProperty(O, P, Attributes);\n if (ObjectPrototypeDescriptor && O !== ObjectPrototype) {\n nativeDefineProperty(ObjectPrototype, P, ObjectPrototypeDescriptor);\n }\n} : nativeDefineProperty;\n\nvar wrap = function (tag, description) {\n var symbol = AllSymbols[tag] = nativeObjectCreate($Symbol[PROTOTYPE]);\n setInternalState(symbol, {\n type: SYMBOL,\n tag: tag,\n description: description\n });\n if (!DESCRIPTORS) symbol.description = description;\n return symbol;\n};\n\nvar isSymbol = USE_SYMBOL_AS_UID ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return Object(it) instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(O, P, Attributes) {\n if (O === ObjectPrototype) $defineProperty(ObjectPrototypeSymbols, P, Attributes);\n anObject(O);\n var key = toPrimitive(P, true);\n anObject(Attributes);\n if (has(AllSymbols, key)) {\n if (!Attributes.enumerable) {\n if (!has(O, HIDDEN)) nativeDefineProperty(O, HIDDEN, createPropertyDescriptor(1, {}));\n O[HIDDEN][key] = true;\n } else {\n if (has(O, HIDDEN) && O[HIDDEN][key]) O[HIDDEN][key] = false;\n Attributes = nativeObjectCreate(Attributes, { enumerable: createPropertyDescriptor(0, false) });\n } return setSymbolDescriptor(O, key, Attributes);\n } return nativeDefineProperty(O, key, Attributes);\n};\n\nvar $defineProperties = function defineProperties(O, Properties) {\n anObject(O);\n var properties = toIndexedObject(Properties);\n var keys = objectKeys(properties).concat($getOwnPropertySymbols(properties));\n $forEach(keys, function (key) {\n if (!DESCRIPTORS || $propertyIsEnumerable.call(properties, key)) $defineProperty(O, key, properties[key]);\n });\n return O;\n};\n\nvar $create = function create(O, Properties) {\n return Properties === undefined ? nativeObjectCreate(O) : $defineProperties(nativeObjectCreate(O), Properties);\n};\n\nvar $propertyIsEnumerable = function propertyIsEnumerable(V) {\n var P = toPrimitive(V, true);\n var enumerable = nativePropertyIsEnumerable.call(this, P);\n if (this === ObjectPrototype && has(AllSymbols, P) && !has(ObjectPrototypeSymbols, P)) return false;\n return enumerable || !has(this, P) || !has(AllSymbols, P) || has(this, HIDDEN) && this[HIDDEN][P] ? enumerable : true;\n};\n\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(O, P) {\n var it = toIndexedObject(O);\n var key = toPrimitive(P, true);\n if (it === ObjectPrototype && has(AllSymbols, key) && !has(ObjectPrototypeSymbols, key)) return;\n var descriptor = nativeGetOwnPropertyDescriptor(it, key);\n if (descriptor && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) {\n descriptor.enumerable = true;\n }\n return descriptor;\n};\n\nvar $getOwnPropertyNames = function getOwnPropertyNames(O) {\n var names = nativeGetOwnPropertyNames(toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (!has(AllSymbols, key) && !has(hiddenKeys, key)) result.push(key);\n });\n return result;\n};\n\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(O) {\n var IS_OBJECT_PROTOTYPE = O === ObjectPrototype;\n var names = nativeGetOwnPropertyNames(IS_OBJECT_PROTOTYPE ? ObjectPrototypeSymbols : toIndexedObject(O));\n var result = [];\n $forEach(names, function (key) {\n if (has(AllSymbols, key) && (!IS_OBJECT_PROTOTYPE || has(ObjectPrototype, key))) {\n result.push(AllSymbols[key]);\n }\n });\n return result;\n};\n\n// `Symbol` constructor\n// https://tc39.github.io/ecma262/#sec-symbol-constructor\nif (!NATIVE_SYMBOL) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor');\n var description = !arguments.length || arguments[0] === undefined ? undefined : String(arguments[0]);\n var tag = uid(description);\n var setter = function (value) {\n if (this === ObjectPrototype) setter.call(ObjectPrototypeSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDescriptor(this, tag, createPropertyDescriptor(1, value));\n };\n if (DESCRIPTORS && USE_SETTER) setSymbolDescriptor(ObjectPrototype, tag, { configurable: true, set: setter });\n return wrap(tag, description);\n };\n\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return getInternalState(this).tag;\n });\n\n redefine($Symbol, 'withoutSetter', function (description) {\n return wrap(uid(description), description);\n });\n\n propertyIsEnumerableModule.f = $propertyIsEnumerable;\n definePropertyModule.f = $defineProperty;\n getOwnPropertyDescriptorModule.f = $getOwnPropertyDescriptor;\n getOwnPropertyNamesModule.f = getOwnPropertyNamesExternal.f = $getOwnPropertyNames;\n getOwnPropertySymbolsModule.f = $getOwnPropertySymbols;\n\n wrappedWellKnownSymbolModule.f = function (name) {\n return wrap(wellKnownSymbol(name), name);\n };\n\n if (DESCRIPTORS) {\n // https://github.com/tc39/proposal-Symbol-description\n nativeDefineProperty($Symbol[PROTOTYPE], 'description', {\n configurable: true,\n get: function description() {\n return getInternalState(this).description;\n }\n });\n if (!IS_PURE) {\n redefine(ObjectPrototype, 'propertyIsEnumerable', $propertyIsEnumerable, { unsafe: true });\n }\n }\n}\n\n$({ global: true, wrap: true, forced: !NATIVE_SYMBOL, sham: !NATIVE_SYMBOL }, {\n Symbol: $Symbol\n});\n\n$forEach(objectKeys(WellKnownSymbolsStore), function (name) {\n defineWellKnownSymbol(name);\n});\n\n$({ target: SYMBOL, stat: true, forced: !NATIVE_SYMBOL }, {\n // `Symbol.for` method\n // https://tc39.github.io/ecma262/#sec-symbol.for\n 'for': function (key) {\n var string = String(key);\n if (has(StringToSymbolRegistry, string)) return StringToSymbolRegistry[string];\n var symbol = $Symbol(string);\n StringToSymbolRegistry[string] = symbol;\n SymbolToStringRegistry[symbol] = string;\n return symbol;\n },\n // `Symbol.keyFor` method\n // https://tc39.github.io/ecma262/#sec-symbol.keyfor\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol');\n if (has(SymbolToStringRegistry, sym)) return SymbolToStringRegistry[sym];\n },\n useSetter: function () { USE_SETTER = true; },\n useSimple: function () { USE_SETTER = false; }\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL, sham: !DESCRIPTORS }, {\n // `Object.create` method\n // https://tc39.github.io/ecma262/#sec-object.create\n create: $create,\n // `Object.defineProperty` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperty\n defineProperty: $defineProperty,\n // `Object.defineProperties` method\n // https://tc39.github.io/ecma262/#sec-object.defineproperties\n defineProperties: $defineProperties,\n // `Object.getOwnPropertyDescriptor` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor\n});\n\n$({ target: 'Object', stat: true, forced: !NATIVE_SYMBOL }, {\n // `Object.getOwnPropertyNames` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertynames\n getOwnPropertyNames: $getOwnPropertyNames,\n // `Object.getOwnPropertySymbols` method\n // https://tc39.github.io/ecma262/#sec-object.getownpropertysymbols\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\n$({ target: 'Object', stat: true, forced: fails(function () { getOwnPropertySymbolsModule.f(1); }) }, {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return getOwnPropertySymbolsModule.f(toObject(it));\n }\n});\n\n// `JSON.stringify` method behavior with symbols\n// https://tc39.github.io/ecma262/#sec-json.stringify\nif ($stringify) {\n var FORCED_JSON_STRINGIFY = !NATIVE_SYMBOL || fails(function () {\n var symbol = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n return $stringify([symbol]) != '[null]'\n // WebKit converts symbol values to JSON as null\n || $stringify({ a: symbol }) != '{}'\n // V8 throws on boxed symbols\n || $stringify(Object(symbol)) != '{}';\n });\n\n $({ target: 'JSON', stat: true, forced: FORCED_JSON_STRINGIFY }, {\n // eslint-disable-next-line no-unused-vars\n stringify: function stringify(it, replacer, space) {\n var args = [it];\n var index = 1;\n var $replacer;\n while (arguments.length > index) args.push(arguments[index++]);\n $replacer = replacer;\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(null, args);\n }\n });\n}\n\n// `Symbol.prototype[@@toPrimitive]` method\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@toprimitive\nif (!$Symbol[PROTOTYPE][TO_PRIMITIVE]) {\n createNonEnumerableProperty($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n}\n// `Symbol.prototype[@@toStringTag]` property\n// https://tc39.github.io/ecma262/#sec-symbol.prototype-@@tostringtag\nsetToStringTag($Symbol, SYMBOL);\n\nhiddenKeys[HIDDEN] = true;\n","// `Symbol.prototype.description` getter\n// https://tc39.github.io/ecma262/#sec-symbol.prototype.description\n'use strict';\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar has = require('../internals/has');\nvar isObject = require('../internals/is-object');\nvar defineProperty = require('../internals/object-define-property').f;\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\n\nvar NativeSymbol = global.Symbol;\n\nif (DESCRIPTORS && typeof NativeSymbol == 'function' && (!('description' in NativeSymbol.prototype) ||\n // Safari 12 bug\n NativeSymbol().description !== undefined\n)) {\n var EmptyStringDescriptionStore = {};\n // wrap Symbol constructor for correct work with undefined description\n var SymbolWrapper = function Symbol() {\n var description = arguments.length < 1 || arguments[0] === undefined ? undefined : String(arguments[0]);\n var result = this instanceof SymbolWrapper\n ? new NativeSymbol(description)\n // in Edge 13, String(Symbol(undefined)) === 'Symbol(undefined)'\n : description === undefined ? NativeSymbol() : NativeSymbol(description);\n if (description === '') EmptyStringDescriptionStore[result] = true;\n return result;\n };\n copyConstructorProperties(SymbolWrapper, NativeSymbol);\n var symbolPrototype = SymbolWrapper.prototype = NativeSymbol.prototype;\n symbolPrototype.constructor = SymbolWrapper;\n\n var symbolToString = symbolPrototype.toString;\n var native = String(NativeSymbol('test')) == 'Symbol(test)';\n var regexp = /^Symbol\\((.*)\\)[^)]+$/;\n defineProperty(symbolPrototype, 'description', {\n configurable: true,\n get: function description() {\n var symbol = isObject(this) ? this.valueOf() : this;\n var string = symbolToString.call(symbol);\n if (has(EmptyStringDescriptionStore, symbol)) return '';\n var desc = native ? string.slice(7, -1) : string.replace(regexp, '$1');\n return desc === '' ? undefined : desc;\n }\n });\n\n $({ global: true, forced: true }, {\n Symbol: SymbolWrapper\n });\n}\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","'use strict';\nvar fails = require('../internals/fails');\n\nmodule.exports = function (METHOD_NAME, argument) {\n var method = [][METHOD_NAME];\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call,no-throw-literal\n method.call(null, argument || function () { throw 1; }, 1);\n });\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar has = require('../internals/has');\n\nvar defineProperty = Object.defineProperty;\nvar cache = {};\n\nvar thrower = function (it) { throw it; };\n\nmodule.exports = function (METHOD_NAME, options) {\n if (has(cache, METHOD_NAME)) return cache[METHOD_NAME];\n if (!options) options = {};\n var method = [][METHOD_NAME];\n var ACCESSORS = has(options, 'ACCESSORS') ? options.ACCESSORS : false;\n var argument0 = has(options, 0) ? options[0] : thrower;\n var argument1 = has(options, 1) ? options[1] : undefined;\n\n return cache[METHOD_NAME] = !!method && !fails(function () {\n if (ACCESSORS && !DESCRIPTORS) return true;\n var O = { length: -1 };\n\n if (ACCESSORS) defineProperty(O, 1, { enumerable: true, get: thrower });\n else O[1] = 1;\n\n method.call(O, argument0, argument1);\n });\n};\n","'use strict';\nvar $forEach = require('../internals/array-iteration').forEach;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('forEach');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('forEach');\n\n// `Array.prototype.forEach` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\nmodule.exports = (!STRICT_METHOD || !USES_TO_LENGTH) ? function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n} : [].forEach;\n","'use strict';\nvar $ = require('../internals/export');\nvar forEach = require('../internals/array-for-each');\n\n// `Array.prototype.forEach` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n$({ target: 'Array', proto: true, forced: [].forEach != forEach }, {\n forEach: forEach\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $indexOf = require('../internals/array-includes').indexOf;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar nativeIndexOf = [].indexOf;\n\nvar NEGATIVE_ZERO = !!nativeIndexOf && 1 / [1].indexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('indexOf');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.indexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n$({ target: 'Array', proto: true, forced: NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH }, {\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? nativeIndexOf.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar definePropertyModule = require('../internals/object-define-property');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n definePropertyModule.f(ArrayPrototype, UNSCOPABLES, {\n configurable: true,\n value: create(null)\n });\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) {\n createNonEnumerableProperty(IteratorPrototype, ITERATOR, returnThis);\n}\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","module.exports = {};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// `Object.getPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.getprototypeof\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? 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 ? ObjectPrototype : null;\n};\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it) && it !== null) {\n throw TypeError(\"Can't set \" + String(it) + ' as a prototype');\n } return it;\n};\n","var anObject = require('../internals/an-object');\nvar aPossiblePrototype = require('../internals/a-possible-prototype');\n\n// `Object.setPrototypeOf` method\n// https://tc39.github.io/ecma262/#sec-object.setprototypeof\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var CORRECT_SETTER = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n CORRECT_SETTER = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n anObject(O);\n aPossiblePrototype(proto);\n if (CORRECT_SETTER) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n createNonEnumerableProperty(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n createNonEnumerableProperty(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\nvar $ = require('../internals/export');\nvar IndexedObject = require('../internals/indexed-object');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\n\nvar nativeJoin = [].join;\n\nvar ES3_STRINGS = IndexedObject != Object;\nvar STRICT_METHOD = arrayMethodIsStrict('join', ',');\n\n// `Array.prototype.join` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.join\n$({ target: 'Array', proto: true, forced: ES3_STRINGS || !STRICT_METHOD }, {\n join: function join(separator) {\n return nativeJoin.call(toIndexedObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","var global = require('../internals/global');\nvar userAgent = require('../internals/engine-user-agent');\n\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8;\nvar match, version;\n\nif (v8) {\n match = v8.split('.');\n version = match[0] + match[1];\n} else if (userAgent) {\n match = userAgent.match(/Edge\\/(\\d+)/);\n if (!match || match[1] >= 74) {\n match = userAgent.match(/Chrome\\/(\\d+)/);\n if (match) version = match[1];\n }\n}\n\nmodule.exports = version && +version;\n","var getBuiltIn = require('../internals/get-built-in');\n\nmodule.exports = getBuiltIn('navigator', 'userAgent') || '';\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (METHOD_NAME) {\n // We can't use this feature detection in V8 since it causes\n // deoptimization and serious performance degradation\n // https://github.com/zloirock/core-js/issues/677\n return V8_VERSION >= 51 || !fails(function () {\n var array = [];\n var constructor = array.constructor = {};\n constructor[SPECIES] = function () {\n return { foo: 1 };\n };\n return array[METHOD_NAME](Boolean).foo !== 1;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toLength = require('../internals/to-length');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar createProperty = require('../internals/create-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('slice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('slice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar SPECIES = wellKnownSymbol('species');\nvar nativeSlice = [].slice;\nvar max = Math.max;\n\n// `Array.prototype.slice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.slice\n// fallback for not array-like ES3 strings and DOM objects\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n slice: function slice(start, end) {\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var k = toAbsoluteIndex(start, length);\n var fin = toAbsoluteIndex(end === undefined ? length : end, length);\n // inline `ArraySpeciesCreate` for usage native `Array#slice` where it's possible\n var Constructor, result, n;\n if (isArray(O)) {\n Constructor = O.constructor;\n // cross-realm fallback\n if (typeof Constructor == 'function' && (Constructor === Array || isArray(Constructor.prototype))) {\n Constructor = undefined;\n } else if (isObject(Constructor)) {\n Constructor = Constructor[SPECIES];\n if (Constructor === null) Constructor = undefined;\n }\n if (Constructor === Array || Constructor === undefined) {\n return nativeSlice.call(O, k, fin);\n }\n }\n result = new (Constructor === undefined ? Array : Constructor)(max(fin - k, 0));\n for (n = 0; k < fin; k++, n++) if (k in O) createProperty(result, n, O[k]);\n result.length = n;\n return result;\n }\n});\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\nmodule.exports = String(test) === '[object z]';\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(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 (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = TO_STRING_TAG_SUPPORT ? classofRaw : function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","'use strict';\nvar TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar classof = require('../internals/classof');\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = TO_STRING_TAG_SUPPORT ? {}.toString : function toString() {\n return '[object ' + classof(this) + ']';\n};\n","var TO_STRING_TAG_SUPPORT = require('../internals/to-string-tag-support');\nvar redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (!TO_STRING_TAG_SUPPORT) {\n redefine(Object.prototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar anObject = require('../internals/an-object');\n\n// `RegExp.prototype.flags` getter implementation\n// https://tc39.github.io/ecma262/#sec-get-regexp.prototype.flags\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.dotAll) result += 's';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n\nvar fails = require('./fails');\n\n// babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError,\n// so we use an intermediate function.\nfunction RE(s, f) {\n return RegExp(s, f);\n}\n\nexports.UNSUPPORTED_Y = fails(function () {\n // babel-minify transpiles RegExp('a', 'y') -> /a/y and it causes SyntaxError\n var re = RE('a', 'y');\n re.lastIndex = 2;\n return re.exec('abcd') != null;\n});\n\nexports.BROKEN_CARET = fails(function () {\n // https://bugzilla.mozilla.org/show_bug.cgi?id=773687\n var re = RE('^r', 'gy');\n re.lastIndex = 2;\n return re.exec('str') != null;\n});\n","'use strict';\nvar regexpFlags = require('./regexp-flags');\nvar stickyHelpers = require('./regexp-sticky-helpers');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/;\n var re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1.lastIndex !== 0 || re2.lastIndex !== 0;\n})();\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y || stickyHelpers.BROKEN_CARET;\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED || UNSUPPORTED_Y;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n var sticky = UNSUPPORTED_Y && re.sticky;\n var flags = regexpFlags.call(re);\n var source = re.source;\n var charsAdded = 0;\n var strCopy = str;\n\n if (sticky) {\n flags = flags.replace('y', '');\n if (flags.indexOf('g') === -1) {\n flags += 'g';\n }\n\n strCopy = String(str).slice(re.lastIndex);\n // Support anchored sticky behavior.\n if (re.lastIndex > 0 && (!re.multiline || re.multiline && str[re.lastIndex - 1] !== '\\n')) {\n source = '(?: ' + source + ')';\n strCopy = ' ' + strCopy;\n charsAdded++;\n }\n // ^(? + rx + ) is needed, in combination with some str slicing, to\n // simulate the 'y' flag.\n reCopy = new RegExp('^(?:' + source + ')', flags);\n }\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + source + '$(?!\\\\s)', flags);\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re.lastIndex;\n\n match = nativeExec.call(sticky ? reCopy : re, strCopy);\n\n if (sticky) {\n if (match) {\n match.input = match.input.slice(charsAdded);\n match[0] = match[0].slice(charsAdded);\n match.index = re.lastIndex;\n re.lastIndex += match[0].length;\n } else re.lastIndex = 0;\n } else if (UPDATES_LAST_INDEX_WRONG && match) {\n re.lastIndex = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","'use strict';\nvar $ = require('../internals/export');\nvar exec = require('../internals/regexp-exec');\n\n$({ target: 'RegExp', proto: true, forced: /./.exec !== exec }, {\n exec: exec\n});\n","'use strict';\nvar redefine = require('../internals/redefine');\nvar anObject = require('../internals/an-object');\nvar fails = require('../internals/fails');\nvar flags = require('../internals/regexp-flags');\n\nvar TO_STRING = 'toString';\nvar RegExpPrototype = RegExp.prototype;\nvar nativeToString = RegExpPrototype[TO_STRING];\n\nvar NOT_GENERIC = fails(function () { return nativeToString.call({ source: 'a', flags: 'b' }) != '/a/b'; });\n// FF44- RegExp#toString has a wrong name\nvar INCORRECT_NAME = nativeToString.name != TO_STRING;\n\n// `RegExp.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-regexp.prototype.tostring\nif (NOT_GENERIC || INCORRECT_NAME) {\n redefine(RegExp.prototype, TO_STRING, function toString() {\n var R = anObject(this);\n var p = String(R.source);\n var rf = R.flags;\n var f = String(rf === undefined && R instanceof RegExp && !('flags' in RegExpPrototype) ? flags.call(R) : rf);\n return '/' + p + '/' + f;\n }, { unsafe: true });\n}\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.{ codePointAt, at }` methods implementation\nvar createMethod = function (CONVERT_TO_STRING) {\n return function ($this, pos) {\n var S = String(requireObjectCoercible($this));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n };\n};\n\nmodule.exports = {\n // `String.prototype.codePointAt` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.codepointat\n codeAt: createMethod(false),\n // `String.prototype.at` method\n // https://github.com/mathiasbynens/String.prototype.at\n charAt: createMethod(true)\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = charAt(string, index);\n state.index += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// TODO: Remove from `core-js@4` since it's moved to entry points\nrequire('../modules/es.regexp.exec');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar regexpExec = require('../internals/regexp-exec');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nvar SPECIES = wellKnownSymbol('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$<a>') !== '7';\n});\n\n// IE <= 11 replaces $0 with the whole match, as if it was $&\n// https://stackoverflow.com/questions/6024666/getting-ie-to-replace-a-regex-with-the-literal-string-0\nvar REPLACE_KEEPS_$0 = (function () {\n return 'a'.replace(/./, '$0') === '$0';\n})();\n\nvar REPLACE = wellKnownSymbol('replace');\n// Safari <= 13.0.3(?) substitutes nth capture where n>m with an empty string\nvar REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = (function () {\n if (/./[REPLACE]) {\n return /./[REPLACE]('a', '$0') === '';\n }\n return false;\n})();\n\n// Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n// Weex JS has frozen built-in prototypes, so use try / catch wrapper\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = !fails(function () {\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length !== 2 || result[0] !== 'a' || result[1] !== 'b';\n});\n\nmodule.exports = function (KEY, length, exec, sham) {\n var SYMBOL = wellKnownSymbol(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL && !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n\n if (KEY === 'split') {\n // We can't use real regex here since it causes deoptimization\n // and serious performance degradation in V8\n // https://github.com/zloirock/core-js/issues/306\n re = {};\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n re.flags = '';\n re[SYMBOL] = /./[SYMBOL];\n }\n\n re.exec = function () { execCalled = true; return null; };\n\n re[SYMBOL]('');\n return !execCalled;\n });\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !(\n REPLACE_SUPPORTS_NAMED_GROUPS &&\n REPLACE_KEEPS_$0 &&\n !REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n )) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var methods = exec(SYMBOL, ''[KEY], function (nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }, {\n REPLACE_KEEPS_$0: REPLACE_KEEPS_$0,\n REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE: REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE\n });\n var stringMethod = methods[0];\n var regexMethod = methods[1];\n\n redefine(String.prototype, KEY, stringMethod);\n redefine(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 regexMethod.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 regexMethod.call(string, this); }\n );\n }\n\n if (sham) createNonEnumerableProperty(RegExp.prototype[SYMBOL], 'sham', true);\n};\n","'use strict';\nvar charAt = require('../internals/string-multibyte').charAt;\n\n// `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? charAt(S, index).length : 1);\n};\n","var classof = require('./classof-raw');\nvar regexpExec = require('./regexp-exec');\n\n// `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n\n if (classof(R) !== 'RegExp') {\n throw TypeError('RegExp#exec called on incompatible receiver');\n }\n\n return regexpExec.call(R, S);\n};\n\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&'`]|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&'`]|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nfixRegExpWellKnownSymbolLogic('replace', 2, function (REPLACE, nativeReplace, maybeCallNative, reason) {\n var REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE = reason.REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE;\n var REPLACE_KEEPS_$0 = reason.REPLACE_KEEPS_$0;\n var UNSAFE_SUBSTITUTE = REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE ? '$' : '$0';\n\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = requireObjectCoercible(this);\n var replacer = searchValue == undefined ? undefined : searchValue[REPLACE];\n return replacer !== undefined\n ? replacer.call(searchValue, O, replaceValue)\n : nativeReplace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n if (\n (!REGEXP_REPLACE_SUBSTITUTES_UNDEFINED_CAPTURE && REPLACE_KEEPS_$0) ||\n (typeof replaceValue === 'string' && replaceValue.indexOf(UNSAFE_SUBSTITUTE) === -1)\n ) {\n var res = maybeCallNative(nativeReplace, regexp, this, replaceValue);\n if (res.done) return res.value;\n }\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n\n results.push(result);\n if (!global) break;\n\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return nativeReplace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","// `SameValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-samevalue\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","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar sameValue = require('../internals/same-value');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@search logic\nfixRegExpWellKnownSymbolLogic('search', 1, function (SEARCH, nativeSearch, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = requireObjectCoercible(this);\n var searcher = regexp == undefined ? undefined : regexp[SEARCH];\n return searcher !== undefined ? searcher.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative(nativeSearch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar isRegExp = require('../internals/is-regexp');\nvar anObject = require('../internals/an-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar speciesConstructor = require('../internals/species-constructor');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar toLength = require('../internals/to-length');\nvar callRegExpExec = require('../internals/regexp-exec-abstract');\nvar regexpExec = require('../internals/regexp-exec');\nvar fails = require('../internals/fails');\n\nvar arrayPush = [].push;\nvar min = Math.min;\nvar MAX_UINT32 = 0xFFFFFFFF;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { return !RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nfixRegExpWellKnownSymbolLogic('split', 2, function (SPLIT, nativeSplit, maybeCallNative) {\n var internalSplit;\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 // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(requireObjectCoercible(this));\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (separator === undefined) return [string];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) {\n return nativeSplit.call(string, separator, lim);\n }\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 // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy.lastIndex;\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match.length > 1 && match.index < string.length) arrayPush.apply(output, match.slice(1));\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= lim) break;\n }\n if (separatorCopy.lastIndex === match.index) separatorCopy.lastIndex++; // 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 > lim ? output.slice(0, lim) : output;\n };\n // Chakra, V8\n } else if ('0'.split(undefined, 0).length) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : nativeSplit.call(this, separator, limit);\n };\n } else internalSplit = nativeSplit;\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = requireObjectCoercible(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== nativeSplit);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n}, !SUPPORTS_Y);\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar forEach = require('../internals/array-for-each');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype && CollectionPrototype.forEach !== forEach) try {\n createNonEnumerableProperty(CollectionPrototype, 'forEach', forEach);\n } catch (error) {\n CollectionPrototype.forEach = forEach;\n }\n}\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar createNonEnumerableProperty = require('../internals/create-non-enumerable-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n createNonEnumerableProperty(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) {\n createNonEnumerableProperty(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n }\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n createNonEnumerableProperty(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","var fails = require('../internals/fails');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = !fails(function () {\n var url = new URL('b?a=1&b=2&c=3', 'http://a');\n var searchParams = url.searchParams;\n var result = '';\n url.pathname = 'c%20d';\n searchParams.forEach(function (value, key) {\n searchParams['delete']('b');\n result += key + value;\n });\n return (IS_PURE && !url.toJSON)\n || !searchParams.sort\n || url.href !== 'http://a/c%20d?a=1&c=3'\n || searchParams.get('c') !== '3'\n || String(new URLSearchParams('?a=1')) !== 'a=1'\n || !searchParams[ITERATOR]\n // throws in Edge\n || new URL('https://a@b').username !== 'a'\n || new URLSearchParams(new URLSearchParams('a=b')).get('a') !== 'b'\n // not punycoded in Edge\n || new URL('http://тест').host !== 'xn--e1aybc'\n // not escaped in Chrome 62-\n || new URL('http://a#б').hash !== '#%D0%B1'\n // fails in Chrome 66-\n || result !== 'a1c3'\n // throws in Safari\n || new URL('http://x', undefined).host !== 'x';\n});\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\nvar defineProperty = Object.defineProperty;\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\nmodule.exports = !nativeAssign || fails(function () {\n // should have correct order of operations (Edge bug)\n if (DESCRIPTORS && nativeAssign({ b: 1 }, nativeAssign(defineProperty({}, 'a', {\n enumerable: true,\n get: function () {\n defineProperty(this, 'b', {\n value: 3,\n enumerable: false\n });\n }\n }), { b: 2 })).b !== 1) return true;\n // should work with symbols and should have deterministic property order (V8 bug)\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var anObject = require('../internals/an-object');\n\nmodule.exports = function (iterator) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) {\n return anObject(returnMethod.call(iterator)).value;\n }\n};\n","var anObject = require('../internals/an-object');\nvar iteratorClose = require('../internals/iterator-close');\n\n// call something on iterator step with safe closing on error\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 (error) {\n iteratorClose(iterator);\n throw error;\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","'use strict';\nvar bind = require('../internals/function-bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method implementation\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iteratorMethod = getIteratorMethod(O);\n var index = 0;\n var length, result, step, iterator, next, value;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n next = iterator.next;\n result = new C();\n for (;!(step = next.call(iterator)).done; index++) {\n value = mapping ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true) : step.value;\n createProperty(result, index, value);\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n value = mapping ? mapfn(O[index], index) : O[index];\n createProperty(result, index, value);\n }\n }\n result.length = index;\n return result;\n};\n","'use strict';\n// based on https://github.com/bestiejs/punycode.js/blob/master/punycode.js\nvar maxInt = 2147483647; // aka. 0x7FFFFFFF or 2^31-1\nvar base = 36;\nvar tMin = 1;\nvar tMax = 26;\nvar skew = 38;\nvar damp = 700;\nvar initialBias = 72;\nvar initialN = 128; // 0x80\nvar delimiter = '-'; // '\\x2D'\nvar regexNonASCII = /[^\\0-\\u007E]/; // non-ASCII chars\nvar regexSeparators = /[.\\u3002\\uFF0E\\uFF61]/g; // RFC 3490 separators\nvar OVERFLOW_ERROR = 'Overflow: input needs wider integers to process';\nvar baseMinusTMin = base - tMin;\nvar floor = Math.floor;\nvar stringFromCharCode = String.fromCharCode;\n\n/**\n * Creates an array containing the numeric code points of each Unicode\n * character in the string. While JavaScript uses UCS-2 internally,\n * this function will convert a pair of surrogate halves (each of which\n * UCS-2 exposes as separate characters) into a single code point,\n * matching UTF-16.\n */\nvar ucs2decode = function (string) {\n var output = [];\n var counter = 0;\n var length = string.length;\n while (counter < length) {\n var value = string.charCodeAt(counter++);\n if (value >= 0xD800 && value <= 0xDBFF && counter < length) {\n // It's a high surrogate, and there is a next character.\n var extra = string.charCodeAt(counter++);\n if ((extra & 0xFC00) == 0xDC00) { // Low surrogate.\n output.push(((value & 0x3FF) << 10) + (extra & 0x3FF) + 0x10000);\n } else {\n // It's an unmatched surrogate; only append this code unit, in case the\n // next code unit is the high surrogate of a surrogate pair.\n output.push(value);\n counter--;\n }\n } else {\n output.push(value);\n }\n }\n return output;\n};\n\n/**\n * Converts a digit/integer into a basic code point.\n */\nvar digitToBasic = function (digit) {\n // 0..25 map to ASCII a..z or A..Z\n // 26..35 map to ASCII 0..9\n return digit + 22 + 75 * (digit < 26);\n};\n\n/**\n * Bias adaptation function as per section 3.4 of RFC 3492.\n * https://tools.ietf.org/html/rfc3492#section-3.4\n */\nvar adapt = function (delta, numPoints, firstTime) {\n var k = 0;\n delta = firstTime ? floor(delta / damp) : delta >> 1;\n delta += floor(delta / numPoints);\n for (; delta > baseMinusTMin * tMax >> 1; k += base) {\n delta = floor(delta / baseMinusTMin);\n }\n return floor(k + (baseMinusTMin + 1) * delta / (delta + skew));\n};\n\n/**\n * Converts a string of Unicode symbols (e.g. a domain name label) to a\n * Punycode string of ASCII-only symbols.\n */\n// eslint-disable-next-line max-statements\nvar encode = function (input) {\n var output = [];\n\n // Convert the input in UCS-2 to an array of Unicode code points.\n input = ucs2decode(input);\n\n // Cache the length.\n var inputLength = input.length;\n\n // Initialize the state.\n var n = initialN;\n var delta = 0;\n var bias = initialBias;\n var i, currentValue;\n\n // Handle the basic code points.\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < 0x80) {\n output.push(stringFromCharCode(currentValue));\n }\n }\n\n var basicLength = output.length; // number of basic code points.\n var handledCPCount = basicLength; // number of code points that have been handled;\n\n // Finish the basic string with a delimiter unless it's empty.\n if (basicLength) {\n output.push(delimiter);\n }\n\n // Main encoding loop:\n while (handledCPCount < inputLength) {\n // All non-basic code points < n have been handled already. Find the next larger one:\n var m = maxInt;\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue >= n && currentValue < m) {\n m = currentValue;\n }\n }\n\n // Increase `delta` enough to advance the decoder's <n,i> state to <m,0>, but guard against overflow.\n var handledCPCountPlusOne = handledCPCount + 1;\n if (m - n > floor((maxInt - delta) / handledCPCountPlusOne)) {\n throw RangeError(OVERFLOW_ERROR);\n }\n\n delta += (m - n) * handledCPCountPlusOne;\n n = m;\n\n for (i = 0; i < input.length; i++) {\n currentValue = input[i];\n if (currentValue < n && ++delta > maxInt) {\n throw RangeError(OVERFLOW_ERROR);\n }\n if (currentValue == n) {\n // Represent delta as a generalized variable-length integer.\n var q = delta;\n for (var k = base; /* no condition */; k += base) {\n var t = k <= bias ? tMin : (k >= bias + tMax ? tMax : k - bias);\n if (q < t) break;\n var qMinusT = q - t;\n var baseMinusT = base - t;\n output.push(stringFromCharCode(digitToBasic(t + qMinusT % baseMinusT)));\n q = floor(qMinusT / baseMinusT);\n }\n\n output.push(stringFromCharCode(digitToBasic(q)));\n bias = adapt(delta, handledCPCountPlusOne, handledCPCount == basicLength);\n delta = 0;\n ++handledCPCount;\n }\n }\n\n ++delta;\n ++n;\n }\n return output.join('');\n};\n\nmodule.exports = function (input) {\n var encoded = [];\n var labels = input.toLowerCase().replace(regexSeparators, '\\u002E').split('.');\n var i, label;\n for (i = 0; i < labels.length; i++) {\n label = labels[i];\n encoded.push(regexNonASCII.test(label) ? 'xn--' + encode(label) : label);\n }\n return encoded.join('.');\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var anObject = require('../internals/an-object');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\nmodule.exports = function (it) {\n var iteratorMethod = getIteratorMethod(it);\n if (typeof iteratorMethod != 'function') {\n throw TypeError(String(it) + ' is not iterable');\n } return anObject(iteratorMethod.call(it));\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.array.iterator');\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar InternalStateModule = require('../internals/internal-state');\nvar anInstance = require('../internals/an-instance');\nvar hasOwn = require('../internals/has');\nvar bind = require('../internals/function-bind-context');\nvar classof = require('../internals/classof');\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar getIterator = require('../internals/get-iterator');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar $fetch = getBuiltIn('fetch');\nvar Headers = getBuiltIn('Headers');\nvar ITERATOR = wellKnownSymbol('iterator');\nvar URL_SEARCH_PARAMS = 'URLSearchParams';\nvar URL_SEARCH_PARAMS_ITERATOR = URL_SEARCH_PARAMS + 'Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalParamsState = InternalStateModule.getterFor(URL_SEARCH_PARAMS);\nvar getInternalIteratorState = InternalStateModule.getterFor(URL_SEARCH_PARAMS_ITERATOR);\n\nvar plus = /\\+/g;\nvar sequences = Array(4);\n\nvar percentSequence = function (bytes) {\n return sequences[bytes - 1] || (sequences[bytes - 1] = RegExp('((?:%[\\\\da-f]{2}){' + bytes + '})', 'gi'));\n};\n\nvar percentDecode = function (sequence) {\n try {\n return decodeURIComponent(sequence);\n } catch (error) {\n return sequence;\n }\n};\n\nvar deserialize = function (it) {\n var result = it.replace(plus, ' ');\n var bytes = 4;\n try {\n return decodeURIComponent(result);\n } catch (error) {\n while (bytes) {\n result = result.replace(percentSequence(bytes--), percentDecode);\n }\n return result;\n }\n};\n\nvar find = /[!'()~]|%20/g;\n\nvar replace = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+'\n};\n\nvar replacer = function (match) {\n return replace[match];\n};\n\nvar serialize = function (it) {\n return encodeURIComponent(it).replace(find, replacer);\n};\n\nvar parseSearchParams = function (result, query) {\n if (query) {\n var attributes = query.split('&');\n var index = 0;\n var attribute, entry;\n while (index < attributes.length) {\n attribute = attributes[index++];\n if (attribute.length) {\n entry = attribute.split('=');\n result.push({\n key: deserialize(entry.shift()),\n value: deserialize(entry.join('='))\n });\n }\n }\n }\n};\n\nvar updateSearchParams = function (query) {\n this.entries.length = 0;\n parseSearchParams(this.entries, query);\n};\n\nvar validateArgumentsLength = function (passed, required) {\n if (passed < required) throw TypeError('Not enough arguments');\n};\n\nvar URLSearchParamsIterator = createIteratorConstructor(function Iterator(params, kind) {\n setInternalState(this, {\n type: URL_SEARCH_PARAMS_ITERATOR,\n iterator: getIterator(getInternalParamsState(params).entries),\n kind: kind\n });\n}, 'Iterator', function next() {\n var state = getInternalIteratorState(this);\n var kind = state.kind;\n var step = state.iterator.next();\n var entry = step.value;\n if (!step.done) {\n step.value = kind === 'keys' ? entry.key : kind === 'values' ? entry.value : [entry.key, entry.value];\n } return step;\n});\n\n// `URLSearchParams` constructor\n// https://url.spec.whatwg.org/#interface-urlsearchparams\nvar URLSearchParamsConstructor = function URLSearchParams(/* init */) {\n anInstance(this, URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n var init = arguments.length > 0 ? arguments[0] : undefined;\n var that = this;\n var entries = [];\n var iteratorMethod, iterator, next, step, entryIterator, entryNext, first, second, key;\n\n setInternalState(that, {\n type: URL_SEARCH_PARAMS,\n entries: entries,\n updateURL: function () { /* empty */ },\n updateSearchParams: updateSearchParams\n });\n\n if (init !== undefined) {\n if (isObject(init)) {\n iteratorMethod = getIteratorMethod(init);\n if (typeof iteratorMethod === 'function') {\n iterator = iteratorMethod.call(init);\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n entryIterator = getIterator(anObject(step.value));\n entryNext = entryIterator.next;\n if (\n (first = entryNext.call(entryIterator)).done ||\n (second = entryNext.call(entryIterator)).done ||\n !entryNext.call(entryIterator).done\n ) throw TypeError('Expected sequence with length 2');\n entries.push({ key: first.value + '', value: second.value + '' });\n }\n } else for (key in init) if (hasOwn(init, key)) entries.push({ key: key, value: init[key] + '' });\n } else {\n parseSearchParams(entries, typeof init === 'string' ? init.charAt(0) === '?' ? init.slice(1) : init : init + '');\n }\n }\n};\n\nvar URLSearchParamsPrototype = URLSearchParamsConstructor.prototype;\n\nredefineAll(URLSearchParamsPrototype, {\n // `URLSearchParams.prototype.append` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-append\n append: function append(name, value) {\n validateArgumentsLength(arguments.length, 2);\n var state = getInternalParamsState(this);\n state.entries.push({ key: name + '', value: value + '' });\n state.updateURL();\n },\n // `URLSearchParams.prototype.delete` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-delete\n 'delete': function (name) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index].key === key) entries.splice(index, 1);\n else index++;\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.get` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-get\n get: function get(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) return entries[index].value;\n }\n return null;\n },\n // `URLSearchParams.prototype.getAll` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-getall\n getAll: function getAll(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var result = [];\n var index = 0;\n for (; index < entries.length; index++) {\n if (entries[index].key === key) result.push(entries[index].value);\n }\n return result;\n },\n // `URLSearchParams.prototype.has` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-has\n has: function has(name) {\n validateArgumentsLength(arguments.length, 1);\n var entries = getInternalParamsState(this).entries;\n var key = name + '';\n var index = 0;\n while (index < entries.length) {\n if (entries[index++].key === key) return true;\n }\n return false;\n },\n // `URLSearchParams.prototype.set` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-set\n set: function set(name, value) {\n validateArgumentsLength(arguments.length, 1);\n var state = getInternalParamsState(this);\n var entries = state.entries;\n var found = false;\n var key = name + '';\n var val = value + '';\n var index = 0;\n var entry;\n for (; index < entries.length; index++) {\n entry = entries[index];\n if (entry.key === key) {\n if (found) entries.splice(index--, 1);\n else {\n found = true;\n entry.value = val;\n }\n }\n }\n if (!found) entries.push({ key: key, value: val });\n state.updateURL();\n },\n // `URLSearchParams.prototype.sort` method\n // https://url.spec.whatwg.org/#dom-urlsearchparams-sort\n sort: function sort() {\n var state = getInternalParamsState(this);\n var entries = state.entries;\n // Array#sort is not stable in some engines\n var slice = entries.slice();\n var entry, entriesIndex, sliceIndex;\n entries.length = 0;\n for (sliceIndex = 0; sliceIndex < slice.length; sliceIndex++) {\n entry = slice[sliceIndex];\n for (entriesIndex = 0; entriesIndex < sliceIndex; entriesIndex++) {\n if (entries[entriesIndex].key > entry.key) {\n entries.splice(entriesIndex, 0, entry);\n break;\n }\n }\n if (entriesIndex === sliceIndex) entries.push(entry);\n }\n state.updateURL();\n },\n // `URLSearchParams.prototype.forEach` method\n forEach: function forEach(callback /* , thisArg */) {\n var entries = getInternalParamsState(this).entries;\n var boundFunction = bind(callback, arguments.length > 1 ? arguments[1] : undefined, 3);\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n boundFunction(entry.value, entry.key, this);\n }\n },\n // `URLSearchParams.prototype.keys` method\n keys: function keys() {\n return new URLSearchParamsIterator(this, 'keys');\n },\n // `URLSearchParams.prototype.values` method\n values: function values() {\n return new URLSearchParamsIterator(this, 'values');\n },\n // `URLSearchParams.prototype.entries` method\n entries: function entries() {\n return new URLSearchParamsIterator(this, 'entries');\n }\n}, { enumerable: true });\n\n// `URLSearchParams.prototype[@@iterator]` method\nredefine(URLSearchParamsPrototype, ITERATOR, URLSearchParamsPrototype.entries);\n\n// `URLSearchParams.prototype.toString` method\n// https://url.spec.whatwg.org/#urlsearchparams-stringification-behavior\nredefine(URLSearchParamsPrototype, 'toString', function toString() {\n var entries = getInternalParamsState(this).entries;\n var result = [];\n var index = 0;\n var entry;\n while (index < entries.length) {\n entry = entries[index++];\n result.push(serialize(entry.key) + '=' + serialize(entry.value));\n } return result.join('&');\n}, { enumerable: true });\n\nsetToStringTag(URLSearchParamsConstructor, URL_SEARCH_PARAMS);\n\n$({ global: true, forced: !USE_NATIVE_URL }, {\n URLSearchParams: URLSearchParamsConstructor\n});\n\n// Wrap `fetch` for correct work with polyfilled `URLSearchParams`\n// https://github.com/zloirock/core-js/issues/674\nif (!USE_NATIVE_URL && typeof $fetch == 'function' && typeof Headers == 'function') {\n $({ global: true, enumerable: true, forced: true }, {\n fetch: function fetch(input /* , init */) {\n var args = [input];\n var init, body, headers;\n if (arguments.length > 1) {\n init = arguments[1];\n if (isObject(init)) {\n body = init.body;\n if (classof(body) === URL_SEARCH_PARAMS) {\n headers = init.headers ? new Headers(init.headers) : new Headers();\n if (!headers.has('content-type')) {\n headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8');\n }\n init = create(init, {\n body: createPropertyDescriptor(0, String(body)),\n headers: createPropertyDescriptor(0, headers)\n });\n }\n }\n args.push(init);\n } return $fetch.apply(this, args);\n }\n });\n}\n\nmodule.exports = {\n URLSearchParams: URLSearchParamsConstructor,\n getState: getInternalParamsState\n};\n","'use strict';\n// TODO: in core-js@4, move /modules/ dependencies to public entries for better optimization by tools like `preset-env`\nrequire('../modules/es.string.iterator');\nvar $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar USE_NATIVE_URL = require('../internals/native-url');\nvar global = require('../internals/global');\nvar defineProperties = require('../internals/object-define-properties');\nvar redefine = require('../internals/redefine');\nvar anInstance = require('../internals/an-instance');\nvar has = require('../internals/has');\nvar assign = require('../internals/object-assign');\nvar arrayFrom = require('../internals/array-from');\nvar codeAt = require('../internals/string-multibyte').codeAt;\nvar toASCII = require('../internals/string-punycode-to-ascii');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar URLSearchParamsModule = require('../modules/web.url-search-params');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar NativeURL = global.URL;\nvar URLSearchParams = URLSearchParamsModule.URLSearchParams;\nvar getInternalSearchParamsState = URLSearchParamsModule.getState;\nvar setInternalState = InternalStateModule.set;\nvar getInternalURLState = InternalStateModule.getterFor('URL');\nvar floor = Math.floor;\nvar pow = Math.pow;\n\nvar INVALID_AUTHORITY = 'Invalid authority';\nvar INVALID_SCHEME = 'Invalid scheme';\nvar INVALID_HOST = 'Invalid host';\nvar INVALID_PORT = 'Invalid port';\n\nvar ALPHA = /[A-Za-z]/;\nvar ALPHANUMERIC = /[\\d+-.A-Za-z]/;\nvar DIGIT = /\\d/;\nvar HEX_START = /^(0x|0X)/;\nvar OCT = /^[0-7]+$/;\nvar DEC = /^\\d+$/;\nvar HEX = /^[\\dA-Fa-f]+$/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT = /[\\u0000\\u0009\\u000A\\u000D #%/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT = /[\\u0000\\u0009\\u000A\\u000D #/:?@[\\\\]]/;\n// eslint-disable-next-line no-control-regex\nvar LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE = /^[\\u0000-\\u001F ]+|[\\u0000-\\u001F ]+$/g;\n// eslint-disable-next-line no-control-regex\nvar TAB_AND_NEW_LINE = /[\\u0009\\u000A\\u000D]/g;\nvar EOF;\n\nvar parseHost = function (url, input) {\n var result, codePoints, index;\n if (input.charAt(0) == '[') {\n if (input.charAt(input.length - 1) != ']') return INVALID_HOST;\n result = parseIPv6(input.slice(1, -1));\n if (!result) return INVALID_HOST;\n url.host = result;\n // opaque host\n } else if (!isSpecial(url)) {\n if (FORBIDDEN_HOST_CODE_POINT_EXCLUDING_PERCENT.test(input)) return INVALID_HOST;\n result = '';\n codePoints = arrayFrom(input);\n for (index = 0; index < codePoints.length; index++) {\n result += percentEncode(codePoints[index], C0ControlPercentEncodeSet);\n }\n url.host = result;\n } else {\n input = toASCII(input);\n if (FORBIDDEN_HOST_CODE_POINT.test(input)) return INVALID_HOST;\n result = parseIPv4(input);\n if (result === null) return INVALID_HOST;\n url.host = result;\n }\n};\n\nvar parseIPv4 = function (input) {\n var parts = input.split('.');\n var partsLength, numbers, index, part, radix, number, ipv4;\n if (parts.length && parts[parts.length - 1] == '') {\n parts.pop();\n }\n partsLength = parts.length;\n if (partsLength > 4) return input;\n numbers = [];\n for (index = 0; index < partsLength; index++) {\n part = parts[index];\n if (part == '') return input;\n radix = 10;\n if (part.length > 1 && part.charAt(0) == '0') {\n radix = HEX_START.test(part) ? 16 : 8;\n part = part.slice(radix == 8 ? 1 : 2);\n }\n if (part === '') {\n number = 0;\n } else {\n if (!(radix == 10 ? DEC : radix == 8 ? OCT : HEX).test(part)) return input;\n number = parseInt(part, radix);\n }\n numbers.push(number);\n }\n for (index = 0; index < partsLength; index++) {\n number = numbers[index];\n if (index == partsLength - 1) {\n if (number >= pow(256, 5 - partsLength)) return null;\n } else if (number > 255) return null;\n }\n ipv4 = numbers.pop();\n for (index = 0; index < numbers.length; index++) {\n ipv4 += numbers[index] * pow(256, 3 - index);\n }\n return ipv4;\n};\n\n// eslint-disable-next-line max-statements\nvar parseIPv6 = function (input) {\n var address = [0, 0, 0, 0, 0, 0, 0, 0];\n var pieceIndex = 0;\n var compress = null;\n var pointer = 0;\n var value, length, numbersSeen, ipv4Piece, number, swaps, swap;\n\n var char = function () {\n return input.charAt(pointer);\n };\n\n if (char() == ':') {\n if (input.charAt(1) != ':') return;\n pointer += 2;\n pieceIndex++;\n compress = pieceIndex;\n }\n while (char()) {\n if (pieceIndex == 8) return;\n if (char() == ':') {\n if (compress !== null) return;\n pointer++;\n pieceIndex++;\n compress = pieceIndex;\n continue;\n }\n value = length = 0;\n while (length < 4 && HEX.test(char())) {\n value = value * 16 + parseInt(char(), 16);\n pointer++;\n length++;\n }\n if (char() == '.') {\n if (length == 0) return;\n pointer -= length;\n if (pieceIndex > 6) return;\n numbersSeen = 0;\n while (char()) {\n ipv4Piece = null;\n if (numbersSeen > 0) {\n if (char() == '.' && numbersSeen < 4) pointer++;\n else return;\n }\n if (!DIGIT.test(char())) return;\n while (DIGIT.test(char())) {\n number = parseInt(char(), 10);\n if (ipv4Piece === null) ipv4Piece = number;\n else if (ipv4Piece == 0) return;\n else ipv4Piece = ipv4Piece * 10 + number;\n if (ipv4Piece > 255) return;\n pointer++;\n }\n address[pieceIndex] = address[pieceIndex] * 256 + ipv4Piece;\n numbersSeen++;\n if (numbersSeen == 2 || numbersSeen == 4) pieceIndex++;\n }\n if (numbersSeen != 4) return;\n break;\n } else if (char() == ':') {\n pointer++;\n if (!char()) return;\n } else if (char()) return;\n address[pieceIndex++] = value;\n }\n if (compress !== null) {\n swaps = pieceIndex - compress;\n pieceIndex = 7;\n while (pieceIndex != 0 && swaps > 0) {\n swap = address[pieceIndex];\n address[pieceIndex--] = address[compress + swaps - 1];\n address[compress + --swaps] = swap;\n }\n } else if (pieceIndex != 8) return;\n return address;\n};\n\nvar findLongestZeroSequence = function (ipv6) {\n var maxIndex = null;\n var maxLength = 1;\n var currStart = null;\n var currLength = 0;\n var index = 0;\n for (; index < 8; index++) {\n if (ipv6[index] !== 0) {\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n currStart = null;\n currLength = 0;\n } else {\n if (currStart === null) currStart = index;\n ++currLength;\n }\n }\n if (currLength > maxLength) {\n maxIndex = currStart;\n maxLength = currLength;\n }\n return maxIndex;\n};\n\nvar serializeHost = function (host) {\n var result, index, compress, ignore0;\n // ipv4\n if (typeof host == 'number') {\n result = [];\n for (index = 0; index < 4; index++) {\n result.unshift(host % 256);\n host = floor(host / 256);\n } return result.join('.');\n // ipv6\n } else if (typeof host == 'object') {\n result = '';\n compress = findLongestZeroSequence(host);\n for (index = 0; index < 8; index++) {\n if (ignore0 && host[index] === 0) continue;\n if (ignore0) ignore0 = false;\n if (compress === index) {\n result += index ? ':' : '::';\n ignore0 = true;\n } else {\n result += host[index].toString(16);\n if (index < 7) result += ':';\n }\n }\n return '[' + result + ']';\n } return host;\n};\n\nvar C0ControlPercentEncodeSet = {};\nvar fragmentPercentEncodeSet = assign({}, C0ControlPercentEncodeSet, {\n ' ': 1, '\"': 1, '<': 1, '>': 1, '`': 1\n});\nvar pathPercentEncodeSet = assign({}, fragmentPercentEncodeSet, {\n '#': 1, '?': 1, '{': 1, '}': 1\n});\nvar userinfoPercentEncodeSet = assign({}, pathPercentEncodeSet, {\n '/': 1, ':': 1, ';': 1, '=': 1, '@': 1, '[': 1, '\\\\': 1, ']': 1, '^': 1, '|': 1\n});\n\nvar percentEncode = function (char, set) {\n var code = codeAt(char, 0);\n return code > 0x20 && code < 0x7F && !has(set, char) ? char : encodeURIComponent(char);\n};\n\nvar specialSchemes = {\n ftp: 21,\n file: null,\n http: 80,\n https: 443,\n ws: 80,\n wss: 443\n};\n\nvar isSpecial = function (url) {\n return has(specialSchemes, url.scheme);\n};\n\nvar includesCredentials = function (url) {\n return url.username != '' || url.password != '';\n};\n\nvar cannotHaveUsernamePasswordPort = function (url) {\n return !url.host || url.cannotBeABaseURL || url.scheme == 'file';\n};\n\nvar isWindowsDriveLetter = function (string, normalized) {\n var second;\n return string.length == 2 && ALPHA.test(string.charAt(0))\n && ((second = string.charAt(1)) == ':' || (!normalized && second == '|'));\n};\n\nvar startsWithWindowsDriveLetter = function (string) {\n var third;\n return string.length > 1 && isWindowsDriveLetter(string.slice(0, 2)) && (\n string.length == 2 ||\n ((third = string.charAt(2)) === '/' || third === '\\\\' || third === '?' || third === '#')\n );\n};\n\nvar shortenURLsPath = function (url) {\n var path = url.path;\n var pathSize = path.length;\n if (pathSize && (url.scheme != 'file' || pathSize != 1 || !isWindowsDriveLetter(path[0], true))) {\n path.pop();\n }\n};\n\nvar isSingleDot = function (segment) {\n return segment === '.' || segment.toLowerCase() === '%2e';\n};\n\nvar isDoubleDot = function (segment) {\n segment = segment.toLowerCase();\n return segment === '..' || segment === '%2e.' || segment === '.%2e' || segment === '%2e%2e';\n};\n\n// States:\nvar SCHEME_START = {};\nvar SCHEME = {};\nvar NO_SCHEME = {};\nvar SPECIAL_RELATIVE_OR_AUTHORITY = {};\nvar PATH_OR_AUTHORITY = {};\nvar RELATIVE = {};\nvar RELATIVE_SLASH = {};\nvar SPECIAL_AUTHORITY_SLASHES = {};\nvar SPECIAL_AUTHORITY_IGNORE_SLASHES = {};\nvar AUTHORITY = {};\nvar HOST = {};\nvar HOSTNAME = {};\nvar PORT = {};\nvar FILE = {};\nvar FILE_SLASH = {};\nvar FILE_HOST = {};\nvar PATH_START = {};\nvar PATH = {};\nvar CANNOT_BE_A_BASE_URL_PATH = {};\nvar QUERY = {};\nvar FRAGMENT = {};\n\n// eslint-disable-next-line max-statements\nvar parseURL = function (url, input, stateOverride, base) {\n var state = stateOverride || SCHEME_START;\n var pointer = 0;\n var buffer = '';\n var seenAt = false;\n var seenBracket = false;\n var seenPasswordToken = false;\n var codePoints, char, bufferCodePoints, failure;\n\n if (!stateOverride) {\n url.scheme = '';\n url.username = '';\n url.password = '';\n url.host = null;\n url.port = null;\n url.path = [];\n url.query = null;\n url.fragment = null;\n url.cannotBeABaseURL = false;\n input = input.replace(LEADING_AND_TRAILING_C0_CONTROL_OR_SPACE, '');\n }\n\n input = input.replace(TAB_AND_NEW_LINE, '');\n\n codePoints = arrayFrom(input);\n\n while (pointer <= codePoints.length) {\n char = codePoints[pointer];\n switch (state) {\n case SCHEME_START:\n if (char && ALPHA.test(char)) {\n buffer += char.toLowerCase();\n state = SCHEME;\n } else if (!stateOverride) {\n state = NO_SCHEME;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case SCHEME:\n if (char && (ALPHANUMERIC.test(char) || char == '+' || char == '-' || char == '.')) {\n buffer += char.toLowerCase();\n } else if (char == ':') {\n if (stateOverride && (\n (isSpecial(url) != has(specialSchemes, buffer)) ||\n (buffer == 'file' && (includesCredentials(url) || url.port !== null)) ||\n (url.scheme == 'file' && !url.host)\n )) return;\n url.scheme = buffer;\n if (stateOverride) {\n if (isSpecial(url) && specialSchemes[url.scheme] == url.port) url.port = null;\n return;\n }\n buffer = '';\n if (url.scheme == 'file') {\n state = FILE;\n } else if (isSpecial(url) && base && base.scheme == url.scheme) {\n state = SPECIAL_RELATIVE_OR_AUTHORITY;\n } else if (isSpecial(url)) {\n state = SPECIAL_AUTHORITY_SLASHES;\n } else if (codePoints[pointer + 1] == '/') {\n state = PATH_OR_AUTHORITY;\n pointer++;\n } else {\n url.cannotBeABaseURL = true;\n url.path.push('');\n state = CANNOT_BE_A_BASE_URL_PATH;\n }\n } else if (!stateOverride) {\n buffer = '';\n state = NO_SCHEME;\n pointer = 0;\n continue;\n } else return INVALID_SCHEME;\n break;\n\n case NO_SCHEME:\n if (!base || (base.cannotBeABaseURL && char != '#')) return INVALID_SCHEME;\n if (base.cannotBeABaseURL && char == '#') {\n url.scheme = base.scheme;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n url.cannotBeABaseURL = true;\n state = FRAGMENT;\n break;\n }\n state = base.scheme == 'file' ? FILE : RELATIVE;\n continue;\n\n case SPECIAL_RELATIVE_OR_AUTHORITY:\n if (char == '/' && codePoints[pointer + 1] == '/') {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n pointer++;\n } else {\n state = RELATIVE;\n continue;\n } break;\n\n case PATH_OR_AUTHORITY:\n if (char == '/') {\n state = AUTHORITY;\n break;\n } else {\n state = PATH;\n continue;\n }\n\n case RELATIVE:\n url.scheme = base.scheme;\n if (char == EOF) {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '/' || (char == '\\\\' && isSpecial(url))) {\n state = RELATIVE_SLASH;\n } else if (char == '?') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n url.path = base.path.slice();\n url.path.pop();\n state = PATH;\n continue;\n } break;\n\n case RELATIVE_SLASH:\n if (isSpecial(url) && (char == '/' || char == '\\\\')) {\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n } else if (char == '/') {\n state = AUTHORITY;\n } else {\n url.username = base.username;\n url.password = base.password;\n url.host = base.host;\n url.port = base.port;\n state = PATH;\n continue;\n } break;\n\n case SPECIAL_AUTHORITY_SLASHES:\n state = SPECIAL_AUTHORITY_IGNORE_SLASHES;\n if (char != '/' || buffer.charAt(pointer + 1) != '/') continue;\n pointer++;\n break;\n\n case SPECIAL_AUTHORITY_IGNORE_SLASHES:\n if (char != '/' && char != '\\\\') {\n state = AUTHORITY;\n continue;\n } break;\n\n case AUTHORITY:\n if (char == '@') {\n if (seenAt) buffer = '%40' + buffer;\n seenAt = true;\n bufferCodePoints = arrayFrom(buffer);\n for (var i = 0; i < bufferCodePoints.length; i++) {\n var codePoint = bufferCodePoints[i];\n if (codePoint == ':' && !seenPasswordToken) {\n seenPasswordToken = true;\n continue;\n }\n var encodedCodePoints = percentEncode(codePoint, userinfoPercentEncodeSet);\n if (seenPasswordToken) url.password += encodedCodePoints;\n else url.username += encodedCodePoints;\n }\n buffer = '';\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (seenAt && buffer == '') return INVALID_AUTHORITY;\n pointer -= arrayFrom(buffer).length + 1;\n buffer = '';\n state = HOST;\n } else buffer += char;\n break;\n\n case HOST:\n case HOSTNAME:\n if (stateOverride && url.scheme == 'file') {\n state = FILE_HOST;\n continue;\n } else if (char == ':' && !seenBracket) {\n if (buffer == '') return INVALID_HOST;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PORT;\n if (stateOverride == HOSTNAME) return;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url))\n ) {\n if (isSpecial(url) && buffer == '') return INVALID_HOST;\n if (stateOverride && buffer == '' && (includesCredentials(url) || url.port !== null)) return;\n failure = parseHost(url, buffer);\n if (failure) return failure;\n buffer = '';\n state = PATH_START;\n if (stateOverride) return;\n continue;\n } else {\n if (char == '[') seenBracket = true;\n else if (char == ']') seenBracket = false;\n buffer += char;\n } break;\n\n case PORT:\n if (DIGIT.test(char)) {\n buffer += char;\n } else if (\n char == EOF || char == '/' || char == '?' || char == '#' ||\n (char == '\\\\' && isSpecial(url)) ||\n stateOverride\n ) {\n if (buffer != '') {\n var port = parseInt(buffer, 10);\n if (port > 0xFFFF) return INVALID_PORT;\n url.port = (isSpecial(url) && port === specialSchemes[url.scheme]) ? null : port;\n buffer = '';\n }\n if (stateOverride) return;\n state = PATH_START;\n continue;\n } else return INVALID_PORT;\n break;\n\n case FILE:\n url.scheme = 'file';\n if (char == '/' || char == '\\\\') state = FILE_SLASH;\n else if (base && base.scheme == 'file') {\n if (char == EOF) {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n } else if (char == '?') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.host = base.host;\n url.path = base.path.slice();\n url.query = base.query;\n url.fragment = '';\n state = FRAGMENT;\n } else {\n if (!startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n url.host = base.host;\n url.path = base.path.slice();\n shortenURLsPath(url);\n }\n state = PATH;\n continue;\n }\n } else {\n state = PATH;\n continue;\n } break;\n\n case FILE_SLASH:\n if (char == '/' || char == '\\\\') {\n state = FILE_HOST;\n break;\n }\n if (base && base.scheme == 'file' && !startsWithWindowsDriveLetter(codePoints.slice(pointer).join(''))) {\n if (isWindowsDriveLetter(base.path[0], true)) url.path.push(base.path[0]);\n else url.host = base.host;\n }\n state = PATH;\n continue;\n\n case FILE_HOST:\n if (char == EOF || char == '/' || char == '\\\\' || char == '?' || char == '#') {\n if (!stateOverride && isWindowsDriveLetter(buffer)) {\n state = PATH;\n } else if (buffer == '') {\n url.host = '';\n if (stateOverride) return;\n state = PATH_START;\n } else {\n failure = parseHost(url, buffer);\n if (failure) return failure;\n if (url.host == 'localhost') url.host = '';\n if (stateOverride) return;\n buffer = '';\n state = PATH_START;\n } continue;\n } else buffer += char;\n break;\n\n case PATH_START:\n if (isSpecial(url)) {\n state = PATH;\n if (char != '/' && char != '\\\\') continue;\n } else if (!stateOverride && char == '?') {\n url.query = '';\n state = QUERY;\n } else if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n state = PATH;\n if (char != '/') continue;\n } break;\n\n case PATH:\n if (\n char == EOF || char == '/' ||\n (char == '\\\\' && isSpecial(url)) ||\n (!stateOverride && (char == '?' || char == '#'))\n ) {\n if (isDoubleDot(buffer)) {\n shortenURLsPath(url);\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else if (isSingleDot(buffer)) {\n if (char != '/' && !(char == '\\\\' && isSpecial(url))) {\n url.path.push('');\n }\n } else {\n if (url.scheme == 'file' && !url.path.length && isWindowsDriveLetter(buffer)) {\n if (url.host) url.host = '';\n buffer = buffer.charAt(0) + ':'; // normalize windows drive letter\n }\n url.path.push(buffer);\n }\n buffer = '';\n if (url.scheme == 'file' && (char == EOF || char == '?' || char == '#')) {\n while (url.path.length > 1 && url.path[0] === '') {\n url.path.shift();\n }\n }\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n }\n } else {\n buffer += percentEncode(char, pathPercentEncodeSet);\n } break;\n\n case CANNOT_BE_A_BASE_URL_PATH:\n if (char == '?') {\n url.query = '';\n state = QUERY;\n } else if (char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n url.path[0] += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case QUERY:\n if (!stateOverride && char == '#') {\n url.fragment = '';\n state = FRAGMENT;\n } else if (char != EOF) {\n if (char == \"'\" && isSpecial(url)) url.query += '%27';\n else if (char == '#') url.query += '%23';\n else url.query += percentEncode(char, C0ControlPercentEncodeSet);\n } break;\n\n case FRAGMENT:\n if (char != EOF) url.fragment += percentEncode(char, fragmentPercentEncodeSet);\n break;\n }\n\n pointer++;\n }\n};\n\n// `URL` constructor\n// https://url.spec.whatwg.org/#url-class\nvar URLConstructor = function URL(url /* , base */) {\n var that = anInstance(this, URLConstructor, 'URL');\n var base = arguments.length > 1 ? arguments[1] : undefined;\n var urlString = String(url);\n var state = setInternalState(that, { type: 'URL' });\n var baseState, failure;\n if (base !== undefined) {\n if (base instanceof URLConstructor) baseState = getInternalURLState(base);\n else {\n failure = parseURL(baseState = {}, String(base));\n if (failure) throw TypeError(failure);\n }\n }\n failure = parseURL(state, urlString, null, baseState);\n if (failure) throw TypeError(failure);\n var searchParams = state.searchParams = new URLSearchParams();\n var searchParamsState = getInternalSearchParamsState(searchParams);\n searchParamsState.updateSearchParams(state.query);\n searchParamsState.updateURL = function () {\n state.query = String(searchParams) || null;\n };\n if (!DESCRIPTORS) {\n that.href = serializeURL.call(that);\n that.origin = getOrigin.call(that);\n that.protocol = getProtocol.call(that);\n that.username = getUsername.call(that);\n that.password = getPassword.call(that);\n that.host = getHost.call(that);\n that.hostname = getHostname.call(that);\n that.port = getPort.call(that);\n that.pathname = getPathname.call(that);\n that.search = getSearch.call(that);\n that.searchParams = getSearchParams.call(that);\n that.hash = getHash.call(that);\n }\n};\n\nvar URLPrototype = URLConstructor.prototype;\n\nvar serializeURL = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var username = url.username;\n var password = url.password;\n var host = url.host;\n var port = url.port;\n var path = url.path;\n var query = url.query;\n var fragment = url.fragment;\n var output = scheme + ':';\n if (host !== null) {\n output += '//';\n if (includesCredentials(url)) {\n output += username + (password ? ':' + password : '') + '@';\n }\n output += serializeHost(host);\n if (port !== null) output += ':' + port;\n } else if (scheme == 'file') output += '//';\n output += url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n if (query !== null) output += '?' + query;\n if (fragment !== null) output += '#' + fragment;\n return output;\n};\n\nvar getOrigin = function () {\n var url = getInternalURLState(this);\n var scheme = url.scheme;\n var port = url.port;\n if (scheme == 'blob') try {\n return new URL(scheme.path[0]).origin;\n } catch (error) {\n return 'null';\n }\n if (scheme == 'file' || !isSpecial(url)) return 'null';\n return scheme + '://' + serializeHost(url.host) + (port !== null ? ':' + port : '');\n};\n\nvar getProtocol = function () {\n return getInternalURLState(this).scheme + ':';\n};\n\nvar getUsername = function () {\n return getInternalURLState(this).username;\n};\n\nvar getPassword = function () {\n return getInternalURLState(this).password;\n};\n\nvar getHost = function () {\n var url = getInternalURLState(this);\n var host = url.host;\n var port = url.port;\n return host === null ? ''\n : port === null ? serializeHost(host)\n : serializeHost(host) + ':' + port;\n};\n\nvar getHostname = function () {\n var host = getInternalURLState(this).host;\n return host === null ? '' : serializeHost(host);\n};\n\nvar getPort = function () {\n var port = getInternalURLState(this).port;\n return port === null ? '' : String(port);\n};\n\nvar getPathname = function () {\n var url = getInternalURLState(this);\n var path = url.path;\n return url.cannotBeABaseURL ? path[0] : path.length ? '/' + path.join('/') : '';\n};\n\nvar getSearch = function () {\n var query = getInternalURLState(this).query;\n return query ? '?' + query : '';\n};\n\nvar getSearchParams = function () {\n return getInternalURLState(this).searchParams;\n};\n\nvar getHash = function () {\n var fragment = getInternalURLState(this).fragment;\n return fragment ? '#' + fragment : '';\n};\n\nvar accessorDescriptor = function (getter, setter) {\n return { get: getter, set: setter, configurable: true, enumerable: true };\n};\n\nif (DESCRIPTORS) {\n defineProperties(URLPrototype, {\n // `URL.prototype.href` accessors pair\n // https://url.spec.whatwg.org/#dom-url-href\n href: accessorDescriptor(serializeURL, function (href) {\n var url = getInternalURLState(this);\n var urlString = String(href);\n var failure = parseURL(url, urlString);\n if (failure) throw TypeError(failure);\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.origin` getter\n // https://url.spec.whatwg.org/#dom-url-origin\n origin: accessorDescriptor(getOrigin),\n // `URL.prototype.protocol` accessors pair\n // https://url.spec.whatwg.org/#dom-url-protocol\n protocol: accessorDescriptor(getProtocol, function (protocol) {\n var url = getInternalURLState(this);\n parseURL(url, String(protocol) + ':', SCHEME_START);\n }),\n // `URL.prototype.username` accessors pair\n // https://url.spec.whatwg.org/#dom-url-username\n username: accessorDescriptor(getUsername, function (username) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(username));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.username = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.username += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.password` accessors pair\n // https://url.spec.whatwg.org/#dom-url-password\n password: accessorDescriptor(getPassword, function (password) {\n var url = getInternalURLState(this);\n var codePoints = arrayFrom(String(password));\n if (cannotHaveUsernamePasswordPort(url)) return;\n url.password = '';\n for (var i = 0; i < codePoints.length; i++) {\n url.password += percentEncode(codePoints[i], userinfoPercentEncodeSet);\n }\n }),\n // `URL.prototype.host` accessors pair\n // https://url.spec.whatwg.org/#dom-url-host\n host: accessorDescriptor(getHost, function (host) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(host), HOST);\n }),\n // `URL.prototype.hostname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hostname\n hostname: accessorDescriptor(getHostname, function (hostname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n parseURL(url, String(hostname), HOSTNAME);\n }),\n // `URL.prototype.port` accessors pair\n // https://url.spec.whatwg.org/#dom-url-port\n port: accessorDescriptor(getPort, function (port) {\n var url = getInternalURLState(this);\n if (cannotHaveUsernamePasswordPort(url)) return;\n port = String(port);\n if (port == '') url.port = null;\n else parseURL(url, port, PORT);\n }),\n // `URL.prototype.pathname` accessors pair\n // https://url.spec.whatwg.org/#dom-url-pathname\n pathname: accessorDescriptor(getPathname, function (pathname) {\n var url = getInternalURLState(this);\n if (url.cannotBeABaseURL) return;\n url.path = [];\n parseURL(url, pathname + '', PATH_START);\n }),\n // `URL.prototype.search` accessors pair\n // https://url.spec.whatwg.org/#dom-url-search\n search: accessorDescriptor(getSearch, function (search) {\n var url = getInternalURLState(this);\n search = String(search);\n if (search == '') {\n url.query = null;\n } else {\n if ('?' == search.charAt(0)) search = search.slice(1);\n url.query = '';\n parseURL(url, search, QUERY);\n }\n getInternalSearchParamsState(url.searchParams).updateSearchParams(url.query);\n }),\n // `URL.prototype.searchParams` getter\n // https://url.spec.whatwg.org/#dom-url-searchparams\n searchParams: accessorDescriptor(getSearchParams),\n // `URL.prototype.hash` accessors pair\n // https://url.spec.whatwg.org/#dom-url-hash\n hash: accessorDescriptor(getHash, function (hash) {\n var url = getInternalURLState(this);\n hash = String(hash);\n if (hash == '') {\n url.fragment = null;\n return;\n }\n if ('#' == hash.charAt(0)) hash = hash.slice(1);\n url.fragment = '';\n parseURL(url, hash, FRAGMENT);\n })\n });\n}\n\n// `URL.prototype.toJSON` method\n// https://url.spec.whatwg.org/#dom-url-tojson\nredefine(URLPrototype, 'toJSON', function toJSON() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\n// `URL.prototype.toString` method\n// https://url.spec.whatwg.org/#URL-stringification-behavior\nredefine(URLPrototype, 'toString', function toString() {\n return serializeURL.call(this);\n}, { enumerable: true });\n\nif (NativeURL) {\n var nativeCreateObjectURL = NativeURL.createObjectURL;\n var nativeRevokeObjectURL = NativeURL.revokeObjectURL;\n // `URL.createObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/createObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeCreateObjectURL) redefine(URLConstructor, 'createObjectURL', function createObjectURL(blob) {\n return nativeCreateObjectURL.apply(NativeURL, arguments);\n });\n // `URL.revokeObjectURL` method\n // https://developer.mozilla.org/en-US/docs/Web/API/URL/revokeObjectURL\n // eslint-disable-next-line no-unused-vars\n if (nativeRevokeObjectURL) redefine(URLConstructor, 'revokeObjectURL', function revokeObjectURL(url) {\n return nativeRevokeObjectURL.apply(NativeURL, arguments);\n });\n}\n\nsetToStringTag(URLConstructor, 'URL');\n\n$({ global: true, forced: !USE_NATIVE_URL, sham: !DESCRIPTORS }, {\n URL: URLConstructor\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(String(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 var typeofSearchString = typeof searchString;\r\n\r\n if (typeofSearchString === 'undefined') {\r\n // do nothing\r\n } else if (typeofSearchString === '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 } else if ((searchString !== null) && (typeofSearchString === 'object')) {\r\n if (Object.prototype.toString.call(searchString) === '[object Array]') {\r\n for (var i = 0; i < searchString.length; i++) {\r\n var entry = searchString[i];\r\n if ((Object.prototype.toString.call(entry) === '[object Array]') || (entry.length !== 2)) {\r\n this.append(entry[0], entry[1]);\r\n } else {\r\n throw new TypeError('Expected [string, any] as entry at index ' + i + ' of URLSearchParams\\'s input');\r\n }\r\n }\r\n } else {\r\n for (var key in searchString) {\r\n if (searchString.hasOwnProperty(key)) {\r\n this.append(key, searchString[key]);\r\n }\r\n }\r\n }\r\n } else {\r\n throw new TypeError('Unsupported input\\'s type for URLSearchParams');\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(String(value));\r\n } else {\r\n this._entries[name] = [String(value)];\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] = [String(value)];\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\r\n global.URLSearchParams = URLSearchParams;\r\n };\r\n\r\n var checkIfURLSearchParamsSupported = function() {\r\n try {\r\n var URLSearchParams = global.URLSearchParams;\r\n\r\n return (\r\n (new URLSearchParams('?a=1').toString() === 'a=1') &&\r\n (typeof URLSearchParams.prototype.set === 'function') &&\r\n (typeof URLSearchParams.prototype.entries === 'function')\r\n );\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n if (!checkIfURLSearchParamsSupported()) {\r\n polyfillURLSearchParams();\r\n }\r\n\r\n var proto = global.URLSearchParams.prototype;\r\n\r\n if (typeof proto.sort !== 'function') {\r\n proto.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 if (typeof proto._fromString !== 'function') {\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 if (this._entries) {\r\n this._entries = {};\r\n } else {\r\n var keys = [];\r\n this.forEach(function(value, name) {\r\n keys.push(name);\r\n });\r\n for (var i = 0; i < keys.length; i++) {\r\n this.delete(keys[i]);\r\n }\r\n }\r\n\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\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 global.URL('b', 'http://a');\r\n u.pathname = 'c d';\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 if (base && typeof base !== 'string') base = String(base);\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 base = base.toLowerCase();\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 var inputElement = doc.createElement('input');\r\n inputElement.type = 'url';\r\n inputElement.value = url;\r\n\r\n if (anchorElement.protocol === ':' || !/:/.test(anchorElement.href) || (!inputElement.checkValidity() && !base)) {\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 global.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","'use strict';\nvar $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar isArray = require('../internals/is-array');\nvar isObject = require('../internals/is-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar IS_CONCAT_SPREADABLE = wellKnownSymbol('isConcatSpreadable');\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_INDEX_EXCEEDED = 'Maximum allowed index exceeded';\n\n// We can't use this feature detection in V8 since it causes\n// deoptimization and serious performance degradation\n// https://github.com/zloirock/core-js/issues/679\nvar IS_CONCAT_SPREADABLE_SUPPORT = V8_VERSION >= 51 || !fails(function () {\n var array = [];\n array[IS_CONCAT_SPREADABLE] = false;\n return array.concat()[0] !== array;\n});\n\nvar SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('concat');\n\nvar isConcatSpreadable = function (O) {\n if (!isObject(O)) return false;\n var spreadable = O[IS_CONCAT_SPREADABLE];\n return spreadable !== undefined ? !!spreadable : isArray(O);\n};\n\nvar FORCED = !IS_CONCAT_SPREADABLE_SUPPORT || !SPECIES_SUPPORT;\n\n// `Array.prototype.concat` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.concat\n// with adding support of @@isConcatSpreadable and @@species\n$({ target: 'Array', proto: true, forced: FORCED }, {\n concat: function concat(arg) { // eslint-disable-line no-unused-vars\n var O = toObject(this);\n var A = arraySpeciesCreate(O, 0);\n var n = 0;\n var i, k, length, len, E;\n for (i = -1, length = arguments.length; i < length; i++) {\n E = i === -1 ? O : arguments[i];\n if (isConcatSpreadable(E)) {\n len = toLength(E.length);\n if (n + len > MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n for (k = 0; k < len; k++, n++) if (k in E) createProperty(A, n, E[k]);\n } else {\n if (n >= MAX_SAFE_INTEGER) throw TypeError(MAXIMUM_ALLOWED_INDEX_EXCEEDED);\n createProperty(A, n++, E);\n }\n }\n A.length = n;\n return A;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $filter = require('../internals/array-iteration').filter;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('filter');\n// Edge 14- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('filter');\n\n// `Array.prototype.filter` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $find = require('../internals/array-iteration').find;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND);\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $includes = require('../internals/array-includes').includes;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true, forced: !USES_TO_LENGTH }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar $ = require('../internals/export');\nvar $map = require('../internals/array-iteration').map;\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('map');\n// FF49- issue\nvar USES_TO_LENGTH = arrayMethodUsesToLength('map');\n\n// `Array.prototype.map` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var isObject = require('../internals/is-object');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\n\n// makes subclassing work correct for wrapped built-ins\nmodule.exports = function ($this, dummy, Wrapper) {\n var NewTarget, NewTargetPrototype;\n if (\n // it can work only with native `setPrototypeOf`\n setPrototypeOf &&\n // we haven't completely correct pre-ES6 way for getting `new.target`, so use this\n typeof (NewTarget = dummy.constructor) == 'function' &&\n NewTarget !== Wrapper &&\n isObject(NewTargetPrototype = NewTarget.prototype) &&\n NewTargetPrototype !== Wrapper.prototype\n ) setPrototypeOf($this, NewTargetPrototype);\n return $this;\n};\n","// a string of all valid unicode whitespaces\n// eslint-disable-next-line max-len\nmodule.exports = '\\u0009\\u000A\\u000B\\u000C\\u000D\\u0020\\u00A0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var requireObjectCoercible = require('../internals/require-object-coercible');\nvar whitespaces = require('../internals/whitespaces');\n\nvar whitespace = '[' + whitespaces + ']';\nvar ltrim = RegExp('^' + whitespace + whitespace + '*');\nvar rtrim = RegExp(whitespace + whitespace + '*$');\n\n// `String.prototype.{ trim, trimStart, trimEnd, trimLeft, trimRight }` methods implementation\nvar createMethod = function (TYPE) {\n return function ($this) {\n var string = String(requireObjectCoercible($this));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n };\n};\n\nmodule.exports = {\n // `String.prototype.{ trimLeft, trimStart }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimstart\n start: createMethod(1),\n // `String.prototype.{ trimRight, trimEnd }` methods\n // https://tc39.github.io/ecma262/#sec-string.prototype.trimend\n end: createMethod(2),\n // `String.prototype.trim` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.trim\n trim: createMethod(3)\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar has = require('../internals/has');\nvar classof = require('../internals/classof-raw');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar toPrimitive = require('../internals/to-primitive');\nvar fails = require('../internals/fails');\nvar create = require('../internals/object-create');\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar defineProperty = require('../internals/object-define-property').f;\nvar trim = require('../internals/string-trim').trim;\n\nvar NUMBER = 'Number';\nvar NativeNumber = global[NUMBER];\nvar NumberPrototype = NativeNumber.prototype;\n\n// Opera ~12 has broken Object#toString\nvar BROKEN_CLASSOF = classof(create(NumberPrototype)) == NUMBER;\n\n// `ToNumber` abstract operation\n// https://tc39.github.io/ecma262/#sec-tonumber\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n var first, third, radix, maxCode, digits, length, index, code;\n if (typeof it == 'string' && it.length > 2) {\n it = trim(it);\n first = it.charCodeAt(0);\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 of /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal of /^0o[0-7]+$/i\n default: return +it;\n }\n digits = it.slice(2);\n length = digits.length;\n for (index = 0; index < length; index++) {\n code = digits.charCodeAt(index);\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\n// `Number` constructor\n// https://tc39.github.io/ecma262/#sec-number-constructor\nif (isForced(NUMBER, !NativeNumber(' 0o1') || !NativeNumber('0b1') || NativeNumber('+0x1'))) {\n var NumberWrapper = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var dummy = this;\n return dummy instanceof NumberWrapper\n // check on 1..constructor(foo) case\n && (BROKEN_CLASSOF ? fails(function () { NumberPrototype.valueOf.call(dummy); }) : classof(dummy) != NUMBER)\n ? inheritIfRequired(new NativeNumber(toNumber(it)), dummy, NumberWrapper) : toNumber(it);\n };\n for (var keys = DESCRIPTORS ? getOwnPropertyNames(NativeNumber) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES2015 (in case, if modules with ES2015 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(NativeNumber, key = keys[j]) && !has(NumberWrapper, key)) {\n defineProperty(NumberWrapper, key, getOwnPropertyDescriptor(NativeNumber, key));\n }\n }\n NumberWrapper.prototype = NumberPrototype;\n NumberPrototype.constructor = NumberWrapper;\n redefine(global, NUMBER, NumberWrapper);\n}\n","var $ = require('../internals/export');\nvar toObject = require('../internals/to-object');\nvar nativeKeys = require('../internals/object-keys');\nvar fails = require('../internals/fails');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeKeys(1); });\n\n// `Object.keys` method\n// https://tc39.github.io/ecma262/#sec-object.keys\n$({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {\n keys: function keys(it) {\n return nativeKeys(toObject(it));\n }\n});\n","var DESCRIPTORS = require('../internals/descriptors');\nvar objectKeys = require('../internals/object-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar propertyIsEnumerable = require('../internals/object-property-is-enumerable').f;\n\n// `Object.{ entries, values }` methods implementation\nvar createMethod = function (TO_ENTRIES) {\n return function (it) {\n var O = toIndexedObject(it);\n var keys = objectKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(O, key)) {\n result.push(TO_ENTRIES ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n\nmodule.exports = {\n // `Object.entries` method\n // https://tc39.github.io/ecma262/#sec-object.entries\n entries: createMethod(true),\n // `Object.values` method\n // https://tc39.github.io/ecma262/#sec-object.values\n values: createMethod(false)\n};\n","var $ = require('../internals/export');\nvar $values = require('../internals/object-to-array').values;\n\n// `Object.values` method\n// https://tc39.github.io/ecma262/#sec-object.values\n$({ target: 'Object', stat: true }, {\n values: function values(O) {\n return $values(O);\n }\n});\n","var isRegExp = require('../internals/is-regexp');\n\nmodule.exports = function (it) {\n if (isRegExp(it)) {\n throw TypeError(\"The method doesn't accept regular expressions\");\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (error1) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (error2) { /* empty */ }\n } return false;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~String(requireObjectCoercible(this))\n .indexOf(notARegExp(searchString), arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n return Object.isExtensible(Object.preventExtensions({}));\n});\n","var hiddenKeys = require('../internals/hidden-keys');\nvar isObject = require('../internals/is-object');\nvar has = require('../internals/has');\nvar defineProperty = require('../internals/object-define-property').f;\nvar uid = require('../internals/uid');\nvar FREEZING = require('../internals/freezing');\n\nvar METADATA = uid('meta');\nvar id = 0;\n\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\n\nvar setMetadata = function (it) {\n defineProperty(it, METADATA, { value: {\n objectID: 'O' + ++id, // object ID\n weakData: {} // weak collections IDs\n } });\n};\n\nvar fastKey = function (it, create) {\n // return a primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return object ID\n } return it[METADATA].objectID;\n};\n\nvar getWeakData = function (it, create) {\n if (!has(it, METADATA)) {\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 setMetadata(it);\n // return the store of weak collections IDs\n } return it[METADATA].weakData;\n};\n\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZING && meta.REQUIRED && isExtensible(it) && !has(it, METADATA)) setMetadata(it);\n return it;\n};\n\nvar meta = module.exports = {\n REQUIRED: false,\n fastKey: fastKey,\n getWeakData: getWeakData,\n onFreeze: onFreeze\n};\n\nhiddenKeys[METADATA] = true;\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/function-bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar iteratorClose = require('../internals/iterator-close');\n\nvar Result = function (stopped, result) {\n this.stopped = stopped;\n this.result = result;\n};\n\nmodule.exports = function (iterable, unboundFunction, options) {\n var that = options && options.that;\n var AS_ENTRIES = !!(options && options.AS_ENTRIES);\n var IS_ITERATOR = !!(options && options.IS_ITERATOR);\n var INTERRUPTED = !!(options && options.INTERRUPTED);\n var fn = bind(unboundFunction, that, 1 + AS_ENTRIES + INTERRUPTED);\n var iterator, iterFn, index, length, result, next, step;\n\n var stop = function (condition) {\n if (iterator) iteratorClose(iterator);\n return new Result(true, condition);\n };\n\n var callFn = function (value) {\n if (AS_ENTRIES) {\n anObject(value);\n return INTERRUPTED ? fn(value[0], value[1], stop) : fn(value[0], value[1]);\n } return INTERRUPTED ? fn(value, stop) : fn(value);\n };\n\n if (IS_ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = callFn(iterable[index]);\n if (result && result instanceof Result) return result;\n } return new Result(false);\n }\n iterator = iterFn.call(iterable);\n }\n\n next = iterator.next;\n while (!(step = next.call(iterator)).done) {\n try {\n result = callFn(step.value);\n } catch (error) {\n iteratorClose(iterator);\n throw error;\n }\n if (typeof result == 'object' && result && result instanceof Result) return result;\n } return new Result(false);\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar redefine = require('../internals/redefine');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar iterate = require('../internals/iterate');\nvar anInstance = require('../internals/an-instance');\nvar isObject = require('../internals/is-object');\nvar fails = require('../internals/fails');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar inheritIfRequired = require('../internals/inherit-if-required');\n\nmodule.exports = function (CONSTRUCTOR_NAME, wrapper, common) {\n var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1;\n var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1;\n var ADDER = IS_MAP ? 'set' : 'add';\n var NativeConstructor = global[CONSTRUCTOR_NAME];\n var NativePrototype = NativeConstructor && NativeConstructor.prototype;\n var Constructor = NativeConstructor;\n var exported = {};\n\n var fixMethod = function (KEY) {\n var nativeMethod = NativePrototype[KEY];\n redefine(NativePrototype, KEY,\n KEY == 'add' ? function add(value) {\n nativeMethod.call(this, value === 0 ? 0 : value);\n return this;\n } : KEY == 'delete' ? function (key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'get' ? function get(key) {\n return IS_WEAK && !isObject(key) ? undefined : nativeMethod.call(this, key === 0 ? 0 : key);\n } : KEY == 'has' ? function has(key) {\n return IS_WEAK && !isObject(key) ? false : nativeMethod.call(this, key === 0 ? 0 : key);\n } : function set(key, value) {\n nativeMethod.call(this, key === 0 ? 0 : key, value);\n return this;\n }\n );\n };\n\n // eslint-disable-next-line max-len\n if (isForced(CONSTRUCTOR_NAME, typeof NativeConstructor != 'function' || !(IS_WEAK || NativePrototype.forEach && !fails(function () {\n new NativeConstructor().entries().next();\n })))) {\n // create collection constructor\n Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER);\n InternalMetadataModule.REQUIRED = true;\n } else if (isForced(CONSTRUCTOR_NAME, true)) {\n var instance = new Constructor();\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 // eslint-disable-next-line no-new\n var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); });\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 NativeConstructor();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n\n if (!ACCEPT_ITERABLES) {\n Constructor = wrapper(function (dummy, iterable) {\n anInstance(dummy, Constructor, CONSTRUCTOR_NAME);\n var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor);\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n return that;\n });\n Constructor.prototype = NativePrototype;\n NativePrototype.constructor = Constructor;\n }\n\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n\n // weak collections should not contains .clear method\n if (IS_WEAK && NativePrototype.clear) delete NativePrototype.clear;\n }\n\n exported[CONSTRUCTOR_NAME] = Constructor;\n $({ global: true, forced: Constructor != NativeConstructor }, exported);\n\n setToStringTag(Constructor, CONSTRUCTOR_NAME);\n\n if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP);\n\n return Constructor;\n};\n","'use strict';\nvar redefineAll = require('../internals/redefine-all');\nvar getWeakData = require('../internals/internal-metadata').getWeakData;\nvar anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar anInstance = require('../internals/an-instance');\nvar iterate = require('../internals/iterate');\nvar ArrayIterationModule = require('../internals/array-iteration');\nvar $has = require('../internals/has');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar setInternalState = InternalStateModule.set;\nvar internalStateGetterFor = InternalStateModule.getterFor;\nvar find = ArrayIterationModule.find;\nvar findIndex = ArrayIterationModule.findIndex;\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (store) {\n return store.frozen || (store.frozen = new UncaughtFrozenStore());\n};\n\nvar UncaughtFrozenStore = function () {\n this.entries = [];\n};\n\nvar findUncaughtFrozen = function (store, key) {\n return find(store.entries, function (it) {\n return it[0] === key;\n });\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.entries.push([key, value]);\n },\n 'delete': function (key) {\n var index = findIndex(this.entries, function (it) {\n return it[0] === key;\n });\n if (~index) this.entries.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, CONSTRUCTOR_NAME);\n setInternalState(that, {\n type: CONSTRUCTOR_NAME,\n id: id++,\n frozen: undefined\n });\n if (iterable != undefined) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP });\n });\n\n var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME);\n\n var define = function (that, key, value) {\n var state = getInternalState(that);\n var data = getWeakData(anObject(key), true);\n if (data === true) uncaughtFrozenStore(state).set(key, value);\n else data[state.id] = value;\n return that;\n };\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state)['delete'](key);\n return data && $has(data, state.id) && delete data[state.id];\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 var state = getInternalState(this);\n if (!isObject(key)) return false;\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).has(key);\n return data && $has(data, state.id);\n }\n });\n\n redefineAll(C.prototype, IS_MAP ? {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n var state = getInternalState(this);\n if (isObject(key)) {\n var data = getWeakData(key);\n if (data === true) return uncaughtFrozenStore(state).get(key);\n return data ? data[state.id] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return define(this, key, value);\n }\n } : {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return define(this, value, true);\n }\n });\n\n return C;\n }\n};\n","'use strict';\nvar global = require('../internals/global');\nvar redefineAll = require('../internals/redefine-all');\nvar InternalMetadataModule = require('../internals/internal-metadata');\nvar collection = require('../internals/collection');\nvar collectionWeak = require('../internals/collection-weak');\nvar isObject = require('../internals/is-object');\nvar enforceIternalState = require('../internals/internal-state').enforce;\nvar NATIVE_WEAK_MAP = require('../internals/native-weak-map');\n\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar isExtensible = Object.isExtensible;\nvar InternalWeakMap;\n\nvar wrapper = function (init) {\n return function WeakMap() {\n return init(this, arguments.length ? arguments[0] : undefined);\n };\n};\n\n// `WeakMap` constructor\n// https://tc39.github.io/ecma262/#sec-weakmap-constructor\nvar $WeakMap = module.exports = collection('WeakMap', wrapper, collectionWeak);\n\n// IE11 WeakMap frozen keys fix\n// We can't use feature detection because it crash some old IE builds\n// https://github.com/zloirock/core-js/issues/485\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalWeakMap = collectionWeak.getConstructor(wrapper, 'WeakMap', true);\n InternalMetadataModule.REQUIRED = true;\n var WeakMapPrototype = $WeakMap.prototype;\n var nativeDelete = WeakMapPrototype['delete'];\n var nativeHas = WeakMapPrototype.has;\n var nativeGet = WeakMapPrototype.get;\n var nativeSet = WeakMapPrototype.set;\n redefineAll(WeakMapPrototype, {\n 'delete': function (key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeDelete.call(this, key) || state.frozen['delete'](key);\n } return nativeDelete.call(this, key);\n },\n has: function has(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) || state.frozen.has(key);\n } return nativeHas.call(this, key);\n },\n get: function get(key) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n return nativeHas.call(this, key) ? nativeGet.call(this, key) : state.frozen.get(key);\n } return nativeGet.call(this, key);\n },\n set: function set(key, value) {\n if (isObject(key) && !isExtensible(key)) {\n var state = enforceIternalState(this);\n if (!state.frozen) state.frozen = new InternalWeakMap();\n nativeHas.call(this, key) ? nativeSet.call(this, key, value) : state.frozen.set(key, value);\n } else nativeSet.call(this, key, value);\n return this;\n }\n });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar $every = require('../internals/array-iteration').every;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('every');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('every');\n\n// `Array.prototype.every` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var fails = require('../internals/fails');\nvar whitespaces = require('../internals/whitespaces');\n\nvar non = '\\u200B\\u0085\\u180E';\n\n// check that a method works with the correct list\n// of whitespaces and has a correct name\nmodule.exports = function (METHOD_NAME) {\n return fails(function () {\n return !!whitespaces[METHOD_NAME]() || non[METHOD_NAME]() != non || whitespaces[METHOD_NAME].name !== METHOD_NAME;\n });\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $trim = require('../internals/string-trim').trim;\nvar forcedStringTrimMethod = require('../internals/string-trim-forced');\n\n// `String.prototype.trim` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.trim\n$({ target: 'String', proto: true, forced: forcedStringTrimMethod('trim') }, {\n trim: function trim() {\n return $trim(this);\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar $some = require('../internals/array-iteration').some;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar STRICT_METHOD = arrayMethodIsStrict('some');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('some');\n\n// `Array.prototype.some` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH }, {\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","var classof = require('../internals/classof-raw');\n\n// `thisNumberValue` abstract operation\n// https://tc39.github.io/ecma262/#sec-thisnumbervalue\nmodule.exports = function (value) {\n if (typeof value != 'number' && classof(value) != 'Number') {\n throw TypeError('Incorrect invocation');\n }\n return +value;\n};\n","'use strict';\nvar toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `String.prototype.repeat` method implementation\n// https://tc39.github.io/ecma262/#sec-string.prototype.repeat\nmodule.exports = ''.repeat || function repeat(count) {\n var str = String(requireObjectCoercible(this));\n var result = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError('Wrong number of repetitions');\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) result += str;\n return result;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar toInteger = require('../internals/to-integer');\nvar thisNumberValue = require('../internals/this-number-value');\nvar repeat = require('../internals/string-repeat');\nvar fails = require('../internals/fails');\n\nvar nativeToFixed = 1.0.toFixed;\nvar floor = Math.floor;\n\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\n\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\nvar FORCED = nativeToFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !fails(function () {\n // V8 ~ Android 4.3-\n nativeToFixed.call({});\n});\n\n// `Number.prototype.toFixed` method\n// https://tc39.github.io/ecma262/#sec-number.prototype.tofixed\n$({ target: 'Number', proto: true, forced: FORCED }, {\n // eslint-disable-next-line max-statements\n toFixed: function toFixed(fractionDigits) {\n var number = thisNumberValue(this);\n var fractDigits = toInteger(fractionDigits);\n var data = [0, 0, 0, 0, 0, 0];\n var sign = '';\n var result = '0';\n var e, z, j, k;\n\n var multiply = function (n, c) {\n var index = -1;\n var c2 = c;\n while (++index < 6) {\n c2 += n * data[index];\n data[index] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n };\n\n var divide = function (n) {\n var index = 6;\n var c = 0;\n while (--index >= 0) {\n c += data[index];\n data[index] = floor(c / n);\n c = (c % n) * 1e7;\n }\n };\n\n var dataToString = function () {\n var index = 6;\n var s = '';\n while (--index >= 0) {\n if (s !== '' || index === 0 || data[index] !== 0) {\n var t = String(data[index]);\n s = s === '' ? t : s + repeat.call('0', 7 - t.length) + t;\n }\n } return s;\n };\n\n if (fractDigits < 0 || fractDigits > 20) throw RangeError('Incorrect fraction digits');\n // eslint-disable-next-line no-self-compare\n if (number != number) return 'NaN';\n if (number <= -1e21 || number >= 1e21) return String(number);\n if (number < 0) {\n sign = '-';\n number = -number;\n }\n if (number > 1e-21) {\n e = log(number * pow(2, 69, 1)) - 69;\n z = e < 0 ? number * pow(2, -e, 1) : number / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = fractDigits;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n result = dataToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n result = dataToString() + repeat.call('0', fractDigits);\n }\n }\n if (fractDigits > 0) {\n k = result.length;\n result = sign + (k <= fractDigits\n ? '0.' + repeat.call('0', fractDigits - k) + result\n : result.slice(0, k - fractDigits) + '.' + result.slice(k - fractDigits));\n } else {\n result = sign + result;\n } return result;\n }\n});\n","var $ = require('../internals/export');\nvar $entries = require('../internals/object-to-array').entries;\n\n// `Object.entries` method\n// https://tc39.github.io/ecma262/#sec-object.entries\n$({ target: 'Object', stat: true }, {\n entries: function entries(O) {\n return $entries(O);\n }\n});\n","var $ = require('../internals/export');\n\n// `Number.isNaN` method\n// https://tc39.github.io/ecma262/#sec-number.isnan\n$({ target: 'Number', stat: true }, {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","var $ = require('../internals/export');\nvar fails = require('../internals/fails');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar nativeGetOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar FAILS_ON_PRIMITIVES = fails(function () { nativeGetOwnPropertyDescriptor(1); });\nvar FORCED = !DESCRIPTORS || FAILS_ON_PRIMITIVES;\n\n// `Object.getOwnPropertyDescriptor` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptor\n$({ target: 'Object', stat: true, forced: FORCED, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(it, key) {\n return nativeGetOwnPropertyDescriptor(toIndexedObject(it), key);\n }\n});\n","function _classCallCheck(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function _defineProperties(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function _createClass(e,t,n){return t&&_defineProperties(e.prototype,t),n&&_defineProperties(e,n),e}function _defineProperty(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function ownKeys(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function _objectSpread2(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?ownKeys(Object(n),!0).forEach((function(t){_defineProperty(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):ownKeys(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}var defaults={addCSS:!0,thumbWidth:15,watch:!0};function matches(e,t){return function(){return Array.from(document.querySelectorAll(t)).includes(this)}.call(e,t)}function trigger(e,t){if(e&&t){var n=new Event(t,{bubbles:!0});e.dispatchEvent(n)}}var getConstructor=function(e){return null!=e?e.constructor:null},instanceOf=function(e,t){return!!(e&&t&&e instanceof t)},isNullOrUndefined=function(e){return null==e},isObject=function(e){return getConstructor(e)===Object},isNumber=function(e){return getConstructor(e)===Number&&!Number.isNaN(e)},isString=function(e){return getConstructor(e)===String},isBoolean=function(e){return getConstructor(e)===Boolean},isFunction=function(e){return getConstructor(e)===Function},isArray=function(e){return Array.isArray(e)},isNodeList=function(e){return instanceOf(e,NodeList)},isElement=function(e){return instanceOf(e,Element)},isEvent=function(e){return instanceOf(e,Event)},isEmpty=function(e){return isNullOrUndefined(e)||(isString(e)||isArray(e)||isNodeList(e))&&!e.length||isObject(e)&&!Object.keys(e).length},is={nullOrUndefined:isNullOrUndefined,object:isObject,number:isNumber,string:isString,boolean:isBoolean,function:isFunction,array:isArray,nodeList:isNodeList,element:isElement,event:isEvent,empty:isEmpty};function getDecimalPlaces(e){var t=\"\".concat(e).match(/(?:\\.(\\d+))?(?:[eE]([+-]?\\d+))?$/);return t?Math.max(0,(t[1]?t[1].length:0)-(t[2]?+t[2]:0)):0}function round(e,t){if(1>t){var n=getDecimalPlaces(t);return parseFloat(e.toFixed(n))}return Math.round(e/t)*t}var RangeTouch=function(){function e(t,n){_classCallCheck(this,e),is.element(t)?this.element=t:is.string(t)&&(this.element=document.querySelector(t)),is.element(this.element)&&is.empty(this.element.rangeTouch)&&(this.config=_objectSpread2({},defaults,{},n),this.init())}return _createClass(e,[{key:\"init\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"none\",this.element.style.webKitUserSelect=\"none\",this.element.style.touchAction=\"manipulation\"),this.listeners(!0),this.element.rangeTouch=this)}},{key:\"destroy\",value:function(){e.enabled&&(this.config.addCSS&&(this.element.style.userSelect=\"\",this.element.style.webKitUserSelect=\"\",this.element.style.touchAction=\"\"),this.listeners(!1),this.element.rangeTouch=null)}},{key:\"listeners\",value:function(e){var t=this,n=e?\"addEventListener\":\"removeEventListener\";[\"touchstart\",\"touchmove\",\"touchend\"].forEach((function(e){t.element[n](e,(function(e){return t.set(e)}),!1)}))}},{key:\"get\",value:function(t){if(!e.enabled||!is.event(t))return null;var n,r=t.target,i=t.changedTouches[0],o=parseFloat(r.getAttribute(\"min\"))||0,s=parseFloat(r.getAttribute(\"max\"))||100,u=parseFloat(r.getAttribute(\"step\"))||1,c=r.getBoundingClientRect(),a=100/c.width*(this.config.thumbWidth/2)/100;return 0>(n=100/c.width*(i.clientX-c.left))?n=0:100<n&&(n=100),50>n?n-=(100-2*n)*a:50<n&&(n+=2*(n-50)*a),o+round(n/100*(s-o),u)}},{key:\"set\",value:function(t){e.enabled&&is.event(t)&&!t.target.disabled&&(t.preventDefault(),t.target.value=this.get(t),trigger(t.target,\"touchend\"===t.type?\"change\":\"input\"))}}],[{key:\"setup\",value:function(t){var n=1<arguments.length&&void 0!==arguments[1]?arguments[1]:{},r=null;if(is.empty(t)||is.string(t)?r=Array.from(document.querySelectorAll(is.string(t)?t:'input[type=\"range\"]')):is.element(t)?r=[t]:is.nodeList(t)?r=Array.from(t):is.array(t)&&(r=t.filter(is.element)),is.empty(r))return null;var i=_objectSpread2({},defaults,{},n);if(is.string(t)&&i.watch){var o=new MutationObserver((function(n){Array.from(n).forEach((function(n){Array.from(n.addedNodes).forEach((function(n){is.element(n)&&matches(n,t)&&new e(n,i)}))}))}));o.observe(document.body,{childList:!0,subtree:!0})}return r.map((function(t){return new e(t,n)}))}},{key:\"enabled\",get:function(){return\"ontouchstart\"in document.documentElement}}]),e}();export default RangeTouch;","var $ = require('../internals/export');\nvar DESCRIPTORS = require('../internals/descriptors');\nvar ownKeys = require('../internals/own-keys');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar createProperty = require('../internals/create-property');\n\n// `Object.getOwnPropertyDescriptors` method\n// https://tc39.github.io/ecma262/#sec-object.getownpropertydescriptors\n$({ target: 'Object', stat: true, sham: !DESCRIPTORS }, {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIndexedObject(object);\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n var keys = ownKeys(O);\n var result = {};\n var index = 0;\n var key, descriptor;\n while (keys.length > index) {\n descriptor = getOwnPropertyDescriptor(O, key = keys[index++]);\n if (descriptor !== undefined) createProperty(result, key, descriptor);\n }\n return result;\n }\n});\n","'use strict';\nvar fixRegExpWellKnownSymbolLogic = require('../internals/fix-regexp-well-known-symbol-logic');\nvar anObject = require('../internals/an-object');\nvar toLength = require('../internals/to-length');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar advanceStringIndex = require('../internals/advance-string-index');\nvar regExpExec = require('../internals/regexp-exec-abstract');\n\n// @@match logic\nfixRegExpWellKnownSymbolLogic('match', 1, function (MATCH, nativeMatch, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = requireObjectCoercible(this);\n var matcher = regexp == undefined ? undefined : regexp[MATCH];\n return matcher !== undefined ? matcher.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative(nativeMatch, regexp, this);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n\n if (!rx.global) return regExpExec(rx, S);\n\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar bind = require('../internals/function-bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\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};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = 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 (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (IS_NODE) {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n // except iOS - https://github.com/zloirock/core-js/issues/624\n } else if (MessageChannel && !IS_IOS) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(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 (\n global.addEventListener &&\n typeof postMessage == 'function' &&\n !global.importScripts &&\n location && location.protocol !== 'file:' &&\n !fails(post)\n ) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var global = require('../internals/global');\n\nmodule.exports = global.Promise;\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var Constructor = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n\n if (DESCRIPTORS && Constructor && !Constructor[SPECIES]) {\n defineProperty(Constructor, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n }\n};\n","var userAgent = require('../internals/engine-user-agent');\n\nmodule.exports = /(iphone|ipod|ipad).*applewebkit/i.test(userAgent);\n","var classof = require('../internals/classof-raw');\nvar global = require('../internals/global');\n\nmodule.exports = classof(global.process) == 'process';\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar macrotask = require('../internals/task').set;\nvar IS_IOS = require('../internals/engine-is-ios');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar document = global.document;\nvar process = global.process;\nvar Promise = global.Promise;\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise, then;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n if (!IS_IOS && !IS_NODE && MutationObserver && document) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true });\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 promise = Promise.resolve(undefined);\n then = promise.then;\n notify = function () {\n then.call(promise, flush);\n };\n // Node.js without promises\n } else if (IS_NODE) {\n notify = function () {\n process.nextTick(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\nmodule.exports = queueMicrotask || 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","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar getBuiltIn = require('../internals/get-built-in');\nvar NativePromise = require('../internals/native-promise-constructor');\nvar redefine = require('../internals/redefine');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar inspectSource = require('../internals/inspect-source');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_NODE = require('../internals/engine-is-node');\nvar V8_VERSION = require('../internals/engine-v8-version');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = NativePromise;\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = getBuiltIn('fetch');\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar NATIVE_REJECTION_EVENT = typeof PromiseRejectionEvent == 'function';\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper, nativeThen;\n\nvar FORCED = isForced(PROMISE, function () {\n var GLOBAL_CORE_JS_PROMISE = inspectSource(PromiseConstructor) !== String(PromiseConstructor);\n if (!GLOBAL_CORE_JS_PROMISE) {\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 if (V8_VERSION === 66) return true;\n // Unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n if (!IS_NODE && !NATIVE_REJECTION_EVENT) return true;\n }\n // We need Promise#finally in the pure version for preventing prototype pollution\n if (IS_PURE && !PromiseConstructor.prototype['finally']) return true;\n // We can't use @@species feature detection in V8 since it causes\n // deoptimization and performance degradation\n // https://github.com/zloirock/core-js/issues/679\n if (V8_VERSION >= 51 && /native code/.test(PromiseConstructor)) return false;\n // Detect correctness of subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var FakePromise = function (exec) {\n exec(function () { /* empty */ }, function () { /* empty */ });\n };\n var constructor = promise.constructor = {};\n constructor[SPECIES] = FakePromise;\n return !(promise.then(function () { /* empty */ }) instanceof FakePromise);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var index = 0;\n // variable length - can't use forEach\n while (chain.length > index) {\n var reaction = chain[index++];\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 (state.rejection === UNHANDLED) onHandleUnhandled(state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // can 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 (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n }\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (!NATIVE_REJECTION_EVENT && (handler = global['on' + name])) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (state) {\n task.call(global, function () {\n var promise = state.facade;\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, state, unwrap) {\n return function (value) {\n fn(state, value, unwrap);\n };\n};\n\nvar internalReject = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(state, true);\n};\n\nvar internalResolve = function (state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (state.facade === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, wrapper, state),\n bind(internalReject, wrapper, state)\n );\n } catch (error) {\n internalReject(wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(state, false);\n }\n } catch (error) {\n internalReject({ done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, state), bind(internalReject, state));\n } catch (error) {\n internalReject(state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, state);\n this.reject = bind(internalReject, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n if (!IS_PURE && typeof NativePromise == 'function') {\n nativeThen = NativePromise.prototype.then;\n\n // wrap native Promise#then for native async functions\n redefine(NativePromise.prototype, 'then', function then(onFulfilled, onRejected) {\n var that = this;\n return new PromiseConstructor(function (resolve, reject) {\n nativeThen.call(that, resolve, reject);\n }).then(onFulfilled, onRejected);\n // https://github.com/zloirock/core-js/issues/640\n }, { unsafe: true });\n\n // wrap fetch result\n if (typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input /* , init */) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n }\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = getBuiltIn(PROMISE);\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\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 $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, 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.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\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 var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (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\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/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","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar toLength = require('../internals/to-length');\nvar notARegExp = require('../internals/not-a-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\nvar IS_PURE = require('../internals/is-pure');\n\nvar nativeStartsWith = ''.startsWith;\nvar min = Math.min;\n\nvar CORRECT_IS_REGEXP_LOGIC = correctIsRegExpLogic('startsWith');\n// https://github.com/zloirock/core-js/pull/702\nvar MDN_POLYFILL_BUG = !IS_PURE && !CORRECT_IS_REGEXP_LOGIC && !!function () {\n var descriptor = getOwnPropertyDescriptor(String.prototype, 'startsWith');\n return descriptor && !descriptor.writable;\n}();\n\n// `String.prototype.startsWith` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.startswith\n$({ target: 'String', proto: true, forced: !MDN_POLYFILL_BUG && !CORRECT_IS_REGEXP_LOGIC }, {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = String(requireObjectCoercible(this));\n notARegExp(searchString);\n var index = toLength(min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return nativeStartsWith\n ? nativeStartsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\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 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));\nconst isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);\n\nconst isElement = (input) =>\n input !== null &&\n typeof input === 'object' &&\n input.nodeType === 1 &&\n typeof input.style === 'object' &&\n typeof input.ownerDocument === 'object';\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 // Must be string from here\n if (!isString(input)) {\n return false;\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 promise: isPromise,\n url: isUrl,\n empty: isEmpty,\n};\n","// ==========================================================================\n// Animation utils\n// ==========================================================================\n\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, delay) {\n setTimeout(() => {\n try {\n // eslint-disable-next-line no-param-reassign\n element.hidden = true;\n\n // eslint-disable-next-line no-unused-expressions\n element.offsetHeight;\n\n // eslint-disable-next-line no-param-reassign\n element.hidden = false;\n } catch (e) {\n // Do nothing\n }\n }, delay);\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 isEdge: window.navigator.userAgent.includes('Edge'),\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","var aFunction = require('../internals/a-function');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\nvar toLength = require('../internals/to-length');\n\n// `Array.prototype.{ reduce, reduceRight }` methods implementation\nvar createMethod = function (IS_RIGHT) {\n return function (that, callbackfn, argumentsLength, memo) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IndexedObject(O);\n var length = toLength(O.length);\n var index = IS_RIGHT ? length - 1 : 0;\n var i = IS_RIGHT ? -1 : 1;\n if (argumentsLength < 2) while (true) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (IS_RIGHT ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n };\n};\n\nmodule.exports = {\n // `Array.prototype.reduce` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n left: createMethod(false),\n // `Array.prototype.reduceRight` method\n // https://tc39.github.io/ecma262/#sec-array.prototype.reduceright\n right: createMethod(true)\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar $reduce = require('../internals/array-reduce').left;\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\nvar CHROME_VERSION = require('../internals/engine-v8-version');\nvar IS_NODE = require('../internals/engine-is-node');\n\nvar STRICT_METHOD = arrayMethodIsStrict('reduce');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('reduce', { 1: 0 });\n// Chrome 80-82 has a critical bug\n// https://bugs.chromium.org/p/chromium/issues/detail?id=1049982\nvar CHROME_BUG = !IS_NODE && CHROME_VERSION > 79 && CHROME_VERSION < 83;\n\n// `Array.prototype.reduce` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.reduce\n$({ target: 'Array', proto: true, forced: !STRICT_METHOD || !USES_TO_LENGTH || CHROME_BUG }, {\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments.length > 1 ? arguments[1] : undefined);\n }\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// Element utils\n// ==========================================================================\n\nimport is from './is';\nimport { extend } from './objects';\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 // 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 = extend({}, 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 // Get the parts and value\n const parts = stripped.split('=');\n const [key] = parts;\n const value = parts.length > 1 ? parts[1].replace(/[\"']/g, '') : '';\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.string(existing.class)) {\n attributes.class = `${existing.class} ${className}`;\n } else {\n attributes.class = className;\n }\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 extend(existing, 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 // eslint-disable-next-line no-param-reassign\n element.hidden = hide;\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 method =\n prototype.matches ||\n prototype.webkitMatchesSelector ||\n prototype.mozMatchesSelector ||\n prototype.msMatchesSelector ||\n match;\n\n return method.call(element, selector);\n}\n\n// Closest ancestor element matching selector (also tests element itself)\nexport function closest(element, selector) {\n const { prototype } = Element;\n\n // https://developer.mozilla.org/en-US/docs/Web/API/Element/closest#Polyfill\n function closestElement() {\n let el = this;\n\n do {\n if (matches.matches(el, selector)) return el;\n el = el.parentElement || el.parentNode;\n } while (el !== null && el.nodeType === 1);\n return null;\n }\n\n const method = prototype.closest || closestElement;\n\n return method.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// 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({ preventScroll: true });\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// 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 & Chrome only currently\n pip: (() => {\n if (browser.isIPhone) {\n return false;\n }\n\n // Safari\n // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls\n if (is.function(createElement('video').webkitSetPresentationMode)) {\n return true;\n }\n\n // Chrome\n // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture\n if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {\n return true;\n }\n\n return false;\n })(),\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(input) {\n if (is.empty(input)) {\n return false;\n }\n\n const [mediaType] = input.split('/');\n let type = input;\n\n // Verify we're using HTML5 and there's no media type mismatch\n if (!this.isHTML5 || mediaType !== this.type) {\n return false;\n }\n\n // Add codec if required\n if (Object.keys(defaultCodecs).includes(type)) {\n type += `; codecs=\"${defaultCodecs[input]}\"`;\n }\n\n try {\n return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));\n } catch (e) {\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// 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 // 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 const 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: { ...detail, plyr: this },\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((resolve) =>\n this.ready ? setTimeout(resolve, 0) : on.call(this, this.elements.container, 'ready', resolve),\n ).then(() => {});\n}\n","import is from './is';\n/**\n * Silence a Promise-like object.\n * This is useful for avoiding non-harmful, but potentially confusing \"uncaught\n * play promise\" rejection error messages.\n * @param {Object} value An object that may or may not be `Promise`-like.\n */\nexport function silencePromise(value) {\n if (is.promise(value)) {\n value.then(null, () => {});\n }\n}\n\nexport default { silencePromise };\n","// ==========================================================================\n// Style utils\n// ==========================================================================\n\nimport is from './is';\n\nexport function validateRatio(input) {\n if (!is.array(input) && (!is.string(input) || !input.includes(':'))) {\n return false;\n }\n\n const ratio = is.array(input) ? input : input.split(':');\n\n return ratio.map(Number).every(is.number);\n}\n\nexport function reduceAspectRatio(ratio) {\n if (!is.array(ratio) || !ratio.every(is.number)) {\n return null;\n }\n\n const [width, height] = ratio;\n const getDivider = (w, h) => (h === 0 ? w : getDivider(h, w % h));\n const divider = getDivider(width, height);\n\n return [width / divider, height / divider];\n}\n\nexport function getAspectRatio(input) {\n const parse = (ratio) => (validateRatio(ratio) ? ratio.split(':').map(Number) : null);\n // Try provided ratio\n let ratio = parse(input);\n\n // Get from config\n if (ratio === null) {\n ratio = parse(this.config.ratio);\n }\n\n // Get from embed\n if (ratio === null && !is.empty(this.embed) && is.array(this.embed.ratio)) {\n ({ ratio } = this.embed);\n }\n\n // Get from HTML5 video\n if (ratio === null && this.isHTML5) {\n const { videoWidth, videoHeight } = this.media;\n ratio = reduceAspectRatio([videoWidth, videoHeight]);\n }\n\n return ratio;\n}\n\n// Set aspect ratio for responsive container\nexport function setAspectRatio(input) {\n if (!this.isVideo) {\n return {};\n }\n\n const { wrapper } = this.elements;\n const ratio = getAspectRatio.call(this, input);\n const [w, h] = is.array(ratio) ? ratio : [0, 0];\n const padding = (100 / w) * h;\n\n wrapper.style.paddingBottom = `${padding}%`;\n\n // For Vimeo we have an extra <div> to hide the standard controls and UI\n if (this.isVimeo && !this.config.vimeo.premium && this.supported.ui) {\n const height = (100 / this.media.offsetWidth) * parseInt(window.getComputedStyle(this.media).paddingBottom, 10);\n const offset = (height - padding) / (height / 50);\n\n if (this.fullscreen.active) {\n wrapper.style.paddingBottom = null;\n } else {\n this.media.style.transform = `translateY(-${offset}%)`;\n }\n } else if (this.isHTML5) {\n wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);\n }\n\n return { padding, ratio };\n}\n\nexport default { setAspectRatio };\n","// ==========================================================================\n// Plyr HTML5 helpers\n// ==========================================================================\n\nimport support from './support';\nimport { removeElement } from './utils/elements';\nimport { triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { setAspectRatio } from './utils/style';\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 (if type is specified)\n return sources.filter((source) => {\n const type = source.getAttribute('type');\n\n if (is.empty(type)) {\n return true;\n }\n\n return support.mime.call(this, type);\n });\n },\n\n // Get quality levels\n getQualityOptions() {\n // Whether we're forcing all options (e.g. for streaming)\n if (this.config.quality.forced) {\n return this.config.quality.options;\n }\n\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 setup() {\n if (!this.isHTML5) {\n return;\n }\n\n const player = this;\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set aspect ratio if fixed\n if (!is.empty(this.config.ratio)) {\n setAspectRatio.call(player);\n }\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((s) => s.getAttribute('src') === player.source);\n\n // Return size, if match is found\n return source && Number(source.getAttribute('size'));\n },\n set(input) {\n if (player.quality === input) {\n return;\n }\n\n // If we're using an an external handler...\n if (player.config.quality.forced && is.function(player.config.quality.onChange)) {\n player.config.quality.onChange(input);\n } else {\n // Get sources\n const sources = html5.getSources.call(player);\n // Get first match for requested size\n const source = sources.find((s) => Number(s.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, playbackRate } = 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.speed = playbackRate;\n player.currentTime = currentTime;\n\n // Resume playing\n if (!paused) {\n silencePromise(player.play());\n }\n });\n\n // Load new source\n player.media.load();\n }\n }\n\n // Trigger change event\n triggerEvent.call(player, player.media, 'qualitychange', false, {\n quality: input,\n });\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","var DESCRIPTORS = require('../internals/descriptors');\nvar global = require('../internals/global');\nvar isForced = require('../internals/is-forced');\nvar inheritIfRequired = require('../internals/inherit-if-required');\nvar defineProperty = require('../internals/object-define-property').f;\nvar getOwnPropertyNames = require('../internals/object-get-own-property-names').f;\nvar isRegExp = require('../internals/is-regexp');\nvar getFlags = require('../internals/regexp-flags');\nvar stickyHelpers = require('../internals/regexp-sticky-helpers');\nvar redefine = require('../internals/redefine');\nvar fails = require('../internals/fails');\nvar setInternalState = require('../internals/internal-state').set;\nvar setSpecies = require('../internals/set-species');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\nvar NativeRegExp = global.RegExp;\nvar RegExpPrototype = NativeRegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n\n// \"new\" should create a new object, old webkit bug\nvar CORRECT_NEW = new NativeRegExp(re1) !== re1;\n\nvar UNSUPPORTED_Y = stickyHelpers.UNSUPPORTED_Y;\n\nvar FORCED = DESCRIPTORS && isForced('RegExp', (!CORRECT_NEW || UNSUPPORTED_Y || fails(function () {\n re2[MATCH] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return NativeRegExp(re1) != re1 || NativeRegExp(re2) == re2 || NativeRegExp(re1, 'i') != '/a/i';\n})));\n\n// `RegExp` constructor\n// https://tc39.github.io/ecma262/#sec-regexp-constructor\nif (FORCED) {\n var RegExpWrapper = function RegExp(pattern, flags) {\n var thisIsRegExp = this instanceof RegExpWrapper;\n var patternIsRegExp = isRegExp(pattern);\n var flagsAreUndefined = flags === undefined;\n var sticky;\n\n if (!thisIsRegExp && patternIsRegExp && pattern.constructor === RegExpWrapper && flagsAreUndefined) {\n return pattern;\n }\n\n if (CORRECT_NEW) {\n if (patternIsRegExp && !flagsAreUndefined) pattern = pattern.source;\n } else if (pattern instanceof RegExpWrapper) {\n if (flagsAreUndefined) flags = getFlags.call(pattern);\n pattern = pattern.source;\n }\n\n if (UNSUPPORTED_Y) {\n sticky = !!flags && flags.indexOf('y') > -1;\n if (sticky) flags = flags.replace(/y/g, '');\n }\n\n var result = inheritIfRequired(\n CORRECT_NEW ? new NativeRegExp(pattern, flags) : NativeRegExp(pattern, flags),\n thisIsRegExp ? this : RegExpPrototype,\n RegExpWrapper\n );\n\n if (UNSUPPORTED_Y && sticky) setInternalState(result, { sticky: sticky });\n\n return result;\n };\n var proxy = function (key) {\n key in RegExpWrapper || defineProperty(RegExpWrapper, key, {\n configurable: true,\n get: function () { return NativeRegExp[key]; },\n set: function (it) { NativeRegExp[key] = it; }\n });\n };\n var keys = getOwnPropertyNames(NativeRegExp);\n var index = 0;\n while (keys.length > index) proxy(keys[index++]);\n RegExpPrototype.constructor = RegExpWrapper;\n RegExpWrapper.prototype = RegExpPrototype;\n redefine(global, 'RegExp', RegExpWrapper);\n}\n\n// https://tc39.github.io/ecma262/#sec-get-regexp-@@species\nsetSpecies('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 const replaceAll = (input = '', find = '', replace = '') =>\n input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\\]/\\\\])/g, '\\\\$1'), 'g'), replace.toString());\n\n// Convert to title case\nexport const toTitleCase = (input = '') =>\n input.toString().replace(/\\w\\S*/g, (text) => text.charAt(0).toUpperCase() + text.substr(1).toLowerCase());\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\n// Skip i18n for abbreviations and brand names\nconst resources = {\n pip: 'PIP',\n airplay: 'AirPlay',\n html5: 'HTML5',\n vimeo: 'Vimeo',\n youtube: 'YouTube',\n};\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 if (Object.keys(resources).includes(key)) {\n return resources[key];\n }\n\n return '';\n }\n\n const replace = {\n '{seektime}': config.seekTime,\n '{title}': config.title,\n };\n\n Object.entries(replace).forEach(([k, v]) => {\n string = replaceAll(string, k, v);\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 const exists = () => document.getElementById(id) !== null;\n\n const update = (container, data) => {\n // eslint-disable-next-line no-param-reassign\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 // 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","var $ = require('../internals/export');\n\nvar ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `Math.trunc` method\n// https://tc39.github.io/ecma262/#sec-math.trunc\n$({ target: 'Math', stat: true }, {\n trunc: function trunc(it) {\n return (it > 0 ? floor : ceil)(it);\n }\n});\n","// ==========================================================================\n// Time utils\n// ==========================================================================\n\nimport is from './is';\n\n// Time helpers\nexport const getHours = (value) => Math.trunc((value / 60 / 60) % 60, 10);\nexport const getMinutes = (value) => Math.trunc((value / 60) % 60, 10);\nexport const getSeconds = (value) => Math.trunc(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(undefined, displayHours, inverted);\n }\n\n // Format time component to add leading zero\n const format = (value) => `0${value}`.slice(-2);\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 RangeTouch from 'rangetouch';\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 {\n createElement,\n emptyElement,\n getAttributesFromSelector,\n getElement,\n getElements,\n hasClass,\n matches,\n removeElement,\n setAttributes,\n setFocus,\n toggleClass,\n toggleHidden,\n} from './utils/elements';\nimport { off, on } from './utils/events';\nimport i18n from './utils/i18n';\nimport is from './utils/is';\nimport loadSprite from './utils/load-sprite';\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(`.${this.config.classNames.tooltip}`);\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 // Create <svg>\n const icon = document.createElementNS(namespace, 'svg');\n setAttributes(\n icon,\n extend(attributes, {\n 'aria-hidden': 'true',\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 }\n\n // Always set the older attribute even though it's \"deprecated\" (it'll be around for ages)\n use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path);\n\n // Add <use> to <svg>\n icon.appendChild(use);\n\n return icon;\n },\n\n // Create hidden text label\n createLabel(key, attr = {}) {\n const text = i18n.get(key, this.config);\n const attributes = { ...attr, 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 attributes = extend({}, attr);\n let type = toCamelCase(buttonType);\n\n const props = {\n element: 'button',\n toggle: false,\n label: null,\n icon: null,\n labelPressed: null,\n iconPressed: null,\n };\n\n ['element', 'icon', 'label'].forEach((key) => {\n if (Object.keys(attributes).includes(key)) {\n props[key] = attributes[key];\n delete attributes[key];\n }\n });\n\n // Default to 'button' type to prevent form submission\n if (props.element === 'button' && !Object.keys(attributes).includes('type')) {\n attributes.type = 'button';\n }\n\n // Set class name\n if (Object.keys(attributes).includes('class')) {\n if (!attributes.class.split(' ').some((c) => c === this.config.classNames.control)) {\n extend(attributes, {\n class: `${attributes.class} ${this.config.classNames.control}`,\n });\n }\n } else {\n attributes.class = this.config.classNames.control;\n }\n\n // Large play button\n switch (buttonType) {\n case 'play':\n props.toggle = true;\n props.label = 'play';\n props.labelPressed = 'pause';\n props.icon = 'play';\n props.iconPressed = 'pause';\n break;\n\n case 'mute':\n props.toggle = true;\n props.label = 'mute';\n props.labelPressed = 'unmute';\n props.icon = 'volume';\n props.iconPressed = 'muted';\n break;\n\n case 'captions':\n props.toggle = true;\n props.label = 'enableCaptions';\n props.labelPressed = 'disableCaptions';\n props.icon = 'captions-off';\n props.iconPressed = 'captions-on';\n break;\n\n case 'fullscreen':\n props.toggle = true;\n props.label = 'enterFullscreen';\n props.labelPressed = 'exitFullscreen';\n props.icon = 'enter-fullscreen';\n props.iconPressed = 'exit-fullscreen';\n break;\n\n case 'play-large':\n attributes.class += ` ${this.config.classNames.control}--overlaid`;\n type = 'play';\n props.label = 'play';\n props.icon = 'play';\n break;\n\n default:\n if (is.empty(props.label)) {\n props.label = type;\n }\n if (is.empty(props.icon)) {\n props.icon = buttonType;\n }\n }\n\n const button = createElement(props.element);\n\n // Setup toggle icon and labels\n if (props.toggle) {\n // Icon\n button.appendChild(\n controls.createIcon.call(this, props.iconPressed, {\n class: 'icon--pressed',\n }),\n );\n button.appendChild(\n controls.createIcon.call(this, props.icon, {\n class: 'icon--not-pressed',\n }),\n );\n\n // Label/Tooltip\n button.appendChild(\n controls.createLabel.call(this, props.labelPressed, {\n class: 'label--pressed',\n }),\n );\n button.appendChild(\n controls.createLabel.call(this, props.label, {\n class: 'label--not-pressed',\n }),\n );\n } else {\n button.appendChild(controls.createIcon.call(this, props.icon));\n button.appendChild(controls.createLabel.call(this, props.label));\n }\n\n // Merge and set attributes\n extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));\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 // Improve support on touch devices\n RangeTouch.setup(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: 'progressbar',\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, attrs) {\n const attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);\n\n const container = createElement(\n 'div',\n extend(attributes, {\n class: `${attributes.class ? attributes.class : ''} ${this.config.classNames.display.time} `.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.call(\n this,\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.call(this, 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(check) {\n // Ensure exclusivity\n if (check) {\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', check ? '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 val = 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 = val;\n\n // Update text label inside\n const label = progress.getElementsByTagName('span')[0];\n if (is.element(label)) {\n label.childNodes[0].nodeValue = val;\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 const visible = `${this.config.classNames.tooltip}--visible`;\n const toggle = (show) => toggleClass(this.elements.display.seekTooltip, visible, show);\n\n // Hide on touch\n if (this.touch) {\n toggle(false);\n return;\n }\n\n // Determine percentage, if already visible\n let percent = 0;\n const clientRect = this.elements.progress.getBoundingClientRect();\n\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() {\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 // Filter out invalid speeds\n this.options.speed = this.options.speed.filter((o) => o >= this.minimumSpeed && o <= this.maximumSpeed);\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((p) => !p.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 // If Plyr is in a shadowDOM, the event target is set to the component, instead of the\n // Element in the shadowDOM. The path, if available, is complete.\n const target = is.function(input.composedPath) ? input.composedPath()[0] : input.target;\n const isMenuItem = popup.contains(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 = this.elements.container.querySelector(`#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 // Set the download URL\n setDownloadUrl() {\n const button = this.elements.buttons.download;\n\n // Bail if no button\n if (!is.element(button)) {\n return;\n }\n\n // Set attribute\n button.setAttribute('href', this.download);\n },\n\n // Build the default HTML\n create(data) {\n const {\n bindMenuItemShortcuts,\n createButton,\n createProgress,\n createRange,\n createTime,\n setQualityMenu,\n setSpeedMenu,\n showMenuPanel,\n } = controls;\n this.elements.controls = null;\n\n // Larger overlaid play button\n if (is.array(this.config.controls) && this.config.controls.includes('play-large')) {\n this.elements.container.appendChild(createButton.call(this, 'play-large'));\n }\n\n // Create the container\n const container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));\n this.elements.controls = container;\n\n // Default item attributes\n const defaultAttributes = { class: 'plyr__controls__item' };\n\n // Loop through controls in order\n dedupe(is.array(this.config.controls) ? this.config.controls : []).forEach((control) => {\n // Restart button\n if (control === 'restart') {\n container.appendChild(createButton.call(this, 'restart', defaultAttributes));\n }\n\n // Rewind button\n if (control === 'rewind') {\n container.appendChild(createButton.call(this, 'rewind', defaultAttributes));\n }\n\n // Play/Pause button\n if (control === 'play') {\n container.appendChild(createButton.call(this, 'play', defaultAttributes));\n }\n\n // Fast forward button\n if (control === 'fast-forward') {\n container.appendChild(createButton.call(this, 'fast-forward', defaultAttributes));\n }\n\n // Progress\n if (control === 'progress') {\n const progressContainer = createElement('div', {\n class: `${defaultAttributes.class} plyr__progress__container`,\n });\n\n const progress = createElement('div', getAttributesFromSelector(this.config.selectors.progress));\n\n // Seek range slider\n progress.appendChild(\n createRange.call(this, 'seek', {\n id: `plyr-seek-${data.id}`,\n }),\n );\n\n // Buffer progress\n progress.appendChild(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 progressContainer.appendChild(this.elements.progress);\n container.appendChild(progressContainer);\n }\n\n // Media current time display\n if (control === 'current-time') {\n container.appendChild(createTime.call(this, 'currentTime', defaultAttributes));\n }\n\n // Media duration display\n if (control === 'duration') {\n container.appendChild(createTime.call(this, 'duration', defaultAttributes));\n }\n\n // Volume controls\n if (control === 'mute' || control === 'volume') {\n let { volume } = this.elements;\n\n // Create the volume container if needed\n if (!is.element(volume) || !container.contains(volume)) {\n volume = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__volume`.trim(),\n }),\n );\n\n this.elements.volume = volume;\n\n container.appendChild(volume);\n }\n\n // Toggle mute button\n if (control === 'mute') {\n volume.appendChild(createButton.call(this, 'mute'));\n }\n\n // Volume range control\n // Ignored on iOS as it's handled globally\n // https://developer.apple.com/library/safari/documentation/AudioVideo/Conceptual/Using_HTML5_Audio_Video/Device-SpecificConsiderations/Device-SpecificConsiderations.html\n if (control === 'volume' && !browser.isIos) {\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 createRange.call(\n this,\n 'volume',\n extend(attributes, {\n id: `plyr-volume-${data.id}`,\n }),\n ),\n );\n }\n }\n\n // Toggle captions button\n if (control === 'captions') {\n container.appendChild(createButton.call(this, 'captions', defaultAttributes));\n }\n\n // Settings button / menu\n if (control === 'settings' && !is.empty(this.config.settings)) {\n const wrapper = createElement(\n 'div',\n extend({}, defaultAttributes, {\n class: `${defaultAttributes.class} plyr__menu`.trim(),\n hidden: '',\n }),\n );\n\n wrapper.appendChild(\n 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 bindMenuItemShortcuts.call(this, menuItem, type);\n\n // Show menu on click\n on.call(this, menuItem, 'click', () => {\n 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.call(\n this,\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 showMenuPanel.call(this, 'home', true);\n },\n false,\n );\n\n // Go back via button click\n on.call(this, backButton, 'click', () => {\n 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 wrapper.appendChild(popup);\n container.appendChild(wrapper);\n\n this.elements.settings.popup = popup;\n this.elements.settings.menu = wrapper;\n }\n\n // Picture in picture button\n if (control === 'pip' && support.pip) {\n container.appendChild(createButton.call(this, 'pip', defaultAttributes));\n }\n\n // Airplay button\n if (control === 'airplay' && support.airplay) {\n container.appendChild(createButton.call(this, 'airplay', defaultAttributes));\n }\n\n // Download button\n if (control === 'download') {\n const attributes = extend({}, defaultAttributes, {\n element: 'a',\n href: this.download,\n target: '_blank',\n });\n\n // Set download attribute for HTML5 only\n if (this.isHTML5) {\n attributes.download = '';\n }\n\n const { download } = this.config.urls;\n\n if (!is.url(download) && this.isEmbed) {\n extend(attributes, {\n icon: `logo-${this.provider}`,\n label: this.provider,\n });\n }\n\n container.appendChild(createButton.call(this, 'download', attributes));\n }\n\n // Toggle fullscreen button\n if (control === 'fullscreen') {\n container.appendChild(createButton.call(this, 'fullscreen', defaultAttributes));\n }\n });\n\n // Set available quality levels\n if (this.isHTML5) {\n setQualityMenu.call(this, html5.getQualityOptions.call(this));\n }\n\n 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 }\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 repaint\n if (browser.isEdge) {\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 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\n .filter((track) => !meta.get(track))\n .forEach((track) => {\n this.debug.log('Track added', track);\n\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 // Note: mode='hidden' forces a track to download. To ensure every track\n // isn't downloaded at once, only 'showing' tracks should be reassigned\n // eslint-disable-next-line no-param-reassign\n if (track.mode === 'showing') {\n // eslint-disable-next-line no-param-reassign\n track.mode = 'hidden';\n }\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 (\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\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 // 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 // Wait for the call stack to clear before setting mode='hidden'\n // on the active track - forcing the browser to download it\n setTimeout(() => {\n if (active && this.captions.toggled) {\n this.captions.currentTrackNode.mode = 'hidden';\n }\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\n languages.every((language) => {\n track = sorted.find((t) => t.language === language);\n return !track; // Break iteration if there is a match\n });\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\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 // Force an aspect ratio\n // The format must be `'w:h'` (e.g. `'16:9'`)\n ratio: null,\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.6.4/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 // The options to display in the UI, if available for the source media\n options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240],\n forced: false,\n onChange: null,\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 // The options to display in the UI, if available for the source media (e.g. Vimeo and YouTube only support 0.5x-4x)\n options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 4],\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 using full viewport/window\n iosNative: false, // Use the native fullscreen in iOS (disables custom controls)\n // Selector for the fullscreen container so contextual / non-player content can remain visible in fullscreen mode\n // Non-ancestors of the player element will be ignored\n // container: null, // defaults to the player element\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 // 'duration',\n 'mute',\n 'volume',\n 'captions',\n 'settings',\n 'pip',\n 'airplay',\n // 'download',\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 download: 'Download',\n enterFullscreen: 'Enter fullscreen',\n exitFullscreen: 'Exit fullscreen',\n frameTitle: 'Player for {title}',\n captions: 'Captions',\n settings: 'Settings',\n pip: 'PIP',\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 download: null,\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/oembed.json?url={0}',\n },\n youtube: {\n sdk: 'https://www.youtube.com/iframe_api',\n api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}',\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 download: 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 'download',\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 download: '[data-plyr=\"download\"]',\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 },\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 videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',\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 previewThumbnails: {\n // Tooltip thumbs\n thumbContainer: 'plyr__preview-thumb',\n thumbContainerShown: 'plyr__preview-thumb--is-shown',\n imageContainer: 'plyr__preview-thumb__image-container',\n timeContainer: 'plyr__preview-thumb__time-container',\n // Scrubbing\n scrubbingContainer: 'plyr__preview-scrubbing',\n scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown',\n },\n },\n\n // Embed attributes\n attributes: {\n embed: {\n provider: 'data-plyr-provider',\n id: 'data-plyr-embed-id',\n },\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 tagUrl: '',\n },\n\n // Preview Thumbnails plugin\n previewThumbnails: {\n enabled: false,\n src: '',\n },\n\n // Vimeo plugin\n vimeo: {\n byline: false,\n portrait: false,\n title: false,\n speed: true,\n transparent: false,\n // Custom settings from Plyr\n customControls: true,\n referrerPolicy: null, // https://developer.mozilla.org/en-US/docs/Web/API/HTMLIFrameElement/referrerPolicy\n // Whether the owner of the video has a Pro or Business account\n // (which allows us to properly hide controls without CSS hacks, etc)\n premium: false,\n },\n\n // YouTube plugin\n youtube: {\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 // Custom settings from Plyr\n customControls: true,\n noCookie: false, // Whether to use an alternative version of YouTube without cookies\n },\n};\n\nexport default defaults;\n","// ==========================================================================\n// Plyr states\n// ==========================================================================\n\nexport const pip = {\n active: 'picture-in-picture',\n inactive: 'inline',\n};\n\nexport default { pip };\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|youtube-nocookie\\.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 browser from './utils/browser';\nimport { closest, getElements, hasClass, toggleClass } from './utils/elements';\nimport { on, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\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 // Force the use of 'full window/browser' rather than fullscreen\n this.forceFallback = player.config.fullscreen.fallback === 'force';\n\n // Get the fullscreen element\n // Checks container is an ancestor, defaults to null\n this.player.elements.fullscreen =\n player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container);\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 this.onChange();\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.player.listeners.proxy(event, this.toggle, 'fullscreen');\n });\n\n // Tap focus when in fullscreen\n on.call(this, this.player.elements.container, 'keydown', (event) => this.trapFocus(event));\n\n // Update the UI\n this.update();\n\n // this.toggle = this.toggle.bind(this);\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 // If we're actually using native\n get usingNative() {\n return Fullscreen.native && !this.forceFallback;\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 || this.forceFallback) {\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 && element.shadowRoot ? element === this.target.getRootNode().host : 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.fullscreen || this.player.elements.container;\n }\n\n 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 // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up\n const target = this.target === this.player.media ? this.target : this.player.elements.container;\n // Trigger an event\n triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);\n };\n\n 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\n // Toggle button and fire events\n this.onChange();\n };\n\n // Trap focus inside container\n trapFocus = (event) => {\n // Bail if iOS, not active, not the tab key\n if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {\n return;\n }\n\n // Get the current focused element\n const focused = document.activeElement;\n const focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');\n const [first] = focusable;\n const last = focusable[focusable.length - 1];\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 // Update UI\n update = () => {\n if (this.enabled) {\n let mode;\n\n if (this.forceFallback) {\n mode = 'Fallback (forced)';\n } else if (Fullscreen.native) {\n mode = 'Native';\n } else {\n mode = 'Fallback';\n }\n\n this.player.debug.log(`${mode} 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 if (this.player.isVimeo) {\n this.player.embed.requestFullscreen();\n } else {\n this.target.webkitEnterFullscreen();\n }\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(true);\n } else if (!this.prefix) {\n this.target.requestFullscreen({ navigationUI: 'hide' });\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 silencePromise(this.player.play());\n } else if (!Fullscreen.native || this.forceFallback) {\n this.toggleFallback(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","// `Math.sign` method implementation\n// https://tc39.github.io/ecma262/#sec-math.sign\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","var $ = require('../internals/export');\nvar sign = require('../internals/math-sign');\n\n// `Math.sign` method\n// https://tc39.github.io/ecma262/#sec-math.sign\n$({ target: 'Math', stat: true }, {\n sign: sign\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/load-image';\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 loop state\n this.loop = null;\n\n // Reset quality setting\n this.quality = null;\n\n // Reset speed\n this.speed = 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('data-poster', poster);\n\n // Show the poster\n this.elements.poster.removeAttribute('hidden');\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\n ui.togglePoster.call(this, true);\n\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 Object.assign(target, { pressed: this.playing });\n target.setAttribute('aria-label', i18n.get(this.playing ? 'pause' : 'play', this.config));\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 () => {\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 },\n this.loading ? 250 : 0,\n );\n },\n\n // Toggle controls based on state and `force` argument\n toggleControls(force) {\n const { controls: controlsElement } = this.elements;\n\n if (controlsElement && this.config.hideControls) {\n // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)\n const recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now();\n\n // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide\n this.toggleControls(\n Boolean(\n force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek,\n ),\n );\n }\n },\n\n // Migrate any custom properties from the media to the parent\n migrateStyles() {\n // Loop through values (as they are the keys when the object is spread 🤔)\n Object.values({ ...this.media.style })\n // We're only fussed about Plyr specific properties\n .filter((key) => !is.empty(key) && is.string(key) && key.startsWith('--plyr'))\n .forEach((key) => {\n // Set on the container\n this.elements.container.style.setProperty(key, this.media.style.getPropertyValue(key));\n\n // Clean up from media element\n this.media.style.removeProperty(key);\n });\n\n // Remove attribute if empty\n if (is.empty(this.media.style)) {\n this.media.removeAttribute('style');\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 } from './utils/elements';\nimport { off, on, once, toggleListener, triggerEvent } from './utils/events';\nimport is from './utils/is';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, setAspectRatio } from './utils/style';\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 silencePromise(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 (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {\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 if (event.type !== 'focusout') {\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\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 focusout', this.setTabFocus, toggle, false, true);\n };\n\n // Container listeners\n container = () => {\n const { player } = this;\n const { config, elements, timers } = player;\n\n // Keyboard shortcuts\n if (!config.keyboard.global && 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: controlsElement } = elements;\n\n // Remove button states for fullscreen\n if (controlsElement && event.type === 'enterfullscreen') {\n controlsElement.pressed = false;\n controlsElement.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 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(timers.controls);\n\n // Set new timer to prevent flicker when seeking\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\n },\n );\n\n // Set a gutter for Vimeo\n const setGutter = (ratio, padding, toggle) => {\n if (!player.isVimeo || player.config.vimeo.premium) {\n return;\n }\n\n const target = player.elements.wrapper.firstChild;\n const [, y] = ratio;\n const [videoX, videoY] = getAspectRatio.call(player);\n\n target.style.maxWidth = toggle ? `${(y / videoY) * videoX}px` : null;\n target.style.margin = toggle ? '0 auto' : null;\n };\n\n // Resize on fullscreen change\n const setPlayerSize = (measure) => {\n // If we don't need to measure the viewport\n if (!measure) {\n return setAspectRatio.call(player);\n }\n\n const rect = elements.container.getBoundingClientRect();\n const { width, height } = rect;\n\n return setAspectRatio.call(player, `${width}:${height}`);\n };\n\n const resized = () => {\n clearTimeout(timers.resized);\n timers.resized = setTimeout(setPlayerSize, 50);\n };\n\n on.call(player, elements.container, 'enterfullscreen exitfullscreen', (event) => {\n const { target, usingNative } = player.fullscreen;\n\n // Ignore events not from target\n if (target !== elements.container) {\n return;\n }\n\n // If it's not an embed and no ratio specified\n if (!player.isEmbed && is.empty(player.config.ratio)) {\n return;\n }\n\n const isEnter = event.type === 'enterfullscreen';\n // Set the player size when entering fullscreen to viewport size\n const { padding, ratio } = setPlayerSize(isEnter);\n\n // Set Vimeo gutter\n setGutter(ratio, padding, isEnter);\n\n // Horrible hack for Safari 14 not repainting properly on entering fullscreen\n if (isEnter) {\n setTimeout(() => repaint(elements.container), 100);\n }\n\n // If not using native browser fullscreen API, we need to check for resizes of viewport\n if (!usingNative) {\n if (isEnter) {\n on.call(player, window, 'resize', resized);\n } else {\n off.call(player, window, 'resize', resized);\n }\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 // 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 // Call pause otherwise IE11 will start playing the video again\n player.pause();\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 // 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 or 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 this.proxy(event, player.restart, 'restart');\n this.proxy(\n event,\n () => {\n silencePromise(player.play());\n },\n 'play',\n );\n } else {\n this.proxy(\n event,\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\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 // Update download link when ready and if quality changes\n on.call(player, player.media, 'ready qualitychange', () => {\n controls.setDownloadUrl.call(player);\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 !== false && 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 // 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(\n button,\n 'click',\n () => {\n silencePromise(player.togglePlay());\n },\n 'play',\n );\n });\n }\n\n // Pause\n this.bind(elements.buttons.restart, 'click', player.restart, 'restart');\n\n // Rewind\n this.bind(\n elements.buttons.rewind,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after rewind\n player.lastSeekTime = Date.now();\n player.rewind();\n },\n 'rewind',\n );\n\n // Rewind\n this.bind(\n elements.buttons.fastForward,\n 'click',\n () => {\n // Record seek time so we can prevent hiding controls for a few seconds after fast forward\n player.lastSeekTime = Date.now();\n player.forward();\n },\n 'fastForward',\n );\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 // Download\n this.bind(\n elements.buttons.download,\n 'click',\n () => {\n triggerEvent.call(player, player.media, 'download');\n },\n 'download',\n );\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(\n elements.buttons.settings,\n 'click',\n (event) => {\n // Prevent the document click listener closing the menu\n event.stopPropagation();\n event.preventDefault();\n\n controls.toggleMenu.call(player, event);\n },\n null,\n false,\n ); // Can't be passive as we're preventing default\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 // Record seek time so we can prevent hiding controls for a few seconds after seek\n player.lastSeekTime = Date.now();\n\n // Was playing before?\n const play = seek.hasAttribute(attribute);\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 silencePromise(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 // 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 // Preview thumbnails plugin\n // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this\n this.bind(elements.progress, 'mousemove touchmove', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startMove(event);\n }\n });\n\n // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering\n this.bind(elements.progress, 'mouseleave touchend click', () => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endMove(false, true);\n }\n });\n\n // Show scrubbing preview\n this.bind(elements.progress, 'mousedown touchstart', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.startScrubbing(event);\n }\n });\n\n this.bind(elements.progress, 'mouseup touchend', (event) => {\n const { previewThumbnails } = player;\n\n if (previewThumbnails && previewThumbnails.loaded) {\n previewThumbnails.endScrubbing(event);\n }\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 // Also update controls.hover state for any non-player children of fullscreen element (as above)\n if (elements.fullscreen) {\n Array.from(elements.fullscreen.children)\n .filter((c) => !c.contains(elements.container))\n .forEach((child) => {\n this.bind(child, 'mouseenter mouseleave', (event) => {\n elements.controls.hover = !player.touch && event.type === 'mouseenter';\n });\n });\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 // Show controls when they receive focus (e.g., when using keyboard tab key)\n this.bind(elements.controls, 'focusin', () => {\n const { config, timers } = player;\n\n // Skip transition to prevent focus from scrolling the parent element\n toggleClass(elements.controls, config.classNames.noTransition, true);\n\n // Toggle\n ui.toggleControls.call(player, true);\n\n // Restore transition\n setTimeout(() => {\n toggleClass(elements.controls, config.classNames.noTransition, false);\n }, 0);\n\n // Delay a little more for mouse users\n const delay = this.touch ? 3000 : 4000;\n\n // Clear timer\n clearTimeout(timers.controls);\n\n // Hide again after delay\n timers.controls = setTimeout(() => ui.toggleControls.call(player, false), delay);\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 // Get delta from event. Invert if `inverted` is true\n const [x, y] = [event.deltaX, -event.deltaY].map((value) => (inverted ? -value : value));\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","'use strict';\nvar $ = require('../internals/export');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar toObject = require('../internals/to-object');\nvar arraySpeciesCreate = require('../internals/array-species-create');\nvar createProperty = require('../internals/create-property');\nvar arrayMethodHasSpeciesSupport = require('../internals/array-method-has-species-support');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar HAS_SPECIES_SUPPORT = arrayMethodHasSpeciesSupport('splice');\nvar USES_TO_LENGTH = arrayMethodUsesToLength('splice', { ACCESSORS: true, 0: 0, 1: 2 });\n\nvar max = Math.max;\nvar min = Math.min;\nvar MAX_SAFE_INTEGER = 0x1FFFFFFFFFFFFF;\nvar MAXIMUM_ALLOWED_LENGTH_EXCEEDED = 'Maximum allowed length exceeded';\n\n// `Array.prototype.splice` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.splice\n// with adding support of @@species\n$({ target: 'Array', proto: true, forced: !HAS_SPECIES_SUPPORT || !USES_TO_LENGTH }, {\n splice: function splice(start, deleteCount /* , ...items */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var actualStart = toAbsoluteIndex(start, len);\n var argumentsLength = arguments.length;\n var insertCount, actualDeleteCount, A, k, from, to;\n if (argumentsLength === 0) {\n insertCount = actualDeleteCount = 0;\n } else if (argumentsLength === 1) {\n insertCount = 0;\n actualDeleteCount = len - actualStart;\n } else {\n insertCount = argumentsLength - 2;\n actualDeleteCount = min(max(toInteger(deleteCount), 0), len - actualStart);\n }\n if (len + insertCount - actualDeleteCount > MAX_SAFE_INTEGER) {\n throw TypeError(MAXIMUM_ALLOWED_LENGTH_EXCEEDED);\n }\n A = arraySpeciesCreate(O, actualDeleteCount);\n for (k = 0; k < actualDeleteCount; k++) {\n from = actualStart + k;\n if (from in O) createProperty(A, k, O[from]);\n }\n A.length = actualDeleteCount;\n if (insertCount < actualDeleteCount) {\n for (k = actualStart; k < len - actualDeleteCount; k++) {\n from = k + actualDeleteCount;\n to = k + insertCount;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n for (k = len; k > len - actualDeleteCount + insertCount; k--) delete O[k - 1];\n } else if (insertCount > actualDeleteCount) {\n for (k = len - actualDeleteCount; k > actualStart; k--) {\n from = k + actualDeleteCount - 1;\n to = k + insertCount - 1;\n if (from in O) O[to] = O[from];\n else delete O[to];\n }\n }\n for (k = 0; k < insertCount; k++) {\n O[k + actualStart] = arguments[k + 2];\n }\n O.length = len - actualDeleteCount + insertCount;\n return A;\n }\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 pathname = path.replace(/[\\?|#].*$/, ''),\n pathStripped = path.replace(/^(css|img)!/, ''),\n isLegacyIECss,\n e;\n\n numTries = numTries || 0;\n\n if (/(^css!|\\.css$)/.test(pathname)) {\n // css\n e = doc.createElement('link');\n e.rel = 'stylesheet';\n e.href = pathStripped;\n\n // tag IE9+\n isLegacyIECss = 'hideFocus' in e;\n\n // use preload in IE Edge (to detect load errors)\n if (isLegacyIECss && e.relList) {\n isLegacyIECss = 0;\n e.rel = 'preload';\n e.as = 'style';\n }\n } else if (/(^img!|\\.(png|gif|jpg|svg|webp)$)/.test(pathname)) {\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 // treat empty stylesheets as failures to get around lack of onerror\n // support in IE9-11\n if (isLegacyIECss) {\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` (unless error is Code:18 SecurityError)\n if (x.code != 18) 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 } else if (e.rel == 'preload' && e.as == 'style') {\n // activate preloaded stylesheets\n return e.rel = 'stylesheet'; // jshint ignore:line\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|Object)} [arg1] - The (1) bundleId or (2) success\n * callback or (3) object literal with success/error arguments, numRetries,\n * etc.\n * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object\n * literal with success/error arguments, numRetries, etc.\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 function loadFn(resolve, reject) {\n loadFiles(paths, function (pathsNotFound) {\n // execute callbacks\n executeCallbacks(args, pathsNotFound);\n \n // resolve Promise\n if (resolve) {\n executeCallbacks({success: resolve, error: reject}, pathsNotFound);\n }\n\n // publish bundle load event\n publish(bundleId, pathsNotFound);\n }, args);\n }\n \n if (args.returnPromise) return new Promise(loadFn);\n else loadFn();\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/load-script';\nimport { format, stripHTML } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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// 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 const player = this;\n\n // Add embed class for responsive\n toggleClass(player.elements.wrapper, player.config.classNames.embed, true);\n\n // Set speed options from config\n player.options.speed = player.config.speed.options;\n\n // Set intial ratio\n setAspectRatio.call(player);\n\n // Load the SDK if not already\n if (!is.object(window.Vimeo)) {\n loadScript(player.config.urls.vimeo.sdk)\n .then(() => {\n vimeo.ready.call(player);\n })\n .catch((error) => {\n player.debug.warn('Vimeo SDK (player.js) failed to load', error);\n });\n } else {\n vimeo.ready.call(player);\n }\n },\n\n // API Ready\n ready() {\n const player = this;\n const config = player.config.vimeo;\n const { premium, referrerPolicy, ...frameParams } = config;\n\n // If the owner has a pro or premium account then we can hide controls etc\n if (premium) {\n Object.assign(frameParams, {\n controls: false,\n sidedock: false,\n });\n }\n\n // Get Vimeo params for the iframe\n const params = buildUrlParams({\n loop: player.config.loop.active,\n autoplay: player.autoplay,\n muted: player.muted,\n gesture: 'media',\n playsinline: !this.config.fullscreen.iosNative,\n ...frameParams,\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(player.config.attributes.embed.id);\n }\n\n const id = parseId(source);\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('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; '));\n\n // Set the referrer policy if required\n if (!is.empty(referrerPolicy)) {\n iframe.setAttribute('referrerPolicy', referrerPolicy);\n }\n\n // Inject the package\n if (premium || !config.customControls) {\n iframe.setAttribute('data-poster', player.poster);\n player.media = replaceElement(iframe, player.media);\n } else {\n const wrapper = createElement('div', {\n class: player.config.classNames.embedContainer,\n 'data-poster': player.poster,\n });\n wrapper.appendChild(iframe);\n player.media = replaceElement(wrapper, player.media);\n }\n\n // Get poster image\n if (!config.customControls) {\n fetch(format(player.config.urls.vimeo.api, src)).then((response) => {\n if (is.empty(response) || !response.thumbnail_url) {\n return;\n }\n\n // Set and show poster\n ui.setPoster.call(player, response.thumbnail_url).catch(() => {});\n });\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(() => {\n // Cannot set Playback Rate, Video is probably not on Pro account\n player.options.speed = [1];\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 controls.setDownloadUrl.call(player);\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 [width, height] = dimensions;\n player.embed.ratio = [width, height];\n setAspectRatio.call(this);\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('bufferstart', () => {\n triggerEvent.call(player, player.media, 'waiting');\n });\n\n player.embed.on('bufferend', () => {\n triggerEvent.call(player, player.media, 'playing');\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 0);\n }\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/load-image';\nimport loadScript from '../utils/load-script';\nimport { extend } from '../utils/objects';\nimport { format, generateId } from '../utils/strings';\nimport { setAspectRatio } from '../utils/style';\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\nfunction getHost(config) {\n if (config.noCookie) {\n return 'https://www.youtube-nocookie.com';\n }\n\n if (window.location.protocol === 'http:') {\n return 'http://www.youtube.com';\n }\n\n // Use YouTube's default\n return undefined;\n}\n\nconst youtube = {\n setup() {\n // Add embed class for responsive\n toggleClass(this.elements.wrapper, this.config.classNames.embed, true);\n\n // Setup API\n if (is.object(window.YT) && is.function(window.YT.Player)) {\n youtube.ready.call(this);\n } else {\n // Reference current global callback\n const callback = window.onYouTubeIframeAPIReady;\n\n // Set callback to process queue\n window.onYouTubeIframeAPIReady = () => {\n // Call global callback if set\n if (is.function(callback)) {\n callback();\n }\n\n youtube.ready.call(this);\n };\n\n // Load the SDK\n loadScript(this.config.urls.youtube.sdk).catch((error) => {\n this.debug.warn('YouTube API failed to load', error);\n });\n }\n },\n\n // Get the media title\n getTitle(videoId) {\n const url = format(this.config.urls.youtube.api, videoId);\n\n fetch(url)\n .then((data) => {\n if (is.object(data)) {\n const { title, height, width } = data;\n\n // Set title\n this.config.title = title;\n ui.setTitle.call(this);\n\n // Set aspect ratio\n this.embed.ratio = [width, height];\n }\n\n setAspectRatio.call(this);\n })\n .catch(() => {\n // Set aspect ratio\n setAspectRatio.call(this);\n });\n },\n\n // API ready\n ready() {\n const player = this;\n const config = player.config.youtube;\n // Ignore already setup (race condition)\n const currentId = player.media && 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 // Replace media element\n const container = createElement('div', { id, 'data-poster': config.customControls ? player.poster : undefined });\n player.media = replaceElement(container, player.media);\n\n // Only load the poster when using custom controls\n if (config.customControls) {\n const posterSrc = (s) => `https://i.ytimg.com/vi/${videoId}/${s}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((src) => {\n // If the image is padded, use background-size \"cover\" instead (like youtube does too with their posters)\n if (!src.includes('maxres')) {\n player.elements.poster.style.backgroundSize = 'cover';\n }\n })\n .catch(() => {});\n }\n\n // Setup instance\n // https://developers.google.com/youtube/iframe_api_reference\n player.embed = new window.YT.Player(player.media, {\n videoId,\n host: getHost(config),\n playerVars: extend(\n {},\n {\n // Autoplay\n autoplay: player.config.autoplay ? 1 : 0,\n // iframe interface language\n hl: player.config.hl,\n // Only show controls if not fully supported or opted out\n controls: player.supported.ui && config.customControls ? 0 : 1,\n // Disable keyboard as we handle it\n disablekb: 1,\n // Allow iOS inline playback\n playsinline: !player.config.fullscreen.iosNative ? 1 : 0,\n // Captions are flaky on YouTube\n cc_load_policy: player.captions.active ? 1 : 0,\n cc_lang_pref: player.config.captions.language,\n // Tracking for stats\n widget_referrer: window ? window.location.href : null,\n },\n config,\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 instance.setVolume(volume * 100);\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 const speeds = instance.getAvailablePlaybackRates();\n // Filter based on config\n player.options.speed = speeds.filter((s) => player.config.speed.options.includes(s));\n\n // Set the tabindex to avoid focus entering iframe\n if (player.supported.ui && config.customControls) {\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 if (config.customControls) {\n setTimeout(() => ui.build.call(player), 50);\n }\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 (config.customControls && !player.config.autoplay && 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 case 3:\n // Trigger waiting event to add loading classes to container as the video buffers.\n triggerEvent.call(player, player.media, 'waiting');\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 // Poster image container\n this.elements.poster = createElement('div', {\n class: this.config.classNames.poster,\n hidden: '',\n });\n\n this.elements.wrapper.appendChild(this.elements.poster);\n }\n\n if (this.isHTML5) {\n html5.setup.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/load-script';\nimport { silencePromise } from '../utils/promise';\nimport { formatTime } from '../utils/time';\nimport { buildUrlParams } from '../utils/urls';\n\nconst destroy = (instance) => {\n // Destroy our adsManager\n if (instance.manager) {\n instance.manager.destroy();\n }\n\n // Destroy our adsManager\n if (instance.elements.displayContainer) {\n instance.elements.displayContainer.destroy();\n }\n\n instance.elements.container.remove();\n};\n\nclass Ads {\n /**\n * Ads constructor.\n * @param {Object} player\n * @return {Ads}\n */\n constructor(player) {\n this.player = player;\n this.config = player.config.ads;\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 const { config } = this;\n\n return (\n this.player.isHTML5 &&\n this.player.isVideo &&\n config.enabled &&\n (!is.empty(config.publisherId) || is.url(config.tagUrl))\n );\n }\n\n /**\n * Load the IMA SDK\n */\n load = () => {\n if (!this.enabled) {\n return;\n }\n\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 * Get the ads instance ready\n */\n ready = () => {\n // Double check we're enabled\n if (!this.enabled) {\n destroy(this);\n }\n\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 tag URL\n get tagUrl() {\n const { config } = this;\n\n if (is.url(config.tagUrl)) {\n return config.tagUrl;\n }\n\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: config.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\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 // Set playback for iOS10+\n google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline);\n\n // We assume the adContainer is the video container of the plyr element that will house the ads\n this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media);\n\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 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 // 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 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], (e) => this.onAdEvent(e));\n });\n\n // Resolve our adsManager\n this.trigger('loaded');\n };\n\n addCuePoints = () => {\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\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 // 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 const adData = event.getAdData();\n\n // Proxy event\n const dispatchEvent = (type) => {\n triggerEvent.call(this.player, this.player.media, `ads${type.replace(/_/g, '').toLowerCase()}`);\n };\n\n // Bubble the event\n dispatchEvent(event.type);\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 // 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\n break;\n\n case google.ima.AdEvent.Type.STARTED:\n // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 // 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 if (this.player.ended) {\n this.loadAds();\n } else {\n // The SDK won't allow new ads to be called without receiving a contentComplete()\n this.loader.contentComplete();\n }\n\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 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 this.pollCountdown();\n\n this.resumeContent();\n\n break;\n\n case google.ima.AdEvent.Type.LOG:\n if (adData.adError) {\n this.player.debug.warn(`Non-fatal ad error: ${adData.adError.getMessage()}`);\n }\n\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 this.player.on('canplay', () => {\n this.addCuePoints();\n });\n\n this.player.on('ended', () => {\n this.loader.contentComplete();\n });\n\n this.player.on('timeupdate', () => {\n time = this.player.currentTime;\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 // Set volume to match player\n this.manager.setVolume(this.player.volume);\n\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 video\n silencePromise(this.player.media.play());\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.media.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 // Now that the manager has been destroyed set it to also be un-initialized\n this.initialized = false;\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","'use strict';\nvar $ = require('../internals/export');\nvar $findIndex = require('../internals/array-iteration').findIndex;\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar FIND_INDEX = 'findIndex';\nvar SKIPS_HOLES = true;\n\nvar USES_TO_LENGTH = arrayMethodUsesToLength(FIND_INDEX);\n\n// Shouldn't skip holes\nif (FIND_INDEX in []) Array(1)[FIND_INDEX](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.findIndex` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.findindex\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES || !USES_TO_LENGTH }, {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $findIndex(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND_INDEX);\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toInteger = require('../internals/to-integer');\nvar toLength = require('../internals/to-length');\nvar arrayMethodIsStrict = require('../internals/array-method-is-strict');\nvar arrayMethodUsesToLength = require('../internals/array-method-uses-to-length');\n\nvar min = Math.min;\nvar nativeLastIndexOf = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!nativeLastIndexOf && 1 / [1].lastIndexOf(1, -0) < 0;\nvar STRICT_METHOD = arrayMethodIsStrict('lastIndexOf');\n// For preventing possible almost infinite loop in non-standard implementations, test the forward version of the method\nvar USES_TO_LENGTH = arrayMethodUsesToLength('indexOf', { ACCESSORS: true, 1: 0 });\nvar FORCED = NEGATIVE_ZERO || !STRICT_METHOD || !USES_TO_LENGTH;\n\n// `Array.prototype.lastIndexOf` method implementation\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\nmodule.exports = FORCED ? function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return nativeLastIndexOf.apply(this, arguments) || 0;\n var O = toIndexedObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O && O[index] === searchElement) return index || 0;\n return -1;\n} : nativeLastIndexOf;\n","var $ = require('../internals/export');\nvar lastIndexOf = require('../internals/array-last-index-of');\n\n// `Array.prototype.lastIndexOf` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.lastindexof\n$({ target: 'Array', proto: true, forced: lastIndexOf !== [].lastIndexOf }, {\n lastIndexOf: lastIndexOf\n});\n","import { createElement } from '../utils/elements';\nimport { once } from '../utils/events';\nimport fetch from '../utils/fetch';\nimport is from '../utils/is';\nimport { formatTime } from '../utils/time';\n\n// Arg: vttDataString example: \"WEBVTT\\n\\n1\\n00:00:05.000 --> 00:00:10.000\\n1080p-00001.jpg\"\nconst parseVtt = (vttDataString) => {\n const processedList = [];\n const frames = vttDataString.split(/\\r\\n\\r\\n|\\n\\n|\\r\\r/);\n\n frames.forEach((frame) => {\n const result = {};\n const lines = frame.split(/\\r\\n|\\n|\\r/);\n\n lines.forEach((line) => {\n if (!is.number(result.startTime)) {\n // The line with start and end times on it is the first line of interest\n const matchTimes = line.match(\n /([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/,\n ); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT\n\n if (matchTimes) {\n result.startTime =\n Number(matchTimes[1] || 0) * 60 * 60 +\n Number(matchTimes[2]) * 60 +\n Number(matchTimes[3]) +\n Number(`0.${matchTimes[4]}`);\n result.endTime =\n Number(matchTimes[6] || 0) * 60 * 60 +\n Number(matchTimes[7]) * 60 +\n Number(matchTimes[8]) +\n Number(`0.${matchTimes[9]}`);\n }\n } else if (!is.empty(line.trim()) && is.empty(result.text)) {\n // If we already have the startTime, then we're definitely up to the text line(s)\n const lineSplit = line.trim().split('#xywh=');\n [result.text] = lineSplit;\n\n // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image\n if (lineSplit[1]) {\n [result.x, result.y, result.w, result.h] = lineSplit[1].split(',');\n }\n }\n });\n\n if (result.text) {\n processedList.push(result);\n }\n });\n\n return processedList;\n};\n\n/**\n * Preview thumbnails for seek hover and scrubbing\n * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar\n * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed\n *\n * Notes:\n * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole\n * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails\n * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered\n */\n\nconst fitRatio = (ratio, outer) => {\n const targetRatio = outer.width / outer.height;\n const result = {};\n if (ratio > targetRatio) {\n result.width = outer.width;\n result.height = (1 / ratio) * outer.width;\n } else {\n result.height = outer.height;\n result.width = ratio * outer.height;\n }\n\n return result;\n};\n\nclass PreviewThumbnails {\n /**\n * PreviewThumbnails constructor.\n * @param {Plyr} player\n * @return {PreviewThumbnails}\n */\n constructor(player) {\n this.player = player;\n this.thumbnails = [];\n this.loaded = false;\n this.lastMouseMoveTime = Date.now();\n this.mouseDown = false;\n this.loadedImages = [];\n\n this.elements = {\n thumb: {},\n scrubbing: {},\n };\n\n this.load();\n }\n\n get enabled() {\n return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;\n }\n\n load = () => {\n // Toggle the regular seek tooltip\n if (this.player.elements.display.seekTooltip) {\n this.player.elements.display.seekTooltip.hidden = this.enabled;\n }\n\n if (!this.enabled) {\n return;\n }\n\n this.getThumbnails().then(() => {\n if (!this.enabled) {\n return;\n }\n\n // Render DOM elements\n this.render();\n\n // Check to see if thumb container size was specified manually in CSS\n this.determineContainerAutoSizing();\n\n this.loaded = true;\n });\n };\n\n // Download VTT files and parse them\n getThumbnails = () => {\n return new Promise((resolve) => {\n const { src } = this.player.config.previewThumbnails;\n\n if (is.empty(src)) {\n throw new Error('Missing previewThumbnails.src config attribute');\n }\n\n // Resolve promise\n const sortAndResolve = () => {\n // Sort smallest to biggest (e.g., [120p, 480p, 1080p])\n this.thumbnails.sort((x, y) => x.height - y.height);\n\n this.player.debug.log('Preview thumbnails', this.thumbnails);\n\n resolve();\n };\n\n // Via callback()\n if (is.function(src)) {\n src((thumbnails) => {\n this.thumbnails = thumbnails;\n sortAndResolve();\n });\n }\n // VTT urls\n else {\n // If string, convert into single-element list\n const urls = is.string(src) ? [src] : src;\n // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails\n const promises = urls.map((u) => this.getThumbnail(u));\n // Resolve\n Promise.all(promises).then(sortAndResolve);\n }\n });\n };\n\n // Process individual VTT file\n getThumbnail = (url) => {\n return new Promise((resolve) => {\n fetch(url).then((response) => {\n const thumbnail = {\n frames: parseVtt(response),\n height: null,\n urlPrefix: '',\n };\n\n // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file\n // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank\n // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file\n if (\n !thumbnail.frames[0].text.startsWith('/') &&\n !thumbnail.frames[0].text.startsWith('http://') &&\n !thumbnail.frames[0].text.startsWith('https://')\n ) {\n thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);\n }\n\n // Download the first frame, so that we can determine/set the height of this thumbnailsDef\n const tempImage = new Image();\n\n tempImage.onload = () => {\n thumbnail.height = tempImage.naturalHeight;\n thumbnail.width = tempImage.naturalWidth;\n\n this.thumbnails.push(thumbnail);\n\n resolve();\n };\n\n tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;\n });\n });\n };\n\n startMove = (event) => {\n if (!this.loaded) {\n return;\n }\n\n if (!is.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {\n return;\n }\n\n // Wait until media has a duration\n if (!this.player.media.duration) {\n return;\n }\n\n if (event.type === 'touchmove') {\n // Calculate seek hover position as approx video seconds\n this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);\n } else {\n // Calculate seek hover position as approx video seconds\n const clientRect = this.player.elements.progress.getBoundingClientRect();\n const percentage = (100 / clientRect.width) * (event.pageX - clientRect.left);\n this.seekTime = this.player.media.duration * (percentage / 100);\n\n if (this.seekTime < 0) {\n // The mousemove fires for 10+px out to the left\n this.seekTime = 0;\n }\n\n if (this.seekTime > this.player.media.duration - 1) {\n // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video\n this.seekTime = this.player.media.duration - 1;\n }\n\n this.mousePosX = event.pageX;\n\n // Set time text inside image container\n this.elements.thumb.time.innerText = formatTime(this.seekTime);\n }\n\n // Download and show image\n this.showImageAtCurrentTime();\n };\n\n endMove = () => {\n this.toggleThumbContainer(false, true);\n };\n\n startScrubbing = (event) => {\n // Only act on left mouse button (0), or touch device (event.button does not exist or is false)\n if (is.nullOrUndefined(event.button) || event.button === false || event.button === 0) {\n this.mouseDown = true;\n\n // Wait until media has a duration\n if (this.player.media.duration) {\n this.toggleScrubbingContainer(true);\n this.toggleThumbContainer(false, true);\n\n // Download and show image\n this.showImageAtCurrentTime();\n }\n }\n };\n\n endScrubbing = () => {\n this.mouseDown = false;\n\n // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview\n if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {\n // The video was already seeked/loaded at the chosen time - hide immediately\n this.toggleScrubbingContainer(false);\n } else {\n // The video hasn't seeked yet. Wait for that\n once.call(this.player, this.player.media, 'timeupdate', () => {\n // Re-check mousedown - we might have already started scrubbing again\n if (!this.mouseDown) {\n this.toggleScrubbingContainer(false);\n }\n });\n }\n };\n\n /**\n * Setup hooks for Plyr and window events\n */\n listeners = () => {\n // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering\n this.player.on('play', () => {\n this.toggleThumbContainer(false, true);\n });\n\n this.player.on('seeked', () => {\n this.toggleThumbContainer(false);\n });\n\n this.player.on('timeupdate', () => {\n this.lastTime = this.player.media.currentTime;\n });\n };\n\n /**\n * Create HTML elements for image containers\n */\n render = () => {\n // Create HTML element: plyr__preview-thumbnail-container\n this.elements.thumb.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.thumbContainer,\n });\n\n // Wrapper for the image for styling\n this.elements.thumb.imageContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.imageContainer,\n });\n this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer);\n\n // Create HTML element, parent+span: time text (e.g., 01:32:00)\n const timeContainer = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.timeContainer,\n });\n\n this.elements.thumb.time = createElement('span', {}, '00:00');\n timeContainer.appendChild(this.elements.thumb.time);\n\n this.elements.thumb.container.appendChild(timeContainer);\n\n // Inject the whole thumb\n if (is.element(this.player.elements.progress)) {\n this.player.elements.progress.appendChild(this.elements.thumb.container);\n }\n\n // Create HTML element: plyr__preview-scrubbing-container\n this.elements.scrubbing.container = createElement('div', {\n class: this.player.config.classNames.previewThumbnails.scrubbingContainer,\n });\n\n this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);\n };\n\n destroy = () => {\n if (this.elements.thumb.container) {\n this.elements.thumb.container.remove();\n }\n if (this.elements.scrubbing.container) {\n this.elements.scrubbing.container.remove();\n }\n };\n\n showImageAtCurrentTime = () => {\n if (this.mouseDown) {\n this.setScrubbingContainerSize();\n } else {\n this.setThumbContainerSizeAndPos();\n }\n\n // Find the desired thumbnail index\n // TODO: Handle a video longer than the thumbs where thumbNum is null\n const thumbNum = this.thumbnails[0].frames.findIndex(\n (frame) => this.seekTime >= frame.startTime && this.seekTime <= frame.endTime,\n );\n const hasThumb = thumbNum >= 0;\n let qualityIndex = 0;\n\n // Show the thumb container if we're not scrubbing\n if (!this.mouseDown) {\n this.toggleThumbContainer(hasThumb);\n }\n\n // No matching thumb found\n if (!hasThumb) {\n return;\n }\n\n // Check to see if we've already downloaded higher quality versions of this image\n this.thumbnails.forEach((thumbnail, index) => {\n if (this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {\n qualityIndex = index;\n }\n });\n\n // Only proceed if either thumbnum or thumbfilename has changed\n if (thumbNum !== this.showingThumb) {\n this.showingThumb = thumbNum;\n this.loadImage(qualityIndex);\n }\n };\n\n // Show the image that's currently specified in this.showingThumb\n loadImage = (qualityIndex = 0) => {\n const thumbNum = this.showingThumb;\n const thumbnail = this.thumbnails[qualityIndex];\n const { urlPrefix } = thumbnail;\n const frame = thumbnail.frames[thumbNum];\n const thumbFilename = thumbnail.frames[thumbNum].text;\n const thumbUrl = urlPrefix + thumbFilename;\n\n if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {\n // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one\n // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort\n if (this.loadingImage && this.usingSprites) {\n this.loadingImage.onload = null;\n }\n\n // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image\n // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background\n // images causes a flicker. Putting a new image over the top does not\n const previewImage = new Image();\n previewImage.src = thumbUrl;\n previewImage.dataset.index = thumbNum;\n previewImage.dataset.filename = thumbFilename;\n this.showingThumbFilename = thumbFilename;\n\n this.player.debug.log(`Loading image: ${thumbUrl}`);\n\n // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...\n previewImage.onload = () => this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);\n this.loadingImage = previewImage;\n this.removeOldImages(previewImage);\n } else {\n // Update the existing image\n this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);\n this.currentImageElement.dataset.index = thumbNum;\n this.removeOldImages(this.currentImageElement);\n }\n };\n\n showImage = (previewImage, frame, qualityIndex, thumbNum, thumbFilename, newImage = true) => {\n this.player.debug.log(\n `Showing thumb: ${thumbFilename}. num: ${thumbNum}. qual: ${qualityIndex}. newimg: ${newImage}`,\n );\n this.setImageSizeAndOffset(previewImage, frame);\n\n if (newImage) {\n this.currentImageContainer.appendChild(previewImage);\n this.currentImageElement = previewImage;\n\n if (!this.loadedImages.includes(thumbFilename)) {\n this.loadedImages.push(thumbFilename);\n }\n }\n\n // Preload images before and after the current one\n // Show higher quality of the same frame\n // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading\n this.preloadNearby(thumbNum, true)\n .then(this.preloadNearby(thumbNum, false))\n .then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));\n };\n\n // Remove all preview images that aren't the designated current image\n removeOldImages = (currentImage) => {\n // Get a list of all images, convert it from a DOM list to an array\n Array.from(this.currentImageContainer.children).forEach((image) => {\n if (image.tagName.toLowerCase() !== 'img') {\n return;\n }\n\n const removeDelay = this.usingSprites ? 500 : 1000;\n\n if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {\n // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients\n // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function\n // eslint-disable-next-line no-param-reassign\n image.dataset.deleting = true;\n\n // This has to be set before the timeout - to prevent issues switching between hover and scrub\n const { currentImageContainer } = this;\n\n setTimeout(() => {\n currentImageContainer.removeChild(image);\n this.player.debug.log(`Removing thumb: ${image.dataset.filename}`);\n }, removeDelay);\n }\n });\n };\n\n // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame\n // This will only preload the lowest quality\n preloadNearby = (thumbNum, forward = true) => {\n return new Promise((resolve) => {\n setTimeout(() => {\n const oldThumbFilename = this.thumbnails[0].frames[thumbNum].text;\n\n if (this.showingThumbFilename === oldThumbFilename) {\n // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away\n let thumbnailsClone;\n if (forward) {\n thumbnailsClone = this.thumbnails[0].frames.slice(thumbNum);\n } else {\n thumbnailsClone = this.thumbnails[0].frames.slice(0, thumbNum).reverse();\n }\n\n let foundOne = false;\n\n thumbnailsClone.forEach((frame) => {\n const newThumbFilename = frame.text;\n\n if (newThumbFilename !== oldThumbFilename) {\n // Found one with a different filename. Make sure it hasn't already been loaded on this page visit\n if (!this.loadedImages.includes(newThumbFilename)) {\n foundOne = true;\n this.player.debug.log(`Preloading thumb filename: ${newThumbFilename}`);\n\n const { urlPrefix } = this.thumbnails[0];\n const thumbURL = urlPrefix + newThumbFilename;\n const previewImage = new Image();\n previewImage.src = thumbURL;\n previewImage.onload = () => {\n this.player.debug.log(`Preloaded thumb filename: ${newThumbFilename}`);\n if (!this.loadedImages.includes(newThumbFilename)) this.loadedImages.push(newThumbFilename);\n\n // We don't resolve until the thumb is loaded\n resolve();\n };\n }\n }\n });\n\n // If there are none to preload then we want to resolve immediately\n if (!foundOne) {\n resolve();\n }\n }\n }, 300);\n });\n };\n\n // If user has been hovering current image for half a second, look for a higher quality one\n getHigherQuality = (currentQualityIndex, previewImage, frame, thumbFilename) => {\n if (currentQualityIndex < this.thumbnails.length - 1) {\n // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container\n let previewImageHeight = previewImage.naturalHeight;\n\n if (this.usingSprites) {\n previewImageHeight = frame.h;\n }\n\n if (previewImageHeight < this.thumbContainerHeight) {\n // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while\n setTimeout(() => {\n // Make sure the mouse hasn't already moved on and started hovering at another image\n if (this.showingThumbFilename === thumbFilename) {\n this.player.debug.log(`Showing higher quality thumb for: ${thumbFilename}`);\n this.loadImage(currentQualityIndex + 1);\n }\n }, 300);\n }\n }\n };\n\n get currentImageContainer() {\n if (this.mouseDown) {\n return this.elements.scrubbing.container;\n }\n\n return this.elements.thumb.imageContainer;\n }\n\n get usingSprites() {\n return Object.keys(this.thumbnails[0].frames[0]).includes('w');\n }\n\n get thumbAspectRatio() {\n if (this.usingSprites) {\n return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;\n }\n\n return this.thumbnails[0].width / this.thumbnails[0].height;\n }\n\n get thumbContainerHeight() {\n if (this.mouseDown) {\n const { height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n return height;\n }\n\n // If css is used this needs to return the css height for sprites to work (see setImageSizeAndOffset)\n if (this.sizeSpecifiedInCSS) {\n return this.elements.thumb.imageContainer.clientHeight;\n }\n\n return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);\n }\n\n get currentImageElement() {\n if (this.mouseDown) {\n return this.currentScrubbingImageElement;\n }\n\n return this.currentThumbnailImageElement;\n }\n\n set currentImageElement(element) {\n if (this.mouseDown) {\n this.currentScrubbingImageElement = element;\n } else {\n this.currentThumbnailImageElement = element;\n }\n }\n\n toggleThumbContainer = (toggle = false, clearShowing = false) => {\n const className = this.player.config.classNames.previewThumbnails.thumbContainerShown;\n this.elements.thumb.container.classList.toggle(className, toggle);\n\n if (!toggle && clearShowing) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n toggleScrubbingContainer = (toggle = false) => {\n const className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;\n this.elements.scrubbing.container.classList.toggle(className, toggle);\n\n if (!toggle) {\n this.showingThumb = null;\n this.showingThumbFilename = null;\n }\n };\n\n determineContainerAutoSizing = () => {\n if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {\n // This will prevent auto sizing in this.setThumbContainerSizeAndPos()\n this.sizeSpecifiedInCSS = true;\n }\n };\n\n // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS\n setThumbContainerSizeAndPos = () => {\n if (!this.sizeSpecifiedInCSS) {\n const thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${this.thumbContainerHeight}px`;\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight > 20 &&\n this.elements.thumb.imageContainer.clientWidth < 20\n ) {\n const thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.width = `${thumbWidth}px`;\n } else if (\n this.elements.thumb.imageContainer.clientHeight < 20 &&\n this.elements.thumb.imageContainer.clientWidth > 20\n ) {\n const thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);\n this.elements.thumb.imageContainer.style.height = `${thumbHeight}px`;\n }\n\n this.setThumbContainerPos();\n };\n\n setThumbContainerPos = () => {\n const seekbarRect = this.player.elements.progress.getBoundingClientRect();\n const plyrRect = this.player.elements.container.getBoundingClientRect();\n const { container } = this.elements.thumb;\n // Find the lowest and highest desired left-position, so we don't slide out the side of the video container\n const minVal = plyrRect.left - seekbarRect.left + 10;\n const maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10;\n // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth\n let previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;\n\n if (previewPos < minVal) {\n previewPos = minVal;\n }\n\n if (previewPos > maxVal) {\n previewPos = maxVal;\n }\n\n container.style.left = `${previewPos}px`;\n };\n\n // Can't use 100% width, in case the video is a different aspect ratio to the video container\n setScrubbingContainerSize = () => {\n const { width, height } = fitRatio(this.thumbAspectRatio, {\n width: this.player.media.clientWidth,\n height: this.player.media.clientHeight,\n });\n this.elements.scrubbing.container.style.width = `${width}px`;\n this.elements.scrubbing.container.style.height = `${height}px`;\n };\n\n // Sprites need to be offset to the correct location\n setImageSizeAndOffset = (previewImage, frame) => {\n if (!this.usingSprites) {\n return;\n }\n\n // Find difference between height and preview container height\n const multiplier = this.thumbContainerHeight / frame.h;\n\n // eslint-disable-next-line no-param-reassign\n previewImage.style.height = `${previewImage.naturalHeight * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.width = `${previewImage.naturalWidth * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.left = `-${frame.x * multiplier}px`;\n // eslint-disable-next-line no-param-reassign\n previewImage.style.top = `-${frame.y * multiplier}px`;\n };\n}\n\nexport default PreviewThumbnails;\n","// ==========================================================================\n// Plyr source update\n// ==========================================================================\n\nimport { providers } from './config/types';\nimport html5 from './html5';\nimport media from './media';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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 (Object.keys(input).includes('tracks')) {\n source.insertElements.call(this, 'track', input.tracks);\n }\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 // Load HTML5 sources\n if (this.isHTML5) {\n this.media.load();\n }\n\n // Update previewThumbnails config & reload plugin\n if (!is.empty(input.previewThumbnails)) {\n Object.assign(this.config.previewThumbnails, input.previewThumbnails);\n\n // Cleanup previewThumbnails plugin if it was loaded\n if (this.previewThumbnails && this.previewThumbnails.loaded) {\n this.previewThumbnails.destroy();\n this.previewThumbnails = null;\n }\n\n // Create new instance if it is still enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // Update the fullscreen support\n this.fullscreen.update();\n },\n true,\n );\n },\n};\n\nexport default source;\n","/**\n * Returns a number whose value is limited to the given range.\n *\n * Example: limit the output of this computation to between 0 and 255\n * (x * 255).clamp(0, 255)\n *\n * @param {Number} input\n * @param {Number} min The lower boundary of the output range\n * @param {Number} max The upper boundary of the output range\n * @returns A number in the range [min, max]\n * @type Number\n */\nexport function clamp(input = 0, min = 0, max = 255) {\n return Math.min(Math.max(input, min), max);\n}\n\nexport default { clamp };\n","// ==========================================================================\n// Plyr\n// plyr.js v3.6.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 { pip } from './config/states';\nimport { getProviderByUrl, providers, types } from './config/types';\nimport Console from './console';\nimport controls from './controls';\nimport Fullscreen from './fullscreen';\nimport html5 from './html5';\nimport Listeners from './listeners';\nimport media from './media';\nimport Ads from './plugins/ads';\nimport PreviewThumbnails from './plugins/preview-thumbnails';\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/load-sprite';\nimport { clamp } from './utils/numbers';\nimport { cloneDeep, extend } from './utils/objects';\nimport { silencePromise } from './utils/promise';\nimport { getAspectRatio, reduceAspectRatio, setAspectRatio, validateRatio } from './utils/style';\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 fullscreen: 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 // 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.youtube.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.values(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', { tabindex: 0 });\n wrap(this.media, this.elements.container);\n }\n\n // Migrate custom properties from media to container (so they work 😉)\n ui.migrateStyles.call(this);\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 fullscreen\n this.fullscreen = new Fullscreen(this);\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 ads if provided\n if (this.config.ads.enabled) {\n this.ads = new Ads(this);\n }\n\n // Autoplay if required\n if (this.isHTML5 && this.config.autoplay) {\n this.once('canplay', () => silencePromise(this.play()));\n }\n\n // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek\n this.lastSeekTime = 0;\n\n // Setup preview thumbnails if enabled\n if (this.config.previewThumbnails.enabled) {\n this.previewThumbnails = new PreviewThumbnails(this);\n }\n }\n\n // ---------------------------------------\n // API\n // ---------------------------------------\n\n /**\n * Types and provider helpers\n */\n get isHTML5() {\n return this.provider === providers.html5;\n }\n\n get isEmbed() {\n return this.isYouTube || this.isVimeo;\n }\n\n get isYouTube() {\n return this.provider === providers.youtube;\n }\n\n get isVimeo() {\n return this.provider === providers.vimeo;\n }\n\n get isVideo() {\n return this.type === types.video;\n }\n\n get isAudio() {\n return 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 // Intecept play with ads\n if (this.ads && this.ads.enabled) {\n this.ads.managerPromise.then(() => this.ads.play()).catch(() => silencePromise(this.media.play()));\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 null;\n }\n\n return 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 return this.play();\n }\n\n return this.pause();\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 -= 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 += 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 // 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 // Clamp to min/max\n const { minimumSpeed: min, maximumSpeed: max } = this;\n speed = clamp(speed, min, max);\n\n // Update config\n this.config.speed.selected = speed;\n\n // Set media speed\n setTimeout(() => {\n this.media.playbackRate = speed;\n }, 0);\n }\n\n /**\n * Get current playback speed\n */\n get speed() {\n return Number(this.media.playbackRate);\n }\n\n /**\n * Get the minimum allowed speed\n */\n get minimumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.min(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 0.5;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 0.0625;\n }\n\n /**\n * Get the maximum allowed speed\n */\n get maximumSpeed() {\n if (this.isYouTube) {\n // https://developers.google.com/youtube/iframe_api_reference#setPlaybackRate\n return Math.max(...this.options.speed);\n }\n\n if (this.isVimeo) {\n // https://github.com/vimeo/player.js/#setplaybackrateplaybackrate-number-promisenumber-rangeerrorerror\n return 2;\n }\n\n // https://stackoverflow.com/a/32320020/1191319\n return 16;\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 let updateStorage = true;\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 // Don't update storage if quality is not supported\n updateStorage = false;\n }\n\n // Update config\n config.selected = quality;\n\n // Set quality\n this.media.quality = quality;\n\n // Save to storage\n if (updateStorage) {\n this.storage.set({ quality });\n }\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 * Get a download URL (either source or custom)\n */\n get download() {\n const { download } = this.config.urls;\n\n return is.url(download) ? download : this.source;\n }\n\n /**\n * Set the download URL\n */\n set download(input) {\n if (!is.url(input)) {\n return;\n }\n\n this.config.urls.download = input;\n\n controls.setDownloadUrl.call(this);\n }\n\n /**\n * Set the poster image for a video\n * @param {String} 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') || this.media.getAttribute('data-poster');\n }\n\n /**\n * Get the current aspect ratio in use\n */\n get ratio() {\n if (!this.isVideo) {\n return null;\n }\n\n const ratio = reduceAspectRatio(getAspectRatio.call(this));\n\n return is.array(ratio) ? ratio.join(':') : ratio;\n }\n\n /**\n * Set video aspect ratio\n */\n set ratio(input) {\n if (!this.isVideo) {\n this.debug.warn('Aspect ratio can only be set for video');\n return;\n }\n\n if (!is.string(input) || !validateRatio(input)) {\n this.debug.error(`Invalid aspect ratio specified (${input})`);\n return;\n }\n\n this.config.ratio = input;\n\n setAspectRatio.call(this);\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 // 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;\n\n // Toggle based on current state\n // Safari\n if (is.function(this.media.webkitSetPresentationMode)) {\n this.media.webkitSetPresentationMode(toggle ? pip.active : pip.inactive);\n }\n\n // Chrome\n if (is.function(this.media.requestPictureInPicture)) {\n if (!this.pip && toggle) {\n this.media.requestPictureInPicture();\n } else if (this.pip && !toggle) {\n document.exitPictureInPicture();\n }\n }\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 // Safari\n if (!is.empty(this.media.webkitPresentationMode)) {\n return this.media.webkitPresentationMode === pip.active;\n }\n\n // Chrome\n return this.media === document.pictureInPictureElement;\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 // Negate the argument if not undefined since adding the class to hides the controls\n const force = typeof toggle === 'undefined' ? undefined : !toggle;\n // Apply and get updated state\n const hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force);\n\n // Close menu\n if (\n hiding &&\n is.array(this.config.controls) &&\n this.config.controls.includes('settings') &&\n !is.empty(this.config.settings)\n ) {\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 // Cancel current network requests\n html5.cancelRequests.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 // Clear timeouts\n clearTimeout(this.timers.loading);\n clearTimeout(this.timers.controls);\n clearTimeout(this.timers.resized);\n\n // Provider specific stuff\n if (this.isHTML5) {\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) => support.mime.call(this, type);\n\n /**\n * Check for support\n * @param {String} type - Player type (audio/video)\n * @param {String} provider - Provider (html5/youtube/vimeo)\n * @param {Boolean} 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.mjs b/dist/plyr.polyfilled.mjs
index 9ae08d5c..d1dc7f32 100644
--- a/dist/plyr.polyfilled.mjs
+++ b/dist/plyr.polyfilled.mjs
@@ -5015,6 +5015,46 @@ _export({ target: 'Object', stat: true, forced: FAILS_ON_PRIMITIVES }, {
}
});
+var propertyIsEnumerable = objectPropertyIsEnumerable.f;
+
+// `Object.{ entries, values }` methods implementation
+var createMethod$4 = function (TO_ENTRIES) {
+ return function (it) {
+ var O = toIndexedObject(it);
+ var keys = objectKeys(O);
+ var length = keys.length;
+ var i = 0;
+ var result = [];
+ var key;
+ while (length > i) {
+ key = keys[i++];
+ if (!descriptors || propertyIsEnumerable.call(O, key)) {
+ result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
+ }
+ }
+ return result;
+ };
+};
+
+var objectToArray = {
+ // `Object.entries` method
+ // https://tc39.github.io/ecma262/#sec-object.entries
+ entries: createMethod$4(true),
+ // `Object.values` method
+ // https://tc39.github.io/ecma262/#sec-object.values
+ values: createMethod$4(false)
+};
+
+var $values = objectToArray.values;
+
+// `Object.values` method
+// https://tc39.github.io/ecma262/#sec-object.values
+_export({ target: 'Object', stat: true }, {
+ values: function values(O) {
+ return $values(O);
+ }
+});
+
var notARegexp = function (it) {
if (isRegexp(it)) {
throw TypeError("The method doesn't accept regular expressions");
@@ -5637,36 +5677,6 @@ _export({ target: 'Number', proto: true, forced: FORCED$1 }, {
}
});
-var propertyIsEnumerable = objectPropertyIsEnumerable.f;
-
-// `Object.{ entries, values }` methods implementation
-var createMethod$4 = function (TO_ENTRIES) {
- return function (it) {
- var O = toIndexedObject(it);
- var keys = objectKeys(O);
- var length = keys.length;
- var i = 0;
- var result = [];
- var key;
- while (length > i) {
- key = keys[i++];
- if (!descriptors || propertyIsEnumerable.call(O, key)) {
- result.push(TO_ENTRIES ? [key, O[key]] : O[key]);
- }
- }
- return result;
- };
-};
-
-var objectToArray = {
- // `Object.entries` method
- // https://tc39.github.io/ecma262/#sec-object.entries
- entries: createMethod$4(true),
- // `Object.values` method
- // https://tc39.github.io/ecma262/#sec-object.values
- values: createMethod$4(false)
-};
-
var $entries = objectToArray.entries;
// `Object.entries` method
@@ -5677,16 +5687,6 @@ _export({ target: 'Object', stat: true }, {
}
});
-var $values = objectToArray.values;
-
-// `Object.values` method
-// https://tc39.github.io/ecma262/#sec-object.values
-_export({ target: 'Object', stat: true }, {
- values: function values(O) {
- return $values(O);
- }
-});
-
// `Number.isNaN` method
// https://tc39.github.io/ecma262/#sec-number.isnan
_export({ target: 'Number', stat: true }, {
@@ -6666,10 +6666,6 @@ var isNodeList$1 = function isNodeList(input) {
return instanceOf$1(input, NodeList);
};
-var isElement$1 = function isElement(input) {
- return instanceOf$1(input, Element);
-};
-
var isTextNode = function isTextNode(input) {
return getConstructor$1(input) === Text;
};
@@ -6694,6 +6690,10 @@ var isPromise = function isPromise(input) {
return instanceOf$1(input, Promise) && isFunction$1(input.then);
};
+var isElement$1 = function isElement(input) {
+ return input !== null && _typeof(input) === 'object' && input.nodeType === 1 && _typeof(input.style) === 'object' && _typeof(input.ownerDocument) === 'object';
+};
+
var isEmpty$1 = function isEmpty(input) {
return isNullOrUndefined$1(input) || (isString$1(input) || isArray$2(input) || isNodeList$1(input)) && !input.length || isObject$2(input) && !Object.keys(input).length;
};
@@ -7836,21 +7836,16 @@ var i18n = {
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 _this = this;
+ _classCallCheck(this, Storage);
- _createClass(Storage, [{
- key: "get",
- value: function get(key) {
- if (!Storage.supported || !this.enabled) {
+ _defineProperty(this, "get", function (key) {
+ if (!Storage.supported || !_this.enabled) {
return null;
}
- var store = window.localStorage.getItem(this.key);
+ var store = window.localStorage.getItem(_this.key);
if (is$1.empty(store)) {
return null;
@@ -7858,12 +7853,11 @@ var Storage = /*#__PURE__*/function () {
var json = JSON.parse(store);
return is$1.string(key) && key.length ? json[key] : json;
- }
- }, {
- key: "set",
- value: function set(object) {
+ });
+
+ _defineProperty(this, "set", function (object) {
// Bail if we don't have localStorage support or it's disabled
- if (!Storage.supported || !this.enabled) {
+ if (!Storage.supported || !_this.enabled) {
return;
} // Can only store objectst
@@ -7873,7 +7867,8 @@ var Storage = /*#__PURE__*/function () {
} // Get current storage
- var storage = this.get(); // Default to empty object
+ var storage = _this.get(); // Default to empty object
+
if (is$1.empty(storage)) {
storage = {};
@@ -7882,9 +7877,15 @@ var Storage = /*#__PURE__*/function () {
extend(storage, object); // Update storage
- window.localStorage.setItem(this.key, JSON.stringify(storage));
- }
- }], [{
+ window.localStorage.setItem(_this.key, JSON.stringify(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, null, [{
key: "supported",
get: function get() {
try {
@@ -10017,7 +10018,7 @@ var defaults$1 = {
// Sprite (for icons)
loadSprite: true,
iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',
+ iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',
// Blank video (used to prevent errors on source change)
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
// Quality default
@@ -10416,83 +10417,41 @@ var Fullscreen = /*#__PURE__*/function () {
_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
- }; // Force the use of 'full window/browser' rather than fullscreen
-
- this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
- // Checks container is an ancestor, defaults to null
-
- this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
- _this.onChange();
- }); // 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.player.listeners.proxy(event, _this.toggle, 'fullscreen');
- }); // Tap focus when in fullscreen
-
- on.call(this, this.player.elements.container, 'keydown', function (event) {
- return _this.trapFocus(event);
- }); // Update the UI
-
- this.update();
- } // Determine if native supported
-
-
- _createClass(Fullscreen, [{
- key: "onChange",
- value: function onChange() {
- if (!this.enabled) {
+ _defineProperty(this, "onChange", function () {
+ if (!_this.enabled) {
return;
} // Update toggle button
- var button = this.player.elements.buttons.fullscreen;
+ var button = _this.player.elements.buttons.fullscreen;
if (is$1.element(button)) {
- button.pressed = this.active;
+ button.pressed = _this.active;
} // Always trigger events on the plyr / media element (not a fullscreen container) and let them bubble up
- var target = this.target === this.player.media ? this.target : this.player.elements.container; // Trigger an event
+ var target = _this.target === _this.player.media ? _this.target : _this.player.elements.container; // Trigger an event
- triggerEvent.call(this.player, target, this.active ? 'enterfullscreen' : 'exitfullscreen', true);
- }
- }, {
- key: "toggleFallback",
- value: function toggleFallback() {
+ triggerEvent.call(_this.player, target, _this.active ? 'enterfullscreen' : 'exitfullscreen', true);
+ });
+
+ _defineProperty(this, "toggleFallback", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
// Store or restore scroll position
if (toggle) {
- this.scrollPosition = {
+ _this.scrollPosition = {
x: window.scrollX || 0,
y: window.scrollY || 0
};
} else {
- window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
+ 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); // Force full viewport on iPhone X+
+ toggleClass(_this.target, _this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
if (browser.isIos) {
var viewport = document.head.querySelector('meta[name="viewport"]');
@@ -10507,12 +10466,12 @@ var Fullscreen = /*#__PURE__*/function () {
var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);
if (toggle) {
- this.cleanupViewport = !hasProperty;
+ _this.cleanupViewport = !hasProperty;
if (!hasProperty) {
viewport.content += ",".concat(property);
}
- } else if (this.cleanupViewport) {
+ } else if (_this.cleanupViewport) {
viewport.content = viewport.content.split(',').filter(function (part) {
return part.trim() !== property;
}).join(',');
@@ -10520,20 +10479,18 @@ var Fullscreen = /*#__PURE__*/function () {
} // Toggle button and fire events
- this.onChange();
- } // Trap focus inside container
+ _this.onChange();
+ });
- }, {
- key: "trapFocus",
- value: function trapFocus(event) {
+ _defineProperty(this, "trapFocus", function (event) {
// Bail if iOS, not active, not the tab key
- if (browser.isIos || !this.active || event.key !== 'Tab' || event.keyCode !== 9) {
+ if (browser.isIos || !_this.active || event.key !== 'Tab' || event.keyCode !== 9) {
return;
} // Get the current focused element
var focused = document.activeElement;
- var focusable = getElements.call(this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
+ var focusable = getElements.call(_this.player, 'a[href], button:not(:disabled), input:not(:disabled), [tabindex]');
var _focusable = _slicedToArray(focusable, 1),
first = _focusable[0];
@@ -10549,15 +10506,13 @@ var Fullscreen = /*#__PURE__*/function () {
last.focus();
event.preventDefault();
}
- } // Update UI
+ });
- }, {
- key: "update",
- value: function update() {
- if (this.enabled) {
+ _defineProperty(this, "update", function () {
+ if (_this.enabled) {
var mode;
- if (this.forceFallback) {
+ if (_this.forceFallback) {
mode = 'Fallback (forced)';
} else if (Fullscreen.native) {
mode = 'Native';
@@ -10565,67 +10520,106 @@ var Fullscreen = /*#__PURE__*/function () {
mode = 'Fallback';
}
- this.player.debug.log("".concat(mode, " fullscreen enabled"));
+ _this.player.debug.log("".concat(mode, " fullscreen enabled"));
} else {
- this.player.debug.log('Fullscreen not supported and fallback disabled');
+ _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
+ toggleClass(_this.player.elements.container, _this.player.config.classNames.fullscreen.enabled, _this.enabled);
+ });
- }, {
- key: "enter",
- value: function enter() {
- if (!this.enabled) {
+ _defineProperty(this, "enter", function () {
+ 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 || this.forceFallback) {
- this.toggleFallback(true);
- } else if (!this.prefix) {
- this.target.requestFullscreen({
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ if (_this.player.isVimeo) {
+ _this.player.embed.requestFullscreen();
+ } else {
+ _this.target.webkitEnterFullscreen();
+ }
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(true);
+ } else if (!_this.prefix) {
+ _this.target.requestFullscreen({
navigationUI: 'hide'
});
- } else if (!is$1.empty(this.prefix)) {
- this.target["".concat(this.prefix, "Request").concat(this.property)]();
+ } 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) {
+ _defineProperty(this, "exit", function () {
+ if (!_this.enabled) {
return;
} // iOS native fullscreen
- if (browser.isIos && this.player.config.fullscreen.iosNative) {
- this.target.webkitExitFullscreen();
- silencePromise(this.player.play());
- } else if (!Fullscreen.native || this.forceFallback) {
- this.toggleFallback(false);
- } else if (!this.prefix) {
+ if (browser.isIos && _this.player.config.fullscreen.iosNative) {
+ _this.target.webkitExitFullscreen();
+
+ silencePromise(_this.player.play());
+ } else if (!Fullscreen.native || _this.forceFallback) {
+ _this.toggleFallback(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)]();
+ } 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();
+ _defineProperty(this, "toggle", function () {
+ if (!_this.active) {
+ _this.enter();
} else {
- this.exit();
+ _this.exit();
}
- }
- }, {
+ });
+
+ // 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
+ }; // Force the use of 'full window/browser' rather than fullscreen
+
+ this.forceFallback = player.config.fullscreen.fallback === 'force'; // Get the fullscreen element
+ // Checks container is an ancestor, defaults to null
+
+ this.player.elements.fullscreen = player.config.fullscreen.container && closest(this.player.elements.container, player.config.fullscreen.container); // 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??
+ _this.onChange();
+ }); // 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.player.listeners.proxy(event, _this.toggle, 'fullscreen');
+ }); // Tap focus when in fullscreen
+
+ on.call(this, this.player.elements.container, 'keydown', function (event) {
+ return _this.trapFocus(event);
+ }); // Update the UI
+
+ this.update(); // this.toggle = this.toggle.bind(this);
+ } // Determine if native supported
+
+
+ _createClass(Fullscreen, [{
key: "usingNative",
// If we're actually using native
get: function get() {
@@ -10969,182 +10963,23 @@ var ui = {
};
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$1(focused, editable)) {
- return;
- }
-
- if (event.which === 32 && matches$1(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) {
- silencePromise(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;
- } // Escape is handle natively when in full screen
- // So we only need to worry about non native
-
-
- if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
- player.fullscreen.toggle();
- } // Store last code for next cycle
-
-
- this.lastKey = code;
- } else {
- this.lastKey = null;
- }
- } // Toggle menu
+ function Listeners(_player) {
+ var _this = this;
- }, {
- key: "toggleMenu",
- value: function toggleMenu(event) {
- controls.toggleMenu.call(this.player, event);
- } // Device is touch enabled
+ _classCallCheck(this, Listeners);
- }, {
- key: "firstTouch",
- value: function firstTouch() {
- var player = this.player;
+ _defineProperty(this, "firstTouch", function () {
+ 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;
+ });
+
+ _defineProperty(this, "setTabFocus", function (event) {
+ var player = _this.player;
var elements = player.elements;
- clearTimeout(this.focusTimer); // Ignore any key other than tab
+ clearTimeout(_this.focusTimer); // Ignore any key other than tab
if (event.type === 'keydown' && event.which !== 9) {
return;
@@ -11152,7 +10987,7 @@ var Listeners = /*#__PURE__*/function () {
if (event.type === 'keydown') {
- this.lastKeyDown = event.timeStamp;
+ _this.lastKeyDown = event.timeStamp;
} // Remove current classes
@@ -11163,7 +10998,7 @@ var Listeners = /*#__PURE__*/function () {
}; // 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
+ var wasKeyDown = event.timeStamp - _this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
if (event.type === 'focus' && !wasKeyDown) {
return;
@@ -11174,7 +11009,7 @@ var Listeners = /*#__PURE__*/function () {
// This event fires before the focusin event
if (event.type !== 'focusout') {
- this.focusTimer = setTimeout(function () {
+ _this.focusTimer = setTimeout(function () {
var focused = document.activeElement; // Ignore if current focus element isn't inside the player
if (!elements.container.contains(focused)) {
@@ -11184,36 +11019,32 @@ var Listeners = /*#__PURE__*/function () {
toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
}, 10);
}
- } // Global window & document listeners
+ });
- }, {
- key: "global",
- value: function global() {
+ _defineProperty(this, "global", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
- var player = this.player; // Keyboard shortcuts
+ var player = _this.player; // Keyboard shortcuts
if (player.config.keyboard.global) {
- toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
+ 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
+ toggleListener.call(player, document.body, 'click', _this.toggleMenu, toggle); // Detect touch by events
- once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
+ once.call(player, document.body, 'touchstart', _this.firstTouch); // Tab focus detection
- toggleListener.call(player, document.body, 'keydown focus blur focusout', this.setTabFocus, toggle, false, true);
- } // Container listeners
+ toggleListener.call(player, document.body, 'keydown focus blur focusout', _this.setTabFocus, toggle, false, true);
+ });
- }, {
- key: "container",
- value: function container() {
- var player = this.player;
+ _defineProperty(this, "container", function () {
+ var player = _this.player;
var config = player.config,
elements = player.elements,
timers = player.timers; // Keyboard shortcuts
if (!config.keyboard.global && config.keyboard.focused) {
- on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
+ on.call(player, elements.container, 'keydown keyup', _this.handleKey, false);
} // Toggle controls on mouse events and entering fullscreen
@@ -11318,14 +11149,10 @@ var Listeners = /*#__PURE__*/function () {
}
}
});
- } // Listen for media events
-
- }, {
- key: "media",
- value: function media() {
- var _this = this;
+ });
- var player = this.player;
+ _defineProperty(this, "media", function () {
+ var player = _this.player;
var elements = player.elements; // Time change on media
on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
@@ -11417,7 +11244,6 @@ var Listeners = /*#__PURE__*/function () {
// Update UI
controls.updateSetting.call(player, 'speed'); // Save to storage
-
player.storage.set({
speed: player.speed
});
@@ -11444,12 +11270,10 @@ var Listeners = /*#__PURE__*/function () {
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;
+ _defineProperty(this, "proxy", function (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
@@ -11462,89 +11286,90 @@ var Listeners = /*#__PURE__*/function () {
if (returned !== false && is$1.function(defaultHandler)) {
defaultHandler.call(player, event);
}
- } // Trigger custom and default handlers
-
- }, {
- key: "bind",
- value: function bind(element, type, defaultHandler, customHandlerKey) {
- var _this2 = this;
+ });
+ _defineProperty(this, "bind", function (element, type, defaultHandler, customHandlerKey) {
var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
- var player = this.player;
+ var player = _this.player;
var customHandler = player.config.listeners[customHandlerKey];
var hasCustomHandler = is$1.function(customHandler);
on.call(player, element, type, function (event) {
- return _this2.proxy(event, defaultHandler, customHandlerKey);
+ return _this.proxy(event, defaultHandler, customHandlerKey);
}, passive && !hasCustomHandler);
- } // Listen for control events
-
- }, {
- key: "controls",
- value: function controls$1() {
- var _this3 = this;
+ });
- var player = this.player;
+ _defineProperty(this, "controls", function () {
+ 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) {
- _this3.bind(button, 'click', function () {
+ _this.bind(button, 'click', function () {
silencePromise(player.togglePlay());
}, 'play');
});
} // Pause
- this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+ _this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
+
- this.bind(elements.buttons.rewind, 'click', function () {
+ _this.bind(elements.buttons.rewind, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after rewind
player.lastSeekTime = Date.now();
player.rewind();
}, 'rewind'); // Rewind
- this.bind(elements.buttons.fastForward, 'click', function () {
+
+ _this.bind(elements.buttons.fastForward, 'click', function () {
// Record seek time so we can prevent hiding controls for a few seconds after fast forward
player.lastSeekTime = Date.now();
player.forward();
}, 'fastForward'); // Mute toggle
- this.bind(elements.buttons.mute, 'click', function () {
+
+ _this.bind(elements.buttons.mute, 'click', function () {
player.muted = !player.muted;
}, 'mute'); // Captions toggle
- this.bind(elements.buttons.captions, 'click', function () {
+
+ _this.bind(elements.buttons.captions, 'click', function () {
return player.toggleCaptions();
}); // Download
- this.bind(elements.buttons.download, 'click', function () {
+
+ _this.bind(elements.buttons.download, 'click', function () {
triggerEvent.call(player, player.media, 'download');
}, 'download'); // Fullscreen toggle
- this.bind(elements.buttons.fullscreen, 'click', function () {
+
+ _this.bind(elements.buttons.fullscreen, 'click', function () {
player.fullscreen.toggle();
}, 'fullscreen'); // Picture-in-Picture
- this.bind(elements.buttons.pip, 'click', function () {
+
+ _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) {
+ _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();
event.preventDefault();
-
controls.toggleMenu.call(player, event);
}, null, false); // Can't be passive as we're preventing default
// 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) {
+
+ _this.bind(elements.buttons.settings, 'keyup', function (event) {
var code = event.which; // We only care about space and return
if (![13, 32].includes(code)) {
@@ -11554,7 +11379,6 @@ var Listeners = /*#__PURE__*/function () {
if (code === 13) {
controls.focusFirstMenuItem.call(player, null, true);
-
return;
} // Prevent scroll
@@ -11567,19 +11391,22 @@ var Listeners = /*#__PURE__*/function () {
}, null, false // Can't be passive as we're preventing default
); // Escape closes menu
- this.bind(elements.settings.menu, 'keydown', function (event) {
+
+ _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) {
+
+ _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) {
+
+ _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';
@@ -11606,17 +11433,18 @@ var Listeners = /*#__PURE__*/function () {
// 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 _this3.bind(input, inputEvent, function (event) {
+ return _this.bind(input, inputEvent, function (event) {
return repaint(event.target);
});
});
} // Seek
- this.bind(elements.inputs.seek, inputEvent, function (event) {
+ _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');
@@ -11629,12 +11457,14 @@ var Listeners = /*#__PURE__*/function () {
player.currentTime = seekTo / seek.max * player.duration;
}, 'seek'); // Seek tooltip
- this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
+
+ _this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
return controls.updateSeekTooltip.call(player, event);
}); // Preview thumbnails plugin
// TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this
- this.bind(elements.progress, 'mousemove touchmove', function (event) {
+
+ _this.bind(elements.progress, 'mousemove touchmove', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -11642,7 +11472,8 @@ var Listeners = /*#__PURE__*/function () {
}
}); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
- this.bind(elements.progress, 'mouseleave touchend click', function () {
+
+ _this.bind(elements.progress, 'mouseleave touchend click', function () {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -11650,14 +11481,16 @@ var Listeners = /*#__PURE__*/function () {
}
}); // Show scrubbing preview
- this.bind(elements.progress, 'mousedown touchstart', function (event) {
+
+ _this.bind(elements.progress, 'mousedown touchstart', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
previewThumbnails.startScrubbing(event);
}
});
- this.bind(elements.progress, 'mouseup touchend', function (event) {
+
+ _this.bind(elements.progress, 'mouseup touchend', function (event) {
var previewThumbnails = player.previewThumbnails;
if (previewThumbnails && previewThumbnails.loaded) {
@@ -11665,9 +11498,10 @@ var Listeners = /*#__PURE__*/function () {
}
}); // Polyfill for lower fill in <input type="range"> for webkit
+
if (browser.isWebkit) {
Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
- _this3.bind(element, 'input', function (event) {
+ _this.bind(element, 'input', function (event) {
return controls.updateRangeFill.call(player, event.target);
});
});
@@ -11676,43 +11510,45 @@ var Listeners = /*#__PURE__*/function () {
if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
- this.bind(elements.display.currentTime, 'click', function () {
+ _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) {
+ _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) {
+
+ _this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
elements.controls.hover = !player.touch && event.type === 'mouseenter';
}); // Also update controls.hover state for any non-player children of fullscreen element (as above)
+
if (elements.fullscreen) {
Array.from(elements.fullscreen.children).filter(function (c) {
return !c.contains(elements.container);
}).forEach(function (child) {
- _this3.bind(child, 'mouseenter mouseleave', function (event) {
+ _this.bind(child, '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) {
+ _this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
}); // Show controls when they receive focus (e.g., when using keyboard tab key)
- this.bind(elements.controls, 'focusin', function () {
+
+ _this.bind(elements.controls, 'focusin', function () {
var config = player.config,
timers = player.timers; // Skip transition to prevent focus from scrolling the parent element
@@ -11724,7 +11560,7 @@ var Listeners = /*#__PURE__*/function () {
toggleClass(elements.controls, config.classNames.noTransition, false);
}, 0); // Delay a little more for mouse users
- var delay = _this3.touch ? 3000 : 4000; // Clear timer
+ var delay = _this.touch ? 3000 : 4000; // Clear timer
clearTimeout(timers.controls); // Hide again after delay
@@ -11733,7 +11569,8 @@ var Listeners = /*#__PURE__*/function () {
}, delay);
}); // Mouse wheel for volume
- this.bind(elements.inputs.volume, 'wheel', function (event) {
+
+ _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
@@ -11756,7 +11593,166 @@ var Listeners = /*#__PURE__*/function () {
event.preventDefault();
}
}, 'volume', false);
- }
+ });
+
+ 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$1(focused, editable)) {
+ return;
+ }
+
+ if (event.which === 32 && matches$1(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) {
+ silencePromise(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;
+ } // Escape is handle natively when in full screen
+ // So we only need to worry about non native
+
+
+ if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
+ 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
+
}]);
return Listeners;
@@ -12210,7 +12206,7 @@ var vimeo = {
var src = format(player.config.urls.vimeo.iframe, id, params);
iframe.setAttribute('src', src);
iframe.setAttribute('allowfullscreen', '');
- iframe.setAttribute('allow', 'autoplay,fullscreen,picture-in-picture'); // Set the referrer policy if required
+ iframe.setAttribute('allow', ['autoplay', 'fullscreen', 'picture-in-picture'].join('; ')); // Set the referrer policy if required
if (!is$1.empty(referrerPolicy)) {
iframe.setAttribute('referrerPolicy', referrerPolicy);
@@ -12966,135 +12962,84 @@ var Ads = /*#__PURE__*/function () {
_classCallCheck(this, Ads);
- this.player = player;
- this.config = player.config.ads;
- 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) {
+ _defineProperty(this, "load", function () {
+ if (!_this.enabled) {
return;
} // 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();
+ loadScript(_this.player.config.urls.googleIMA.sdk).then(function () {
+ _this.ready();
}).catch(function () {
// Script failed to load or is blocked
- _this2.trigger('error', new Error('Google IMA SDK failed to load'));
+ _this.trigger('error', new Error('Google IMA SDK failed to load'));
});
} else {
- this.ready();
+ _this.ready();
}
- }
- /**
- * Get the ads instance ready
- */
-
- }, {
- key: "ready",
- value: function ready() {
- var _this3 = this;
+ });
+ _defineProperty(this, "ready", function () {
// Double check we're enabled
- if (!this.enabled) {
- destroy(this);
+ if (!_this.enabled) {
+ destroy(_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.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
+
- this.managerPromise.then(function () {
- _this3.clearSafetyTimer('onAdsManagerLoaded()');
+ _this.managerPromise.then(function () {
+ _this.clearSafetyTimer('onAdsManagerLoaded()');
}); // Set listeners on the Plyr instance
- this.listeners(); // Setup the IMA SDK
- this.setupIMA();
- } // Build the tag URL
+ _this.listeners(); // Setup the IMA SDK
- }, {
- 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() {
- var _this4 = this;
+ _this.setupIMA();
+ });
+ _defineProperty(this, "setupIMA", function () {
// Create the container for our advertisements
- this.elements.container = createElement('div', {
- class: this.player.config.classNames.ads
+ _this.elements.container = createElement('div', {
+ class: _this.player.config.classNames.ads
});
- this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
+
+ _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); // Set playback for iOS10+
+ google.ima.settings.setLocale(_this.player.config.ads.language); // Set playback for iOS10+
- google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
+ google.ima.settings.setDisableCustomPlaybackForIOS10Plus(_this.player.config.playsinline); // 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, this.player.media); // Create ads loader
+ _this.elements.displayContainer = new google.ima.AdDisplayContainer(_this.elements.container, _this.player.media); // Create ads loader
- this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
+ _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);
+ _this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
+ return _this.onAdsManagerLoaded(event);
}, false);
- this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this4.onAdError(error);
+
+ _this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}, false); // Request video ads to be pre-loaded
- this.requestAds();
- }
- /**
- * Request advertisements
- */
- }, {
- key: "requestAds",
- value: function requestAds() {
- var container = this.player.elements.container;
+ _this.requestAds();
+ });
+
+ _defineProperty(this, "requestAds", function () {
+ var container = _this.player.elements.container;
try {
// Request video ads
var request = new google.ima.AdsRequest();
- request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
+ 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;
@@ -13104,51 +13049,38 @@ var Ads = /*#__PURE__*/function () {
request.forceNonLinearFullSlot = false; // Mute based on current state
- request.setAdWillPlayMuted(!this.player.muted);
- this.loader.requestAds(request);
+ request.setAdWillPlayMuted(!_this.player.muted);
+
+ _this.loader.requestAds(request);
} catch (e) {
- this.onAdError(e);
+ _this.onAdError(e);
}
- }
- /**
- * Update the ad countdown
- * @param {Boolean} start
- */
-
- }, {
- key: "pollCountdown",
- value: function pollCountdown() {
- var _this5 = this;
+ });
+ _defineProperty(this, "pollCountdown", function () {
var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
if (!start) {
- clearInterval(this.countdownTimer);
- this.elements.container.removeAttribute('data-badge-text');
+ 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);
+ var time = formatTime(Math.max(_this.manager.getRemainingTime(), 0));
+ var label = "".concat(i18n.get('advertisement', _this.player.config), " - ").concat(time);
- _this5.elements.container.setAttribute('data-badge-text', label);
+ _this.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;
+ _this.countdownTimer = setInterval(update, 100);
+ });
+ _defineProperty(this, "onAdsManagerLoaded", function (event) {
// Load could occur after a source change (race condition)
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
} // Get the ads manager
@@ -13159,38 +13091,36 @@ var Ads = /*#__PURE__*/function () {
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.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 listeners to the required events
+ _this.cuePoints = _this.manager.getCuePoints(); // Add listeners to the required events
// Advertisement error events
- this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
- return _this6.onAdError(error);
+ _this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
+ return _this.onAdError(error);
}); // Advertisement regular events
+
Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
- _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
- return _this6.onAdEvent(e);
+ _this.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
+ return _this.onAdEvent(e);
});
}); // Resolve our adsManager
- this.trigger('loaded');
- }
- }, {
- key: "addCuePoints",
- value: function addCuePoints() {
- var _this7 = this;
+ _this.trigger('loaded');
+ });
+ _defineProperty(this, "addCuePoints", function () {
// 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 < _this7.player.duration) {
- var seekElement = _this7.player.elements.progress;
+ if (!is$1.empty(_this.cuePoints)) {
+ _this.cuePoints.forEach(function (cuePoint) {
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this.player.duration) {
+ var seekElement = _this.player.elements.progress;
if (is$1.element(seekElement)) {
- var cuePercentage = 100 / _this7.player.duration * cuePoint;
+ var cuePercentage = 100 / _this.player.duration * cuePoint;
var cue = createElement('span', {
- class: _this7.player.config.classNames.cues
+ class: _this.player.config.classNames.cues
});
cue.style.left = "".concat(cuePercentage.toString(), "%");
seekElement.appendChild(cue);
@@ -13198,27 +13128,17 @@ var Ads = /*#__PURE__*/function () {
}
});
}
- }
- /**
- * 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 _this8 = this;
+ });
- var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
+ _defineProperty(this, "onAdEvent", function (event) {
+ 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();
var adData = event.getAdData(); // Proxy event
var dispatchEvent = function dispatchEvent(type) {
- triggerEvent.call(_this8.player, _this8.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
+ triggerEvent.call(_this.player, _this.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
}; // Bubble the event
@@ -13228,9 +13148,10 @@ var Ads = /*#__PURE__*/function () {
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'); // Start countdown
+ _this.trigger('loaded'); // Start countdown
- this.pollCountdown(true);
+
+ _this.pollCountdown(true);
if (!ad.isLinear()) {
// Position AdDisplayContainer correctly for overlay
@@ -13244,7 +13165,8 @@ var Ads = /*#__PURE__*/function () {
case google.ima.AdEvent.Type.STARTED:
// Set volume to match player
- this.manager.setVolume(this.player.volume);
+ _this.manager.setVolume(_this.player.volume);
+
break;
case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
@@ -13271,11 +13193,11 @@ var Ads = /*#__PURE__*/function () {
// };
// 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
- if (this.player.ended) {
- this.loadAds();
+ if (_this.player.ended) {
+ _this.loadAds();
} else {
// The SDK won't allow new ads to be called without receiving a contentComplete()
- this.loader.contentComplete();
+ _this.loader.contentComplete();
}
break;
@@ -13284,7 +13206,8 @@ var Ads = /*#__PURE__*/function () {
// 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
- this.pauseContent();
+ _this.pauseContent();
+
break;
case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
@@ -13292,275 +13215,237 @@ var Ads = /*#__PURE__*/function () {
// 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
- this.pollCountdown();
- this.resumeContent();
+ _this.pollCountdown();
+
+ _this.resumeContent();
+
break;
case google.ima.AdEvent.Type.LOG:
if (adData.adError) {
- this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
+ _this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
}
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
- */
+ _defineProperty(this, "onAdError", function (event) {
+ _this.cancel();
- }, {
- key: "listeners",
- value: function listeners() {
- var _this9 = this;
+ _this.player.debug.warn('Ads error', event);
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "listeners", function () {
+ var container = _this.player.elements.container;
var time;
- this.player.on('canplay', function () {
- _this9.addCuePoints();
+
+ _this.player.on('canplay', function () {
+ _this.addCuePoints();
});
- this.player.on('ended', function () {
- _this9.loader.contentComplete();
+
+ _this.player.on('ended', function () {
+ _this.loader.contentComplete();
});
- this.player.on('timeupdate', function () {
- time = _this9.player.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ time = _this.player.currentTime;
});
- this.player.on('seeked', function () {
- var seekedTime = _this9.player.currentTime;
- if (is$1.empty(_this9.cuePoints)) {
+ _this.player.on('seeked', function () {
+ var seekedTime = _this.player.currentTime;
+
+ if (is$1.empty(_this.cuePoints)) {
return;
}
- _this9.cuePoints.forEach(function (cuePoint, index) {
+ _this.cuePoints.forEach(function (cuePoint, index) {
if (time < cuePoint && cuePoint < seekedTime) {
- _this9.manager.discardAdBreak();
+ _this.manager.discardAdBreak();
- _this9.cuePoints.splice(index, 1);
+ _this.cuePoints.splice(index, 1);
}
});
}); // Listen to the resizing of the window. And resize ad accordingly
// TODO: eventually implement ResizeObserver
+
window.addEventListener('resize', function () {
- if (_this9.manager) {
- _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
+ if (_this.manager) {
+ _this.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
}
});
- }
- /**
- * Initialize the adsManager and start playing advertisements
- */
-
- }, {
- key: "play",
- value: function play() {
- var _this10 = this;
+ });
- var container = this.player.elements.container;
+ _defineProperty(this, "play", function () {
+ var container = _this.player.elements.container;
- if (!this.managerPromise) {
- this.resumeContent();
+ if (!_this.managerPromise) {
+ _this.resumeContent();
} // Play the requested advertisement whenever the adsManager is ready
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Set volume to match player
- _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices
+ _this.manager.setVolume(_this.player.volume); // Initialize the container. Must be done via a user action on mobile devices
- _this10.elements.displayContainer.initialize();
+ _this.elements.displayContainer.initialize();
try {
- if (!_this10.initialized) {
+ if (!_this.initialized) {
// Initialize the ads manager. Ad rules playlist will start at this time
- _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
+ _this.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
- _this10.manager.start();
+ _this.manager.start();
}
- _this10.initialized = true;
+ _this.initialized = true;
} catch (adError) {
// An error may be thrown if there was a problem with the
// VAST response
- _this10.onAdError(adError);
+ _this.onAdError(adError);
}
}).catch(function () {});
- }
- /**
- * Resume our video
- */
+ });
- }, {
- key: "resumeContent",
- value: function resumeContent() {
+ _defineProperty(this, "resumeContent", function () {
// Hide the advertisement container
- this.elements.container.style.zIndex = ''; // Ad is stopped
+ _this.elements.container.style.zIndex = ''; // Ad is stopped
- this.playing = false; // Play video
+ _this.playing = false; // Play video
- silencePromise(this.player.media.play());
- }
- /**
- * Pause our video
- */
+ silencePromise(_this.player.media.play());
+ });
- }, {
- key: "pauseContent",
- value: function pauseContent() {
+ _defineProperty(this, "pauseContent", function () {
// Show the advertisement container
- this.elements.container.style.zIndex = 3; // Ad is playing
+ _this.elements.container.style.zIndex = 3; // Ad is playing
- this.playing = true; // Pause our video.
+ _this.playing = true; // Pause our video.
- this.player.media.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
- */
+ _this.player.media.pause();
+ });
- }, {
- key: "cancel",
- value: function cancel() {
+ _defineProperty(this, "cancel", function () {
// Pause our video
- if (this.initialized) {
- this.resumeContent();
+ if (_this.initialized) {
+ _this.resumeContent();
} // Tell our instance that we're done for now
- this.trigger('error'); // Re-create our adsManager
+ _this.trigger('error'); // Re-create our adsManager
- this.loadAds();
- }
- /**
- * Re-create our adsManager
- */
- }, {
- key: "loadAds",
- value: function loadAds() {
- var _this11 = this;
+ _this.loadAds();
+ });
+ _defineProperty(this, "loadAds", function () {
// Tell our adsManager to go bye bye
- this.managerPromise.then(function () {
+ _this.managerPromise.then(function () {
// Destroy our adsManager
- if (_this11.manager) {
- _this11.manager.destroy();
+ if (_this.manager) {
+ _this.manager.destroy();
} // Re-set our adsManager promises
- _this11.managerPromise = new Promise(function (resolve) {
- _this11.on('loaded', resolve);
+ _this.managerPromise = new Promise(function (resolve) {
+ _this.on('loaded', resolve);
- _this11.player.debug.log(_this11.manager);
+ _this.player.debug.log(_this.manager);
}); // Now that the manager has been destroyed set it to also be un-initialized
- _this11.initialized = false; // Now request some new advertisements
+ _this.initialized = false; // Now request some new advertisements
- _this11.requestAds();
+ _this.requestAds();
}).catch(function () {});
- }
- /**
- * Handles callbacks after an ad event was invoked
- * @param {String} event - Event type
- */
-
- }, {
- key: "trigger",
- value: function trigger(event) {
- var _this12 = this;
+ });
+ _defineProperty(this, "trigger", function (event) {
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];
+ var handlers = _this.events[event];
if (is$1.array(handlers)) {
handlers.forEach(function (handler) {
if (is$1.function(handler)) {
- handler.apply(_this12, args);
+ handler.apply(_this, args);
}
});
}
- }
- /**
- * Add event listeners
- * @param {String} event - Event type
- * @param {Function} callback - Callback for when event occurs
- * @return {Ads}
- */
+ });
- }, {
- key: "on",
- value: function on(event, callback) {
- if (!is$1.array(this.events[event])) {
- this.events[event] = [];
+ _defineProperty(this, "on", function (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
- */
+ _this.events[event].push(callback);
- }, {
- key: "startSafetyTimer",
- value: function startSafetyTimer(time, from) {
- var _this13 = this;
+ return _this;
+ });
- this.player.debug.log("Safety timer invoked from: ".concat(from));
- this.safetyTimer = setTimeout(function () {
- _this13.cancel();
+ _defineProperty(this, "startSafetyTimer", function (time, from) {
+ _this.player.debug.log("Safety timer invoked from: ".concat(from));
- _this13.clearSafetyTimer('startSafetyTimer()');
+ _this.safetyTimer = setTimeout(function () {
+ _this.cancel();
+
+ _this.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;
+ _defineProperty(this, "clearSafetyTimer", function (from) {
+ if (!is$1.nullOrUndefined(_this.safetyTimer)) {
+ _this.player.debug.log("Safety timer cleared from: ".concat(from));
+
+ clearTimeout(_this.safetyTimer);
+ _this.safetyTimer = null;
}
- }
- }, {
+ });
+
+ this.player = player;
+ this.config = player.config.ads;
+ 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: "enabled",
get: function get() {
var config = this.config;
return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));
}
+ /**
+ * Load the IMA SDK
+ */
+
}, {
key: "tagUrl",
+ // Build the tag URL
get: function get() {
var config = this.config;
@@ -13580,6 +13465,15 @@ var Ads = /*#__PURE__*/function () {
var base = 'https://go.aniview.com/api/adserver6/vast/';
return "".concat(base, "?").concat(buildUrlParams(params));
}
+ /**
+ * 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.
+ */
+
}]);
return Ads;
@@ -13713,36 +13607,21 @@ var PreviewThumbnails = /*#__PURE__*/function () {
* @return {PreviewThumbnails}
*/
function PreviewThumbnails(player) {
- _classCallCheck(this, PreviewThumbnails);
-
- this.player = player;
- this.thumbnails = [];
- this.loaded = false;
- this.lastMouseMoveTime = Date.now();
- this.mouseDown = false;
- this.loadedImages = [];
- this.elements = {
- thumb: {},
- scrubbing: {}
- };
- this.load();
- }
+ var _this = this;
- _createClass(PreviewThumbnails, [{
- key: "load",
- value: function load() {
- var _this = this;
+ _classCallCheck(this, PreviewThumbnails);
+ _defineProperty(this, "load", function () {
// Toggle the regular seek tooltip
- if (this.player.elements.display.seekTooltip) {
- this.player.elements.display.seekTooltip.hidden = this.enabled;
+ if (_this.player.elements.display.seekTooltip) {
+ _this.player.elements.display.seekTooltip.hidden = _this.enabled;
}
- if (!this.enabled) {
+ if (!_this.enabled) {
return;
}
- this.getThumbnails().then(function () {
+ _this.getThumbnails().then(function () {
if (!_this.enabled) {
return;
} // Render DOM elements
@@ -13755,15 +13634,11 @@ var PreviewThumbnails = /*#__PURE__*/function () {
_this.loaded = true;
});
- } // Download VTT files and parse them
-
- }, {
- key: "getThumbnails",
- value: function getThumbnails() {
- var _this2 = this;
+ });
+ _defineProperty(this, "getThumbnails", function () {
return new Promise(function (resolve) {
- var src = _this2.player.config.previewThumbnails.src;
+ var src = _this.player.config.previewThumbnails.src;
if (is$1.empty(src)) {
throw new Error('Missing previewThumbnails.src config attribute');
@@ -13772,11 +13647,11 @@ var PreviewThumbnails = /*#__PURE__*/function () {
var sortAndResolve = function sortAndResolve() {
// Sort smallest to biggest (e.g., [120p, 480p, 1080p])
- _this2.thumbnails.sort(function (x, y) {
+ _this.thumbnails.sort(function (x, y) {
return x.height - y.height;
});
- _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
+ _this.player.debug.log('Preview thumbnails', _this.thumbnails);
resolve();
}; // Via callback()
@@ -13784,7 +13659,7 @@ var PreviewThumbnails = /*#__PURE__*/function () {
if (is$1.function(src)) {
src(function (thumbnails) {
- _this2.thumbnails = thumbnails;
+ _this.thumbnails = thumbnails;
sortAndResolve();
});
} // VTT urls
@@ -13793,19 +13668,15 @@ var PreviewThumbnails = /*#__PURE__*/function () {
var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
var promises = urls.map(function (u) {
- return _this2.getThumbnail(u);
+ return _this.getThumbnail(u);
}); // Resolve
Promise.all(promises).then(sortAndResolve);
}
});
- } // Process individual VTT file
-
- }, {
- key: "getThumbnail",
- value: function getThumbnail(url) {
- var _this3 = this;
+ });
+ _defineProperty(this, "getThumbnail", function (url) {
return new Promise(function (resolve) {
fetch(url).then(function (response) {
var thumbnail = {
@@ -13827,7 +13698,7 @@ var PreviewThumbnails = /*#__PURE__*/function () {
thumbnail.height = tempImage.naturalHeight;
thumbnail.width = tempImage.naturalWidth;
- _this3.thumbnails.push(thumbnail);
+ _this.thumbnails.push(thumbnail);
resolve();
};
@@ -13835,11 +13706,10 @@ var PreviewThumbnails = /*#__PURE__*/function () {
tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;
});
});
- }
- }, {
- key: "startMove",
- value: function startMove(event) {
- if (!this.loaded) {
+ });
+
+ _defineProperty(this, "startMove", function (event) {
+ if (!_this.loaded) {
return;
}
@@ -13848,163 +13718,153 @@ var PreviewThumbnails = /*#__PURE__*/function () {
} // Wait until media has a duration
- if (!this.player.media.duration) {
+ if (!_this.player.media.duration) {
return;
}
if (event.type === 'touchmove') {
// Calculate seek hover position as approx video seconds
- this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
+ _this.seekTime = _this.player.media.duration * (_this.player.elements.inputs.seek.value / 100);
} else {
// Calculate seek hover position as approx video seconds
- var clientRect = this.player.elements.progress.getBoundingClientRect();
+ var clientRect = _this.player.elements.progress.getBoundingClientRect();
+
var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);
- this.seekTime = this.player.media.duration * (percentage / 100);
+ _this.seekTime = _this.player.media.duration * (percentage / 100);
- if (this.seekTime < 0) {
+ if (_this.seekTime < 0) {
// The mousemove fires for 10+px out to the left
- this.seekTime = 0;
+ _this.seekTime = 0;
}
- if (this.seekTime > this.player.media.duration - 1) {
+ if (_this.seekTime > _this.player.media.duration - 1) {
// Took 1 second off the duration for safety, because different players can disagree on the real duration of a video
- this.seekTime = this.player.media.duration - 1;
+ _this.seekTime = _this.player.media.duration - 1;
}
- this.mousePosX = event.pageX; // Set time text inside image container
+ _this.mousePosX = event.pageX; // Set time text inside image container
- this.elements.thumb.time.innerText = formatTime(this.seekTime);
+ _this.elements.thumb.time.innerText = formatTime(_this.seekTime);
} // Download and show image
- this.showImageAtCurrentTime();
- }
- }, {
- key: "endMove",
- value: function endMove() {
- this.toggleThumbContainer(false, true);
- }
- }, {
- key: "startScrubbing",
- value: function startScrubbing(event) {
+ _this.showImageAtCurrentTime();
+ });
+
+ _defineProperty(this, "endMove", function () {
+ _this.toggleThumbContainer(false, true);
+ });
+
+ _defineProperty(this, "startScrubbing", function (event) {
// Only act on left mouse button (0), or touch device (event.button does not exist or is false)
if (is$1.nullOrUndefined(event.button) || event.button === false || event.button === 0) {
- this.mouseDown = true; // Wait until media has a duration
+ _this.mouseDown = true; // Wait until media has a duration
+
+ if (_this.player.media.duration) {
+ _this.toggleScrubbingContainer(true);
- if (this.player.media.duration) {
- this.toggleScrubbingContainer(true);
- this.toggleThumbContainer(false, true); // Download and show image
+ _this.toggleThumbContainer(false, true); // Download and show image
- this.showImageAtCurrentTime();
+
+ _this.showImageAtCurrentTime();
}
}
- }
- }, {
- key: "endScrubbing",
- value: function endScrubbing() {
- var _this4 = this;
+ });
- this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
+ _defineProperty(this, "endScrubbing", function () {
+ _this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
- if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {
+ if (Math.ceil(_this.lastTime) === Math.ceil(_this.player.media.currentTime)) {
// The video was already seeked/loaded at the chosen time - hide immediately
- this.toggleScrubbingContainer(false);
+ _this.toggleScrubbingContainer(false);
} else {
// The video hasn't seeked yet. Wait for that
- once.call(this.player, this.player.media, 'timeupdate', function () {
+ once.call(_this.player, _this.player.media, 'timeupdate', function () {
// Re-check mousedown - we might have already started scrubbing again
- if (!_this4.mouseDown) {
- _this4.toggleScrubbingContainer(false);
+ if (!_this.mouseDown) {
+ _this.toggleScrubbingContainer(false);
}
});
}
- }
- /**
- * Setup hooks for Plyr and window events
- */
-
- }, {
- key: "listeners",
- value: function listeners() {
- var _this5 = this;
+ });
+ _defineProperty(this, "listeners", function () {
// Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
- this.player.on('play', function () {
- _this5.toggleThumbContainer(false, true);
+ _this.player.on('play', function () {
+ _this.toggleThumbContainer(false, true);
});
- this.player.on('seeked', function () {
- _this5.toggleThumbContainer(false);
+
+ _this.player.on('seeked', function () {
+ _this.toggleThumbContainer(false);
});
- this.player.on('timeupdate', function () {
- _this5.lastTime = _this5.player.media.currentTime;
+
+ _this.player.on('timeupdate', function () {
+ _this.lastTime = _this.player.media.currentTime;
});
- }
- /**
- * Create HTML elements for image containers
- */
+ });
- }, {
- key: "render",
- value: function render() {
+ _defineProperty(this, "render", function () {
// Create HTML element: plyr__preview-thumbnail-container
- this.elements.thumb.container = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.thumbContainer
+ _this.elements.thumb.container = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.thumbContainer
}); // Wrapper for the image for styling
- this.elements.thumb.imageContainer = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.imageContainer
+ _this.elements.thumb.imageContainer = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.imageContainer
});
- this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
+ _this.elements.thumb.container.appendChild(_this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
+
var timeContainer = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.timeContainer
+ class: _this.player.config.classNames.previewThumbnails.timeContainer
});
- this.elements.thumb.time = createElement('span', {}, '00:00');
- timeContainer.appendChild(this.elements.thumb.time);
- this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+ _this.elements.thumb.time = createElement('span', {}, '00:00');
+ timeContainer.appendChild(_this.elements.thumb.time);
+
+ _this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
+
- if (is$1.element(this.player.elements.progress)) {
- this.player.elements.progress.appendChild(this.elements.thumb.container);
+ if (is$1.element(_this.player.elements.progress)) {
+ _this.player.elements.progress.appendChild(_this.elements.thumb.container);
} // Create HTML element: plyr__preview-scrubbing-container
- this.elements.scrubbing.container = createElement('div', {
- class: this.player.config.classNames.previewThumbnails.scrubbingContainer
+ _this.elements.scrubbing.container = createElement('div', {
+ class: _this.player.config.classNames.previewThumbnails.scrubbingContainer
});
- this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
- }
- }, {
- key: "destroy",
- value: function destroy() {
- if (this.elements.thumb.container) {
- this.elements.thumb.container.remove();
+
+ _this.player.elements.wrapper.appendChild(_this.elements.scrubbing.container);
+ });
+
+ _defineProperty(this, "destroy", function () {
+ if (_this.elements.thumb.container) {
+ _this.elements.thumb.container.remove();
}
- if (this.elements.scrubbing.container) {
- this.elements.scrubbing.container.remove();
+ if (_this.elements.scrubbing.container) {
+ _this.elements.scrubbing.container.remove();
}
- }
- }, {
- key: "showImageAtCurrentTime",
- value: function showImageAtCurrentTime() {
- var _this6 = this;
+ });
- if (this.mouseDown) {
- this.setScrubbingContainerSize();
+ _defineProperty(this, "showImageAtCurrentTime", function () {
+ if (_this.mouseDown) {
+ _this.setScrubbingContainerSize();
} else {
- this.setThumbContainerSizeAndPos();
+ _this.setThumbContainerSizeAndPos();
} // Find the desired thumbnail index
// TODO: Handle a video longer than the thumbs where thumbNum is null
- var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {
- return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;
+ var thumbNum = _this.thumbnails[0].frames.findIndex(function (frame) {
+ return _this.seekTime >= frame.startTime && _this.seekTime <= frame.endTime;
});
+
var hasThumb = thumbNum >= 0;
var qualityIndex = 0; // Show the thumb container if we're not scrubbing
- if (!this.mouseDown) {
- this.toggleThumbContainer(hasThumb);
+ if (!_this.mouseDown) {
+ _this.toggleThumbContainer(hasThumb);
} // No matching thumb found
@@ -14013,36 +13873,34 @@ var PreviewThumbnails = /*#__PURE__*/function () {
} // Check to see if we've already downloaded higher quality versions of this image
- this.thumbnails.forEach(function (thumbnail, index) {
- if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
+ _this.thumbnails.forEach(function (thumbnail, index) {
+ if (_this.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
qualityIndex = index;
}
}); // Only proceed if either thumbnum or thumbfilename has changed
- if (thumbNum !== this.showingThumb) {
- this.showingThumb = thumbNum;
- this.loadImage(qualityIndex);
- }
- } // Show the image that's currently specified in this.showingThumb
- }, {
- key: "loadImage",
- value: function loadImage() {
- var _this7 = this;
+ if (thumbNum !== _this.showingThumb) {
+ _this.showingThumb = thumbNum;
+
+ _this.loadImage(qualityIndex);
+ }
+ });
+ _defineProperty(this, "loadImage", function () {
var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
- var thumbNum = this.showingThumb;
- var thumbnail = this.thumbnails[qualityIndex];
+ var thumbNum = _this.showingThumb;
+ var thumbnail = _this.thumbnails[qualityIndex];
var urlPrefix = thumbnail.urlPrefix;
var frame = thumbnail.frames[thumbNum];
var thumbFilename = thumbnail.frames[thumbNum].text;
var thumbUrl = urlPrefix + thumbFilename;
- if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {
+ if (!_this.currentImageElement || _this.currentImageElement.dataset.filename !== thumbFilename) {
// If we're already loading a previous image, remove its onload handler - we don't want it to load after this one
// Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort
- if (this.loadingImage && this.usingSprites) {
- this.loadingImage.onload = null;
+ if (_this.loadingImage && _this.usingSprites) {
+ _this.loadingImage.onload = null;
} // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image
// is instead used. But this causes issues with larger images in Firefox and Safari - switching between background
// images causes a flicker. Putting a new image over the top does not
@@ -14052,56 +13910,59 @@ var PreviewThumbnails = /*#__PURE__*/function () {
previewImage.src = thumbUrl;
previewImage.dataset.index = thumbNum;
previewImage.dataset.filename = thumbFilename;
- this.showingThumbFilename = thumbFilename;
- this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+ _this.showingThumbFilename = thumbFilename;
+
+ _this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
+
previewImage.onload = function () {
- return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
+ return _this.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
};
- this.loadingImage = previewImage;
- this.removeOldImages(previewImage);
+ _this.loadingImage = previewImage;
+
+ _this.removeOldImages(previewImage);
} else {
// Update the existing image
- this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
- this.currentImageElement.dataset.index = thumbNum;
- this.removeOldImages(this.currentImageElement);
+ _this.showImage(_this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
+
+ _this.currentImageElement.dataset.index = thumbNum;
+
+ _this.removeOldImages(_this.currentImageElement);
}
- }
- }, {
- key: "showImage",
- value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
+ });
+
+ _defineProperty(this, "showImage", function (previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
- this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
- this.setImageSizeAndOffset(previewImage, frame);
+
+ _this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
+
+ _this.setImageSizeAndOffset(previewImage, frame);
if (newImage) {
- this.currentImageContainer.appendChild(previewImage);
- this.currentImageElement = previewImage;
+ _this.currentImageContainer.appendChild(previewImage);
+
+ _this.currentImageElement = previewImage;
- if (!this.loadedImages.includes(thumbFilename)) {
- this.loadedImages.push(thumbFilename);
+ if (!_this.loadedImages.includes(thumbFilename)) {
+ _this.loadedImages.push(thumbFilename);
}
} // Preload images before and after the current one
// Show higher quality of the same frame
// Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
- this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
- } // Remove all preview images that aren't the designated current image
-
- }, {
- key: "removeOldImages",
- value: function removeOldImages(currentImage) {
- var _this8 = this;
+ _this.preloadNearby(thumbNum, true).then(_this.preloadNearby(thumbNum, false)).then(_this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
+ });
+ _defineProperty(this, "removeOldImages", function (currentImage) {
// Get a list of all images, convert it from a DOM list to an array
- Array.from(this.currentImageContainer.children).forEach(function (image) {
+ Array.from(_this.currentImageContainer.children).forEach(function (image) {
if (image.tagName.toLowerCase() !== 'img') {
return;
}
- var removeDelay = _this8.usingSprites ? 500 : 1000;
+ var removeDelay = _this.usingSprites ? 500 : 1000;
if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {
// Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients
@@ -14109,35 +13970,30 @@ var PreviewThumbnails = /*#__PURE__*/function () {
// eslint-disable-next-line no-param-reassign
image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub
- var currentImageContainer = _this8.currentImageContainer;
+ var currentImageContainer = _this.currentImageContainer;
setTimeout(function () {
currentImageContainer.removeChild(image);
- _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
+ _this.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
}, removeDelay);
}
});
- } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
- // This will only preload the lowest quality
-
- }, {
- key: "preloadNearby",
- value: function preloadNearby(thumbNum) {
- var _this9 = this;
+ });
+ _defineProperty(this, "preloadNearby", function (thumbNum) {
var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
return new Promise(function (resolve) {
setTimeout(function () {
- var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;
+ var oldThumbFilename = _this.thumbnails[0].frames[thumbNum].text;
- if (_this9.showingThumbFilename === oldThumbFilename) {
+ if (_this.showingThumbFilename === oldThumbFilename) {
// Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away
var thumbnailsClone;
if (forward) {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);
+ thumbnailsClone = _this.thumbnails[0].frames.slice(thumbNum);
} else {
- thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();
+ thumbnailsClone = _this.thumbnails[0].frames.slice(0, thumbNum).reverse();
}
var foundOne = false;
@@ -14146,20 +14002,20 @@ var PreviewThumbnails = /*#__PURE__*/function () {
if (newThumbFilename !== oldThumbFilename) {
// Found one with a different filename. Make sure it hasn't already been loaded on this page visit
- if (!_this9.loadedImages.includes(newThumbFilename)) {
+ if (!_this.loadedImages.includes(newThumbFilename)) {
foundOne = true;
- _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
- var urlPrefix = _this9.thumbnails[0].urlPrefix;
+ var urlPrefix = _this.thumbnails[0].urlPrefix;
var thumbURL = urlPrefix + newThumbFilename;
var previewImage = new Image();
previewImage.src = thumbURL;
previewImage.onload = function () {
- _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
+ _this.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
- if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
+ if (!_this.loadedImages.includes(newThumbFilename)) _this.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
resolve();
};
@@ -14173,97 +14029,91 @@ var PreviewThumbnails = /*#__PURE__*/function () {
}
}, 300);
});
- } // If user has been hovering current image for half a second, look for a higher quality one
-
- }, {
- key: "getHigherQuality",
- value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {
- var _this10 = this;
+ });
- if (currentQualityIndex < this.thumbnails.length - 1) {
+ _defineProperty(this, "getHigherQuality", function (currentQualityIndex, previewImage, frame, thumbFilename) {
+ if (currentQualityIndex < _this.thumbnails.length - 1) {
// Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
var previewImageHeight = previewImage.naturalHeight;
- if (this.usingSprites) {
+ if (_this.usingSprites) {
previewImageHeight = frame.h;
}
- if (previewImageHeight < this.thumbContainerHeight) {
+ if (previewImageHeight < _this.thumbContainerHeight) {
// Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while
setTimeout(function () {
// Make sure the mouse hasn't already moved on and started hovering at another image
- if (_this10.showingThumbFilename === thumbFilename) {
- _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
+ if (_this.showingThumbFilename === thumbFilename) {
+ _this.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
- _this10.loadImage(currentQualityIndex + 1);
+ _this.loadImage(currentQualityIndex + 1);
}
}, 300);
}
}
- }
- }, {
- key: "toggleThumbContainer",
- value: function toggleThumbContainer() {
+ });
+
+ _defineProperty(this, "toggleThumbContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
- var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;
- this.elements.thumb.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.thumbContainerShown;
+
+ _this.elements.thumb.container.classList.toggle(className, toggle);
if (!toggle && clearShowing) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "toggleScrubbingContainer",
- value: function toggleScrubbingContainer() {
+ });
+
+ _defineProperty(this, "toggleScrubbingContainer", function () {
var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
- var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
- this.elements.scrubbing.container.classList.toggle(className, toggle);
+ var className = _this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
+
+ _this.elements.scrubbing.container.classList.toggle(className, toggle);
if (!toggle) {
- this.showingThumb = null;
- this.showingThumbFilename = null;
+ _this.showingThumb = null;
+ _this.showingThumbFilename = null;
}
- }
- }, {
- key: "determineContainerAutoSizing",
- value: function determineContainerAutoSizing() {
- if (this.elements.thumb.imageContainer.clientHeight > 20 || this.elements.thumb.imageContainer.clientWidth > 20) {
+ });
+
+ _defineProperty(this, "determineContainerAutoSizing", function () {
+ if (_this.elements.thumb.imageContainer.clientHeight > 20 || _this.elements.thumb.imageContainer.clientWidth > 20) {
// This will prevent auto sizing in this.setThumbContainerSizeAndPos()
- this.sizeSpecifiedInCSS = true;
+ _this.sizeSpecifiedInCSS = true;
}
- } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
+ });
- }, {
- key: "setThumbContainerSizeAndPos",
- value: function setThumbContainerSizeAndPos() {
- if (!this.sizeSpecifiedInCSS) {
- var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px");
- this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight > 20 && this.elements.thumb.imageContainer.clientWidth < 20) {
- var _thumbWidth = Math.floor(this.elements.thumb.imageContainer.clientHeight * this.thumbAspectRatio);
+ _defineProperty(this, "setThumbContainerSizeAndPos", function () {
+ if (!_this.sizeSpecifiedInCSS) {
+ var thumbWidth = Math.floor(_this.thumbContainerHeight * _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(_this.thumbContainerHeight, "px");
+ _this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight > 20 && _this.elements.thumb.imageContainer.clientWidth < 20) {
+ var _thumbWidth = Math.floor(_this.elements.thumb.imageContainer.clientHeight * _this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
- } else if (this.elements.thumb.imageContainer.clientHeight < 20 && this.elements.thumb.imageContainer.clientWidth > 20) {
- var thumbHeight = Math.floor(this.elements.thumb.imageContainer.clientWidth / this.thumbAspectRatio);
- this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
+ _this.elements.thumb.imageContainer.style.width = "".concat(_thumbWidth, "px");
+ } else if (_this.elements.thumb.imageContainer.clientHeight < 20 && _this.elements.thumb.imageContainer.clientWidth > 20) {
+ var thumbHeight = Math.floor(_this.elements.thumb.imageContainer.clientWidth / _this.thumbAspectRatio);
+ _this.elements.thumb.imageContainer.style.height = "".concat(thumbHeight, "px");
}
- this.setThumbContainerPos();
- }
- }, {
- key: "setThumbContainerPos",
- value: function setThumbContainerPos() {
- var seekbarRect = this.player.elements.progress.getBoundingClientRect();
- var plyrRect = this.player.elements.container.getBoundingClientRect();
- var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
+ _this.setThumbContainerPos();
+ });
+
+ _defineProperty(this, "setThumbContainerPos", function () {
+ var seekbarRect = _this.player.elements.progress.getBoundingClientRect();
+
+ var plyrRect = _this.player.elements.container.getBoundingClientRect();
+
+ var container = _this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
var minVal = plyrRect.left - seekbarRect.left + 10;
var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth
- var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;
+ var previewPos = _this.mousePosX - seekbarRect.left - container.clientWidth / 2;
if (previewPos < minVal) {
previewPos = minVal;
@@ -14274,31 +14124,27 @@ var PreviewThumbnails = /*#__PURE__*/function () {
}
container.style.left = "".concat(previewPos, "px");
- } // Can't use 100% width, in case the video is a different aspect ratio to the video container
+ });
- }, {
- key: "setScrubbingContainerSize",
- value: function setScrubbingContainerSize() {
- var _fitRatio = fitRatio(this.thumbAspectRatio, {
- width: this.player.media.clientWidth,
- height: this.player.media.clientHeight
+ _defineProperty(this, "setScrubbingContainerSize", function () {
+ var _fitRatio = fitRatio(_this.thumbAspectRatio, {
+ width: _this.player.media.clientWidth,
+ height: _this.player.media.clientHeight
}),
width = _fitRatio.width,
height = _fitRatio.height;
- this.elements.scrubbing.container.style.width = "".concat(width, "px");
- this.elements.scrubbing.container.style.height = "".concat(height, "px");
- } // Sprites need to be offset to the correct location
+ _this.elements.scrubbing.container.style.width = "".concat(width, "px");
+ _this.elements.scrubbing.container.style.height = "".concat(height, "px");
+ });
- }, {
- key: "setImageSizeAndOffset",
- value: function setImageSizeAndOffset(previewImage, frame) {
- if (!this.usingSprites) {
+ _defineProperty(this, "setImageSizeAndOffset", function (previewImage, frame) {
+ if (!_this.usingSprites) {
return;
} // Find difference between height and preview container height
- var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
+ var multiplier = _this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
previewImage.style.height = "".concat(previewImage.naturalHeight * multiplier, "px"); // eslint-disable-next-line no-param-reassign
@@ -14307,8 +14153,22 @@ var PreviewThumbnails = /*#__PURE__*/function () {
previewImage.style.left = "-".concat(frame.x * multiplier, "px"); // eslint-disable-next-line no-param-reassign
previewImage.style.top = "-".concat(frame.y * multiplier, "px");
- }
- }, {
+ });
+
+ this.player = player;
+ this.thumbnails = [];
+ this.loaded = false;
+ this.lastMouseMoveTime = Date.now();
+ this.mouseDown = false;
+ this.loadedImages = [];
+ this.elements = {
+ thumb: {},
+ scrubbing: {}
+ };
+ this.load();
+ }
+
+ _createClass(PreviewThumbnails, [{
key: "enabled",
get: function get() {
return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;
@@ -14554,6 +14414,214 @@ var Plyr = /*#__PURE__*/function () {
_classCallCheck(this, Plyr);
+ _defineProperty(this, "play", function () {
+ if (!is$1.function(_this.media.play)) {
+ return null;
+ } // Intecept play with ads
+
+
+ if (_this.ads && _this.ads.enabled) {
+ _this.ads.managerPromise.then(function () {
+ return _this.ads.play();
+ }).catch(function () {
+ return silencePromise(_this.media.play());
+ });
+ } // Return the promise (for HTML5)
+
+
+ return _this.media.play();
+ });
+
+ _defineProperty(this, "pause", function () {
+ if (!_this.playing || !is$1.function(_this.media.pause)) {
+ return null;
+ }
+
+ return _this.media.pause();
+ });
+
+ _defineProperty(this, "togglePlay", function (input) {
+ // Toggle based on current state if nothing passed
+ var toggle = is$1.boolean(input) ? input : !_this.playing;
+
+ if (toggle) {
+ return _this.play();
+ }
+
+ return _this.pause();
+ });
+
+ _defineProperty(this, "stop", function () {
+ if (_this.isHTML5) {
+ _this.pause();
+
+ _this.restart();
+ } else if (is$1.function(_this.media.stop)) {
+ _this.media.stop();
+ }
+ });
+
+ _defineProperty(this, "restart", function () {
+ _this.currentTime = 0;
+ });
+
+ _defineProperty(this, "rewind", function (seekTime) {
+ _this.currentTime -= is$1.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "forward", function (seekTime) {
+ _this.currentTime += is$1.number(seekTime) ? seekTime : _this.config.seekTime;
+ });
+
+ _defineProperty(this, "increaseVolume", function (step) {
+ var volume = _this.media.muted ? 0 : _this.volume;
+ _this.volume = volume + (is$1.number(step) ? step : 0);
+ });
+
+ _defineProperty(this, "decreaseVolume", function (step) {
+ _this.increaseVolume(-step);
+ });
+
+ _defineProperty(this, "airplay", function () {
+ // Show dialog if supported
+ if (support.airplay) {
+ _this.media.webkitShowPlaybackTargetPicker();
+ }
+ });
+
+ _defineProperty(this, "toggleControls", function (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 && is$1.array(_this.config.controls) && _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;
+ });
+
+ _defineProperty(this, "on", function (event, callback) {
+ on.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "once", function (event, callback) {
+ once.call(_this, _this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "off", function (event, callback) {
+ off(_this.elements.container, event, callback);
+ });
+
+ _defineProperty(this, "destroy", function (callback) {
+ 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
+
+ _this.embed = null; // If it's a soft destroy, make minimal changes
+
+ if (soft) {
+ if (Object.keys(_this.elements).length) {
+ // Remove elements
+ removeElement(_this.elements.buttons.play);
+ removeElement(_this.elements.captions);
+ removeElement(_this.elements.controls);
+ removeElement(_this.elements.wrapper); // Clear for GC
+
+ _this.elements.buttons.play = null;
+ _this.elements.captions = null;
+ _this.elements.controls = null;
+ _this.elements.wrapper = null;
+ } // Callback
+
+
+ if (is$1.function(callback)) {
+ callback();
+ }
+ } else {
+ // Unbind listeners
+ unbindListeners.call(_this); // Cancel current network requests
+
+ html5.cancelRequests.call(_this); // Replace the container with the original element provided
+
+ replaceElement(_this.elements.original, _this.elements.container); // Event
+
+ triggerEvent.call(_this, _this.elements.original, 'destroyed', true); // Callback
+
+ if (is$1.function(callback)) {
+ callback.call(_this.elements.original);
+ } // Reset state
+
+
+ _this.ready = false; // Clear for garbage collection
+
+ setTimeout(function () {
+ _this.elements = null;
+ _this.media = null;
+ }, 200);
+ }
+ }; // Stop playback
+
+
+ _this.stop(); // Clear timeouts
+
+
+ clearTimeout(_this.timers.loading);
+ clearTimeout(_this.timers.controls);
+ clearTimeout(_this.timers.resized); // Provider specific stuff
+
+ if (_this.isHTML5) {
+ // 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);
+ }
+ });
+
+ _defineProperty(this, "supports", function (type) {
+ return support.mime.call(_this, type);
+ });
+
this.timers = {}; // State
this.ready = false;
@@ -14650,12 +14718,13 @@ var Plyr = /*#__PURE__*/function () {
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 _type = this.media.tagName.toLowerCase(); // Embed properties
+
var iframe = null;
var url = null; // Different setup based on type
- switch (type) {
+ switch (_type) {
case 'div':
// Find the frame
iframe = this.media.querySelector('iframe'); // <iframe> type
@@ -14698,7 +14767,7 @@ var Plyr = /*#__PURE__*/function () {
} // Unsupported or missing provider
- if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
+ if (is$1.empty(this.provider) || !Object.values(providers).includes(this.provider)) {
this.debug.error('Setup failed: Invalid provider');
return;
} // Audio will come later for external providers
@@ -14709,7 +14778,7 @@ var Plyr = /*#__PURE__*/function () {
case 'video':
case 'audio':
- this.type = type;
+ this.type = _type;
this.provider = providers.html5; // Get config from attributes
if (this.media.hasAttribute('crossorigin')) {
@@ -14815,139 +14884,6 @@ var Plyr = /*#__PURE__*/function () {
_createClass(Plyr, [{
- key: "play",
-
- /**
- * Play the media, or play the advertisement (if they are not blocked)
- */
- value: function play() {
- var _this2 = this;
-
- if (!is$1.function(this.media.play)) {
- return null;
- } // Intecept play with ads
-
-
- if (this.ads && this.ads.enabled) {
- this.ads.managerPromise.then(function () {
- return _this2.ads.play();
- }).catch(function () {
- return silencePromise(_this2.media.play());
- });
- } // 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 null;
- }
-
- 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) {
- return this.play();
- }
-
- return 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 -= 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 += 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",
/**
@@ -14963,202 +14899,6 @@ var Plyr = /*#__PURE__*/function () {
*/
}, {
- 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 && is$1.array(this.config.controls) && 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 _this3 = 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
-
- _this3.embed = null; // If it's a soft destroy, make minimal changes
-
- if (soft) {
- if (Object.keys(_this3.elements).length) {
- // Remove elements
- removeElement(_this3.elements.buttons.play);
- removeElement(_this3.elements.captions);
- removeElement(_this3.elements.controls);
- removeElement(_this3.elements.wrapper); // Clear for GC
-
- _this3.elements.buttons.play = null;
- _this3.elements.captions = null;
- _this3.elements.controls = null;
- _this3.elements.wrapper = null;
- } // Callback
-
-
- if (is$1.function(callback)) {
- callback();
- }
- } else {
- // Unbind listeners
- unbindListeners.call(_this3); // Cancel current network requests
-
- html5.cancelRequests.call(_this3); // Replace the container with the original element provided
-
- replaceElement(_this3.elements.original, _this3.elements.container); // Event
-
- triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback
-
- if (is$1.function(callback)) {
- callback.call(_this3.elements.original);
- } // Reset state
-
-
- _this3.ready = false; // Clear for garbage collection
-
- setTimeout(function () {
- _this3.elements = null;
- _this3.media = null;
- }, 200);
- }
- }; // Stop playback
-
-
- this.stop(); // Clear timeouts
-
- clearTimeout(this.timers.loading);
- clearTimeout(this.timers.controls);
- clearTimeout(this.timers.resized); // Provider specific stuff
-
- if (this.isHTML5) {
- // 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 {Boolean} inline - Where player has `playsinline` sttribute
- */
-
- }, {
key: "isHTML5",
get: function get() {
return this.provider === providers.html5;
@@ -15188,8 +14928,16 @@ var Plyr = /*#__PURE__*/function () {
get: function get() {
return this.type === types.audio;
}
+ /**
+ * Play the media, or play the advertisement (if they are not blocked)
+ */
+
}, {
key: "playing",
+
+ /**
+ * Get playing state
+ */
get: function get() {
return Boolean(this.ready && !this.paused && !this.ended);
}
@@ -15220,8 +14968,18 @@ var Plyr = /*#__PURE__*/function () {
get: function get() {
return Boolean(this.media.ended);
}
+ /**
+ * Toggle playback based on current status
+ * @param {Boolean} input
+ */
+
}, {
key: "currentTime",
+
+ /**
+ * Seek to a time
+ * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
+ */
set: function set(input) {
// Bail if media duration isn't available yet
if (!this.duration) {
@@ -15340,8 +15098,18 @@ var Plyr = /*#__PURE__*/function () {
get: function get() {
return Number(this.media.volume);
}
+ /**
+ * Increase volume
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
+ */
+
}, {
key: "muted",
+
+ /**
+ * Set muted state
+ * @param {Boolean} mute
+ */
set: function set(mute) {
var toggle = mute; // Load muted state from storage
@@ -15393,7 +15161,7 @@ var Plyr = /*#__PURE__*/function () {
}, {
key: "speed",
set: function set(input) {
- var _this4 = this;
+ var _this2 = this;
var speed = null;
@@ -15417,7 +15185,7 @@ var Plyr = /*#__PURE__*/function () {
this.config.speed.selected = speed; // Set media speed
setTimeout(function () {
- _this4.media.playbackRate = speed;
+ _this2.media.playbackRate = speed;
}, 0);
}
/**
@@ -15765,8 +15533,20 @@ var Plyr = /*#__PURE__*/function () {
return this.media === document.pictureInPictureElement;
}
+ /**
+ * Trigger the airplay dialog
+ * TODO: update player with state, support, enabled
+ */
+
}], [{
key: "supported",
+
+ /**
+ * Check for support
+ * @param {String} type - Player type (audio/video)
+ * @param {String} provider - Provider (html5/youtube/vimeo)
+ * @param {Boolean} inline - Where player has `playsinline` sttribute
+ */
value: function supported(type, provider, inline) {
return support.check(type, provider, inline);
}
diff --git a/src/js/config/defaults.js b/src/js/config/defaults.js
index 74083e53..7a73c318 100644
--- a/src/js/config/defaults.js
+++ b/src/js/config/defaults.js
@@ -61,7 +61,7 @@ const defaults = {
// Sprite (for icons)
loadSprite: true,
iconPrefix: 'plyr',
- iconUrl: 'https://cdn.plyr.io/3.6.3/plyr.svg',
+ iconUrl: 'https://cdn.plyr.io/3.6.4/plyr.svg',
// Blank video (used to prevent errors on source change)
blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
diff --git a/src/js/fullscreen.js b/src/js/fullscreen.js
index 7a7f21a9..20e958fc 100644
--- a/src/js/fullscreen.js
+++ b/src/js/fullscreen.js
@@ -57,6 +57,8 @@ class Fullscreen {
// Update the UI
this.update();
+
+ // this.toggle = this.toggle.bind(this);
}
// Determine if native supported
diff --git a/src/js/plyr.js b/src/js/plyr.js
index e67e29d4..b40f5c5a 100644
--- a/src/js/plyr.js
+++ b/src/js/plyr.js
@@ -1,6 +1,6 @@
// ==========================================================================
// Plyr
-// plyr.js v3.6.3
+// plyr.js v3.6.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 79a58a31..f8f613e7 100644
--- a/src/js/plyr.polyfilled.js
+++ b/src/js/plyr.polyfilled.js
@@ -1,6 +1,6 @@
// ==========================================================================
// Plyr Polyfilled Build
-// plyr.js v3.6.3
+// plyr.js v3.6.4
// https://github.com/sampotts/plyr
// License: The MIT License (MIT)
// ==========================================================================
diff --git a/src/js/utils/is.js b/src/js/utils/is.js
index 5a60da06..28f0c1a4 100644
--- a/src/js/utils/is.js
+++ b/src/js/utils/is.js
@@ -21,11 +21,11 @@ const isTrack = (input) => instanceOf(input, TextTrack) || (!isNullOrUndefined(i
const isPromise = (input) => instanceOf(input, Promise) && isFunction(input.then);
const isElement = (input) =>
- input !== null &&
- (typeof input === "object") &&
- (input.nodeType === 1) &&
- (typeof input.style === "object") &&
- (typeof input.ownerDocument === "object");
+ input !== null &&
+ typeof input === 'object' &&
+ input.nodeType === 1 &&
+ typeof input.style === 'object' &&
+ typeof input.ownerDocument === 'object';
const isEmpty = (input) =>
isNullOrUndefined(input) ||